commit 92795b2a0ac2f9c2a26bcdf8752e8f0ab7c11675
Author:     norayr chilingarian <nor...@arnet.am>
AuthorDate: Sun Dec 3 20:22:04 2023 +0400
Commit:     Hiltjo Posthuma <hil...@codemadness.org>
CommitDate: Wed Dec 13 19:10:08 2023 +0100

    fix uppercase in armenian (and perhaps some other) layouts
    
    "This patch fixes uppercase in armenian (and perhaps some other) layouts. 
svkbd
    was previously registering a key in one modification (xorg accepts up to 4
    modifications). with this patch svkbd registers 2 modifications - upper and
    lower case. function tmp_remap changed in a way that if the key is not 
found in
    a current layout, it is temporary added to it. for cyrillic layout uppercase
    (when shift is pressed) letters were showing anyway, because those are 
somehow
    found (modified) by xorg. but for armenian layout that did not work. now 
works."
    
    Patch by նորայր <nor...@arnet.am>

diff --git a/svkbd.c b/svkbd.c
index e4dbd15..22b4b34 100644
--- a/svkbd.c
+++ b/svkbd.c
@@ -481,9 +481,18 @@ press(Key *k, KeySym buttonmod)
 int
 tmp_remap(KeySym keysym)
 {
-       XChangeKeyboardMapping(dpy, tmp_keycode, 1, &keysym, 1);
+       /* map lower and upper case of keysym to the temporary keycode */
+       KeySym syms[2];
+       XConvertCase(keysym, &syms[0], &syms[1]);
+
+       /* if keysym is capital letter then swap upper and lower case */
+       if (keysym == syms[1])
+               syms[1] = syms[0], syms[0] = keysym;
+
+       XChangeKeyboardMapping(dpy, tmp_keycode, syms[0] == syms[1] ? 1 : 2, 
syms, 1);
        XSync(dpy, False);
 
+       printdbg("Temporary map keysym %ld (%ld, %ld) to keycode %d\n", keysym, 
syms[0], syms[1], tmp_keycode);
        return tmp_keycode;
 }
 

Reply via email to