[gtkmm] Gdk: Add ToplevelSize and Toplevel::signal_compute_size()
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm] Gdk: Add ToplevelSize and Toplevel::signal_compute_size()
- Date: Mon, 10 Aug 2020 15:27:52 +0000 (UTC)
commit b4d0c1868c805a51c9db87349ad2d2b6a521f3fd
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date: Mon Aug 10 17:24:59 2020 +0200
Gdk: Add ToplevelSize and Toplevel::signal_compute_size()
.gitignore | 2 ++
gdk/gdkmm/meson.build | 1 +
gdk/src/filelist.am | 1 +
gdk/src/gdk_extra_objects.defs | 8 ++++-
gdk/src/gdk_signals.defs | 2 +-
gdk/src/gdk_signals.defs.patch | 19 ++++++++--
gdk/src/toplevel.ccg | 30 ++++++++++++++++
gdk/src/toplevel.hg | 6 ++--
gdk/src/toplevelsize.ccg | 54 +++++++++++++++++++++++++++++
gdk/src/toplevelsize.hg | 78 ++++++++++++++++++++++++++++++++++++++++++
10 files changed, 194 insertions(+), 7 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index d15f4f4c..10ac7e5c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -129,6 +129,8 @@ gdk/gdkmm/toplevel.cc
gdk/gdkmm/toplevel.h
gdk/gdkmm/toplevellayout.cc
gdk/gdkmm/toplevellayout.h
+gdk/gdkmm/toplevelsize.cc
+gdk/gdkmm/toplevelsize.h
gdk/gdkmm/types.cc
gdk/gdkmm/types.h
gdk/gdkmm/wrap_init.cc
diff --git a/gdk/gdkmm/meson.build b/gdk/gdkmm/meson.build
index 93ca9784..47ba652a 100644
--- a/gdk/gdkmm/meson.build
+++ b/gdk/gdkmm/meson.build
@@ -69,6 +69,7 @@ gdkmm_any_hg_ccg_basenames = [
'timecoord',
'toplevel',
'toplevellayout',
+ 'toplevelsize',
'types',
]
diff --git a/gdk/src/filelist.am b/gdk/src/filelist.am
index 9fca6df4..c82708bc 100644
--- a/gdk/src/filelist.am
+++ b/gdk/src/filelist.am
@@ -54,6 +54,7 @@ gdkmm_files_any_hg = \
timecoord.hg \
toplevel.hg \
toplevellayout.hg \
+ toplevelsize.hg \
types.hg
gdkmm_files_deprecated_hg =
diff --git a/gdk/src/gdk_extra_objects.defs b/gdk/src/gdk_extra_objects.defs
index d420454a..ff4304d6 100644
--- a/gdk/src/gdk_extra_objects.defs
+++ b/gdk/src/gdk_extra_objects.defs
@@ -175,7 +175,13 @@
(define-object Toplevel
(in-module "Gdk")
(c-name "GdkToplevel")
- (gtype-id "GDK_TYPE_Toplevel")
+ (gtype-id "GDK_TYPE_TOPLEVEL")
+)
+
+(define-object ToplevelSize
+ (in-module "Gdk")
+ (c-name "GdkToplevelSize")
+ (gtype-id "GDK_TYPE_TOPLEVEL_SIZE")
)
(define-object Texture
diff --git a/gdk/src/gdk_signals.defs b/gdk/src/gdk_signals.defs
index 2bfb2ced..992f4d2e 100644
--- a/gdk/src/gdk_signals.defs
+++ b/gdk/src/gdk_signals.defs
@@ -1095,7 +1095,7 @@
(return-type "void")
(flags "Run Last")
(parameters
- '("GdkToplevelSize" "p0")
+ '("GdkToplevelSize*" "p0")
)
)
diff --git a/gdk/src/gdk_signals.defs.patch b/gdk/src/gdk_signals.defs.patch
index acb9d64b..7e14ccb7 100644
--- a/gdk/src/gdk_signals.defs.patch
+++ b/gdk/src/gdk_signals.defs.patch
@@ -1,6 +1,6 @@
---- ./../../gdk/src/gdk_signals.defs.orig 2020-05-21 15:28:16.237314196 +0200
-+++ ./../../gdk/src/gdk_signals.defs 2020-05-21 15:38:50.956598646 +0200
-@@ -1043,11 +1043,11 @@
+--- ./../../gdk/src/gdk_signals.defs.orig 2020-08-10 15:54:05.615826709 +0200
++++ ./../../gdk/src/gdk_signals.defs 2020-08-10 15:54:50.182765035 +0200
+@@ -1005,11 +1005,11 @@
(define-signal event
(of-object "GdkSurface")
(return-type "gboolean")
@@ -13,3 +13,16 @@
(define-signal enter-monitor
(of-object "GdkSurface")
+@@ -1093,11 +1093,11 @@
+ (define-signal compute-size
+ (of-object "GdkToplevel")
+ (return-type "void")
+ (flags "Run Last")
+ (parameters
+- '("GdkToplevelSize" "p0")
++ '("GdkToplevelSize*" "p0")
+ )
+ )
+
+ (define-property decorated
+ (of-object "GdkToplevel")
diff --git a/gdk/src/toplevel.ccg b/gdk/src/toplevel.ccg
index c86901a6..70676caf 100644
--- a/gdk/src/toplevel.ccg
+++ b/gdk/src/toplevel.ccg
@@ -15,3 +15,33 @@
*/
#include <gdk/gdk.h>
+
+namespace
+{
+// Hand-coded because the slot can't be called with a non-const temporary ToplevelSize.
+static void Toplevel_signal_compute_size_callback(GdkToplevel* self, GdkToplevelSize* p0, void* data)
+{
+ using namespace Gdk;
+ using SlotType = sigc::slot<void(ToplevelSize&)>;
+
+ auto obj = dynamic_cast<Toplevel*>(Glib::ObjectBase::_get_current_wrapper((GObject*) self));
+ // Do not try to call a signal on a disassociated wrapper.
+ if(obj)
+ {
+ try
+ {
+ if (const auto slot = Glib::SignalProxyNormal::data_to_slot(data))
+ {
+ // This works because Gdk::ToplevelSize neither copies nor deletes *p0.
+ ToplevelSize toplevelsize(p0);
+ (*static_cast<SlotType*>(slot))(toplevelsize);
+ }
+ }
+ catch(...)
+ {
+ Glib::exception_handlers_invoke();
+ }
+ }
+}
+
+} // anonymous namespace
diff --git a/gdk/src/toplevel.hg b/gdk/src/toplevel.hg
index 7bf498b9..8098a9ad 100644
--- a/gdk/src/toplevel.hg
+++ b/gdk/src/toplevel.hg
@@ -18,6 +18,7 @@
#include <gdkmm/surface.h>
#include <gdkmm/texture.h>
#include <gdkmm/toplevellayout.h>
+#include <gdkmm/toplevelsize.h>
#include <vector>
_DEFS(gdkmm,gdk)
@@ -76,6 +77,9 @@ public:
_WRAP_METHOD(void begin_move(const Glib::RefPtr<Device>& device, int button,
double x, double y, guint32 timestamp), gdk_toplevel_begin_move)
+ _WRAP_SIGNAL(void compute_size(ToplevelSize& size), "compute-size",
+ no_default_handler, custom_c_callback)
+
_WRAP_PROPERTY("state", Surface::State)
_WRAP_PROPERTY("title", Glib::ustring)
_WRAP_PROPERTY("startup-id", Glib::ustring)
@@ -86,8 +90,6 @@ public:
_WRAP_PROPERTY("deletable", bool)
_WRAP_PROPERTY("fullscreen-mode", FullscreenMode)
_WRAP_PROPERTY("shortcuts-inhibited", bool)
-
- // There are no signals or public vfuncs.
};
} // namespace Gdk
diff --git a/gdk/src/toplevelsize.ccg b/gdk/src/toplevelsize.ccg
new file mode 100644
index 00000000..9ef9c433
--- /dev/null
+++ b/gdk/src/toplevelsize.ccg
@@ -0,0 +1,54 @@
+/* Copyright (C) 2020 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gdk/gdk.h>
+#include <utility> // std::move(), std::swap()
+
+namespace Gdk
+{
+
+ToplevelSize::operator bool() const
+{
+ return gobj();
+}
+
+ToplevelSize::ToplevelSize(GdkToplevelSize* gobject)
+:
+ gobject_(gobject)
+{}
+
+ToplevelSize::ToplevelSize(ToplevelSize&& other) noexcept
+:
+ gobject_(std::move(other.gobject_))
+{
+ other.gobject_ = nullptr;
+}
+
+ToplevelSize& ToplevelSize::operator=(ToplevelSize&& other) noexcept
+{
+ ToplevelSize temp(std::move(other));
+ std::swap(gobject_, temp.gobject_);
+ return *this;
+}
+
+ToplevelSize::~ToplevelSize() noexcept
+{
+ // The Gdk::ToplevelSize instance does not own the wrapped GdkToplevelSize instance.
+ // GdkToplevelSize is a private gtk struct with no public create,
+ // copy or free functions.
+}
+
+} // namespace Gdk
diff --git a/gdk/src/toplevelsize.hg b/gdk/src/toplevelsize.hg
new file mode 100644
index 00000000..f55d991f
--- /dev/null
+++ b/gdk/src/toplevelsize.hg
@@ -0,0 +1,78 @@
+/* Copyright (C) 2020 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+_CONFIGINCLUDE(gdkmmconfig.h)
+
+#include <gdk/gdk.h>
+
+_DEFS(gdkmm,gdk)
+
+namespace Gdk
+{
+
+/** Information for computing toplevel size.
+ *
+ * The %Gdk::ToplevelSize struct contains information that may be useful
+ * for users of Gdk::Toplevel to compute a surface size. It also carries
+ * information back with the computational result.
+ *
+ * @newin{3,98}
+ */
+class GDKMM_API ToplevelSize
+{
+ _CLASS_GENERIC(ToplevelSize, GdkToplevelSize)
+
+public:
+ explicit ToplevelSize(GdkToplevelSize* gobject);
+
+ // Not copyable
+ ToplevelSize(const ToplevelSize& other) = delete;
+ ToplevelSize& operator=(const ToplevelSize& other) = delete;
+
+ // Movable
+ ToplevelSize(ToplevelSize&& other) noexcept;
+ ToplevelSize& operator=(ToplevelSize&& other) noexcept;
+
+ ~ToplevelSize() noexcept;
+
+ /** Checks if this instance is valid.
+ * It is valid if and only if it contains a pointer to a GdkToplevelSize.
+ * For instance,
+ * @code
+ * if (size)
+ * do_something()
+ * @endcode
+ */
+ explicit operator bool() const;
+
+ /// Provides access to the underlying C object.
+ GdkToplevelSize* gobj() { return gobject_; }
+ /// Provides access to the underlying C object.
+ const GdkToplevelSize* gobj() const { return gobject_; }
+
+ _WRAP_METHOD(void get_bounds(int& bounds_width, int& bounds_height) const,
+ gdk_toplevel_size_get_bounds)
+ _WRAP_METHOD(void set_size(int width, int height), gdk_toplevel_size_set_size)
+ _WRAP_METHOD(void set_min_size(int min_width, int min_height), gdk_toplevel_size_set_min_size)
+
+protected:
+ // The Gdk::ToplevelSize instance does not own the wrapped GdkToplevelSize instance.
+ // GdkToplevelSize is a private gtk struct with no public create,
+ // copy or free functions.
+ GdkToplevelSize* gobject_;
+};
+
+} // namespace Gdk
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]