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

[Xen-changelog] [qemu-xen-unstable] fix '|' key display problem in en-us with altgr processing



commit 99d53fbb69d3e03be61ae10506a304a3d08d792f
Author: Chun Yan Liu <cyliu@xxxxxxxxxx>
Date:   Wed Jan 5 23:48:36 2011 +0000

    fix '|' key display problem in en-us with altgr processing
    
    Commit f95d202ed644 handles altgr-insert problem.  Unfortunately, with
    that patch, there is a problem in En-us keyboard: '|' (bar) cannot be
    displayed. After checking keymap files, we found there are two
    definitions to "bar" in en-us: bar 0x56 altgr (in "common") bar 0x2b
    shift (in "en-us") First line is actually invalid in en-us
    lanuage. The 2nd definition will cover the 1st one.
    
    The previous change in didn't consider multi-definition case. It scans
    keymap files, if keysym needs altgr, it will records that, after that,
    if keysym is pressed but altgr not pressed, it will add an altgr press
    opeartion. It is correct if all keysyms are unique and valid. But in
    the above multi-definition case, there is problem: when reading bar
    0x56 altgr (in "common") it will record altgr needed, but in fact,
    that definition won't be used, it always use the 2nd definition and
    won't need altgr. Then if the keysym is pressed, the code will still
    add an altgr press operation, that will cause problem.
    
    So, if we cannot avoid multi-definition in keymap files, the altgr
    flag (whether altgr needed or not) should also be refreshed according
    to the 2nd defintion. In the above case, when reading the 1st line, it
    records altgr needed; then reading 2nd line, 2nd definition will cover
    the 1st, meanwhile the altgr flag should be reset (the 2nd definition
    doesn't need altgr, so altgr flag should be removed.)
    
    Following patch supplements f95d202ed644, and solve the
    problem.
    
    Signed-off-by: Chun Yan Liu <cyliu@xxxxxxxxxx>
    Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 keymaps.c |   16 ++++++++++++++++
 vnc.c     |    2 --
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/keymaps.c b/keymaps.c
index a61d465..12b83a5 100644
--- a/keymaps.c
+++ b/keymaps.c
@@ -54,6 +54,20 @@ typedef struct {
     struct key_range *altgr_range;
 } kbd_layout_t;
 
+static void del_key_range(struct key_range **krp, int code) {
+    struct key_range *kr;
+    struct key_range *kr_pr;
+    for (kr = *krp; kr; kr_pr = kr, kr = kr->next) {
+        if (code >= kr->start && code <= kr->end) {
+            if (kr == *krp)
+                *krp = kr->next;
+            else
+                kr_pr->next = kr->next;
+            qemu_free(kr);
+        }
+    }
+}
+
 static void add_to_key_range(struct key_range **krp, int code) {
     struct key_range *kr;
     for (kr = *krp; kr; kr = kr->next) {
@@ -137,6 +151,8 @@ static kbd_layout_t *parse_keyboard_layout(const char 
*language,
                    if (rest && strstr(rest, "altgr")) {
                        add_to_key_range(&k->altgr_range, keysym);
                        //fprintf(stderr, "altgr keysym %04x keycode %d\n", 
keysym, keycode);
+                   } else {
+                       del_key_range(&k->altgr_range, keysym);
                    }
        
                    /* if(keycode&0x80)
diff --git a/vnc.c b/vnc.c
index 0726746..ba26f9e 100644
--- a/vnc.c
+++ b/vnc.c
@@ -1279,11 +1279,9 @@ static void press_key_altgr_down(VncState *vs, int down)
     kbd_put_keycode(0xe0);
     if (down){
         kbd_put_keycode(0xb8 & 0x7f);
-        vs->modifiers_state[0xb8] = 1;
     }
     else {
         kbd_put_keycode(0xb8 | 0x80);
-        vs->modifiers_state[0xb8] = 0;
     }
 }
 
--
generated by git-patchbot for /home/xen/git/qemu-xen-unstable.git

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.