[gtkmm] Widget (and others): Add methods needed by custom widgets.



commit 38511d1c49ffeb17daab2e6e2ad2ac4f373d89ad
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date:   Wed Jan 19 12:48:16 2011 +0100

    Widget (and others): Add methods needed by custom widgets.
    
    * gtk/src/cssprovider.hg: Added _WRAP_CREATE. Added refreturn on
    get_default() and get_named().
    * gtk/src/stylecontext.ccg: The 'get' methods return a copy of the local
    objects, not a pointer to them.
    * gtk/src/gtk_vfuncs.defs:
    * gtk/src/widget.[hg|ccg]: Added vfuncs get_request_mode,
    get_preferred_[width|height_for_width|height|width_for_height]. Bug 639073.

 ChangeLog                |   12 ++++++++
 gtk/src/cssprovider.hg   |   10 ++++--
 gtk/src/gtk_vfuncs.defs  |   43 ++++++++++++++++++++++++++++
 gtk/src/stylecontext.ccg |   12 ++++----
 gtk/src/widget.ccg       |   70 ++++++++++++++++++++++++++++++++++++++++++++++
 gtk/src/widget.hg        |   16 ++++++++++
 6 files changed, 153 insertions(+), 10 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index e486989..7129aae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2011-01-19  Kjell Ahlstedt  <kjell ahlstedt bredband net>
+
+  Widget (and others): Add methods needed by custom widgets.
+
+	* gtk/src/cssprovider.hg: Added _WRAP_CREATE. Added refreturn on
+	get_default() and get_named().
+	* gtk/src/stylecontext.ccg: The 'get' methods return a copy of the local
+	objects, not a pointer to them.
+	* gtk/src/gtk_vfuncs.defs:
+	* gtk/src/widget.[hg|ccg]: Added vfuncs get_request_mode,
+	get_preferred_[width|height_for_width|height|width_for_height]. Bug 639073.
+
 2011-01-23  Armin Burgmeier  <armin arbur net>
 
 	Widget: Wrap the style-updated signal.
diff --git a/gtk/src/cssprovider.hg b/gtk/src/cssprovider.hg
index a02f99d..169d898 100644
--- a/gtk/src/cssprovider.hg
+++ b/gtk/src/cssprovider.hg
@@ -34,19 +34,21 @@ class CssProvider
 {
   _CLASS_GOBJECT(CssProvider, GtkCssProvider, GTK_CSS_PROVIDER, Glib::Object, GObject)
   _IMPLEMENTS_INTERFACE(StyleProvider)
-public:
+protected:
   _CTOR_DEFAULT()
   _IGNORE(gtk_css_provider_new)
+
+public:
+  _WRAP_CREATE()
   
   _WRAP_METHOD(bool load_from_data(const std::string& data, gssize length), gtk_css_provider_load_from_data, errthrow)
   
   _WRAP_METHOD(bool load_from_file(const Glib::RefPtr<const Gio::File>& file), gtk_css_provider_load_from_file, errthrow)
   _WRAP_METHOD(bool load_from_path(const std::string& path), gtk_css_provider_load_from_path, errthrow)
 
-  _WRAP_METHOD(static Glib::RefPtr<CssProvider> get_default(), gtk_css_provider_get_default)
-
-  _WRAP_METHOD(static Glib::RefPtr<CssProvider> get_named(const Glib::ustring& name, const Glib::ustring& variant), gtk_css_provider_get_named)
+  _WRAP_METHOD(static Glib::RefPtr<CssProvider> get_default(), gtk_css_provider_get_default, refreturn)
 
+  _WRAP_METHOD(static Glib::RefPtr<CssProvider> get_named(const Glib::ustring& name, const Glib::ustring& variant), gtk_css_provider_get_named, refreturn)
 
   //There are no properties or signals.
 };
diff --git a/gtk/src/gtk_vfuncs.defs b/gtk/src/gtk_vfuncs.defs
index 80c4f09..2f51cfb 100644
--- a/gtk/src/gtk_vfuncs.defs
+++ b/gtk/src/gtk_vfuncs.defs
@@ -1003,6 +1003,49 @@
   (return-type "AtkObject*")
 )
 
