[gnome-settings-daemon] common: Remove unused keygrab code
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] common: Remove unused keygrab code
- Date: Tue, 2 Jul 2013 12:00:23 +0000 (UTC)
commit 66c975cd90736e32f20ffd36846301d68e7a08e7
Author: Bastien Nocera <hadess hadess net>
Date: Tue Jul 2 13:50:43 2013 +0200
common: Remove unused keygrab code
XI2 key matching, and key capture isn't required any more.
plugins/common/gsd-keygrab.c | 328 ------------------------------------------
plugins/common/gsd-keygrab.h | 22 ---
2 files changed, 0 insertions(+), 350 deletions(-)
---
diff --git a/plugins/common/gsd-keygrab.c b/plugins/common/gsd-keygrab.c
index 262d5a7..e8b85c6 100644
--- a/plugins/common/gsd-keygrab.c
+++ b/plugins/common/gsd-keygrab.c
@@ -33,334 +33,6 @@
#include "gsd-keygrab.h"
-/* these are the mods whose combinations are ignored by the keygrabbing code */
-static GdkModifierType gsd_ignored_mods = 0;
-
-/* these are the ones we actually use for global keys, we always only check
- * for these set */
-static GdkModifierType gsd_used_mods = 0;
-
-/* Taken from a comment in XF86keysym.h */
-#define XF86KEYS_RANGE_MIN 0x10080001
-#define XF86KEYS_RANGE_MAX 0x1008FFFF
-
-#define FKEYS_RANGE_MIN GDK_KEY_F1
-#define FKEYS_RANGE_MAX GDK_KEY_R15
-
-#define IN_RANGE(x, min, max) (x >= min && x <= max)
-
-static void
-setup_modifiers (void)
-{
- if (gsd_used_mods == 0 || gsd_ignored_mods == 0) {
- GdkModifierType dynmods;
-
- /* default modifiers */
- gsd_ignored_mods = \
- 0x2000 /*Xkb modifier*/ | GDK_LOCK_MASK | GDK_HYPER_MASK;
- gsd_used_mods = \
- GDK_SHIFT_MASK | GDK_CONTROL_MASK |\
- GDK_MOD1_MASK | GDK_MOD2_MASK | GDK_MOD3_MASK | GDK_MOD4_MASK |\
- GDK_MOD5_MASK | GDK_SUPER_MASK | GDK_META_MASK;
-
- /* NumLock can be assigned to varying keys so we need to
- * resolve and ignore it specially */
- dynmods = XkbKeysymToModifiers (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
GDK_KEY_Num_Lock);
-
- gsd_ignored_mods |= dynmods;
- gsd_used_mods &= ~dynmods;
- }
-}
-
-static void
-grab_key_real (guint keycode,
- GdkWindow *root,
- gboolean grab,
- gboolean synchronous,
- XIGrabModifiers *mods,
- int num_mods)
-{
- XIEventMask evmask;
- unsigned char mask[(XI_LASTEVENT + 7)/8];
-
- memset (mask, 0, sizeof (mask));
- XISetMask (mask, XI_KeyPress);
- XISetMask (mask, XI_KeyRelease);
-
- evmask.deviceid = XIAllMasterDevices;
- evmask.mask_len = sizeof (mask);
- evmask.mask = mask;
-
- if (grab) {
- XIGrabKeycode (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
- XIAllMasterDevices,
- keycode,
- GDK_WINDOW_XID (root),
- GrabModeAsync,
- synchronous ? GrabModeSync : GrabModeAsync,
- False,
- &evmask,
- num_mods,
- mods);
- } else {
- XIUngrabKeycode (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
- XIAllMasterDevices,
- keycode,
- GDK_WINDOW_XID (root),
- num_mods,
- mods);
- }
-}
-
-/* Grab the key. In order to ignore GSD_IGNORED_MODS we need to grab
- * all combinations of the ignored modifiers and those actually used
- * for the binding (if any).
- *
- * inspired by all_combinations from gnome-panel/gnome-panel/global-keys.c
- *
- * This may generate X errors. The correct way to use this is like:
- *
- * gdk_error_trap_push ();
- *
- * grab_key_unsafe (key, grab, screens);
- *
- * gdk_flush ();
- * if (gdk_error_trap_pop ())
- * g_warning ("Grab failed, another application may already have access to key '%u'",
- * key->keycode);
- *
- * This is not done in the function itself, to allow doing multiple grab_key
- * operations with one flush only.
- */
-#define N_BITS 32
-static void
-grab_key_internal (Key *key,
- gboolean grab,
- GsdKeygrabFlags flags,
- GSList *screens)
-{
- int indexes[N_BITS]; /* indexes of bits we need to flip */
- int i;
- int bit;
- int bits_set_cnt;
- int uppervalue;
- guint mask, modifiers;
- GArray *all_mods;
- GSList *l;
-
- setup_modifiers ();
-
- mask = gsd_ignored_mods & ~key->state & GDK_MODIFIER_MASK;
-
- /* XGrabKey requires real modifiers, not virtual ones */
- modifiers = key->state;
- gdk_keymap_map_virtual_modifiers (gdk_keymap_get_default (), &modifiers);
- modifiers &= ~(GDK_META_MASK | GDK_SUPER_MASK | GDK_HYPER_MASK);
-
- /* If key doesn't have a usable modifier, we don't want
- * to grab it, since the user might lose a useful key.
- *
- * The exception is the XFree86 keys and the Function keys
- * (which are useful to grab without a modifier).
- */
- if (!(flags & GSD_KEYGRAB_ALLOW_UNMODIFIED) &&
- (modifiers & gsd_used_mods) == 0 &&
- !IN_RANGE(key->keysym, XF86KEYS_RANGE_MIN, XF86KEYS_RANGE_MAX) &&
- !IN_RANGE(key->keysym, FKEYS_RANGE_MIN, FKEYS_RANGE_MAX) &&
- key->keysym != GDK_KEY_Pause &&
- key->keysym != GDK_KEY_Print &&
- key->keysym != GDK_KEY_Scroll_Lock &&
- key->keysym != GDK_KEY_Pause &&
- key->keysym != GDK_KEY_Break &&
- key->keysym != GDK_KEY_Menu) {
- GString *keycodes;
-
- keycodes = g_string_new ("");
- if (key->keycodes != NULL) {
- guint *c;
-
- for (c = key->keycodes; *c; ++c) {
- g_string_printf (keycodes, " %u", *c);
- }
- }
- g_warning ("Key 0x%x (keycodes: %s) with state 0x%x (resolved to 0x%x) "
- " has no usable modifiers (usable modifiers are 0x%x)",
- key->keysym, keycodes->str, key->state, modifiers, gsd_used_mods);
- g_string_free (keycodes, TRUE);
-
- return;
- }
-
- bit = 0;
- /* store the indexes of all set bits in mask in the array */
- for (i = 0; mask; ++i, mask >>= 1) {
- if (mask & 0x1) {
- indexes[bit++] = i;
- }
- }
-
- bits_set_cnt = bit;
-
- all_mods = g_array_new (FALSE, TRUE, sizeof(XIGrabModifiers));
- uppervalue = 1 << bits_set_cnt;
- /* store all possible modifier combinations for our mask into all_mods */
- for (i = 0; i < uppervalue; ++i) {
- int j;
- int result = 0;
- XIGrabModifiers *mod;
-
- /* map bits in the counter to those in the mask */
- for (j = 0; j < bits_set_cnt; ++j) {
- if (i & (1 << j)) {
- result |= (1 << indexes[j]);
- }
- }
-
- /* Grow the array by one, to fit our new XIGrabModifiers item */
- g_array_set_size (all_mods, all_mods->len + 1);
- mod = &g_array_index (all_mods, XIGrabModifiers, all_mods->len - 1);
- mod->modifiers = result | modifiers;
- }
-
- /* Capture the actual keycodes with the modifier array */
- for (l = screens; l; l = l->next) {
- GdkScreen *screen = l->data;
- guint *code;
-
- for (code = key->keycodes; *code; ++code) {
- grab_key_real (*code,
- gdk_screen_get_root_window (screen),
- grab,
- flags & GSD_KEYGRAB_SYNCHRONOUS,
- (XIGrabModifiers *) all_mods->data,
- all_mods->len);
- }
- }
- g_array_free (all_mods, TRUE);
-}
-
-void
-grab_key_unsafe (Key *key,
- GsdKeygrabFlags flags,
- GSList *screens)
-{
- grab_key_internal (key, TRUE, flags, screens);
-}
-
-static gboolean
-have_xkb (Display *dpy)
-{
- static int have_xkb = -1;
-
- if (have_xkb == -1) {
- int opcode, error_base, major, minor, xkb_event_base;
-
- have_xkb = XkbQueryExtension (dpy,
- &opcode,
- &xkb_event_base,
- &error_base,
- &major,
- &minor)
- && XkbUseExtension (dpy, &major, &minor);
- }
-
- return have_xkb;
-}
-
-gboolean
-key_uses_keycode (const Key *key, guint keycode)
-{
- if (key->keycodes != NULL) {
- guint *c;
-
- for (c = key->keycodes; *c; ++c) {
- if (*c == keycode)
- return TRUE;
- }
- }
- return FALSE;
-}
-
-/* Adapted from _gdk_x11_device_xi2_translate_state()
- * in gtk+/gdk/x11/gdkdevice-xi2.c */
-static guint
-device_xi2_translate_state (XIModifierState *mods_state,
- XIGroupState *group_state)
-{
- guint state;
- gint group;
-
- state = (guint) mods_state->base | mods_state->latched | mods_state->locked;
-
- group = group_state->base | group_state->latched | group_state->locked;
- /* FIXME: do we need the XKB complications for this ? */
- group = CLAMP(group, 0, 3);
- state |= group << 13;
-
- return state;
-}
-
-gboolean
-match_xi2_key (Key *key, XIDeviceEvent *event)
-{
- guint keyval;
- GdkModifierType consumed;
- gint group;
- guint keycode, state;
-
- if (key == NULL)
- return FALSE;
-
- setup_modifiers ();
-
- state = device_xi2_translate_state (&event->mods, &event->group);
-
- if (have_xkb (event->display))
- group = XkbGroupForCoreState (state);
- else
- group = (state & GDK_KEY_Mode_switch) ? 1 : 0;
-
- keycode = event->detail;
-
- /* Check if we find a keysym that matches our current state */
- if (gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (), keycode,
- state, group,
- &keyval, NULL, NULL, &consumed)) {
- guint lower, upper;
- guint mask;
-
- /* HACK: we don't want to use SysRq as a keybinding, so we avoid
- * its translation from Alt+Print. */
- if (keyval == GDK_KEY_Sys_Req &&
- (state & GDK_MOD1_MASK) != 0) {
- consumed = 0;
- keyval = GDK_KEY_Print;
- }
-
- /* The Key structure contains virtual modifiers, whereas
- * the XEvent will be using the real modifier, so translate those */
- mask = key->state;
- gdk_keymap_map_virtual_modifiers (gdk_keymap_get_default (), &mask);
- mask &= ~(GDK_META_MASK | GDK_SUPER_MASK | GDK_HYPER_MASK);
-
- gdk_keyval_convert_case (keyval, &lower, &upper);
-
- /* If we are checking against the lower version of the
- * keysym, we might need the Shift state for matching,
- * so remove it from the consumed modifiers */
- if (lower == key->keysym)
- consumed &= ~GDK_SHIFT_MASK;
-
- return ((lower == key->keysym || upper == key->keysym)
- && (state & ~consumed & gsd_used_mods) == mask);
- }
-
- /* The key we passed doesn't have a keysym, so try with just the keycode */
- return (key != NULL
- && key->state == (state & gsd_used_mods)
- && key_uses_keycode (key, keycode));
-}
-
void
grab_button (int deviceid,
gboolean grab,
diff --git a/plugins/common/gsd-keygrab.h b/plugins/common/gsd-keygrab.h
index 1104196..40a53b8 100644
--- a/plugins/common/gsd-keygrab.h
+++ b/plugins/common/gsd-keygrab.h
@@ -26,28 +26,6 @@ G_BEGIN_DECLS
#include <X11/keysym.h>
#include <X11/extensions/XInput2.h>
-typedef struct {
- guint keysym;
- guint state;
- guint *keycodes;
-} Key;
-
-typedef enum {
- GSD_KEYGRAB_NORMAL = 0,
- GSD_KEYGRAB_ALLOW_UNMODIFIED = 1 << 0,
- GSD_KEYGRAB_SYNCHRONOUS = 1 << 1
-} GsdKeygrabFlags;
-
-void grab_key_unsafe (Key *key,
- GsdKeygrabFlags flags,
- GSList *screens);
-
-gboolean match_xi2_key (Key *key,
- XIDeviceEvent *event);
-
-gboolean key_uses_keycode (const Key *key,
- guint keycode);
-
void grab_button (int deviceid,
gboolean grab,
GdkScreen *screen);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]