gdkkeys-win32: Only perform substitution as last-resort
authorPhilip Zander <philip.zander@gmail.com>
Sun, 27 Feb 2022 15:32:59 +0000 (16:32 +0100)
committerLuca Bacci <luca.bacci982@gmail.com>
Thu, 3 Mar 2022 08:59:53 +0000 (09:59 +0100)
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

index caa170b20ab014c58c37e7122d43041bbd52836d..eed0d8fd23c3cb0291af3abce48457a16f6d1753 100644 (file)
@@ -229,14 +229,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;
@@ -249,24 +244,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);
@@ -326,6 +305,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)
 {