+(define-vfunc get_request_mode
+  (of-object "GtkWidget")
+  (return-type "GtkSizeRequestMode")
+)
+
+(define-vfunc get_preferred_height
+  (of-object "GtkWidget")
+  (return-type "void")
+  (parameters
+    '("gint*" "minimum_height")
+    '("gint*" "natural_height")
+  )
+)
+
+(define-vfunc get_preferred_width_for_height
+  (of-object "GtkWidget")
+  (return-type "void")
+  (parameters
+    '("gint" "height")
+    '("gint*" "minimum_width")
+    '("gint*" "natural_width")
+  )
+)
+
+(define-vfunc get_preferred_width
+  (of-object "GtkWidget")
+  (return-type "void")
+  (parameters
+    '("gint*" "minimum_width")
+    '("gint*" "natural_width")
+  )
+)
+
+(define-vfunc get_preferred_height_for_width
+  (of-object "GtkWidget")
+  (return-type "void")
+  (parameters
+    '("gint" "width")
+    '("gint*" "minimum_height")
+    '("gint*" "natural_height")
+  )
+)
+
 ; GtkRecentChooser
 
 (define-vfunc set_current_uri
diff --git a/gtk/src/stylecontext.ccg b/gtk/src/stylecontext.ccg
index b6c7b09..eecfee4 100644
--- a/gtk/src/stylecontext.ccg
+++ b/gtk/src/stylecontext.ccg
@@ -30,42 +30,42 @@ Gdk::RGBA StyleContext::get_color(StateFlags state) const
 {
   GdkRGBA crgba;
   gtk_style_context_get_color(const_cast<GtkStyleContext*>(gobj()), ((GtkStateFlags)(state)), &crgba);
-  return Gdk::RGBA(&crgba, false); 
+  return Gdk::RGBA(&crgba, true); 
 }
 
 Gdk::RGBA StyleContext::get_background_color(StateFlags state) const
 {
   GdkRGBA crgba;
   gtk_style_context_get_background_color(const_cast<GtkStyleContext*>(gobj()), ((GtkStateFlags)(state)), &crgba);
-  return Gdk::RGBA(&crgba, false); 
+  return Gdk::RGBA(&crgba, true); 
 }
 
 Gdk::RGBA StyleContext::get_border_color(StateFlags state) const
 {
   GdkRGBA crgba;
   gtk_style_context_get_border_color(const_cast<GtkStyleContext*>(gobj()), ((GtkStateFlags)(state)), &crgba);
-  return Gdk::RGBA(&crgba, false); 
+  return Gdk::RGBA(&crgba, true); 
 }
 
 Border StyleContext::get_border(StateFlags state) const
 {
   GtkBorder cborder;
   gtk_style_context_get_border(const_cast<GtkStyleContext*>(gobj()), ((GtkStateFlags)(state)), &cborder);
-  return Border(&cborder, false); 
+  return Border(&cborder, true); 
 }
 
 Border StyleContext::get_padding(StateFlags state) const
 {
   GtkBorder cborder;
   gtk_style_context_get_padding(const_cast<GtkStyleContext*>(gobj()), ((GtkStateFlags)(state)), &cborder);
-  return Border(&cborder, false); 
+  return Border(&cborder, true); 
 }
 
 Border StyleContext::get_margin(StateFlags state) const
 {
   GtkBorder cborder;
   gtk_style_context_get_margin(const_cast<GtkStyleContext*>(gobj()), ((GtkStateFlags)(state)), &cborder);
-  return Border(&cborder, false); 
+  return Border(&cborder, true); 
 }
 
 } // namespace Gtk
diff --git a/gtk/src/widget.ccg b/gtk/src/widget.ccg
index f297a69..e32c149 100644
--- a/gtk/src/widget.ccg
+++ b/gtk/src/widget.ccg
@@ -158,6 +158,76 @@ void Widget_Class::drag_data_get_callback(GtkWidget* self, GdkDragContext* p0, G
   }
 }
 
