Commit 8c6162b5 authored by Alexander Larsson's avatar Alexander Larsson Committed by Matthias Clasen
Browse files

Convert all gdk_keymap methods to vtable calls

parent 4ad948ec
......@@ -315,6 +315,36 @@ struct _GdkKeymapClass
{
GObjectClass parent_class;
PangoDirection (* get_direction) (GdkKeymap *keymap);
gboolean (* have_bidi_layouts) (GdkKeymap *keymap);
gboolean (* get_caps_lock_state) (GdkKeymap *keymap);
gboolean (* get_num_lock_state) (GdkKeymap *keymap);
gboolean (* get_entries_for_keyval) (GdkKeymap *keymap,
guint keyval,
GdkKeymapKey **keys,
gint *n_keys);
gboolean (* get_entries_for_keycode) (GdkKeymap *keymap,
guint hardware_keycode,
GdkKeymapKey **keys,
guint **keyvals,
gint *n_entries);
guint (* lookup_key) (GdkKeymap *keymap,
const GdkKeymapKey *key);
gboolean (* translate_keyboard_state) (GdkKeymap *keymap,
guint hardware_keycode,
GdkModifierType state,
gint group,
guint *keyval,
gint *effective_group,
gint *level,
GdkModifierType *consumed_modifiers);
void (* add_virtual_modifiers) (GdkKeymap *keymap,
GdkModifierType *state);
gboolean (* map_virtual_modifiers) (GdkKeymap *keymap,
GdkModifierType *state);
/* Signals */
void (*direction_changed) (GdkKeymap *keymap);
void (*keys_changed) (GdkKeymap *keymap);
void (*state_changed) (GdkKeymap *keymap);
......
......@@ -420,3 +420,284 @@ gdk_keymap_get_default (void)
{
return gdk_keymap_get_for_display (gdk_display_get_default ());
}
/**
* gdk_keymap_get_direction:
* @keymap: a #GdkKeymap or %NULL to use the default keymap
*
* Returns the direction of effective layout of the keymap.
*
* Returns: %PANGO_DIRECTION_LTR or %PANGO_DIRECTION_RTL
* if it can determine the direction. %PANGO_DIRECTION_NEUTRAL
* otherwise.
**/
PangoDirection
gdk_keymap_get_direction (GdkKeymap *keymap)
{
return GDK_KEYMAP_GET_CLASS(keymap)->get_direction (keymap);
}
/**
* gdk_keymap_have_bidi_layouts:
* @keymap: a #GdkKeymap or %NULL to use the default keymap
*
* Determines if keyboard layouts for both right-to-left and left-to-right
* languages are in use.
*
* Returns: %TRUE if there are layouts in both directions, %FALSE otherwise
*
* Since: 2.12
**/
gboolean
gdk_keymap_have_bidi_layouts (GdkKeymap *keymap)
{
return GDK_KEYMAP_GET_CLASS(keymap)->have_bidi_layouts (keymap);
}
/**
* gdk_keymap_get_caps_lock_state:
* @keymap: a #GdkKeymap
*
* Returns whether the Caps Lock modifer is locked.
*
* Returns: %TRUE if Caps Lock is on
*
* Since: 2.16
*/
gboolean
gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
{
return GDK_KEYMAP_GET_CLASS(keymap)->get_caps_lock_state (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)
{
return GDK_KEYMAP_GET_CLASS(keymap)->get_num_lock_state (keymap);
}
/**
* gdk_keymap_get_entries_for_keyval:
* @keymap: (allow-none): a #GdkKeymap, or %NULL to use the default keymap
* @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
*
* Obtains a list of keycode/group/level combinations that will
* generate @keyval. Groups and levels are two kinds of keyboard mode;
* in general, the level determines whether the top or bottom symbol
* on a key is used, and the group determines whether the left or
* right symbol is used. On US keyboards, the shift key changes the
* keyboard level, and there are no groups. A group switch key might
* convert a keyboard between Hebrew to English modes, for example.
* #GdkEventKey contains a %group field that indicates the active
* keyboard group. The level is computed from the modifier mask.
* The returned array should be freed
* with g_free().
*
* Return value: %TRUE if keys were found and returned
**/
gboolean
gdk_keymap_get_entries_for_keyval (GdkKeymap *keymap,
guint keyval,
GdkKeymapKey **keys,
gint *n_keys)
{
return GDK_KEYMAP_GET_CLASS(keymap)->get_entries_for_keyval (keymap, keyval, keys, n_keys);
}
/**
* gdk_keymap_get_entries_for_keycode:
* @keymap: (allow-none): a #GdkKeymap or %NULL to use the default keymap
* @hardware_keycode: a keycode
* @keys: (out): return location for array of #GdkKeymapKey, or %NULL
* @keyvals: (out): return location for array of keyvals, or %NULL
* @n_entries: length of @keys and @keyvals
*
* Returns the keyvals bound to @hardware_keycode.
* The Nth #GdkKeymapKey in @keys is bound to the Nth
* keyval in @keyvals. Free the returned arrays with g_free().
* When a keycode is pressed by the user, the keyval from
* this list of entries is selected by considering the effective
* keyboard group and level. See gdk_keymap_translate_keyboard_state().
*
* Returns: %TRUE if there were any entries
**/
gboolean
gdk_keymap_get_entries_for_keycode (GdkKeymap *keymap,
guint hardware_keycode,
GdkKeymapKey **keys,
guint **keyvals,
gint *n_entries)
{
return GDK_KEYMAP_GET_CLASS(keymap)->get_entries_for_keycode (keymap, hardware_keycode, keys, keyvals, n_entries);
}
/**
* gdk_keymap_lookup_key:
* @keymap: a #GdkKeymap or %NULL to use the default keymap
* @key: a #GdkKeymapKey with keycode, group, and level initialized
*
* Looks up the keyval mapped to a keycode/group/level triplet.
* If no keyval is bound to @key, returns 0. For normal user input,
* you want to use gdk_keymap_translate_keyboard_state() instead of
* this function, since the effective group/level may not be
* the same as the current keyboard state.
*
* Return value: a keyval, or 0 if none was mapped to the given @key
**/
guint
gdk_keymap_lookup_key (GdkKeymap *keymap,
const GdkKeymapKey *key)
{
return GDK_KEYMAP_GET_CLASS(keymap)->lookup_key (keymap, key);
}
/**
* gdk_keymap_translate_keyboard_state:
* @keymap: (allow-none): a #GdkKeymap, or %NULL to use the default
* @hardware_keycode: a keycode
* @state: a modifier state
* @group: active keyboard group
* @keyval: (out) (allow-none): return location for keyval, or %NULL
* @effective_group: (out) (allow-none): return location for effective group, or %NULL
* @level: (out) (allow-none): return location for level, or %NULL
* @consumed_modifiers: (out) (allow-none): return location for modifiers that were used to
* determine the group or level, or %NULL
*
* Translates the contents of a #GdkEventKey into a keyval, effective
* group, and level. Modifiers that affected the translation and
* are thus unavailable for application use are returned in
* @consumed_modifiers. See <xref linkend="key-group-explanation"/> for an explanation of
* groups and levels. The @effective_group is the group that was
* actually used for the translation; some keys such as Enter are not
* affected by the active keyboard group. The @level is derived from
* @state. For convenience, #GdkEventKey already contains the translated
* keyval, so this function isn't as useful as you might think.
*
* <note><para>
* @consumed_modifiers gives modifiers that should be masked out
* from @state when comparing this key press to a hot key. For
* instance, on a US keyboard, the <literal>plus</literal>
* symbol is shifted, so when comparing a key press to a
* <literal>&lt;Control&gt;plus</literal> accelerator &lt;Shift&gt; should
* be masked out.
* </para>
* <informalexample><programlisting>
* &sol;* We want to ignore irrelevant modifiers like ScrollLock *&sol;
* &num;define ALL_ACCELS_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)
* gdk_keymap_translate_keyboard_state (keymap, event->hardware_keycode,
* event->state, event->group,
* &amp;keyval, NULL, NULL, &amp;consumed);
* if (keyval == GDK_PLUS &&
* (event->state &amp; ~consumed &amp; ALL_ACCELS_MASK) == GDK_CONTROL_MASK)
* &sol;* Control was pressed *&sol;
* </programlisting></informalexample>
* <para>
* An older interpretation @consumed_modifiers was that it contained
* all modifiers that might affect the translation of the key;
* this allowed accelerators to be stored with irrelevant consumed
* modifiers, by doing:</para>
* <informalexample><programlisting>
* &sol;* XXX Don't do this XXX *&sol;
* if (keyval == accel_keyval &&
* (event->state &amp; ~consumed &amp; ALL_ACCELS_MASK) == (accel_mods &amp; ~consumed))
* &sol;* Accelerator was pressed *&sol;
* </programlisting></informalexample>
* <para>
* However, this did not work if multi-modifier combinations were
* used in the keymap, since, for instance, <literal>&lt;Control&gt;</literal>
* would be masked out even if only <literal>&lt;Control&gt;&lt;Alt&gt;</literal>
* was used in the keymap. To support this usage as well as well as
* possible, all <emphasis>single modifier</emphasis> combinations
* that could affect the key for any combination of modifiers will
* be returned in @consumed_modifiers; multi-modifier combinations
* are returned only when actually found in @state. When you store
* accelerators, you should always store them with consumed modifiers
* removed. Store <literal>&lt;Control&gt;plus</literal>,
* not <literal>&lt;Control&gt;&lt;Shift&gt;plus</literal>,
* </para></note>
*
* Return value: %TRUE if there was a keyval bound to the keycode/state/group
**/
gboolean
gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
guint hardware_keycode,
GdkModifierType state,
gint group,
guint *keyval,
gint *effective_group,
gint *level,
GdkModifierType *consumed_modifiers)
{
return GDK_KEYMAP_GET_CLASS(keymap)->translate_keyboard_state (keymap,
hardware_keycode,
state,
group,
keyval,
effective_group,
level,
consumed_modifiers);
}
/**
* gdk_keymap_add_virtual_modifiers:
* @keymap: a #GdkKeymap
* @state: 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.
* are set in @state to their non-virtual counterparts (i.e. Mod2,
* Mod3,...) and set the corresponding bits in @state.
*
* GDK already does this before delivering key events, but for
* compatibility reasons, it only sets the first virtual modifier
* it finds, whereas this function sets all matching virtual modifiers.
*
* This function is useful when matching key events against
* accelerators.
*
* Since: 2.20
*/
void
gdk_keymap_add_virtual_modifiers (GdkKeymap *keymap,
GdkModifierType *state)
{
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
*
* Maps the virtual modifiers (i.e. Super, Hyper and Meta) which
* are set in @state to their non-virtual counterparts (i.e. Mod2,
* Mod3,...) and set the corresponding bits in @state.
*
* This function is useful when matching key events against
* accelerators.
*
* Returns: %TRUE if no virtual modifiers were mapped to the
* same non-virtual modifier. Note that %FALSE is also returned
* if a virtual modifier is mapped to a non-virtual modifier that
* was already set in @state.
*
* Since: 2.20
*/
gboolean
gdk_keymap_map_virtual_modifiers (GdkKeymap *keymap,
GdkModifierType *state)
{
return GDK_KEYMAP_GET_CLASS(keymap)->map_virtual_modifiers (keymap, state);
}
......@@ -138,16 +138,6 @@ gdk_keymap_x11_get_type (void)
return object_type;
}
static void
gdk_keymap_x11_class_init (GdkKeymapX11Class *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->finalize = gdk_keymap_x11_finalize;
}
static void
gdk_keymap_x11_init (GdkKeymapX11 *keymap)
{
......@@ -736,18 +726,8 @@ _gdk_keymap_keys_changed (GdkDisplay *display)
g_signal_emit_by_name (display_x11->keymap, "keys_changed", 0);
}
/**
* gdk_keymap_get_direction:
* @keymap: a #GdkKeymap or %NULL to use the default keymap
*
* Returns the direction of effective layout of the keymap.
*
* Returns: %PANGO_DIRECTION_LTR or %PANGO_DIRECTION_RTL
* if it can determine the direction. %PANGO_DIRECTION_NEUTRAL
* otherwise.
**/
PangoDirection
gdk_keymap_get_direction (GdkKeymap *keymap)
static PangoDirection
gdk_x11_keymap_get_direction (GdkKeymap *keymap)
{
keymap = GET_EFFECTIVE_KEYMAP (keymap);
......@@ -773,19 +753,8 @@ gdk_keymap_get_direction (GdkKeymap *keymap)
return PANGO_DIRECTION_NEUTRAL;
}
/**
* gdk_keymap_have_bidi_layouts:
* @keymap: a #GdkKeymap or %NULL to use the default keymap
*
* Determines if keyboard layouts for both right-to-left and left-to-right
* languages are in use.
*
* Returns: %TRUE if there are layouts in both directions, %FALSE otherwise
*
* Since: 2.12
**/
gboolean
gdk_keymap_have_bidi_layouts (GdkKeymap *keymap)
static gboolean
gdk_x11_keymap_have_bidi_layouts (GdkKeymap *keymap)
{
keymap = GET_EFFECTIVE_KEYMAP (keymap);
......@@ -815,18 +784,8 @@ gdk_keymap_have_bidi_layouts (GdkKeymap *keymap)
return FALSE;
}
/**
* gdk_keymap_get_caps_lock_state:
* @keymap: a #GdkKeymap
*
* Returns whether the Caps Lock modifer is locked.
*
* Returns: %TRUE if Caps Lock is on
*
* Since: 2.16
*/
gboolean
gdk_keymap_get_caps_lock_state (GdkKeymap *keymap)
static gboolean
gdk_x11_keymap_get_caps_lock_state (GdkKeymap *keymap)
{
GdkKeymapX11 *keymap_x11;
......@@ -837,18 +796,8 @@ 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)
static gboolean
gdk_x11_keymap_get_num_lock_state (GdkKeymap *keymap)
{
GdkKeymapX11 *keymap_x11;
......@@ -859,32 +808,11 @@ gdk_keymap_get_num_lock_state (GdkKeymap *keymap)
return keymap_x11->num_lock_state;
}
/**
* gdk_keymap_get_entries_for_keyval:
* @keymap: (allow-none): a #GdkKeymap, or %NULL to use the default keymap
* @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
*
* Obtains a list of keycode/group/level combinations that will
* generate @keyval. Groups and levels are two kinds of keyboard mode;
* in general, the level determines whether the top or bottom symbol
* on a key is used, and the group determines whether the left or
* right symbol is used. On US keyboards, the shift key changes the
* keyboard level, and there are no groups. A group switch key might
* convert a keyboard between Hebrew to English modes, for example.
* #GdkEventKey contains a %group field that indicates the active
* keyboard group. The level is computed from the modifier mask.
* The returned array should be freed
* with g_free().
*
* Return value: %TRUE if keys were found and returned
**/
gboolean
gdk_keymap_get_entries_for_keyval (GdkKeymap *keymap,
guint keyval,
GdkKeymapKey **keys,
gint *n_keys)
static gboolean
gdk_x11_keymap_get_entries_for_keyval (GdkKeymap *keymap,
guint keyval,
GdkKeymapKey **keys,
gint *n_keys)
{
GArray *retval;
GdkKeymapX11 *keymap_x11;
......@@ -1009,29 +937,12 @@ gdk_keymap_get_entries_for_keyval (GdkKeymap *keymap,
return *n_keys > 0;
}
/**
* gdk_keymap_get_entries_for_keycode:
* @keymap: (allow-none): a #GdkKeymap or %NULL to use the default keymap
* @hardware_keycode: a keycode
* @keys: (out): return location for array of #GdkKeymapKey, or %NULL
* @keyvals: (out): return location for array of keyvals, or %NULL
* @n_entries: length of @keys and @keyvals
*
* Returns the keyvals bound to @hardware_keycode.
* The Nth #GdkKeymapKey in @keys is bound to the Nth
* keyval in @keyvals. Free the returned arrays with g_free().
* When a keycode is pressed by the user, the keyval from
* this list of entries is selected by considering the effective
* keyboard group and level. See gdk_keymap_translate_keyboard_state().
*
* Returns: %TRUE if there were any entries
**/
gboolean
gdk_keymap_get_entries_for_keycode (GdkKeymap *keymap,
guint hardware_keycode,
GdkKeymapKey **keys,
guint **keyvals,
gint *n_entries)
static gboolean
gdk_x11_keymap_get_entries_for_keycode (GdkKeymap *keymap,
guint hardware_keycode,
GdkKeymapKey **keys,
guint **keyvals,
gint *n_entries)
{
GdkKeymapX11 *keymap_x11;
......@@ -1168,23 +1079,9 @@ gdk_keymap_get_entries_for_keycode (GdkKeymap *keymap,
return *n_entries > 0;
}
/**
* gdk_keymap_lookup_key:
* @keymap: a #GdkKeymap or %NULL to use the default keymap
* @key: a #GdkKeymapKey with keycode, group, and level initialized
*
* Looks up the keyval mapped to a keycode/group/level triplet.
* If no keyval is bound to @key, returns 0. For normal user input,
* you want to use gdk_keymap_translate_keyboard_state() instead of
* this function, since the effective group/level may not be
* the same as the current keyboard state.
*
* Return value: a keyval, or 0 if none was mapped to the given @key
**/
guint
gdk_keymap_lookup_key (GdkKeymap *keymap,
const GdkKeymapKey *key)
static guint
gdk_x11_keymap_lookup_key (GdkKeymap *keymap,
const GdkKeymapKey *key)
{
GdkKeymapX11 *keymap_x11;
......@@ -1434,82 +1331,15 @@ translate_keysym (GdkKeymapX11 *keymap_x11,
#undef SYM
}
/**
* gdk_keymap_translate_keyboard_state:
* @keymap: (allow-none): a #GdkKeymap, or %NULL to use the default
* @hardware_keycode: a keycode
* @state: a modifier state
* @group: active keyboard group
* @keyval: (out) (allow-none): return location for keyval, or %NULL
* @effective_group: (out) (allow-none): return location for effective group, or %NULL
* @level: (out) (allow-none): return location for level, or %NULL
* @consumed_modifiers: (out) (allow-none): return location for modifiers that were used to
* determine the group or level, or %NULL
*
* Translates the contents of a #GdkEventKey into a keyval, effective
* group, and level. Modifiers that affected the translation and
* are thus unavailable for application use are returned in
* @consumed_modifiers. See <xref linkend="key-group-explanation"/> for an explanation of
* groups and levels. The @effective_group is the group that was
* actually used for the translation; some keys such as Enter are not
* affected by the active keyboard group. The @level is derived from
* @state. For convenience, #GdkEventKey already contains the translated
* keyval, so this function isn't as useful as you might think.
*
* <note><para>
* @consumed_modifiers gives modifiers that should be masked out
* from @state when comparing this key press to a hot key. For
* instance, on a US keyboard, the <literal>plus</literal>
* symbol is shifted, so when comparing a key press to a
* <literal>&lt;Control&gt;plus</literal> accelerator &lt;Shift&gt; should
* be masked out.
* </para>
* <informalexample><programlisting>
* &sol;* We want to ignore irrelevant modifiers like ScrollLock *&sol;
* &num;define ALL_ACCELS_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)
* gdk_keymap_translate_keyboard_state (keymap, event->hardware_keycode,
* event->state, event->group,
* &amp;keyval, NULL, NULL, &amp;consumed);
* if (keyval == GDK_PLUS &&
* (event->state &amp; ~consumed &amp; ALL_ACCELS_MASK) == GDK_CONTROL_MASK)
* &sol;* Control was pressed *&sol;
* </programlisting></informalexample>
* <para>
* An older interpretation @consumed_modifiers was that it contained
* all modifiers that might affect the translation of the key;
* this allowed accelerators to be stored with irrelevant consumed
* modifiers, by doing:</para>
* <informalexample><programlisting>
* &sol;* XXX Don't do this XXX *&sol;
* if (keyval == accel_keyval &&
* (event->state &amp; ~consumed &amp; ALL_ACCELS_MASK) == (accel_mods &amp; ~consumed))
* &sol;* Accelerator was pressed *&sol;
* </programlisting></informalexample>
* <para>
* However, this did not work if multi-modifier combinations were
* used in the keymap, since, for instance, <literal>&lt;Control&gt;</literal>
* would be masked out even if only <literal>&lt;Control&gt;&lt;Alt&gt;</literal>
* was used in the keymap. To support this usage as well as well as
* possible, all <emphasis>single modifier</emphasis> combinations
* that could affect the key for any combination of modifiers will
* be returned in @consumed_modifiers; multi-modifier combinations
* are returned only when actually found in @state. When you store
* accelerators, you should always store them with consumed modifiers
* removed. Store <literal>&lt;Control&gt;plus</literal>,
* not <literal>&lt;Control&gt;&lt;Shift&gt;plus</literal>,
* </para></note>
*
* Return value: %TRUE if there was a keyval bound to the keycode/state/group
**/
gboolean
gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
guint hardware_keycode,
GdkModifierType state,
gint group,
guint *keyval,
gint *effective_group,
gint *level,
GdkModifierType *consumed_modifiers)
static gboolean
gdk_x11_keymap_translate_keyboard_state (GdkKeymap *keymap,
guint hardware_keycode,
GdkModifierType state,
gint group,
guint *keyval,
gint *effective_group,
gint *level,
GdkModifierType *consumed_modifiers)
{
GdkKeymapX11 *keymap_x11;
KeySym tmp_keyval = NoSymbol;
......@@ -1720,27 +1550,8 @@ _gdk_keymap_add_virtual_modifiers_compat (GdkKeymap *keymap,
}
}
/**
* gdk_keymap_add_virtual_modifiers:
* @keymap: a #GdkKeymap
* @state: 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.
* are set in @state to their non-virtual counterparts (i.e. Mod2,
* Mod3,...) and set the corresponding bits in @state.
*
* GDK already does this before delivering key events, but for
* compatibility reasons, it only sets the first virtual modifier
* it finds, whereas this function sets all matching virtual modifiers.
*
* This function is useful when matching key events against
* accelerators.
*
* Since: 2.20
*/
void
gdk_keymap_add_virtual_modifiers (GdkKeymap *keymap,
static void
gdk_x11_keymap_add_virtual_modifiers (GdkKeymap *keymap,
GdkModifierType *state)
{