[gtk+/gtk-2-24] W32: Fix for commit 1f74f12d9, re-enabling decimal separator key



commit 4bf5290a25fe2cc15eccb201f0f1558c0feb535f
Author: Fredy Paquet <fredy opag ch>
Date:   Fri Feb 26 18:33:52 2016 +0000

    W32: Fix for commit 1f74f12d9, re-enabling decimal separator key
    
    1f74f12d9 rendered entry of keypad decimal mark unuseable for
    several national keyboard layouts, this commit amends that, at
    least for W32, and makes GTK+ behave more or less the same way
    W32 behaves.
    
    The patch works like this:
    - When typing the first character at the keyboard or when switching
      keyboard layouts, the decimal mark character will be cached in the
      static variable "decimal_mark" within gdkkeys-win32.c
    
    - in case of WIN32, gdk_keyval_to_unicode() asks gdkkeys-win32.c for the
      current decimal_mark when converting GDK_KEY_KP_Decimal.

 gdk/gdkkeyuni.c              |    5 +++++
 gdk/win32/gdkkeys-win32.c    |   22 ++++++++++++++++++++--
 gdk/win32/gdkprivate-win32.h |    2 ++
 3 files changed, 27 insertions(+), 2 deletions(-)
---
diff --git a/gdk/gdkkeyuni.c b/gdk/gdkkeyuni.c
index 4282597..4a4af94 100644
--- a/gdk/gdkkeyuni.c
+++ b/gdk/gdkkeyuni.c
@@ -881,6 +881,11 @@ gdk_keyval_to_unicode (guint keyval)
   if ((keyval & 0xff000000) == 0x01000000)
     return keyval & 0x00ffffff;
 
+#if defined(GDK_WINDOWING_WIN32)
+  if (keyval == 0xffae)
+    return (guint32) _gdk_win32_keymap_get_decimal_mark ();
+#endif
+
   /* binary search in table */
   while (max >= min) {
     mid = (min + max) / 2;
diff --git a/gdk/win32/gdkkeys-win32.c b/gdk/win32/gdkkeys-win32.c
index d9f86d7..b70066e 100644
--- a/gdk/win32/gdkkeys-win32.c
+++ b/gdk/win32/gdkkeys-win32.c
@@ -47,6 +47,7 @@ static GdkModifierType gdk_shift_modifiers = GDK_SHIFT_MASK;
 static GdkKeymap *default_keymap = NULL;
 
 static guint *keysym_tab = NULL;
+static wchar_t decimal_mark = 0;
 
 #ifdef G_ENABLE_DEBUG
 static void
@@ -329,6 +330,18 @@ handle_dead (guint  keysym,
     }
 }
 
+/* keypad decimal mark depends on active keyboard layout
+   return current decimal mark as unicode character
+   */
+guint32
+_gdk_win32_keymap_get_decimal_mark (void)
+{
+  if (decimal_mark)
+    return (decimal_mark);
+
+  return ((guint32) '.');
+}
+
 static void
 update_keymap (void)
 {
@@ -382,7 +395,7 @@ update_keymap (void)
               */
              handle_special (vk, ksymp, shift);
 
-             if (*ksymp == 0)
+             if ((*ksymp == 0) || ((vk == VK_DECIMAL) && (shift == 0)))
                {
                  wchar_t wcs[10];
                  gint k;
@@ -396,7 +409,12 @@ update_keymap (void)
                           vk, scancode, shift, k,
                           wcs[0], wcs[1]);
 #endif
-                 if (k == 1)
+                 if ((vk == VK_DECIMAL) && (shift == 0))
+                   {
+                     if (k == 1)
+                       decimal_mark = wcs[0];
+                   }
+                 else if (k == 1)
                    *ksymp = gdk_unicode_to_keyval (wcs[0]);
                  else if (k == -1)
                    {
diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h
index f28ae8a..35116a5 100644
--- a/gdk/win32/gdkprivate-win32.h
+++ b/gdk/win32/gdkprivate-win32.h
@@ -500,6 +500,8 @@ void _gdk_win32_emit_configure_event (GdkWindow *window);
 GdkWindow *_gdk_win32_find_window_for_mouse_event (GdkWindow* reported_window,
                                                   MSG*       msg);
 
+guint32 _gdk_win32_keymap_get_decimal_mark (void);
+
 /* Initialization */
 void _gdk_windowing_window_init (GdkScreen *screen);
 void _gdk_root_window_size_init (void);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]