[gtkmm] Gtk::Builder: Replace a GQuark by member data



commit 3271ccd69da613b502dfc626fca5572715ab0be6
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date:   Mon Nov 14 10:42:04 2016 +0100

    Gtk::Builder: Replace a GQuark by member data
    
    Replace quark_no_gtkmm_derived_types by Builder::no_gtkmm_derived_types.
    Replace the local get_type_from_name_vfunc_callback() in builder.ccg by
    Gtk::Builder_Class::get_type_from_name_vfunc_callback(). That makes it more
    like a gmmproc-generated vfunc callback.

 gtk/src/builder.ccg |   23 ++++++++---------------
 gtk/src/builder.hg  |    3 +++
 2 files changed, 11 insertions(+), 15 deletions(-)
---
diff --git a/gtk/src/builder.ccg b/gtk/src/builder.ccg
index 92eb6b6..2570a9f 100644
--- a/gtk/src/builder.ccg
+++ b/gtk/src/builder.ccg
@@ -20,16 +20,13 @@
 
 #include <gtk/gtk.h>
 
-namespace
+namespace Gtk
 {
 
-//TODO: When we can break ABI, replace this GQuark by member data in Gtk::Builder.
-GQuark quark_no_gtkmm_derived_types = g_quark_from_static_string("gtkmm__Builder::no_gtkmm_derived_types");
-
 // Allow GtkBuilder to instantiate a gtkmm derived GType instead of the regular
 // GTK+ GType, so we can, for instance, use our vfuncs and default signal handlers.
-static GType
-get_type_from_name_vfunc_callback(GtkBuilder* self, const char* type_name)
+// static
+GType Builder_Class::get_type_from_name_vfunc_callback(GtkBuilder* self, const char* type_name)
 {
   if (!type_name)
     return G_TYPE_INVALID;
@@ -39,7 +36,9 @@ get_type_from_name_vfunc_callback(GtkBuilder* self, const char* type_name)
   // If a TreeModel (such as ListStore or TreeStore) is being built,
   // Buildable_Class may have requested no search for gtkmm-derived types.
   // See https://bugzilla.gnome.org/show_bug.cgi?id=742637
-  if (!g_object_get_qdata((GObject*)self, quark_no_gtkmm_derived_types))
+  const auto obj = dynamic_cast<Builder*>(
+    Glib::ObjectBase::_get_current_wrapper((GObject*)self));
+  if (!(obj && obj->no_gtkmm_derived_types))
   {
     // See if there is a gtkmm version of the gclass:
     Glib::ustring classname_prefixed ("gtkmm__"); // gtkmm uses a prefix
@@ -51,8 +50,7 @@ get_type_from_name_vfunc_callback(GtkBuilder* self, const char* type_name)
   if (gtype == G_TYPE_INVALID) // If it's not a registered typename
   {
     // Get the parent class of the object class (the original underlying C class).
-    Gtk::Builder_Class::BaseClassType* const base =
-      static_cast<Gtk::Builder_Class::BaseClassType*>(
+    const auto base = static_cast<BaseClassType*>(
       g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)));
 
     // Call the original underlying C function.
@@ -65,15 +63,10 @@ get_type_from_name_vfunc_callback(GtkBuilder* self, const char* type_name)
   return gtype;
 }
 
-} // anonymous namespace
-
-namespace Gtk
-{
-
 // Called from Buildable
 void Builder::set_no_gtkmm_derived_types(bool status)
 {
-  g_object_set_qdata((GObject*)gobj(), quark_no_gtkmm_derived_types, (gpointer)status);
+  no_gtkmm_derived_types = status;
 }
 
 // static
diff --git a/gtk/src/builder.hg b/gtk/src/builder.hg
index dccbd0e..c0e1752 100644
--- a/gtk/src/builder.hg
+++ b/gtk/src/builder.hg
@@ -591,6 +591,7 @@ protected:
 
 private:
   void set_no_gtkmm_derived_types(bool status);
+  bool no_gtkmm_derived_types {false};
   friend class Buildable_Class;
 
 #m4begin
@@ -598,6 +599,8 @@ dnl Custom-coded vfunc:
 dnl
   _PUSH(SECTION_PCC_CLASS_INIT_VFUNCS)
   klass->get_type_from_name = &get_type_from_name_vfunc_callback;
+  _SECTION(SECTION_PH_VFUNCS)
+  static GType get_type_from_name_vfunc_callback(GtkBuilder* self, const char* type_name);
   _POP()
 #m4end
 };


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]