[gtk+] [gdk] Add gdk_keymap_get_num_lock_state



commit 0cfb94cdd44d2dfaf018a23edc5fcf6fd9597928
Author: William Jon McCann <jmccann redhat com>
Date:   Thu Jul 1 18:45:06 2010 -0400

    [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 fb72321..7ca2597 100644
--- a/gdk/directfb/gdkkeys-directfb.c
+++ b/gdk/directfb/gdkkeys-directfb.c
@@ -1759,6 +1759,24 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
 }
 
 /**
+ * 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
  * @hardware_keycode: a keycode
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index ca44318..455cace 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 ebab21b..212c680 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 52b0867..729f320 100644
--- a/gdk/quartz/gdkkeys-quartz.c
+++ b/gdk/quartz/gdkkeys-quartz.c
@@ -452,6 +452,13 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
 }
 
 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,
                                    GdkKeymapKey **keys,
diff --git a/gdk/win32/gdkkeys-win32.c b/gdk/win32/gdkkeys-win32.c
index eff2ebe..bd6a096 100644
--- a/gdk/win32/gdkkeys-win32.c
+++ b/gdk/win32/gdkkeys-win32.c
@@ -537,6 +537,12 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
 }
 
 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,
                                    GdkKeymapKey **keys,
diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c
index 784e0ff..0804700 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:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]