* 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"
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)
{
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
*/
G_STRUCT_OFFSET (GdkKeymapClass, state_changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
+ G_TYPE_NONE,
0);
}
gdk_keyval_to_upper (guint keyval)
{
guint result;
-
+
gdk_keyval_convert_case (keyval, NULL, &result);
return result;
gdk_keyval_to_lower (guint keyval)
{
guint result;
-
+
gdk_keyval_convert_case (keyval, &result, NULL);
return result;
if (keyval)
{
guint upper_val = 0;
-
+
gdk_keyval_convert_case (keyval, NULL, &upper_val);
return upper_val == 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.
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);
}
/**
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);
}
/**
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);
}
/**
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;
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.
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);
}
/**
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);
}
/**
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,
/**
* 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.
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,
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
* 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);
}
/**
{
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);
}