]> Pileus Git - ~andy/gtk/blobdiff - gdk/gdkkeys.c
testtoolbar: Fix test to use GtkGrid
[~andy/gtk] / gdk / gdkkeys.c
index c992ef5ae17915da6651dcfdc355da3842187e15..d2b7b61f6e5c46339a8c41a065927aeed30a3cec 100644 (file)
@@ -21,7 +21,7 @@
  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
  * file for a list of people on the GTK+ Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
  */
 
 #include "config.h"
@@ -108,6 +108,11 @@ enum {
   LAST_SIGNAL
 };
 
+
+static GdkModifierType gdk_keymap_real_get_modifier_mask (GdkKeymap         *keymap,
+                                                          GdkModifierIntent  intent);
+
+
 static guint signals[LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE (GdkKeymap, gdk_keymap, G_TYPE_OBJECT)
@@ -117,12 +122,14 @@ gdk_keymap_class_init (GdkKeymapClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
+  klass->get_modifier_mask = gdk_keymap_real_get_modifier_mask;
+
   /**
    * GdkKeymap::direction-changed:
    * @keymap: the object on which the signal is emitted
-   * 
+   *
    * The ::direction-changed signal gets emitted when the direction of
-   * the keymap changes. 
+   * the keymap changes.
    *
    * Since: 2.0
    */
@@ -171,7 +178,7 @@ gdk_keymap_class_init (GdkKeymapClass *klass)
                   G_STRUCT_OFFSET (GdkKeymapClass, state_changed),
                   NULL, NULL,
                   g_cclosure_marshal_VOID__VOID,
-                  G_TYPE_NONE, 
+                  G_TYPE_NONE,
                   0);
 }
 
