[gtkmm] Widget (and others): Add methods needed by custom widgets.
- From: Murray Cumming <murrayc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm] Widget (and others): Add methods needed by custom widgets.
- Date: Thu, 27 Jan 2011 15:09:10 +0000 (UTC)
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]