diff options
author | Frederic Plourde <frederic.plourde@collabora.com> | 2012-10-10 13:43:07 +0000 |
---|---|---|
committer | Ross Burton <ross.burton@intel.com> | 2012-10-10 16:31:52 +0100 |
commit | eff37b6a98f56eeb328501ceed175c0c123cf1a8 (patch) | |
tree | c721a5d6497120b92171df34a2b3674e89cf3931 | |
parent | 9a256abf7ee11dbe91cef79f3bc002732f81c393 (diff) |
Port to GTK+ 3.
Signed-off-by: Ross Burton <ross.burton@intel.com>
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/button.c | 12 | ||||
-rw-r--r-- | src/callbacks.c | 62 | ||||
-rw-r--r-- | src/callbacks.h | 4 | ||||
-rw-r--r-- | src/fakedev.h | 5 | ||||
-rw-r--r-- | src/keys.c | 4 | ||||
-rw-r--r-- | src/main.c | 150 | ||||
-rw-r--r-- | src/prefs.h | 2 |
8 files changed, 135 insertions, 106 deletions
diff --git a/configure.ac b/configure.ac index fac53c5..401171c 100644 --- a/configure.ac +++ b/configure.ac @@ -46,7 +46,7 @@ AM_CONDITIONAL(HAVE_GCONF, test -n "$GCONF_REQ") dnl TODO: make gconf optional -PKG_CHECK_MODULES(APP, [gtk+-2.0 $GCONF_REQ]) +PKG_CHECK_MODULES(APP, [gtk+-3.0 $GCONF_REQ]) dnl ------ XTest ------------------------------------------------------------ diff --git a/src/button.c b/src/button.c index b9107be..f274e1d 100644 --- a/src/button.c +++ b/src/button.c @@ -17,7 +17,7 @@ #include <string.h> #include <stdio.h> #include <glib.h> -#include <gtk/gtkimage.h> +#include <gtk/gtk.h> #include "fakedev.h" FakeButton * @@ -72,8 +72,9 @@ void button_press (GtkWidget * w, GdkEventButton * event, FakeButton * button) { g_return_if_fail (button != NULL); - gtk_image_set_from_pixmap (GTK_IMAGE (button->image), button->active_img, - NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE (button->image), + gdk_pixbuf_get_from_surface (button->active_img, + 0, 0, button->width, button->height)); keys_send_key (button->app, button->keysym, KEYDOWN); } @@ -81,8 +82,9 @@ void button_release (GtkWidget * w, GdkEventButton * event, FakeButton * button) { g_return_if_fail (button != NULL); - gtk_image_set_from_pixmap (GTK_IMAGE (button->image), button->normal_img, - NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE (button->image), + gdk_pixbuf_get_from_surface (button->normal_img, + 0, 0, button->width, button->height)); keys_send_key (button->app, button->keysym, KEYUP); } diff --git a/src/callbacks.c b/src/callbacks.c index e291ee9..e46314e 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -17,11 +17,6 @@ #include <signal.h> #include <gtk/gtk.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkmenu.h> -#include <gtk/gtkmenuitem.h> -#include <gtk/gtkcheckmenuitem.h> -#include <gtk/gtkwindow.h> #include "fakedev.h" extern pid_t xnest_pid; @@ -47,7 +42,7 @@ on_quit_activate (GtkMenuItem * menuitem, FakeApp * app) } void -on_window_destroy (GtkObject * object, FakeApp * app) +on_window_destroy (GInitiallyUnowned * object, FakeApp * app) { quit (app); } @@ -67,24 +62,51 @@ on_popup_menu_show (GtkWidget * widget, GdkEventButton * event, FakeApp * app) void on_show_decorations_toggle (GtkCheckMenuItem * menuitem, FakeApp * app) { + GdkWindow *gdk_window; + + gdk_window = gtk_widget_get_window (app->window); if (gtk_window_get_decorated (GTK_WINDOW (app->window))) { - GdkBitmap *mask; - mask = - gdk_pixmap_new (app->fixed->window, app->device_width, - app->device_height, 1); - gdk_pixbuf_render_threshold_alpha (app->device_img, mask, 0, 0, 0, 0, - -1, -1, 128); - gtk_widget_realize (app->window); - gdk_window_shape_combine_mask (app->window->window, mask, 0, 0); - - gtk_widget_hide (app->menubar); - gtk_window_set_decorated (GTK_WINDOW (app->window), FALSE); - gtk_check_menu_item_set_active (menuitem, FALSE); - } + /* we're shaping the window only if device image has an alpha channel */ + if (gdk_pixbuf_get_has_alpha (app->device_img)) + { + gint root_x, root_y; + cairo_surface_t *mask; + cairo_region_t *region; + cairo_t *cr; + + mask = cairo_image_surface_create (CAIRO_FORMAT_A1, + app->device_width, app->device_height); + + cr = cairo_create (mask); + gdk_cairo_set_source_pixbuf (cr, app->device_img, 0, 0); + cairo_paint (cr); + + region = gdk_cairo_region_create_from_surface (mask); + + gtk_window_get_position (GTK_WINDOW (app->window), &root_x, &root_y); + gtk_widget_hide (app->window); + gdk_window_shape_combine_region (gdk_window, region, 0, 0); + gtk_widget_shape_combine_region (app->window, region); + gtk_widget_show (app->window); + + cairo_region_destroy (region); + cairo_destroy (cr); + cairo_surface_destroy (mask); + + gtk_widget_realize (app->window); + gtk_window_move (GTK_WINDOW (app->window), root_x, root_y); + + gtk_widget_hide (app->menubar); + gtk_window_set_decorated (GTK_WINDOW (app->window), FALSE); + gtk_check_menu_item_set_active (menuitem, FALSE); + } + } else { - gdk_window_shape_combine_mask (app->window->window, NULL, 0, 0); + gtk_widget_shape_combine_region (app->window, NULL); + gdk_window_shape_combine_region (gdk_window, NULL, 0, 0); + gtk_widget_show (app->menubar); gtk_window_set_decorated (GTK_WINDOW (app->window), TRUE); gtk_check_menu_item_set_active (menuitem, TRUE); diff --git a/src/callbacks.h b/src/callbacks.h index 3749981..41cd8eb 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -1,4 +1,4 @@ -#include <gtk/gtkmenuitem.h> +#include <gtk/gtk.h> /* GTK+ callbacks */ @@ -10,7 +10,7 @@ void on_quit_activate (GtkMenuItem * menuitem, FakeApp * app); void on_about_activate (GtkMenuItem * menuitem, FakeApp * app); -void on_window_destroy (GtkObject * widget, FakeApp * app); +void on_window_destroy (GInitiallyUnowned * widget, FakeApp * app); gboolean on_popup_menu_show (GtkWidget * widget, GdkEventButton * event, diff --git a/src/fakedev.h b/src/fakedev.h index e32e379..b5fd137 100644 --- a/src/fakedev.h +++ b/src/fakedev.h @@ -24,8 +24,7 @@ #include <sys/stat.h> #include <fcntl.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtkimage.h> +#include <gtk/gtk.h> #include <X11/extensions/XTest.h> #include "config.h" @@ -91,7 +90,7 @@ struct FakeButton KeySym keysym; GdkPixbuf *overlay; - GdkPixmap *normal_img, *active_img; + cairo_surface_t *normal_img, *active_img; int repeat; @@ -36,8 +36,8 @@ keys_xnest_connect (FakeApp * app) unsigned int num_children; Window root, parent; Window *windows; - XQueryTree (GDK_WINDOW_XDISPLAY (app->winnest->window), - GDK_WINDOW_XWINDOW (app->winnest->window), &root, &parent, + XQueryTree (GDK_WINDOW_XDISPLAY (gtk_widget_get_window (app->winnest)), + GDK_WINDOW_XID (gtk_widget_get_window (app->winnest)), &root, &parent, &windows, &num_children); if (num_children != 0) { @@ -83,57 +83,57 @@ fakeapp_new (void) g_assert (builder != NULL); widget = GTK_WIDGET (gtk_builder_get_object (builder, "send_signal")); - g_object_connect (G_OBJECT (widget), "activate", - G_CALLBACK (on_send_signal_activate), app, NULL); + g_signal_connect (G_OBJECT (widget), "activate", + G_CALLBACK (on_send_signal_activate), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "quit")); - g_object_connect (G_OBJECT (widget), "activate", - G_CALLBACK (on_quit_activate), app, NULL); + g_signal_connect (G_OBJECT (widget), "activate", + G_CALLBACK (on_quit_activate), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "about")); - g_object_connect (G_OBJECT (widget), "activate", - G_CALLBACK (on_about_activate), app, NULL); - - widget = GTK_WIDGET (gtk_builder_get_object (builder, "window")); - g_object_connect (G_OBJECT (widget), "destroy", - G_CALLBACK (on_window_destroy), app, NULL); + g_signal_connect (G_OBJECT (widget), "activate", + G_CALLBACK (on_about_activate), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "eventbox1")); - g_object_connect (G_OBJECT (widget), "button_press_event", - G_CALLBACK (on_popup_menu_show), app, NULL); + g_signal_connect (G_OBJECT (widget), "button_press_event", + G_CALLBACK (on_popup_menu_show), app); + + widget = GTK_WIDGET (gtk_builder_get_object (builder, "window")); + g_signal_connect (G_OBJECT (widget), "destroy", + G_CALLBACK (on_window_destroy), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "show_decorations")); - g_object_connect (G_OBJECT (widget), "activate", - G_CALLBACK (on_show_decorations_toggle), app, NULL); + g_signal_connect (G_OBJECT (widget), "activate", + G_CALLBACK (on_show_decorations_toggle), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "aboutwindow")); - g_object_connect (G_OBJECT (widget), "delete_event", - G_CALLBACK (on_delete_event_hide), app, NULL); + g_signal_connect (G_OBJECT (widget), "delete_event", + G_CALLBACK (on_delete_event_hide), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "prefswindow")); - g_object_connect (G_OBJECT (widget), "delete_event", - G_CALLBACK (on_delete_event_hide), app, NULL); + g_signal_connect (G_OBJECT (widget), "delete_event", + G_CALLBACK (on_delete_event_hide), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "aboutwindow")); - g_object_connect (G_OBJECT (widget), "delete_event", - G_CALLBACK (on_delete_event_hide), app, NULL); + g_signal_connect (G_OBJECT (widget), "delete_event", + G_CALLBACK (on_delete_event_hide), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "select_device")); - g_object_connect (G_OBJECT (widget), "activate", - G_CALLBACK (on_select_device), app, NULL); + g_signal_connect (G_OBJECT (widget), "activate", + G_CALLBACK (on_select_device), app); #if HAVE_GCONF widget = GTK_WIDGET (gtk_builder_get_object (builder, "preferences")); - g_object_connect (G_OBJECT (widget), "activate", - G_CALLBACK (on_preferences_activate), app, NULL); + g_signal_connect (G_OBJECT (widget), "activate", + G_CALLBACK (on_preferences_activate), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_apply")); - g_object_connect (G_OBJECT (widget), "clicked", - G_CALLBACK (on_prefs_apply_clicked), app, NULL); + g_signal_connect (G_OBJECT (widget), "clicked", + G_CALLBACK (on_prefs_apply_clicked), app); widget = GTK_WIDGET (gtk_builder_get_object (builder, "button_close")); - g_object_connect (G_OBJECT (widget), "clicked", - G_CALLBACK (on_prefs_cancel_clicked), app, NULL); + g_signal_connect (G_OBJECT (widget), "clicked", + G_CALLBACK (on_prefs_cancel_clicked), app); #else widget = GTK_WIDGET (gtk_builder_get_object (builder, "preferences")); gtk_widget_hide (widget); @@ -189,8 +189,6 @@ fakeapp_new (void) void fakeapp_create_gui (FakeApp * app) { - GdkColor color; - GdkGC *gc; FakeButton *button; /* Configure the main window title and size */ @@ -217,52 +215,59 @@ fakeapp_create_gui (FakeApp * app) for (button = app->button_head; button; button = button->next) { GtkWidget *eventbox; - button->normal_img = - gdk_pixmap_new (app->fixed->window, button->width, button->height, - -1); - gdk_draw_pixbuf (GDK_DRAWABLE (button->normal_img), NULL, - app->device_img, button->x, button->y, 0, 0, - button->width, button->height, GDK_RGB_DITHER_NONE, 0, - 0); - button->image = gtk_image_new_from_pixmap (button->normal_img, NULL); + + button->normal_img = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + button->width, button->height); + + cairo_t *cr = cairo_create (button->normal_img); + gdk_cairo_set_source_pixbuf (cr, app->device_img, button->x, button->y); + cairo_paint (cr); + cairo_destroy (cr); + + button->image = gtk_image_new_from_pixbuf (gdk_pixbuf_get_from_surface + (button->normal_img, 0, 0, button->width, button->height)); + gtk_widget_show (button->image); eventbox = gtk_event_box_new (); gtk_widget_show (eventbox); gtk_container_add (GTK_CONTAINER (eventbox), button->image); g_signal_connect (eventbox, "button-press-event", - G_CALLBACK (button_press), button); + G_CALLBACK (button_press), button); g_signal_connect (eventbox, "button-release-event", - G_CALLBACK (button_release), button); + G_CALLBACK (button_release), button); gtk_fixed_put (GTK_FIXED (app->fixed), eventbox, button->x, button->y); + button->active_img = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + button->width, button->height); + + g_assert (button->active_img); + if (button->overlay) - { - button->active_img = - gdk_pixmap_new (app->fixed->window, button->width, button->height, - -1); - g_assert (button->active_img); - gc = gdk_gc_new (GDK_DRAWABLE (button->active_img)); - gdk_draw_drawable (button->active_img, gc, button->normal_img, 0, 0, - 0, 0, -1, -1); - gdk_draw_pixbuf (button->active_img, gc, button->overlay, 0, 0, 0, - 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); - } + { + cairo_t *cr = cairo_create (button->active_img); + cairo_set_source_surface (cr, button->normal_img, 0, 0); + cairo_paint (cr); + + gdk_cairo_set_source_pixbuf (cr, button->overlay, 0, 0); + cairo_paint_with_alpha (cr, 1.0); + + cairo_destroy (cr); + } else - { - button->active_img = - gdk_pixmap_new (app->fixed->window, button->width, button->height, - -1); - gdk_draw_pixbuf (button->active_img, NULL, app->device_img, - button->x, button->y, 0, 0, button->width, - button->height, GDK_RGB_DITHER_NONE, 0, 0); - gc = gdk_gc_new (GDK_DRAWABLE (button->active_img)); - gdk_color_parse ("yellow", &color); - gdk_gc_set_rgb_fg_color (gc, &color); - gdk_draw_rectangle (GDK_DRAWABLE (button->active_img), gc, FALSE, 0, - 0, button->width - 1, button->height - 1); - g_object_unref (gc); - } + { + cairo_t *cr = cairo_create (button->active_img); + gdk_cairo_set_source_pixbuf (cr, app->device_img, button->x, button->y); + cairo_paint (cr); + + cairo_set_source_rgb (cr, 1.0, 1.0, 0.0); + cairo_set_line_width (cr, 2); + cairo_rectangle (cr, 0, 0, button->width, button->height); + cairo_stroke (cr); + + cairo_destroy (cr); + } } + gtk_widget_show (app->window); } @@ -277,11 +282,12 @@ key_event (GtkWidget * widget, GdkEventKey * event, FakeApp * app) { XEvent xevent; xevent.xkey.type = - (event->type == GDK_KEY_PRESS) ? KeyPress : KeyRelease; - xevent.xkey.window = GDK_WINDOW_XWINDOW (app->winnest->window); + (event->type == GDK_KEY_PRESS) ? KeyPress : KeyRelease; + xevent.xkey.window = GDK_WINDOW_XID + (gtk_widget_get_window (app->winnest)); xevent.xkey.root = - GDK_WINDOW_XWINDOW (gdk_screen_get_root_window - (gdk_drawable_get_screen (app->winnest->window))); + GDK_WINDOW_XID (gdk_screen_get_root_window + (gdk_window_get_screen (gtk_widget_get_window (app->winnest)))); xevent.xkey.time = event->time; /* FIXME, the following might cause problems for non-GTK apps */ @@ -296,8 +302,8 @@ key_event (GtkWidget * widget, GdkEventKey * event, FakeApp * app) gdk_error_trap_push (); XSendEvent (GDK_WINDOW_XDISPLAY - (app->winnest->window), app->xnest_window, - False, NoEventMask, &xevent); + (gtk_widget_get_window (app->winnest)), app->xnest_window, + False, NoEventMask, &xevent); gdk_display_sync (gtk_widget_get_display (widget)); @@ -318,7 +324,7 @@ fakeapp_start_server (FakeApp * app) gchar **exec_vector = NULL; g_snprintf (winid, 32, "%li", - gdk_x11_drawable_get_xid (app->winnest->window)); + gdk_x11_window_get_xid (gtk_widget_get_window (app->winnest))); g_snprintf (exec_buf, 2048, "%s %s %s -parent %s", "Xnest", app->xnest_dpy_name, app->xnest_bin_options, winid); diff --git a/src/prefs.h b/src/prefs.h index ae79442..5fe62a0 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -1,4 +1,4 @@ -#include <gtk/gtkmenuitem.h> +#include <gtk/gtk.h> #include "fakedev.h" #define GCONF_DISPLAY "/apps/Xoo/display" |