@@ -215,7 +222,7 @@ guint
 gdk_keyval_to_upper (guint keyval)
 {
   guint result;
-  
+
   gdk_keyval_convert_case (keyval, NULL, &result);
 
   return result;
@@ -234,7 +241,7 @@ guint
 gdk_keyval_to_lower (guint keyval)
 {
   guint result;
-  
+
   gdk_keyval_convert_case (keyval, &result, NULL);
 
   return result;
@@ -255,7 +262,7 @@ gdk_keyval_is_upper (guint keyval)
   if (keyval)
     {
       guint upper_val = 0;
-      
+
       gdk_keyval_convert_case (keyval, NULL, &upper_val);
       return upper_val == keyval;
     }
@@ -277,14 +284,14 @@ gdk_keyval_is_lower (guint keyval)
   if (keyval)
     {
       guint lower_val = 0;
-      
+
       gdk_keyval_convert_case (keyval, &lower_val, NULL);
       return lower_val == keyval;
     }
   return FALSE;
 }
 
-/** 
+/**
  * gdk_keymap_get_default:
  *
  * Returns the #GdkKeymap attached to the default display.
@@ -310,7 +317,9 @@ gdk_keymap_get_default (void)
 PangoDirection
 gdk_keymap_get_direction (GdkKeymap *keymap)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->get_direction (keymap);
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), PANGO_DIRECTION_LTR);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->get_direction (keymap);
 }
 
 /**
@@ -327,7 +336,9 @@ gdk_keymap_get_direction (GdkKeymap *keymap)
 gboolean
 gdk_keymap_have_bidi_layouts (GdkKeymap *keymap)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->have_bidi_layouts (keymap);
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->have_bidi_layouts (keymap);
 }
 
 /**
@@ -343,7 +354,9 @@ gdk_keymap_have_bidi_layouts (GdkKeymap *keymap)
 gboolean
 gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->get_caps_lock_state (keymap);
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->get_caps_lock_state (keymap);
 }
 
 /**
@@ -359,15 +372,18 @@ gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
 gboolean
 gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->get_num_lock_state (keymap);
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->get_num_lock_state (keymap);
 }
 
 /**
  * gdk_keymap_get_entries_for_keyval:
  * @keymap: a #GdkKeymap
  * @keyval: a keyval, such as %GDK_a, %GDK_Up, %GDK_Return, etc.
- * @keys: (out): return location for an array of #GdkKeymapKey
- * @n_keys: (out): return location for number of elements in returned array
+ * @keys: (out) (array length=n_keys) (transfer full): return location
+ *     for an array of #GdkKeymapKey
+ * @n_keys: return location for number of elements in returned array
  *
  * Obtains a list of keycode/group/level combinations that will
  * generate @keyval. Groups and levels are two kinds of keyboard mode;
@@ -389,15 +405,20 @@ gdk_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                    GdkKeymapKey **keys,
                                    gint          *n_keys)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->get_entries_for_keyval (keymap, keyval, keys, n_keys);
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->get_entries_for_keyval (keymap, keyval,
+                                                                keys, n_keys);
 }
 
 /**
  * gdk_keymap_get_entries_for_keycode:
  * @keymap: a #GdkKeymap
  * @hardware_keycode: a keycode
- * @keys: (out): return location for array of #GdkKeymapKey, or %NULL
- * @keyvals: (out): return location for array of keyvals, or %NULL
+ * @keys: (out) (array length=n_entries) (transfer full): return
+ *     location for array of #GdkKeymapKey, or %NULL
+ * @keyvals: (out) (array length=n_entries) (transfer full): return
+ *     location for array of keyvals, or %NULL
  * @n_entries: length of @keys and @keyvals
  *
  * Returns the keyvals bound to @hardware_keycode.
@@ -416,7 +437,10 @@ gdk_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
                                     guint        **keyvals,
                                     gint          *n_entries)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->get_entries_for_keycode (keymap, hardware_keycode, keys, keyvals, n_entries);
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->get_entries_for_keycode (keymap, hardware_keycode,
+                                                                 keys, keyvals, n_entries);
 }
 
 /**
@@ -436,7 +460,9 @@ guint
 gdk_keymap_lookup_key (GdkKeymap          *keymap,
                        const GdkKeymapKey *key)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->lookup_key (keymap, key);
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), 0);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->lookup_key (keymap, key);
 }
 
 /**
@@ -518,7 +544,9 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
                                      gint            *level,
                                      GdkModifierType *consumed_modifiers)
 {
-  return GDK_KEYMAP_GET_CLASS(keymap)->translate_keyboard_state (keymap,
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->translate_keyboard_state (keymap,
                                                                  hardware_keycode,
                                                                  state,
                                                                  group,
@@ -531,7 +559,7 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
 /**
  * gdk_keymap_add_virtual_modifiers:
  * @keymap: a #GdkKeymap
- * @state: pointer to the modifier mask to change
+ * @state: (out): pointer to the modifier mask to change
  *
  * Adds virtual modifiers (i.e. Super, Hyper and Meta) which correspond
  * to the real modifiers (i.e Mod2, Mod3, ...) in @modifiers.
@@ -551,13 +579,15 @@ void
 gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
                                  GdkModifierType *state)
 {
-  GDK_KEYMAP_GET_CLASS(keymap)->add_virtual_modifiers (keymap, state);
+  g_return_if_fail (GDK_IS_KEYMAP (keymap));
+
+  GDK_KEYMAP_GET_CLASS (keymap)->add_virtual_modifiers (keymap, state);
 }
 
 /**
  * gdk_keymap_map_virtual_modifiers:
  * @keymap: a #GdkKeymap
- * @state: pointer to the modifier state to map
+ * @state: (out): pointer to the modifier state to map
  *
  * Maps the virtual modifiers (i.e. Super, Hyper and Meta) which
  * are set in @state to their non-virtual counterparts (i.e. Mod2,
@@ -577,9 +607,66 @@ gboolean
 gdk_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
                                   GdkModifierType *state)
 {
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), FALSE);
+
   return GDK_KEYMAP_GET_CLASS(keymap)->map_virtual_modifiers (keymap, state);
 }
 
+static GdkModifierType
+gdk_keymap_real_get_modifier_mask (GdkKeymap         *keymap,
+                                   GdkModifierIntent  intent)
+{
+  switch (intent)
+    {
+    case GDK_MODIFIER_INTENT_PRIMARY_ACCELERATOR:
+      return GDK_CONTROL_MASK;
+
+    case GDK_MODIFIER_INTENT_CONTEXT_MENU:
+      return 0;
+
+    case GDK_MODIFIER_INTENT_EXTEND_SELECTION:
+      return GDK_SHIFT_MASK;
+
+    case GDK_MODIFIER_INTENT_MODIFY_SELECTION:
+      return GDK_CONTROL_MASK;
+
+    case GDK_MODIFIER_INTENT_NO_TEXT_INPUT:
+      return GDK_MOD1_MASK | GDK_CONTROL_MASK;
+
+    default:
+      g_return_val_if_reached (0);
+    }
+}
+
+/**
+ * gdk_keymap_get_modifier_mask:
+ * @keymap: a #GdkKeymap
+ * @intent: the use case for the modifier mask
+ *
+ * Returns the modifier mask the @keymap's windowing system backend
+ * uses for a particular purpose.
+ *
+ * Note that this function always returns real hardware modifiers, not
+ * virtual ones (e.g. it will return #GDK_MOD1_MASK rather than
+ * #GDK_META_MASK if the backend maps MOD1 to META), so there are use
+ * cases where the return value of this function has to be transformed
+ * by gdk_keymap_add_virtual_modifiers() in order to contain the
+ * expected result.
+ *
+ * Returns: the modifier mask used for @intent.
+ *
+ * Since: 3.4
+ **/
+GdkModifierType
+gdk_keymap_get_modifier_mask (GdkKeymap         *keymap,
+                              GdkModifierIntent  intent)
+{
+  g_return_val_if_fail (GDK_IS_KEYMAP (keymap), 0);
+
+  return GDK_KEYMAP_GET_CLASS (keymap)->get_modifier_mask (keymap, intent);
+}
+
+
 /**
  * gdk_keyval_name:
  * @keyval: a key value
@@ -594,12 +681,13 @@ gdk_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
  *     or %NULL if @keyval is not a valid key. The string should not be
  *     modified.
  */
-gchar*
+gchar *
 gdk_keyval_name (guint keyval)
 {
   GdkDisplayManager *manager = gdk_display_manager_get ();
 
-  return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_keyval_name (manager, keyval);
+  return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->get_keyval_name (manager,
+                                                                   keyval);
 }
 
 /**
@@ -620,5 +708,6 @@ gdk_keyval_from_name (const gchar *keyval_name)
 {
   GdkDisplayManager *manager = gdk_display_manager_get ();
 
-  return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->lookup_keyval (manager, keyval_name);
+  return GDK_DISPLAY_MANAGER_GET_CLASS (manager)->lookup_keyval (manager,
+                                                                 keyval_name);
 }