[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