+// This callback is custom implemented, because the return value RType(),
+// generated by _WRAP_VFUNC may not be appropriate.
+GtkSizeRequestMode Widget_Class::get_request_mode_vfunc_callback(GtkWidget* self)
+{
+  Glib::ObjectBase *const obj_base = static_cast<Glib::ObjectBase*>(
+      Glib::ObjectBase::_get_current_wrapper((GObject*)self));
+
+  // Non-gtkmmproc-generated custom classes implicitly call the default
+  // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc-
+  // generated classes can use this optimisation, which avoids the unnecessary
+  // parameter conversions if there is no possibility of the virtual function
+  // being overridden:
+  if(obj_base && obj_base->is_derived_())
+  {
+    CppObjectType *const obj = dynamic_cast<CppObjectType* const>(obj_base);
+    if(obj) // This can be NULL during destruction.
+    {
+      #ifdef GLIBMM_EXCEPTIONS_ENABLED
+      try // Trap C++ exceptions which would normally be lost because this is a C callback.
+      {
+      #endif //GLIBMM_EXCEPTIONS_ENABLED
+        // Call the virtual member method, which derived classes might override.
+        return ((GtkSizeRequestMode)(obj->get_request_mode_vfunc()));
+      #ifdef GLIBMM_EXCEPTIONS_ENABLED
+      }
+      catch(...)
+      {
+        Glib::exception_handlers_invoke();
+      }
+      #endif //GLIBMM_EXCEPTIONS_ENABLED
+    }
+  }
+  
+  BaseClassType *const base = static_cast<BaseClassType*>(
+      g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)) // Get the parent class of the object class (The original underlying C class).
+  );
+
+  // Call the original underlying C function:
+  if(base && base->get_request_mode)
+    return (*base->get_request_mode)(self);
+
+  // By default widgets are height-for-width.
+  // This is the default value of gtk_widget_get_request_mode().
+  return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
+  // Don't assume that the following code returns the same value. (It might,
+  // but it's unwise to depend on it.)
+  // typedef GtkSizeRequestMode RType;
+  // return RType();
+}
+
+// This vfunc is custom implemented, because the return value RType(),
+// generated by _WRAP_VFUNC may not be appropriate.
+SizeRequestMode Gtk::Widget::get_request_mode_vfunc() const
+{
+  BaseClassType *const base = static_cast<BaseClassType*>(
+      g_type_class_peek_parent(G_OBJECT_GET_CLASS(gobject_)) // Get the parent class of the object class (The original underlying C class).
+  );
+
+  if(base && base->get_request_mode)
+    return ((SizeRequestMode)((*base->get_request_mode)(const_cast<GtkWidget*>(gobj()))));
+
+  // By default widgets are height-for-width.
+  // This is the default value of gtk_widget_get_request_mode().
+  return SIZE_REQUEST_HEIGHT_FOR_WIDTH;
+  // Don't assume that the following code returns the same value. (It might,
+  // but it's unwise to depend on it.)
+  // typedef SizeRequestMode RType;
+  // return RType();
+}
+
 Widget::~Widget()
 {}
 
diff --git a/gtk/src/widget.hg b/gtk/src/widget.hg
index bec0a01..f2876d5 100644
--- a/gtk/src/widget.hg
+++ b/gtk/src/widget.hg
@@ -809,6 +809,22 @@ protected:
   _WRAP_VFUNC(void show_all(), "show_all")
   _WRAP_VFUNC(Glib::RefPtr<Atk::Object> get_accessible(), "get_accessible", refreturn, ifdef GTKMM_ATKMM_ENABLED)
 
+  virtual SizeRequestMode get_request_mode_vfunc() const;
+#m4begin
+dnl // _WRAP_VFUNC(SizeRequestMode get_request_mode() const, get_request_mode)
+dnl // Custom implementation because the default return value RType() may not be appropriate.
+dnl // _VFUNC_H is not used. It obscures the code. Prototype is written above.
+dnl // _VFUNC_CC is not used. Custom vfunc is implemented in widget.ccg.
+dnl // _VFUNC_PCC is not used. Custom vfunc_callback is implemented in widget.ccg.
+dnl // _VFUNC_PH(gtkname, crettype, cargs and names)
+  _VFUNC_PH(get_request_mode, GtkSizeRequestMode, `GtkWidget* self')
+#m4end
+
+  _WRAP_VFUNC(void get_preferred_width(int* minimum_width, int* natural_width) const, get_preferred_width)
+  _WRAP_VFUNC(void get_preferred_height_for_width(int width, int* minimum_height, int* natural_height) const, get_preferred_height_for_width)
+  _WRAP_VFUNC(void get_preferred_height(int* minimum_height, int* natural_height) const, get_preferred_height)
+  _WRAP_VFUNC(void get_preferred_width_for_height(int height, int* minimum_width, int* natural_width) const, get_preferred_width_for_height)
+
 protected:
   _CTOR_DEFAULT()
 



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