[PATCH 2/2] Prepare to compile with gtk-3

Linus Torvalds torvalds at linux-foundation.org
Mon Jan 28 11:24:09 PST 2013


From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Mon, 28 Jan 2013 11:01:45 -0800
Subject: [PATCH 2/2] Prepare to compile with gtk-3

To actually compile with gtk-3 you currently need to disable the use of
OSM (compatible with gtk2 only for now).  And obviously figure out the
headers and libraries by using pkg-config on gtk-3 instead of gtk-2.
But now it should be only a Makefile change.

Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
---

This does some tiny cleanups (gtk_label_set was deprecated before, and is 
gone in gtk3) and fixes the about dialog so that it should work across gtk 
versions. It also handles the different GtkDrawable cairo interface in 
gtk-3.

 gtk-gui.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 57 insertions(+), 21 deletions(-)

diff --git a/gtk-gui.c b/gtk-gui.c
index 15743f37d213..d4f6acd53142 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -121,7 +121,7 @@ void report_error(GError* error)
 		error_count++;
 		char buffer[256];
 		snprintf(buffer, sizeof(buffer), _("Failed to open %i files."), error_count);
-		gtk_label_set(GTK_LABEL(error_label), buffer);
+		gtk_label_set_text(GTK_LABEL(error_label), buffer);
 	}
 }
 
