summaryrefslogtreecommitdiff
path: root/glib/glibmm/objectbase.cc
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjell.ahlstedt@bredband.net>2017-02-15 10:51:46 +0100
committerKjell Ahlstedt <kjell.ahlstedt@bredband.net>2017-02-15 10:51:46 +0100
commit7e7b6b2a32559df6e08d351a6370a29200baaced (patch)
tree2f437bd269eccd76bd21854bcf61a69823e71069 /glib/glibmm/objectbase.cc
parentef9ea241f758e567f25af597c61dd47ae0a5d27f (diff)
downloadglibmm-7e7b6b2a32559df6e08d351a6370a29200baaced.tar.gz
Object construction: Add custom class init and instance init functions
Make it possible for named custom types to register additions to the class init function and to register an instance init function. An extra class init function is useful in Gtk::WidgetCustomDraw and Gtk::WidgetCustomSnapshot. Bug 775348
Diffstat (limited to 'glib/glibmm/objectbase.cc')
-rw-r--r--glib/glibmm/objectbase.cc54
1 files changed, 54 insertions, 0 deletions
diff --git a/glib/glibmm/objectbase.cc b/glib/glibmm/objectbase.cc
index 429d11d1..7e36414c 100644
--- a/glib/glibmm/objectbase.cc
+++ b/glib/glibmm/objectbase.cc
@@ -40,6 +40,17 @@ namespace Glib
/**** Glib::ObjectBase *****************************************************/
+// Used only during the construction of named custom types.
+struct ObjectBase::PrivImpl
+{
+ // Pointers to the interfaces of custom types.
+ Class::interface_classes_type custom_interface_classes;
+ // Pointers to extra class init functions.
+ Class::class_init_funcs_type custom_class_init_functions;
+ // Pointer to the instance init function.
+ GInstanceInitFunc custom_instance_init_function = nullptr;
+};
+
ObjectBase::ObjectBase()
: gobject_(nullptr),
custom_type_name_(anonymous_custom_type_name),
@@ -379,6 +390,49 @@ ObjectBase::thaw_notify()
g_object_thaw_notify(gobj());
}
+void ObjectBase::add_custom_interface_class(const Interface_Class* iface_class)
+{
+ if (!priv_pimpl_)
+ priv_pimpl_ = std::make_unique<PrivImpl>();
+ priv_pimpl_->custom_interface_classes.emplace_back(iface_class);
+}
+
+void ObjectBase::add_custom_class_init_function(GClassInitFunc class_init_func, void* class_data)
+{
+ if (!priv_pimpl_)
+ priv_pimpl_ = std::make_unique<PrivImpl>();
+ priv_pimpl_->custom_class_init_functions.emplace_back(
+ std::make_tuple(class_init_func, class_data));
+}
+
+void ObjectBase::set_custom_instance_init_function(GInstanceInitFunc instance_init_func)
+{
+ if (!priv_pimpl_)
+ priv_pimpl_ = std::make_unique<PrivImpl>();
+ priv_pimpl_->custom_instance_init_function = instance_init_func;
+}
+
+const Class::interface_classes_type* ObjectBase::get_custom_interface_classes() const
+{
+ return priv_pimpl_ ? &priv_pimpl_->custom_interface_classes : nullptr;
+}
+
+const Class::class_init_funcs_type* ObjectBase::get_custom_class_init_functions() const
+{
+ return priv_pimpl_ ? &priv_pimpl_->custom_class_init_functions : nullptr;
+}
+
+GInstanceInitFunc ObjectBase::get_custom_instance_init_function() const
+{
+ return priv_pimpl_ ? priv_pimpl_->custom_instance_init_function : nullptr;
+}
+
+void ObjectBase::custom_class_init_finished()
+{
+ priv_pimpl_.reset();
+}
+
+/**** Global function *****************************************************/
bool
_gobject_cppinstance_already_deleted(GObject* gobject)
{