[Gambas-user] Highlight Editor - Capslock Key State

Rob sourceforge-raindog2 at ...94...
Wed Feb 13 22:40:09 CET 2008


On Wednesday 13 February 2008 15:08, Benoit Minisini wrote:
> Interesting problem. I don't know if there is a way to know the
> status of CAPS LOCK, or other modifier keys.

I think there is.  At the end of this post is the output of xev when I 
press "a" three times, turning caps lock on and off in between.  
Looking at the source of xev, the current status of the caps lock key 
seems to be bit 1 (value of 2) in XKeyEvent->state, which seems to 
correspond to the macro LockMask in X.h:

/* from xev.c */
const char *Yes = "YES";
const char *No = "NO";
/* ... */
static void do_KeyPress (XEvent *eventp)
{
    XKeyEvent *e = (XKeyEvent *) eventp;
    KeySym ks;
    char *ksname;
    /* ... */
    printf ("    state 0x%x, keycode %u (keysym 0x%lx, %s),             
                 same_screen %s,\n",
            e->state, e->keycode, (unsigned long) ks, ksname,
            e->same_screen ? Yes : No);
}
/* the above outputs "state 0x2" when caps lock is on */

/* from X.h */
#define LockMask                (1<<1) /* i.e., 0x2 */

So someone using gb.api could probably detect the caps lock key the 
first time a key is pressed, after a little bit of painful libX11 
manipulation.  While this would only work when the user presses a 
key, the state flag is also passed with XMotionEvent, and appears to 
work the same way, so whenever the user moved the mouse you'd have 
your caps lock state as well.

This doesn't seem to work for Scroll Lock, and I don't have a Num Lock 
key on my laptop so I don't know whether that would work too.  

Rob

KeyPress event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286280441, (486,459), root:(489,543),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XmbLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

KeyRelease event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286280497, (486,459), root:(489,543),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

KeyPress event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286281927, (486,459), root:(489,543),
    state 0x0, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286282007, (486,459), root:(489,543),
    state 0x2, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286282869, (486,459), root:(489,543),
    state 0x2, keycode 38 (keysym 0x41, A), same_screen YES,
    XLookupString gives 1 bytes: (41) "A"
    XmbLookupString gives 1 bytes: (41) "A"
    XFilterEvent returns: False

KeyRelease event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286282933, (486,459), root:(489,543),
    state 0x2, keycode 38 (keysym 0x41, A), same_screen YES,
    XLookupString gives 1 bytes: (41) "A"
    XFilterEvent returns: False

KeyPress event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286283508, (486,459), root:(489,543),
    state 0x2, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286283587, (486,459), root:(489,543),
    state 0x2, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286284033, (486,459), root:(489,543),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XmbLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

KeyRelease event, serial 31, synthetic NO, window 0x3c00001,
    root 0x5d, subw 0x0, time 1286284097, (486,459), root:(489,543),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False




More information about the User mailing list