@@ -397,7 +397,6 @@ GtkTreeViewColumn *tree_view_column(GtkWidget *tree_view, int index, const char
 		gtk_tree_view_column_set_cell_data_func(col, renderer, data_func, (void *)(long)index, NULL);
 	else
 		gtk_tree_view_column_add_attribute(col, renderer, "text", index);
-	gtk_object_set(GTK_OBJECT(renderer), "alignment", align, NULL);
 	switch (align) {
 	case PANGO_ALIGN_LEFT:
 		xalign = 0.0;
@@ -1042,6 +1041,7 @@ static void about_dialog(GtkWidget *w, gpointer data)
 {
 	const char *logo_property = NULL;
 	GdkPixbuf *logo = NULL;
+	GtkWidget * dialog;
 
 	if (need_icon) {
 		GtkWidget *image = gtk_image_new_from_file(subsurface_icon_name());
@@ -1051,6 +1051,12 @@ static void about_dialog(GtkWidget *w, gpointer data)
 			logo_property = "logo";
 		}
 	}
+	dialog = gtk_about_dialog_new();
+#if !GTK_CHECK_VERSION(2,24,0) /* F*cking gtk */
+	gtk_about_dialog_set_url_hook(about_dialog_link_cb, NULL, NULL);
+#else
+	g_signal_connect(GTK_ABOUT_DIALOG(dialog), "activate-link", G_CALLBACK(about_dialog_link_cb), NULL);
+#endif
 	gtk_show_about_dialog(NULL,
 		"title", _("About Subsurface"),
 		"program-name", "Subsurface",
@@ -1065,7 +1071,6 @@ static void about_dialog(GtkWidget *w, gpointer data)
 		/* Must be last: */
 		logo_property, logo,
 		NULL);
-	gtk_about_dialog_set_url_hook(about_dialog_link_cb, NULL, NULL);
 }
 
 static void view_list(GtkWidget *w, gpointer data)
@@ -1696,31 +1701,23 @@ static gboolean profile_tooltip (GtkWidget *widget, gint x, gint y,
 static double zoom_factor = 1.0;
 static int zoom_x = -1, zoom_y = -1;
 
-static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+static gboolean common_drawing_function(GtkWidget *widget, struct graphics_context *gc)
 {
 	int i = 0;
 	struct dive *dive = current_dive;
-	GtkAllocation allocation;
-	static struct graphics_context gc = { .printer = 0 };
 
-	/* the drawing area gives TOTAL width * height - x,y is used as the topx/topy offset
-	 * so effective drawing area is width-2x * height-2y */
-	gtk_widget_get_allocation(widget, &allocation);
-	gc.drawing_area.width = allocation.width;
-	gc.drawing_area.height = allocation.height;
-	gc.drawing_area.x = MIN(50,gc.drawing_area.width / 20.0);
-	gc.drawing_area.y = MIN(50,gc.drawing_area.height / 20.0);
+	gc->drawing_area.x = MIN(50,gc->drawing_area.width / 20.0);
+	gc->drawing_area.y = MIN(50,gc->drawing_area.height / 20.0);
 
-	gc.cr = gdk_cairo_create(gtk_widget_get_window(widget));
 	g_object_set(widget, "has-tooltip", TRUE, NULL);
-	g_signal_connect(widget, "query-tooltip", G_CALLBACK(profile_tooltip), &gc);
-	init_profile_background(&gc);
-	cairo_paint(gc.cr);
+	g_signal_connect(widget, "query-tooltip", G_CALLBACK(profile_tooltip), gc);
+	init_profile_background(gc);
+	cairo_paint(gc->cr);
 
 	if (zoom_factor > 1.0) {
 		double n = -(zoom_factor-1);
-		cairo_translate(gc.cr, n*zoom_x, n*zoom_y);
-		cairo_scale(gc.cr, zoom_factor, zoom_factor);
+		cairo_translate(gc->cr, n*zoom_x, n*zoom_y);
+		cairo_scale(gc->cr, zoom_factor, zoom_factor);
 	}
 
 	if (dive) {
@@ -1734,13 +1731,48 @@ static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer
 			tooltip_rects = NULL;
 		}
 		tooltips = 0;
-		plot(&gc, dive, SC_SCREEN);
+		plot(gc, dive, SC_SCREEN);
 	}
-	cairo_destroy(gc.cr);
 
 	return FALSE;
 }
 
+#if GTK_CHECK_VERSION(3,0,0)
+
+static gboolean draw_callback(GtkWidget *widget, cairo_t *cr, gpointer data)
+{
+	guint width, height;
+	static struct graphics_context gc = { .printer = 0 };
+
+	width = gtk_widget_get_allocated_width(widget);
+	height = gtk_widget_get_allocated_height(widget);
+
+	gc.drawing_area.width = width;
+	gc.drawing_area.height = height;
+	gc.cr = cr;
+
+	return common_drawing_function(widget, &gc);
+}
+
+#else /* gtk2 */
+
+static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+	GtkAllocation allocation;
+	static struct graphics_context gc = { .printer = 0 };
+
+	/* the drawing area gives TOTAL width * height - x,y is used as the topx/topy offset
+	 * so effective drawing area is width-2x * height-2y */
+	gtk_widget_get_allocation(widget, &allocation);
+	gc.drawing_area.width = allocation.width;
+	gc.drawing_area.height = allocation.height;
+	gc.cr = gdk_cairo_create(gtk_widget_get_window(widget));
+
+	return common_drawing_function(widget, &gc);
+}
+
+#endif
+
 static void zoom_event(int x, int y, double inc)
 {
 	zoom_x = x;
@@ -1815,7 +1847,11 @@ GtkWidget *dive_profile_widget(void)
 
 	da = gtk_drawing_area_new();
 	gtk_widget_set_size_request(da, 350, 250);
+#if GTK_CHECK_VERSION(3,0,0)
+	g_signal_connect(da, "draw", G_CALLBACK (draw_callback), NULL);
+#else
 	g_signal_connect(da, "expose_event", G_CALLBACK(expose_event), NULL);
+#endif
 	g_signal_connect(da, "button-press-event", G_CALLBACK(clicked), NULL);
 	g_signal_connect(da, "scroll-event", G_CALLBACK(scroll_event), NULL);
 	g_signal_connect(da, "button-release-event", G_CALLBACK(released), NULL);
-- 
1.8.1.1.271.g02f55e6



More information about the subsurface mailing list