[gtkmm] Gdk: Add ToplevelSize and Toplevel::signal_compute_size()



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]