Updating branch refs/heads/nick/gtk3 to e9c0da4a9fdf6b9fb9dd7cd9eb79432f7a935604 (commit) from 50657c1a3f0bf0a3720a47b5366dac79087e488f (commit)
commit e9c0da4a9fdf6b9fb9dd7cd9eb79432f7a935604 Author: Peter de Ridder <pe...@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: _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits