From 0cfb94cdd44d2dfaf018a23edc5fcf6fd9597928 Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Thu, 1 Jul 2010 18:45:06 -0400 Subject: [PATCH] [gdk] Add gdk_keymap_get_num_lock_state https://bugzilla.gnome.org/show_bug.cgi?id=623239 --- gdk/directfb/gdkkeys-directfb.c | 18 ++++++++++++++++ gdk/gdk.symbols | 2 ++ gdk/gdkkeys.h | 1 + gdk/quartz/gdkkeys-quartz.c | 7 +++++++ gdk/win32/gdkkeys-win32.c | 6 ++++++ gdk/x11/gdkkeys-x11.c | 37 +++++++++++++++++++++++++++++---- 6 files changed, 67 insertions(+), 4 deletions(-) diff --git a/gdk/directfb/gdkkeys-directfb.c b/gdk/directfb/gdkkeys-directfb.c index fb72321089..7ca259714e 100644 --- a/gdk/directfb/gdkkeys-directfb.c +++ b/gdk/directfb/gdkkeys-directfb.c @@ -1758,6 +1758,24 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap) return FALSE; } +/** + * gdk_keymap_get_num_lock_state: + * @keymap: a #GdkKeymap + * + * Returns whether the Num Lock modifer is locked. + * + * Returns: %TRUE if Num Lock is on + * + * Since: 3.0 + */ +gboolean +gdk_keymap_get_num_lock_state (GdkKeymap *keymap) +{ + /* FIXME: Can we implement this? */ + + return FALSE; +} + /** * gdk_keymap_get_entries_for_keycode: * @keymap: a #GdkKeymap or %NULL to use the default keymap diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols index ca44318bf0..455cacebb8 100644 --- a/gdk/gdk.symbols +++ b/gdk/gdk.symbols @@ -861,6 +861,7 @@ gdk_keymap_get_entries_for_keyval gdk_keymap_get_for_display gdk_keymap_have_bidi_layouts gdk_keymap_get_caps_lock_state +gdk_keymap_get_num_lock_state gdk_keymap_lookup_key gdk_keymap_translate_keyboard_state gdk_keymap_add_virtual_modifiers @@ -878,6 +879,7 @@ gdk_keymap_get_entries_for_keycode gdk_keymap_get_entries_for_keyval gdk_keymap_get_for_display gdk_keymap_get_caps_lock_state +gdk_keymap_get_num_lock_state gdk_keymap_lookup_key gdk_keymap_translate_keyboard_state gdk_keymap_add_virtual_modifiers diff --git a/gdk/gdkkeys.h b/gdk/gdkkeys.h index ebab21bfcb..212c680a7c 100644 --- a/gdk/gdkkeys.h +++ b/gdk/gdkkeys.h @@ -108,6 +108,7 @@ gboolean gdk_keymap_get_entries_for_keycode (GdkKeymap *keymap, PangoDirection gdk_keymap_get_direction (GdkKeymap *keymap); gboolean gdk_keymap_have_bidi_layouts (GdkKeymap *keymap); gboolean gdk_keymap_get_caps_lock_state (GdkKeymap *keymap); +gboolean gdk_keymap_get_num_lock_state (GdkKeymap *keymap); void gdk_keymap_add_virtual_modifiers (GdkKeymap *keymap, GdkModifierType *state); gboolean gdk_keymap_map_virtual_modifiers (GdkKeymap *keymap, diff --git a/gdk/quartz/gdkkeys-quartz.c b/gdk/quartz/gdkkeys-quartz.c index 52b08677a5..729f320f7a 100644 --- a/gdk/quartz/gdkkeys-quartz.c +++ b/gdk/quartz/gdkkeys-quartz.c @@ -451,6 +451,13 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap) return FALSE; } +gboolean +gdk_keymap_get_num_lock_state (GdkKeymap *keymap) +{ + /* FIXME: Implement this. */ + return FALSE; +} + gboolean gdk_keymap_get_entries_for_keyval (GdkKeymap *keymap, guint keyval, diff --git a/gdk/win32/gdkkeys-win32.c b/gdk/win32/gdkkeys-win32.c index eff2ebec80..bd6a096e00 100644 --- a/gdk/win32/gdkkeys-win32.c +++ b/gdk/win32/gdkkeys-win32.c @@ -536,6 +536,12 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap) return ((GetKeyState (VK_CAPITAL) & 1) != 0); } +gboolean +gdk_keymap_get_num_lock_state (GdkKeymap *keymap) +{ + return ((GetKeyState (VK_NUMLOCK) & 1) != 0); +} + gboolean gdk_keymap_get_entries_for_keyval (GdkKeymap *keymap, guint keyval, diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c index 784e0ff5c9..0804700035 100644 --- a/gdk/x11/gdkkeys-x11.c +++ b/gdk/x11/gdkkeys-x11.c @@ -86,6 +86,7 @@ struct _GdkKeymapX11 guint sun_keypad : 1; guint have_direction : 1; guint caps_lock_state : 1; + guint num_lock_state : 1; guint current_serial; #ifdef HAVE_XKB @@ -276,6 +277,9 @@ get_xkb (GdkKeymapX11 *keymap_x11) keymap_x11->current_serial = display_x11->keymap_serial; + if (keymap_x11->num_lock_mask == 0) + keymap_x11->num_lock_mask = XkbKeysymToModifiers (KEYMAP_XDISPLAY (GDK_KEYMAP (keymap_x11)), XK_Num_Lock); + return keymap_x11->xkb_desc; } #endif /* HAVE_XKB */ @@ -687,12 +691,16 @@ update_lock_state (GdkKeymapX11 *keymap_x11, gint locked_mods) { gboolean caps_lock_state; - + gboolean num_lock_state; + caps_lock_state = keymap_x11->caps_lock_state; + num_lock_state = keymap_x11->num_lock_state; keymap_x11->caps_lock_state = (locked_mods & GDK_LOCK_MASK) != 0; - - return caps_lock_state != keymap_x11->caps_lock_state; + keymap_x11->num_lock_state = (locked_mods & keymap_x11->num_lock_mask) != 0; + + return (caps_lock_state != keymap_x11->caps_lock_state) + || (num_lock_state != keymap_x11->num_lock_state); } /* keep this in sync with the XkbSelectEventDetails() call @@ -713,7 +721,7 @@ _gdk_keymap_state_changed (GdkDisplay *display, g_signal_emit_by_name (keymap_x11, "direction-changed"); if (update_lock_state (keymap_x11, xkb_event->state.locked_mods)) - g_signal_emit_by_name (keymap_x11, "state-changed"); + g_signal_emit_by_name (keymap_x11, "state-changed"); } } @@ -831,6 +839,27 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap) return keymap_x11->caps_lock_state; } +/** + * gdk_keymap_get_num_lock_state: + * @keymap: a #GdkKeymap + * + * Returns whether the Num Lock modifer is locked. + * + * Returns: %TRUE if Num Lock is on + * + * Since: 3.0 + */ +gboolean +gdk_keymap_get_num_lock_state (GdkKeymap *keymap) +{ + GdkKeymapX11 *keymap_x11; + + keymap = GET_EFFECTIVE_KEYMAP (keymap); + + keymap_x11 = GDK_KEYMAP_X11 (keymap); + + return keymap_x11->num_lock_state; +} /** * gdk_keymap_get_entries_for_keyval: