Merge branch 'win32-fix-altgr-gtk3' into 'gtk-3-24'
IMContextSimple: Fix AltGr not working on Win32 [GTK3] See merge request GNOME/gtk!4374
This commit is contained in:
commit
8252f99e08
@ -686,6 +686,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
|
||||
GtkIMContextSimple *context_simple = GTK_IM_CONTEXT_SIMPLE (context);
|
||||
GtkIMContextSimplePrivate *priv = context_simple->priv;
|
||||
GdkDisplay *display = gdk_window_get_display (event->window);
|
||||
GdkKeymap *keymap = gdk_keymap_get_for_display (display);
|
||||
GSList *tmp_list;
|
||||
int n_compose = 0;
|
||||
GdkModifierType hex_mod_mask;
|
||||
@ -787,11 +788,28 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
|
||||
!is_hex_start && !is_hex_end && !is_escape && !is_backspace))
|
||||
{
|
||||
GdkModifierType no_text_input_mask;
|
||||
GdkModifierType consumed_modifiers = 0;
|
||||
|
||||
no_text_input_mask =
|
||||
gdk_keymap_get_modifier_mask (gdk_keymap_get_for_display (display),
|
||||
gdk_keymap_get_modifier_mask (keymap,
|
||||
GDK_MODIFIER_INTENT_NO_TEXT_INPUT);
|
||||
|
||||
#ifdef G_OS_WIN32
|
||||
/* On Win32, even Ctrl + Alt could be text input because AltGr = Ctrl
|
||||
* + Alt. For example, Ctrl + Alt + e = € on a German keyboard. The
|
||||
* GdkEvent's state, however, reports *all* modifiers that were
|
||||
* active at the time the key was pressed, including the ones that
|
||||
* were consumed to generate the keyval. So we cannot just assume
|
||||
* that any key event containing Ctrl or Alt is a keybinding. We have
|
||||
* to first check if those modifiers were actually used to generate
|
||||
* the keyval. If so, then the keypress is regular input and we
|
||||
* should not exit here.
|
||||
*/
|
||||
gdk_keymap_translate_keyboard_state (keymap, event->hardware_keycode,
|
||||
event->state, event->group, NULL,
|
||||
NULL, NULL, &consumed_modifiers);
|
||||
#endif
|
||||
|
||||
if (priv->in_hex_sequence && priv->modifiers_dropped &&
|
||||
(event->keyval == GDK_KEY_Return ||
|
||||
event->keyval == GDK_KEY_ISO_Enter ||
|
||||
@ -800,7 +818,7 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (event->state & no_text_input_mask)
|
||||
if (event->state & no_text_input_mask & ~consumed_modifiers)
|
||||
{
|
||||
if (priv->in_hex_sequence || priv->in_compose_sequence)
|
||||
return TRUE; /* Don't leak random key events during preedit */
|
||||
|
Loading…
Reference in New Issue
Block a user