aboutsummaryrefslogtreecommitdiff
path: root/src/ka-pwdialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ka-pwdialog.c')
-rw-r--r--src/ka-pwdialog.c66
1 files changed, 59 insertions, 7 deletions
diff --git a/src/ka-pwdialog.c b/src/ka-pwdialog.c
index 483873a..5e56d8b 100644
--- a/src/ka-pwdialog.c
+++ b/src/ka-pwdialog.c
@@ -1,6 +1,6 @@
/* Krb5 Auth Applet -- Acquire and release kerberos tickets
*
- * (C) 2009 Guido Guenther <agx@sigxcpu.org>
+ * (C) 2009,2013 Guido Guenther <agx@sigxcpu.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -88,17 +88,57 @@ ka_pwdialog_new (void)
return g_object_new (KA_TYPE_PWDIALOG, NULL);
}
+static GdkGrabStatus
+for_each_keyboard (GdkWindow *window, GdkEvent *event,
+ GdkGrabStatus (*func)(GdkDevice*,
+ GdkWindow*,
+ GdkEvent*))
+{
+ GdkDisplay *display;
+ GdkDeviceManager *device_manager;
+ GdkDevice *device;
+ GList *devices, *dev;
+ GdkGrabStatus ret = GDK_GRAB_SUCCESS;
+
+ display = gdk_window_get_display (window);
+ device_manager = gdk_display_get_device_manager (display);
+ devices = gdk_device_manager_list_devices (device_manager,
+ GDK_DEVICE_TYPE_MASTER);
+
+ for (dev = devices; dev; dev = dev->next) {
+ device = dev->data;
+ if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD)
+ continue;
+ ret = (*func)(device, window, event);
+ }
+
+ g_list_free (devices);
+ return ret;
+}
+
+static GdkGrabStatus
+grab_keyboard_func (GdkDevice *device, GdkWindow *window, GdkEvent *event)
+{
+ return gdk_device_grab (device,
+ window,
+ GDK_OWNERSHIP_WINDOW,
+ FALSE,
+ GDK_ALL_EVENTS_MASK,
+ NULL,
+ gdk_event_get_time (event));
+}
static gboolean
grab_keyboard (GtkWidget *win, GdkEvent * event, gpointer data)
{
KaPwDialog *pwdialog = KA_PWDIALOG (data);
-
GdkGrabStatus status;
if (!pwdialog->priv->grabbed) {
- status = gdk_keyboard_grab (gtk_widget_get_window (win),
- FALSE, gdk_event_get_time (event));
+ status = for_each_keyboard(gtk_widget_get_window (win),
+ event,
+ &grab_keyboard_func);
+
if (status == GDK_GRAB_SUCCESS)
pwdialog->priv->grabbed = TRUE;
else
@@ -107,6 +147,15 @@ grab_keyboard (GtkWidget *win, GdkEvent * event, gpointer data)
return FALSE;
}
+static GdkGrabStatus
+ungrab_keyboard_func (GdkDevice *device,
+ GdkWindow *window G_GNUC_UNUSED,
+ GdkEvent *event)
+{
+ gdk_device_ungrab (device,
+ gdk_event_get_time (event));
+ return 0;
+}
static gboolean
ungrab_keyboard (GtkWidget *win G_GNUC_UNUSED,
@@ -114,9 +163,12 @@ ungrab_keyboard (GtkWidget *win G_GNUC_UNUSED,
{
KaPwDialog *pwdialog = KA_PWDIALOG (data);
- if (pwdialog->priv->grabbed)
- gdk_keyboard_ungrab (gdk_event_get_time (event));
- pwdialog->priv->grabbed = FALSE;
+ if (pwdialog->priv->grabbed) {
+ for_each_keyboard(gtk_widget_get_window (win),
+ event,
+ &ungrab_keyboard_func);
+ pwdialog->priv->grabbed = FALSE;
+ }
return FALSE;
}
bgstack15