[geany/geany] d6fba7: Make GeanyWrapLabel work with GTK3

Colomban Wendling git-noreply at geany.org
Tue Jan 29 14:35:24 UTC 2013


Branch:      refs/heads/gtk3-support
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Tue, 09 Oct 2012 11:25:12 UTC
Commit:      d6fba7ac8244ebf077e76468a5072552fa02aa89
             https://github.com/geany/geany/commit/d6fba7ac8244ebf077e76468a5072552fa02aa89

Log Message:
-----------
Make GeanyWrapLabel work with GTK3

Although theoretically GtkLabel from GTK3 should be able to replace
GeanyWrapLabel altogether, a bug [1] with it makes it use way too much
space in our about dialog (and possibly other places), making it not
really usable.

So, port the GeanyWrapLabel hack to GTK3, with the appropriate
additional hacks for it to work.  At least it looks good and don't
seem to have resizing issues now.

[1] https://bugzilla.gnome.org/show_bug.cgi?id=657621


Modified Paths:
--------------
    src/geanywraplabel.c
    src/geanywraplabel.h

Modified: src/geanywraplabel.c
102 files changed, 96 insertions(+), 6 deletions(-)
===================================================================
@@ -29,8 +29,6 @@
 #include "utils.h"
 #include "geanywraplabel.h"
 
-#if ! GTK_CHECK_VERSION(3, 0, 0)
-
 
 struct _GeanyWrapLabelClass
 {
@@ -50,9 +48,22 @@ struct _GeanyWrapLabel
 };
 
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+static gboolean geany_wrap_label_draw(GtkWidget *widget, cairo_t *cr);
+static void geany_wrap_label_get_preferred_width (GtkWidget *widget,
+		gint *minimal_width, gint *natural_width);
+static void geany_wrap_label_get_preferred_height (GtkWidget *widget,
+		gint *minimal_height, gint *natural_height);
+static void geany_wrap_label_get_preferred_width_for_height (GtkWidget *widget,
+		gint height, gint *minimal_width, gint *natural_width);
+static void geany_wrap_label_get_preferred_height_for_width (GtkWidget *widget,
+		gint width, gint *minimal_height, gint *natural_height);
+static GtkSizeRequestMode geany_wrap_label_get_request_mode(GtkWidget *widget);
+#else
+static gboolean geany_wrap_label_expose		(GtkWidget *widget, GdkEventExpose *event);
 static void geany_wrap_label_size_request	(GtkWidget *widget, GtkRequisition *req);
+#endif
 static void geany_wrap_label_size_allocate	(GtkWidget *widget, GtkAllocation *alloc);
-static gboolean geany_wrap_label_expose		(GtkWidget *widget, GdkEventExpose *event);
 static void geany_wrap_label_set_wrap_width	(GtkWidget *widget, gint width);
 static void geany_wrap_label_label_notify	(GObject *object, GParamSpec *pspec, gpointer data);
 
@@ -63,9 +74,18 @@ static void geany_wrap_label_class_init(GeanyWrapLabelClass *klass)
 {
 	GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
 
-	widget_class->size_request = geany_wrap_label_size_request;
 	widget_class->size_allocate = geany_wrap_label_size_allocate;
+#if GTK_CHECK_VERSION(3, 0, 0)
+	widget_class->draw = geany_wrap_label_draw;
+	widget_class->get_preferred_width = geany_wrap_label_get_preferred_width;
+	widget_class->get_preferred_width_for_height = geany_wrap_label_get_preferred_width_for_height;
+	widget_class->get_preferred_height = geany_wrap_label_get_preferred_height;
+	widget_class->get_preferred_height_for_width = geany_wrap_label_get_preferred_height_for_width;
+	widget_class->get_request_mode = geany_wrap_label_get_request_mode;
+#else
+	widget_class->size_request = geany_wrap_label_size_request;
 	widget_class->expose_event = geany_wrap_label_expose;
+#endif
 
 	g_type_class_add_private(klass, sizeof (GeanyWrapLabelPrivate));
 }
