[grits] Add support for GTK 3
- From: Andy Spencer <andys src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grits] Add support for GTK 3
- Date: Mon, 21 Jan 2013 05:25:58 +0000 (UTC)
commit 5c17e7d79895982036139dcffb5c17cefb1d4d9f
Author: Andy Spencer <andy753421 gmail com>
Date: Mon Dec 3 00:12:41 2012 +0000
Add support for GTK 3
First, most of the code has already been converted to work the same on
the latest copy of GTK 2 and GTK 3. These changes include things like
using GDK_KEY_* and removing all the gdk threading code.
Second, a compatibility file was added to mimic GTK 3 features that will
not be added to GTK 2. This includes things like gtk_box_new.
Third, any other differences are resolved using GTK_CHECK_VERSION.
This was done as a last resort where there are actual differences
between GTK 2 and GTK 3, such as the "expose-event" to "draw" change.
configure.ac | 14 ++++++++++++--
examples/gl/gl.c | 13 +++++++++++--
examples/gl/mkfile | 2 +-
src/compat.h | 10 ++++++++++
src/grits-demo.c | 3 ++-
src/grits-opengl.c | 4 ++++
src/grits-test.c | 6 ++++--
src/grits.pc.in | 2 +-
src/gtkgl.c | 7 ++++++-
src/gtkgl.h | 4 ++--
src/tile-test.c | 6 ++++--
11 files changed, 57 insertions(+), 14 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index e3e9dc4..33758b7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,11 +26,21 @@ PKG_PROG_PKG_CONFIG
GTK_DOC_CHECK(1.9)
# Check for required packages
-PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.14 gobject-2.0 gthread-2.0 gmodule-2.0)
+PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.32 gobject-2.0 gthread-2.0 gmodule-2.0)
PKG_CHECK_MODULES(CAIRO, cairo)
-PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.16)
PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.26)
+# Check for gtk 3
+AC_ARG_ENABLE([gtk3],
+ AS_HELP_STRING([--enable-gtk3], [Build with gtk3 support]))
+AS_IF([test "$enable_gtk3" = "yes"],
+ [PKG_CHECK_MODULES(GTK, gtk+-3.0 >= 3.0)],
+ [PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.18)])
+AS_IF([test "$enable_gtk3" = "yes"],
+ [GTK_VERSION=gtk+-3.0],
+ [GTK_VERSION=gtk+-2.0])
+AC_SUBST(GTK_VERSION)
+
# Check for glut for example plugin
AC_CHECK_LIB(glut, glutSolidTeapot, GLUT_LIBS="-lglut")
AM_CONDITIONAL(HAVE_GLUT, test "$GLUT_LIBS" != "")
diff --git a/examples/gl/gl.c b/examples/gl/gl.c
index 45075f6..1ece4c2 100644
--- a/examples/gl/gl.c
+++ b/examples/gl/gl.c
@@ -100,10 +100,15 @@ gpointer setup(GtkWidget *widget)
XVisualInfo *xvinfo = glXChooseVisual(xdisplay, nscreen, attribs);
GLXContext context = glXCreateContext(xdisplay, xvinfo, 0, True);
- /* Fix up colormap */
+ /* Fix up visual/colormap */
+#if GTK_CHECK_VERSION(3,0,0)
+ GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
+ gtk_widget_set_visual(widget, visual);
+#else
GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
GdkColormap *cmap = gdk_colormap_new(visual, FALSE);
gtk_widget_set_colormap(widget, cmap);
+#endif
/* Disable GTK double buffering */
gtk_widget_set_double_buffered(widget, FALSE);
@@ -326,7 +331,7 @@ int main(int argc, char **argv)
{
gtk_init_check(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- GtkWidget *box = gtk_vbox_new(FALSE, 5);
+ GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
GtkWidget *draw = gtk_drawing_area_new();
GtkWidget *label = gtk_label_new("Hello, World");
GtkWidget *button = gtk_button_new_with_label("Hello, World");
@@ -334,7 +339,11 @@ int main(int argc, char **argv)
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(window, "key-press-event", G_CALLBACK(key_press), NULL);
//g_signal_connect(draw, "configure-event", G_CALLBACK(configure), data);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_signal_connect(draw, "draw", G_CALLBACK(expose), data);
+#else
g_signal_connect(draw, "expose-event", G_CALLBACK(expose), data);
+#endif
gtk_widget_set_size_request(draw, 300, 300);
gtk_widget_set_size_request(button, -1, 50);
gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0);
diff --git a/examples/gl/mkfile b/examples/gl/mkfile
index ecb6803..1205899 100644
--- a/examples/gl/mkfile
+++ b/examples/gl/mkfile
@@ -1,4 +1,4 @@
-PKGS=gtk+-2.0
+PKGS=gtk+-3.0
PROGS=gl
# Cairo
diff --git a/src/compat.h b/src/compat.h
new file mode 100644
index 0000000..2e8b4e6
--- /dev/null
+++ b/src/compat.h
@@ -0,0 +1,10 @@
+#include <gtk/gtk.h>
+
+#if ! GTK_CHECK_VERSION(3,0,0)
+static inline GtkWidget *gtk_box_new(GtkOrientation orientation, gint spacing)
+{
+ return orientation == GTK_ORIENTATION_HORIZONTAL
+ ? gtk_hbox_new(0, spacing)
+ : gtk_vbox_new(0, spacing);
+}
+#endif
diff --git a/src/grits-demo.c b/src/grits-demo.c
index 05803be..c0d7267 100644
--- a/src/grits-demo.c
+++ b/src/grits-demo.c
@@ -21,6 +21,7 @@
#include "grits.h"
+#include "compat.h"
static GritsPrefs *prefs;
static GritsPlugins *plugins;
@@ -127,7 +128,7 @@ static GtkWidget *setup_window(GtkUIManager *manager, GtkWidget **_notebook)
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *menu = gtk_ui_manager_get_widget(manager, "/Menu");
GtkWidget *notebook = gtk_notebook_new();
- GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
+ GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_box_pack_start(GTK_BOX(vbox), menu, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(viewer), TRUE, TRUE, 0);
diff --git a/src/grits-opengl.c b/src/grits-opengl.c
index c4c7dac..2bd0082 100644
--- a/src/grits-opengl.c
+++ b/src/grits-opengl.c
@@ -447,7 +447,11 @@ static void on_realize(GritsOpenGL *opengl, gpointer _)
/* Connect signals and idle functions now that opengl is fully initialized */
gtk_widget_add_events(GTK_WIDGET(opengl), GDK_KEY_PRESS_MASK);
g_signal_connect(opengl, "configure-event", G_CALLBACK(_set_projection), NULL);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_signal_connect(opengl, "draw", G_CALLBACK(on_expose), NULL);
+#else
g_signal_connect(opengl, "expose-event", G_CALLBACK(on_expose), NULL);
+#endif
g_signal_connect(opengl, "key-press-event", G_CALLBACK(on_key_press), NULL);
diff --git a/src/grits-test.c b/src/grits-test.c
index 6c393e0..cde36cd 100644
--- a/src/grits-test.c
+++ b/src/grits-test.c
@@ -21,6 +21,8 @@
#include "grits.h"
+#include "compat.h"
+
GritsPrefs *prefs = NULL;
GritsPlugins *plugins = NULL;
GritsViewer *viewer = NULL;
@@ -72,7 +74,7 @@ int main(int argc, char **argv)
viewer = grits_opengl_new(plugins, prefs);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
+ GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
GtkWidget *config = gtk_notebook_new();
g_signal_connect(window, "delete-event", G_CALLBACK(on_delete), NULL);
g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), NULL);
@@ -97,7 +99,7 @@ int main(int argc, char **argv)
gtk_widget_show_all(config);
gtk_main();
- gdk_display_close(gdk_display_get_default());
+ //gdk_display_close(gdk_display_get_default());
prefs = NULL;
plugins = NULL;
diff --git a/src/grits.pc.in b/src/grits.pc.in
index da0ea6a..81a41cc 100644
--- a/src/grits.pc.in
+++ b/src/grits.pc.in
@@ -6,6 +6,6 @@ includedir= includedir@
Name: Grits
Description: Grits is a Virtual Globe library
Version: @VERSION@
-Requires: gmodule-2.0 gtk+-2.0 libsoup-2.4
+Requires: gmodule-2.0 libsoup-2.4 @GTK_VERSION@
Libs: -L${libdir} -lgrits @GL_LIBS@
Cflags: -I${includedir}/grits @GL_CFLAGS@
diff --git a/src/gtkgl.c b/src/gtkgl.c
index 6c4913b..19f3219 100644
--- a/src/gtkgl.c
+++ b/src/gtkgl.c
@@ -108,11 +108,16 @@ void gtk_gl_enable(GtkWidget *widget)
g_object_set_data(G_OBJECT(widget), "glcontext", context);
- /* Fix up colormap */
+ /* Fix up visual/colormap */
+#if GTK_CHECK_VERSION(3,0,0)
+ GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
+ gtk_widget_set_visual(widget, visual);
+#else
GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
GdkColormap *cmap = gdk_colormap_new(visual, FALSE);
gtk_widget_set_colormap(widget, cmap);
g_object_unref(cmap);
+#endif
XFree(xvinfo);
/* Disable GTK double buffering */
diff --git a/src/gtkgl.h b/src/gtkgl.h
index fac5086..0f9f2a0 100644
--- a/src/gtkgl.h
+++ b/src/gtkgl.h
@@ -33,10 +33,10 @@
/* Call before widget is realized */
void gtk_gl_enable(GtkWidget *widget);
-/* Call at the start of "expose-event" */
+/* Call at the start of expose */
void gtk_gl_begin(GtkWidget *widget);
-/* Call at the end of "expose-event" */
+/* Call at the end of expose */
void gtk_gl_end(GtkWidget *widget);
/* Call when done to cleanup data */
diff --git a/src/tile-test.c b/src/tile-test.c
index 0951541..e4b2379 100644
--- a/src/tile-test.c
+++ b/src/tile-test.c
@@ -23,6 +23,8 @@
#include "data/grits-tms.h"
#include "objects/grits-tile.h"
+#include "compat.h"
+
struct CacheState {
GtkWidget *image;
GtkWidget *status;
@@ -151,8 +153,8 @@ int main(int argc, char **argv)
gtk_init(&argc, &argv);
GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- GtkWidget *vbox1 = gtk_vbox_new(FALSE, 0);
- GtkWidget *vbox2 = gtk_vbox_new(FALSE, 0);
+ GtkWidget *vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ GtkWidget *vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
GtkWidget *status = gtk_statusbar_new();
GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
GtkWidget *bmng_image = gtk_image_new();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]