From b85e60524fe2a420ca64c237051f86f3dd9cf4de Mon Sep 17 00:00:00 2001 From: Philip Zander Date: Sun, 27 Feb 2022 16:32:59 +0100 Subject: [PATCH] gdkkeys-win32: Only perform substitution as last-resort Instead of performing keyboard layout substitution whenever we find a matching entry in the registry, first try to load the original layout and only attempt substitution when that fails. See #4724 --- gdk/win32/gdkkeys-win32.c | 49 ++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/gdk/win32/gdkkeys-win32.c b/gdk/win32/gdkkeys-win32.c index 84aa381902..0a413afeb8 100644 --- a/gdk/win32/gdkkeys-win32.c +++ b/gdk/win32/gdkkeys-win32.c @@ -227,14 +227,9 @@ fail1: return NULL; } -/* - * Get the file path of the keyboard layout dll. - * The result is heap-allocated and should be freed with g_free(). - */ static char* -get_keyboard_layout_file (const char *layout_name) +_get_keyboard_layout_file (const char *layout_name) { - char *final_layout_name = NULL; HKEY hkey = 0; DWORD var_type = REG_SZ; char *result = NULL; @@ -247,24 +242,8 @@ get_keyboard_layout_file (const char *layout_name) "Keyboard Layouts\\"; char kbdKeyPath[sizeof (prefix) + KL_NAMELENGTH]; - /* The user may have a keyboard substitute configured */ - final_layout_name = get_keyboard_layout_substituted_name (layout_name); - if (final_layout_name != NULL) - { - g_debug ("Substituting keyboard layout name from '%s' to '%s'", - layout_name, final_layout_name); - g_snprintf (kbdKeyPath, sizeof (prefix) + KL_NAMELENGTH, "%s%s", - prefix, final_layout_name); - g_free (final_layout_name); - final_layout_name = NULL; - } - else - { - g_debug ("Could not get substitute keyboard layout name for '%s', " - "will use '%s' directly", layout_name, layout_name); - g_snprintf (kbdKeyPath, sizeof (prefix) + KL_NAMELENGTH, "%s%s", - prefix, layout_name); - } + g_snprintf (kbdKeyPath, sizeof (prefix) + KL_NAMELENGTH, "%s%s", + prefix, layout_name); status = RegOpenKeyExA (HKEY_LOCAL_MACHINE, (LPCSTR) kbdKeyPath, 0, KEY_QUERY_VALUE, &hkey); @@ -324,6 +303,28 @@ fail1: return NULL; } +/* + * Get the file path of the keyboard layout dll. + * The result is heap-allocated and should be freed with g_free(). + */ +static char* +get_keyboard_layout_file (const char *layout_name) +{ + char *result = _get_keyboard_layout_file (layout_name); + + /* If we could not retrieve a path, it may be that we need to perform layout + * substitution + */ + if (result == NULL) + { + char *substituted = get_keyboard_layout_substituted_name (layout_name); + result = _get_keyboard_layout_file (substituted); + g_free (substituted); + } + + return result; +} + static void clear_keyboard_layout_info (gpointer data) {