@@ -120,6 +140,67 @@ static void geany_wrap_label_label_notify(GObject *object, GParamSpec *pspec, gp
 }
 
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+/* makes sure the layout is setup for rendering and chains to parent renderer */
+static gboolean geany_wrap_label_draw(GtkWidget *widget, cairo_t *cr)
+{
+	GeanyWrapLabel *self = GEANY_WRAP_LABEL(widget);
+	PangoLayout *layout = gtk_label_get_layout(GTK_LABEL(widget));
+
+	pango_layout_set_width(layout, self->priv->wrap_width * PANGO_SCALE);
+	pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+
+	return (* GTK_WIDGET_CLASS(geany_wrap_label_parent_class)->draw)(widget, cr);
+}
+
+
+static void geany_wrap_label_get_preferred_width (GtkWidget *widget,
+		gint *minimal_width, gint *natural_width)
+{
+	*minimal_width = *natural_width = 0;
+}
+
+
+static void geany_wrap_label_get_preferred_width_for_height (GtkWidget *widget,
+		gint height, gint *minimal_width, gint *natural_width)
+{
+	PangoLayout *layout = gtk_label_get_layout(GTK_LABEL(widget));;
+
+	pango_layout_set_height(layout, height * PANGO_SCALE);
+	pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+	pango_layout_get_pixel_size(layout, natural_width, NULL);
+
+	*minimal_width = 0;
+}
+
+
+static void geany_wrap_label_get_preferred_height (GtkWidget *widget,
+		gint *minimal_height, gint *natural_height)
+{
+	*minimal_height = *natural_height = GEANY_WRAP_LABEL(widget)->priv->wrap_height;
+}
+
+
+static void geany_wrap_label_get_preferred_height_for_width (GtkWidget *widget,
+		gint width, gint *minimal_height, gint *natural_height)
+{
+	PangoLayout *layout = gtk_label_get_layout(GTK_LABEL(widget));
+
+	pango_layout_set_width(layout, width * PANGO_SCALE);
+	pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+	pango_layout_get_pixel_size(layout, NULL, natural_height);
+
+	*minimal_height = *natural_height;
+}
+
+
+static GtkSizeRequestMode geany_wrap_label_get_request_mode(GtkWidget *widget)
+{
+	return GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT;
+}
+
+#else /* GTK3 */
+
 /* makes sure the layout is setup for rendering and chains to parent renderer */
 static gboolean geany_wrap_label_expose(GtkWidget *widget, GdkEventExpose *event)
 {
@@ -140,6 +221,7 @@ static void geany_wrap_label_size_request(GtkWidget *widget, GtkRequisition *req
 	req->width = 0;
 	req->height = GEANY_WRAP_LABEL(widget)->priv->wrap_height;
 }
+#endif /* GTK3 */
 
 
 /* Sets the wrap width to the width allocated to us. */
@@ -148,6 +230,16 @@ static void geany_wrap_label_size_allocate(GtkWidget *widget, GtkAllocation *all
 	(* GTK_WIDGET_CLASS(geany_wrap_label_parent_class)->size_allocate)(widget, alloc);
 
 	geany_wrap_label_set_wrap_width(widget, alloc->width);
+
+#if GTK_CHECK_VERSION(3, 0, 0)
+{
+	/* ask the parent to recompute our size, because it seems GTK3 size
+	 * caching is too aggressive */
+	GtkWidget *parent = gtk_widget_get_parent(widget);
+	if (GTK_IS_CONTAINER(parent))
+		gtk_container_check_resize(GTK_CONTAINER(parent));
+}
+#endif
 }
 
 
@@ -155,5 +247,3 @@ GtkWidget *geany_wrap_label_new(const gchar *text)
 {
 	return g_object_new(GEANY_WRAP_LABEL_TYPE, "label", text, NULL);
 }
-
-#endif


Modified: src/geanywraplabel.h
25 files changed, 0 insertions(+), 25 deletions(-)
===================================================================
@@ -25,8 +25,6 @@
 G_BEGIN_DECLS
 
 
-#if ! GTK_CHECK_VERSION(3, 0, 0)
-
 #define GEANY_WRAP_LABEL_TYPE				(geany_wrap_label_get_type())
 #define GEANY_WRAP_LABEL(obj)				(G_TYPE_CHECK_INSTANCE_CAST((obj), \
 	GEANY_WRAP_LABEL_TYPE, GeanyWrapLabel))
@@ -44,29 +42,6 @@
 GType			geany_wrap_label_get_type			(void);
 GtkWidget*		geany_wrap_label_new				(const gchar *text);
 
-#else /* GTK 3.0 */
-
-#define GEANY_WRAP_LABEL_TYPE		GTK_TYPE_LABEL
-#define GEANY_WRAP_LABEL			GTK_LABEL
-#define GEANY_WRAP_LABEL_CLASS		GTK_LABEL_CLASS
-#define IS_GEANY_WRAP_LABEL			GTK_IS_LABEL
-#define IS_GEANY_WRAP_LABEL_CLASS	GTK_IS_LABEL_CLASS
-
-#define GeanyWrapLabel		GtkLabel
-#define GeanyWrapLabelClass	GtkLabelClass
-
-#define geany_wrap_label_get_type	gtk_label_get_type
-#define geany_wrap_label_new(text) \
-	g_object_new(GTK_TYPE_LABEL, \
-				 "label", (text), \
-				 "wrap", TRUE, \
-				 "wrap-mode", PANGO_WRAP_WORD_CHAR, \
-				 "xalign", 0.0, \
-				 "yalign", 0.0, \
-				 NULL)
-
-#endif
-
 
 G_END_DECLS
 



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list