summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Karapetsas <[email protected]>2014-01-16 10:02:43 +0100
committerStefano Karapetsas <[email protected]>2014-01-16 10:02:43 +0100
commit73b9047c8d221558fa3bd3ed0f6a17d76fe84910 (patch)
tree9c7811c4e10e2438f81b89afaea86223c5984256
parent250aa6b573bc495efe96dad816267daf65182a3c (diff)
downloadmate-netbook-73b9047c8d221558fa3bd3ed0f6a17d76fe84910.tar.bz2
mate-netbook-73b9047c8d221558fa3bd3ed0f6a17d76fe84910.tar.xz
mate-window-picker-applet: Add GTK3 support
-rw-r--r--configure.ac1
-rw-r--r--mate-window-picker-applet/applet.c16
-rw-r--r--mate-window-picker-applet/task-item.c66
-rw-r--r--mate-window-picker-applet/task-title.c92
4 files changed, 156 insertions, 19 deletions
diff --git a/configure.ac b/configure.ac
index 5839720..88675c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,6 +70,7 @@ PKG_CHECK_MODULES(MATEWINDOWPICKER_DEPS,
glib-2.0
gio-2.0
libwnck-$LIBWNCK_API_VERSION
+ mate-desktop-2.0
)
AC_SUBST(MATEWINDOWPICKER_DEPS_CFLAGS)
AC_SUBST(MATEWINDOWPICKER_DEPS_LIBS)
diff --git a/mate-window-picker-applet/applet.c b/mate-window-picker-applet/applet.c
index be98536..2edd45e 100644
--- a/mate-window-picker-applet/applet.c
+++ b/mate-window-picker-applet/applet.c
@@ -35,6 +35,10 @@
#include <mate-panel-applet.h>
#include <mate-panel-applet-gsettings.h>
+#if GTK_CHECK_VERSION (3, 0, 0)
+#define gtk_rc_style_unref g_object_ref
+#endif
+
#include "task-list.h"
#include "task-title.h"
@@ -60,7 +64,11 @@ static gpointer parent_class;
static void cw_panel_background_changed (MatePanelApplet *applet,
MatePanelAppletBackgroundType type,
GdkColor *colour,
+#if GTK_CHECK_VERSION (3, 0, 0)
+ cairo_pattern_t *pattern,
+#else
GdkPixmap *pixmap,
+#endif
gpointer user_data);
static void display_about_dialog (GtkAction *action,
WinPickerApp *applet);
@@ -229,7 +237,11 @@ static void
cw_panel_background_changed (MatePanelApplet *applet,
MatePanelAppletBackgroundType type,
GdkColor *colour,
+#if GTK_CHECK_VERSION (3, 0, 0)
+ cairo_pattern_t *pattern,
+#else
GdkPixmap *pixmap,
+#endif
gpointer user_data)
{
GtkRcStyle *rc_style;
@@ -256,12 +268,16 @@ cw_panel_background_changed (MatePanelApplet *applet,
break;
case PANEL_PIXMAP_BACKGROUND:
+#if GTK_CHECK_VERSION (3, 0, 0)
+ /* FIXME */
+#else
style = gtk_style_copy (GTK_WIDGET (applet)->style);
if (style->bg_pixmap[GTK_STATE_NORMAL])
g_object_unref (style->bg_pixmap[GTK_STATE_NORMAL]);
style->bg_pixmap[GTK_STATE_NORMAL] = g_object_ref (pixmap);
gtk_widget_set_style (GTK_WIDGET (applet), style);
g_object_unref (style);
+#endif
/*style = gtk_style_copy (mainapp->title->style);
if (style->bg_pixmap[GTK_STATE_NORMAL])
diff --git a/mate-window-picker-applet/task-item.c b/mate-window-picker-applet/task-item.c
index a584d23..cafcb2c 100644
--- a/mate-window-picker-applet/task-item.c
+++ b/mate-window-picker-applet/task-item.c
@@ -66,7 +66,9 @@ update_hints (TaskItem *item)
{
GtkWidget *parent;
GtkWidget *widget;
+ GtkAllocation *allocation;
WnckWindow *window;
+ GdkWindow *gdkwindow;
gint x, y, x1, y1;
widget = GTK_WIDGET (item);
@@ -76,32 +78,37 @@ update_hints (TaskItem *item)
if (!GTK_IS_WIDGET (widget)) return;
/* Skip invisible windows */
- if (!GTK_WIDGET_VISIBLE (widget)) return;
+ if (!gtk_widget_get_visible (widget)) return;
x = y = 0;
/* Recursively compute the button's coordinates */
- for (parent = widget; parent; parent = parent->parent)
+ for (parent = widget; parent; parent = gtk_widget_get_parent (parent))
{
- if (parent->parent)
+ if (gtk_widget_get_parent (parent))
{
- x += parent->allocation.x;
- y += parent->allocation.y;
+ gtk_widget_get_allocation (parent, allocation);
+ x += allocation->x;
+ y += allocation->y;
}
else
{
x1 = y1 = 0;
- if (GDK_IS_WINDOW (parent->window))
- gdk_window_get_origin (parent->window, &x1, &y1);
+ gdkwindow = gtk_widget_get_window (parent);
+#if !GTK_CHECK_VERSION (3, 0, 0)
+ if (GDK_IS_WINDOW (gdkwindow))
+#endif
+ gdk_window_get_origin (gdkwindow, &x1, &y1);
x += x1; y += y1;
break;
}
}
/* Set the minimize hint for the window */
+ gtk_widget_get_allocation (widget, allocation);
wnck_window_set_icon_geometry (window, x, y,
- widget->allocation.width,
- widget->allocation.height);
+ allocation->width,
+ allocation->height);
}
static gboolean
@@ -191,6 +198,26 @@ task_item_set_visibility (TaskItem *item)
}
}
+#if GTK_CHECK_VERSION (3, 0, 0)
+
+static void
+task_item_get_preferred_width (GtkWidget *widget,
+ gint *minimal_width,
+ gint *natural_width)
+{
+ *minimal_width = *natural_width = DEFAULT_TASK_ITEM_WIDTH;
+}
+
+static void
+task_item_get_preferred_height (GtkWidget *widget,
+ gint *minimal_height,
+ gint *natural_height)
+{
+ *minimal_height = *natural_height = DEFAULT_TASK_ITEM_HEIGHT;
+}
+
+#else
+
static void
task_item_size_request (GtkWidget *widget,
GtkRequisition *requisition)
@@ -200,6 +227,8 @@ task_item_size_request (GtkWidget *widget,
requisition->height = DEFAULT_TASK_ITEM_HEIGHT;
}
+#endif
+
static GdkPixbuf *
task_item_sized_pixbuf_for_window (TaskItem *item,
WnckWindow *window,
@@ -247,10 +276,17 @@ task_item_sized_pixbuf_for_window (TaskItem *item,
return pbuf;
}
static gboolean
+#if GTK_CHECK_VERSION (3, 0, 0)
+task_item_draw (GtkWidget *widget,
+ cairo_t *cr)
+#else
task_item_expose_event (GtkWidget *widget,
GdkEventExpose *event)
+#endif
{
+#if !GTK_CHECK_VERSION (3, 0, 0)
cairo_t *cr;
+#endif
TaskItem *item;
GdkRectangle area;
TaskItemPrivate *priv;
@@ -259,7 +295,9 @@ task_item_expose_event (GtkWidget *widget,
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (TASK_IS_ITEM (widget), FALSE);
+#if !GTK_CHECK_VERSION (3, 0, 0)
g_return_val_if_fail (event != NULL, FALSE);
+#endif
item = TASK_ITEM (widget);
priv = item->priv;
@@ -267,7 +305,9 @@ task_item_expose_event (GtkWidget *widget,
g_return_val_if_fail (WNCK_IS_WINDOW (priv->window), FALSE);
area = priv->area;
+#if !GTK_CHECK_VERSION (3, 0, 0)
cr = gdk_cairo_create (event->window);
+#endif
pbuf = priv->pixbuf;
desat = NULL;
@@ -354,7 +394,9 @@ task_item_expose_event (GtkWidget *widget,
if (GDK_IS_PIXBUF (desat))
g_object_unref (desat);
+#if !GTK_CHECK_VERSION (3, 0, 0)
cairo_destroy (cr);
+#endif
return FALSE;
}
@@ -679,8 +721,14 @@ task_item_class_init (TaskItemClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
obj_class->finalize = task_item_finalize;
+#if GTK_CHECK_VERSION (3, 0, 0)
+ widget_class->draw = task_item_draw;
+ widget_class->get_preferred_width = task_item_get_preferred_width;
+ widget_class->get_preferred_height = task_item_get_preferred_height;
+#else
widget_class->expose_event = task_item_expose_event;
widget_class->size_request = task_item_size_request;
+#endif
g_type_class_add_private (obj_class, sizeof (TaskItemPrivate));
diff --git a/mate-window-picker-applet/task-title.c b/mate-window-picker-applet/task-title.c
index 5db675f..546e331 100644
--- a/mate-window-picker-applet/task-title.c
+++ b/mate-window-picker-applet/task-title.c
@@ -23,6 +23,12 @@
#include <libwnck/libwnck.h>
#include <mate-panel-applet.h>
+#if GTK_CHECK_VERSION (3, 0, 0)
+#include <math.h>
+#define MATE_DESKTOP_USE_UNSTABLE_API
+#include <libmate-desktop/mate-desktop-utils.h>
+#endif
+
#include "task-list.h"
G_DEFINE_TYPE (TaskTitle, task_title, GTK_TYPE_EVENT_BOX);
@@ -70,7 +76,11 @@ on_close_clicked (GtkButton *button,
if (!WNCK_IS_WINDOW (window)
|| wnck_window_get_window_type (window) == WNCK_WINDOW_DESKTOP)
{
+#if GTK_CHECK_VERSION (3, 0, 0)
+ mate_gdk_spawn_command_line_on_screen (gdk_screen_get_default (),
+#else
gdk_spawn_command_line_on_screen (gdk_screen_get_default (),
+#endif
LOGOUT, NULL);
}
else
@@ -111,8 +121,13 @@ on_leave_notify (GtkWidget *widget,
}
static gboolean
+#if GTK_CHECK_VERSION (3, 0, 0)
+on_button_draw (GtkWidget *widget,
+ cairo_t *cr,
+#else
on_button_expose (GtkWidget *widget,
GdkEventExpose *event,
+#endif
TaskTitle *title)
{
g_return_val_if_fail (TASK_IS_TITLE (title), FALSE);
@@ -123,17 +138,39 @@ on_button_expose (GtkWidget *widget,
if (priv->mouse_in_close_button)
{
GtkStyle *style = gtk_widget_get_style (widget);
- gtk_paint_box (style,
+#if GTK_CHECK_VERSION (3, 0, 0)
+ GdkRectangle area;
+ gdouble x1, y1, x2, y2;
+ cairo_clip_extents (cr, &x1, &y1, &x2, &y2);
+ area.x = floor (x1);
+ area.y = floor (y1);
+ area.width = ceil (x2) - area.x;
+ area.height = ceil (y2) - area.y;
+#endif
+ gtk_paint_box (style,
+#if GTK_CHECK_VERSION (3, 0, 0)
+ cr,
+#else
event->window,
+#endif
GTK_STATE_PRELIGHT,
GTK_SHADOW_NONE,
+#if !GTK_CHECK_VERSION (3, 0, 0)
NULL,
+#endif
NULL,
NULL,
+#if GTK_CHECK_VERSION (3, 0, 0)
+ area.x,
+ area.y + 2,
+ area.width,
+ area.height - 4);
+#else
event->area.x,
event->area.y + 2,
event->area.width,
- event->area.height - 4);
+ event->area.height - 4);
+#endif
}
return FALSE;
}
@@ -356,20 +393,46 @@ on_button_release (GtkWidget *title, GdkEventButton *event)
static gboolean
+#if GTK_CHECK_VERSION (3, 0, 0)
+on_draw (GtkWidget *eb, cairo_t *cr)
+#else
on_expose (GtkWidget *eb, GdkEventExpose *event)
+#endif
{
-
- if (eb->state == GTK_STATE_ACTIVE)
- gtk_paint_box (eb->style, eb->window,
- eb->state, GTK_SHADOW_NONE,
- NULL, eb, "button",
- eb->allocation.x, eb->allocation.y,
- eb->allocation.width, eb->allocation.height);
+ GtkAllocation *allocation;
+ GtkStyle *style;
+ GtkStateType state;
+
+ gtk_widget_get_allocation (eb, allocation);
+ style = gtk_widget_get_style (eb);
+ state = gtk_widget_get_state (eb);
+
+ if (state == GTK_STATE_ACTIVE)
+ gtk_paint_box (style,
+#if GTK_CHECK_VERSION (3, 0, 0)
+ cr,
+#else
+ eb->window,
+#endif
+ state, GTK_SHADOW_NONE,
+#if !GTK_CHECK_VERSION (3, 0, 0)
+ NULL,
+#endif
+ eb, "button",
+ allocation->x, allocation->y,
+ allocation->width, allocation->height);
+#if GTK_CHECK_VERSION (3, 0, 0)
+ gtk_container_propagate_draw (GTK_CONTAINER (eb),
+ gtk_bin_get_child (GTK_BIN (eb)),
+ cr);
+
+#else
gtk_container_propagate_expose (GTK_CONTAINER (eb),
gtk_bin_get_child (GTK_BIN (eb)),
event);
+#endif
return TRUE;
}
@@ -394,7 +457,11 @@ task_title_class_init (TaskTitleClass *klass)
GtkWidgetClass *wid_class = GTK_WIDGET_CLASS (klass);
obj_class->finalize = task_title_finalize;
+#if GTK_CHECK_VERSION (3, 0, 0)
+ wid_class->draw = on_draw;
+#else
wid_class->expose_event = on_expose;
+#endif
g_type_class_add_private (obj_class, sizeof (TaskTitlePrivate));
}
@@ -461,11 +528,16 @@ task_title_init (TaskTitle *title)
G_CALLBACK (on_enter_notify), title);
g_signal_connect (priv->button, "leave-notify-event",
G_CALLBACK (on_leave_notify), title);
+#if GTK_CHECK_VERSION (3, 0, 0)
+ g_signal_connect (priv->button, "draw",
+ G_CALLBACK (on_button_draw), title);
+#else
g_signal_connect (priv->button, "expose-event",
G_CALLBACK (on_button_expose), title);
+#endif
/* Load the quit icon. We have to do this in such a god-forsaken way
- because of http://bugzilla.mate.org/show_bug.cgi?id=581359 and the
+ because of http://bugzilla.gnome.org/show_bug.cgi?id=581359 and the
fact that we support as far back as GTK+ 2.12 (which never passes
FORCE_SIZE in GtkImage). The only way to guarantee icon size is to
load and scale it ourselves. We don't do this for all the other icons