[Xfce4-commits] <xfce4-panel:nick/gtk3> Ported client event to raw X
Peter de Ridder
noreply at xfce.org
Mon Apr 8 22:40:01 CEST 2013
Updating branch refs/heads/nick/gtk3
to e9c0da4a9fdf6b9fb9dd7cd9eb79432f7a935604 (commit)
from 50657c1a3f0bf0a3720a47b5366dac79087e488f (commit)
commit e9c0da4a9fdf6b9fb9dd7cd9eb79432f7a935604
Author: Peter de Ridder <peter at xfce.org>
Date: Mon Apr 8 21:39:20 2013 +0200
Ported client event to raw X
panel/panel-plugin-external-46.c | 124 ++++++++++++++++++++++++++------------
1 files changed, 85 insertions(+), 39 deletions(-)
diff --git a/panel/panel-plugin-external-46.c b/panel/panel-plugin-external-46.c
index ca2a2e0..c115486 100644
--- a/panel/panel-plugin-external-46.c
+++ b/panel/panel-plugin-external-46.c
@@ -48,17 +48,20 @@
-static void panel_plugin_external_46_finalize (GObject *object);
-static gboolean panel_plugin_external_46_client_event (GtkWidget *widget,
- GdkEventClient *event);
-static gchar **panel_plugin_external_46_get_argv (PanelPluginExternal *external,
- gchar **arguments);
-static void panel_plugin_external_46_set_properties (PanelPluginExternal *external,
- GSList *properties);
-static gboolean panel_plugin_external_46_remote_event (PanelPluginExternal *external,
- const gchar *name,
- const GValue *value,
- guint *handle);
+static void panel_plugin_external_46_finalize (GObject *object);
+static void panel_plugin_external_46_realize (GtkWidget *widget);
+static void panel_plugin_external_46_unrealize (GtkWidget *widget);
+static GdkFilterReturn panel_plugin_external_46_event_filter (GdkXEvent *xevent,
+ GdkEvent *event,
+ gpointer data);
+static gchar **panel_plugin_external_46_get_argv (PanelPluginExternal *external,
+ gchar **arguments);
+static void panel_plugin_external_46_set_properties (PanelPluginExternal *external,
+ GSList *properties);
+static gboolean panel_plugin_external_46_remote_event (PanelPluginExternal *external,
+ const gchar *name,
+ const GValue *value,
+ guint *handle);
@@ -76,7 +79,7 @@ struct _PanelPluginExternal46
-static GdkAtom panel_atom = GDK_NONE;
+static Atom panel_atom = None;
@@ -95,14 +98,15 @@ panel_plugin_external_46_class_init (PanelPluginExternal46Class *klass)
gobject_class->finalize = panel_plugin_external_46_finalize;
gtkwidget_class = GTK_WIDGET_CLASS (klass);
- gtkwidget_class->client_event = panel_plugin_external_46_client_event;
+ gtkwidget_class->realize = panel_plugin_external_46_realize;
+ gtkwidget_class->unrealize = panel_plugin_external_46_unrealize;
plugin_external_class = PANEL_PLUGIN_EXTERNAL_CLASS (klass);
plugin_external_class->get_argv = panel_plugin_external_46_get_argv;
plugin_external_class->set_properties = panel_plugin_external_46_set_properties;
plugin_external_class->remote_event = panel_plugin_external_46_remote_event;
- panel_atom = gdk_atom_intern_static_string (_PANEL_CLIENT_EVENT_ATOM);
+ panel_atom = XInternAtom( gdk_x11_get_default_xdisplay (), _PANEL_CLIENT_EVENT_ATOM, False);
}
@@ -127,16 +131,55 @@ panel_plugin_external_46_finalize (GObject *object)
-static gboolean
-panel_plugin_external_46_client_event (GtkWidget *widget,
- GdkEventClient *event)
+static void
+panel_plugin_external_46_realize (GtkWidget *widget)
+{
+ GdkWindow *window;
+
+ GTK_WIDGET_CLASS (panel_plugin_external_46_parent_class)->realize (widget);
+
+ window = gtk_widget_get_window (widget);
+ if (G_UNLIKELY (window == NULL))
+ return;
+
+ gdk_window_add_filter (window, panel_plugin_external_46_event_filter, widget);
+}
+
+
+
+static void
+panel_plugin_external_46_unrealize (GtkWidget *widget)
{
- PanelPluginExternal *external = PANEL_PLUGIN_EXTERNAL (widget);
+ GdkWindow *window;
+
+ window = gtk_widget_get_window (widget);
+ if (G_LIKELY (window != NULL))
+ {
+ gdk_window_remove_filter (window, panel_plugin_external_46_event_filter, NULL);
+ }
+
+ GTK_WIDGET_CLASS (panel_plugin_external_46_parent_class)->unrealize (widget);
+}
+
+
+
+static GdkFilterReturn
+panel_plugin_external_46_event_filter (GdkXEvent *xevent,
+ GdkEvent *event,
+ gpointer data)
+{
+ PanelPluginExternal *external = PANEL_PLUGIN_EXTERNAL (data);
gint provider_signal;
+ XClientMessageEvent *client_event;
- if (event->message_type == panel_atom)
+ if (((XEvent*)xevent)->type != ClientMessage)
+ return GDK_FILTER_CONTINUE;
+
+ client_event = (XClientMessageEvent*)xevent;
+
+ if (client_event->message_type == panel_atom)
{
- provider_signal = event->data.s[0];
+ provider_signal = client_event->data.s[0];
switch (provider_signal)
{
@@ -155,10 +198,10 @@ panel_plugin_external_46_client_event (GtkWidget *widget,
break;
}
- return FALSE;
+ return GDK_FILTER_REMOVE;
}
- return TRUE;
+ return GDK_FILTER_CONTINUE;
}
@@ -212,24 +255,23 @@ panel_plugin_external_46_set_properties (PanelPluginExternal *external,
{
PanelPluginExternal46 *external46 = PANEL_PLUGIN_EXTERNAL_46 (external);
GSList *li;
- GdkEventClient event;
+ XEvent event;
PluginProperty *property;
GdkColor color = { 0, };
GdkWindow *window;
panel_return_if_fail (PANEL_IS_PLUGIN_EXTERNAL_46 (external));
- panel_return_if_fail (panel_atom != GDK_NONE);
+ panel_return_if_fail (panel_atom != None);
panel_return_if_fail (PANEL_IS_MODULE (external->module));
if (!gtk_widget_get_realized (GTK_WIDGET (external)))
return;
- event.type = GDK_CLIENT_EVENT;
+ event.xclient.type = ClientMessage;
panel_return_if_fail (GDK_IS_WINDOW (gtk_widget_get_window (GTK_WIDGET (external))));
- event.window = gtk_widget_get_window (GTK_WIDGET (external));
- event.send_event = TRUE;
- event.message_type = panel_atom;
- event.data_format = 16;
+ event.xclient.window = gdk_x11_window_get_xid (gtk_widget_get_window (GTK_WIDGET (external)));
+ event.xclient.message_type = panel_atom;
+ event.xclient.format = 16;
gdk_error_trap_push ();
@@ -237,7 +279,7 @@ panel_plugin_external_46_set_properties (PanelPluginExternal *external,
{
property = li->data;
- event.data.s[0] = property->type;
+ event.xclient.data.s[0] = property->type;
switch (property->type)
{
@@ -245,25 +287,25 @@ panel_plugin_external_46_set_properties (PanelPluginExternal *external,
case PROVIDER_PROP_TYPE_SET_MODE:
case PROVIDER_PROP_TYPE_SET_NROWS:
case PROVIDER_PROP_TYPE_SET_SCREEN_POSITION:
- event.data.s[1] = g_value_get_int (&property->value);
+ event.xclient.data.s[1] = g_value_get_int (&property->value);
break;
case PROVIDER_PROP_TYPE_SET_BACKGROUND_ALPHA:
- event.data.s[1] = g_value_get_double (&property->value) * 100.00;
+ event.xclient.data.s[1] = g_value_get_double (&property->value) * 100.00;
break;
case PROVIDER_PROP_TYPE_SET_LOCKED:
case PROVIDER_PROP_TYPE_SET_SENSITIVE:
- event.data.s[1] = g_value_get_boolean (&property->value);
+ event.xclient.data.s[1] = g_value_get_boolean (&property->value);
break;
case PROVIDER_PROP_TYPE_SET_BACKGROUND_COLOR:
if (gdk_color_parse (g_value_get_string (&property->value), &color))
{
- event.data.s[1] = color.red;
- event.data.s[2] = color.green;
- event.data.s[3] = color.blue;
- event.data.s[4] = 0;
+ event.xclient.data.s[1] = color.red;
+ event.xclient.data.s[2] = color.green;
+ event.xclient.data.s[3] = color.blue;
+ event.xclient.data.s[4] = 0;
}
break;
@@ -283,7 +325,7 @@ panel_plugin_external_46_set_properties (PanelPluginExternal *external,
case PROVIDER_PROP_TYPE_ACTION_BACKGROUND_UNSET:
case PROVIDER_PROP_TYPE_ACTION_SHOW_CONFIGURE:
case PROVIDER_PROP_TYPE_ACTION_SHOW_ABOUT:
- event.data.s[1] = 0;
+ event.xclient.data.s[1] = 0;
break;
default:
@@ -295,7 +337,11 @@ panel_plugin_external_46_set_properties (PanelPluginExternal *external,
window = gtk_socket_get_plug_window (GTK_SOCKET (external));
panel_return_if_fail (GDK_IS_WINDOW (window));
- gdk_event_send_client_message ((GdkEvent *) &event, GDK_WINDOW_XID (window));
+ XSendEvent (gdk_x11_display_get_xdisplay (gdk_window_get_display (window)),
+ gdk_x11_window_get_xid (window),
+ False,
+ NoEventMask,
+ &event);
}
bailout:
More information about the Xfce4-commits
mailing list