Updating branch refs/heads/nick/gtk3 to bc829f7ddb7f4b1cb15db89283c842cbf9c66115 (commit) from 0d7e446fa7bb874498d076fb5e85ea1386870f38 (commit)
commit bc829f7ddb7f4b1cb15db89283c842cbf9c66115 Author: Andrzej <ndrwr...@gmail.com> Date: Wed Apr 10 21:21:01 2013 +0100 Clock: Fixed keyboard and pointer grabbing plugins/clock/clock.c | 123 ++++++++++++++++++++++++++++++++---------------- 1 files changed, 82 insertions(+), 41 deletions(-) diff --git a/plugins/clock/clock.c b/plugins/clock/clock.c index db6678f..3900a48 100644 --- a/plugins/clock/clock.c +++ b/plugins/clock/clock.c @@ -85,7 +85,8 @@ static void clock_plugin_set_mode (ClockPlugin *p static void clock_plugin_reposition_calendar (ClockPlugin *plugin); static gboolean clock_plugin_pointer_grab (ClockPlugin *plugin, GtkWidget *widget, - gboolean keep); + gboolean keep, + guint32 activate_time); static void clock_plugin_pointer_ungrab (ClockPlugin *plugin, GtkWidget *widget); static gboolean clock_plugin_calendar_pointed (GtkWidget *calendar_window, @@ -97,8 +98,7 @@ static gboolean clock_plugin_calendar_button_press_event (GtkWidget *c static gboolean clock_plugin_calendar_key_press_event (GtkWidget *calendar_window, GdkEventKey *event, ClockPlugin *plugin); -static void clock_plugin_popup_calendar (ClockPlugin *plugin, - gboolean modal); +static void clock_plugin_popup_calendar (ClockPlugin *plugin); static void clock_plugin_hide_calendar (ClockPlugin *plugin); static gboolean clock_plugin_tooltip (gpointer user_data); @@ -151,7 +151,11 @@ struct _ClockPlugin gchar *tooltip_format; ClockTimeTimeout *tooltip_timeout; - GdkGrabStatus grab_pointer; + GdkDevice *device; + GdkDevice *keyboard; + GdkDevice *pointer; + gboolean keyboard_grabbed; + gboolean pointer_grabbed; gchar *time_config_tool; ClockTime *time; @@ -270,6 +274,11 @@ clock_plugin_init (ClockPlugin *plugin) plugin->command = NULL; plugin->time_config_tool = g_strdup (DEFAULT_TIME_CONFIG_TOOL); plugin->rotate_vertically = TRUE; + plugin->device = NULL; + plugin->keyboard = NULL; + plugin->pointer = NULL; + plugin->keyboard_grabbed = FALSE; + plugin->pointer_grabbed = FALSE; plugin->time = clock_time_new (); plugin->button = xfce_panel_create_toggle_button (); @@ -436,10 +445,15 @@ clock_plugin_button_press_event (GtkWidget *widget, /* toggle calendar window visibility */ if (plugin->calendar_window == NULL || !gtk_widget_get_visible (GTK_WIDGET (plugin->calendar_window))) - clock_plugin_popup_calendar - (plugin, event->button == 1 && !(event->state & GDK_CONTROL_MASK)); + { + clock_plugin_popup_calendar (plugin); + if (event->button == 1 && !(event->state & GDK_CONTROL_MASK)) + clock_plugin_pointer_grab (plugin, GTK_WIDGET (plugin->calendar_window), TRUE, event->time); + } else - clock_plugin_hide_calendar (plugin); + { + clock_plugin_hide_calendar (plugin); + } return TRUE; } @@ -1129,18 +1143,19 @@ static void clock_plugin_pointer_ungrab (ClockPlugin *plugin, GtkWidget *widget) { - GdkDisplay *display; - GdkDevice *pointer; - GdkDeviceManager *device_manager; - - panel_return_if_fail (GTK_IS_WIDGET (widget)); + panel_return_if_fail (XFCE_IS_CLOCK_PLUGIN (plugin)); - display = gtk_widget_get_display (widget); - device_manager = gdk_display_get_device_manager (display); - pointer = gdk_device_manager_get_client_pointer (device_manager); + if (plugin->keyboard != NULL && plugin->keyboard_grabbed) + { + gdk_device_ungrab (plugin->keyboard, GDK_CURRENT_TIME); + plugin->keyboard_grabbed = FALSE; + } - if (plugin->grab_pointer == GDK_GRAB_SUCCESS) - gdk_device_ungrab (pointer, GDK_CURRENT_TIME); + if (plugin->pointer != NULL && plugin->pointer_grabbed) + { + gdk_device_ungrab (plugin->pointer, GDK_CURRENT_TIME); + plugin->pointer_grabbed = FALSE; + } } @@ -1148,35 +1163,64 @@ clock_plugin_pointer_ungrab (ClockPlugin *plugin, static gboolean clock_plugin_pointer_grab (ClockPlugin *plugin, GtkWidget *widget, - gboolean keep) + gboolean keep, + guint32 activate_time) { GdkWindow *window; - gboolean grab_succeed = FALSE; + gboolean grabbed = FALSE; guint i; GdkDisplay *display; - GdkDevice *pointer; GdkDeviceManager *device_manager; - GdkEventMask pointer_mask = GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK - | GDK_POINTER_MOTION_MASK - | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK; + GList *devices; - window = gtk_widget_get_parent_window (widget); - display = gtk_widget_get_display (widget); - device_manager = gdk_display_get_device_manager (display); - pointer = gdk_device_manager_get_client_pointer (device_manager); + window = gtk_widget_get_window (widget); + + if (plugin->device == NULL) + plugin->device = gtk_get_current_event_device (); + + if (plugin->device == NULL) + { + display = gtk_widget_get_display (widget); + device_manager = gdk_display_get_device_manager (display); + devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); + plugin->device = devices->data; + g_list_free (devices); + } + + if (gdk_device_get_source (plugin->device) == GDK_SOURCE_KEYBOARD) + { + plugin->keyboard = plugin->device; + plugin->pointer = gdk_device_get_associated_device (plugin->device); + } + else + { + plugin->pointer = plugin->device; + plugin->keyboard = gdk_device_get_associated_device (plugin->device); + } /* don't try to get the grab for longer then 1/4 second */ for (i = 0; i < (G_USEC_PER_SEC / 100 / 4); i++) { - plugin->grab_pointer = gdk_device_grab (pointer, window, GDK_OWNERSHIP_NONE, TRUE, pointer_mask, - NULL, GDK_CURRENT_TIME); - if (plugin->grab_pointer == GDK_GRAB_SUCCESS) + plugin->keyboard_grabbed = + plugin->keyboard != NULL && + gdk_device_grab (plugin->keyboard, window, + GDK_OWNERSHIP_WINDOW, TRUE, + GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, + NULL, activate_time) == GDK_GRAB_SUCCESS; + if (plugin->keyboard_grabbed) { - grab_succeed = TRUE; - break; + grabbed = plugin->pointer_grabbed = + plugin->pointer != NULL && + gdk_device_grab (plugin->pointer, window, + GDK_OWNERSHIP_WINDOW, TRUE, + GDK_SMOOTH_SCROLL_MASK | + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | + GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | + GDK_POINTER_MOTION_MASK, + NULL, activate_time) == GDK_GRAB_SUCCESS; + if (grabbed) + break; } - g_usleep (100); } @@ -1184,14 +1228,14 @@ clock_plugin_pointer_grab (ClockPlugin *plugin, if (!keep) clock_plugin_pointer_ungrab (plugin, widget); - if (!grab_succeed) + if (!grabbed) { clock_plugin_pointer_ungrab (plugin, widget); g_printerr (PACKAGE_NAME ": Unable to get keyboard and mouse " "grab. Popup failed.\n"); } - return grab_succeed; + return grabbed; } @@ -1206,7 +1250,7 @@ clock_plugin_calendar_pointed (GtkWidget *calendar_window, if (gtk_widget_get_mapped (calendar_window)) { - gdk_window_get_position (gtk_widget_get_parent_window (calendar_window), &window_x, &window_y); + gdk_window_get_position (gtk_widget_get_window (calendar_window), &window_x, &window_y); gtk_widget_get_allocation (calendar_window, &allocation); @@ -1254,8 +1298,7 @@ clock_plugin_calendar_key_press_event (GtkWidget *calendar_window, static void -clock_plugin_popup_calendar (ClockPlugin *plugin, - gboolean modal) +clock_plugin_popup_calendar (ClockPlugin *plugin) { if (plugin->calendar_window == NULL) { @@ -1287,8 +1330,6 @@ clock_plugin_popup_calendar (ClockPlugin *plugin, gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (plugin->button), TRUE); gtk_widget_show (GTK_WIDGET (plugin->calendar_window)); xfce_panel_plugin_block_autohide (XFCE_PANEL_PLUGIN (plugin), TRUE); - if (modal) - clock_plugin_pointer_grab (plugin, GTK_WIDGET (plugin->calendar_window), TRUE); } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits