emacs-diffs
[Top][All Lists]
Advanced

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

master 2cb3dea72b7: Correctly register Num Lock keys under Haiku


From: Po Lu
Subject: master 2cb3dea72b7: Correctly register Num Lock keys under Haiku
Date: Mon, 23 Oct 2023 01:38:22 -0400 (EDT)

branch: master
commit 2cb3dea72b7b48162a6702270dd3896a0f19cb4b
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Correctly register Num Lock keys under Haiku
    
    * src/haiku_support.cc (DispatchMessage): If B_NUM_LOCK is set,
    invert B_SHIFT_KEY; should it be subsequently set, omit mapping
    from raw_char.
---
 src/haiku_support.cc | 38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 3fc90385af3..33ad5889043 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -1059,6 +1059,8 @@ public:
        msg->FindInt64 ("when", &rq.time);
 
        rq.modifiers = 0;
+       rq.keysym = 0;
+
        uint32_t mods = modifiers ();
 
        if (mods & B_SHIFT_KEY)
@@ -1073,10 +1075,39 @@ public:
        if (mods & B_OPTION_KEY)
          rq.modifiers |= HAIKU_MODIFIER_SUPER;
 
-       ret = keysym_from_raw_char (raw, key, &rq.keysym);
+       /* mods & B_SHIFT_KEY should be inverted if keycode is
+          situated in the numeric keypad and Num Lock is set, for
+          this transformation is not effected on key events
+          themselves.  */
+
+       if (mods & B_NUM_LOCK)
+         {
+           switch (key)
+             {
+             case 0x37:
+             case 0x38:
+             case 0x39:
+             case 0x48:
+             case 0x49:
+             case 0x4a:
+             case 0x58:
+             case 0x59:
+             case 0x5a:
+             case 0x64:
+             case 0x65:
+               mods ^= B_SHIFT_KEY;
+
+               /* If shift is set at this juncture, map these keys to
+                  the digits they represent.  Because raw is not
+                  affected by Num Lock, keysym_from_raw_char will map
+                  this to the keysym yielded by this key in the
+                  absence of any modifiers.  */
+               if (mods & B_SHIFT_KEY)
+                 goto map_keysym;
+             }
+         }
 
-       if (!ret)
-         rq.keysym = 0;
+       ret = keysym_from_raw_char (raw, key, &rq.keysym);
 
        if (ret < 0)
          return;
@@ -1087,6 +1118,7 @@ public:
          {
            if (mods & B_SHIFT_KEY)
              {
+         map_keysym:
                if (mods & B_CAPS_LOCK)
                  map_caps_shift (key, &rq.multibyte_char);
                else



reply via email to

[Prev in Thread] Current Thread [Next in Thread]