summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederic Plourde <frederic.plourde@collabora.com>2012-10-10 13:43:07 +0000
committerRoss Burton <ross.burton@intel.com>2012-10-10 16:31:52 +0100
commiteff37b6a98f56eeb328501ceed175c0c123cf1a8 (patch)
treec721a5d6497120b92171df34a2b3674e89cf3931
parent9a256abf7ee11dbe91cef79f3bc002732f81c393 (diff)
Port to GTK+ 3.
Signed-off-by: Ross Burton <ross.burton@intel.com>
-rw-r--r--configure.ac2
-rw-r--r--src/button.c12
-rw-r--r--src/callbacks.c62
-rw-r--r--src/callbacks.h4
-rw-r--r--src/fakedev.h5
-rw-r--r--src/keys.c4
-rw-r--r--src/main.c150
-rw-r--r--src/prefs.h2
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;
diff --git a/src/keys.c b/src/keys.c
index 140f8df..6c7066e 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -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)
{
diff --git a/src/main.c b/src/main.c
index 946832a..ac14d97 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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"