On 04/08/13 10:35, Howard Rubin wrote:
> On Fri, 05 Apr 2013 23:39:28 -0700, Greg Ercolano wrote:
>>      an fltk timer would probably be needed to get the correct
>>      state info shown reliably.
> 
> Thanks for the replies.
> 
> No luck with an fltk timer, on Ubuntu Linux 10.04. Test program below.
> 
> In the console we can see that (Fl::event_state() & FL_CAPS_LOCK)
> correctly changes to nonzero as soon as you press Caps Lock.
> 
> But it doesn't change back to 0 when you press Caps Lock again
> until e.g. you move the mouse over the window.

        I'm not sure if this is a bug in X11 or not.. kinda seems so.

        X11's own "KeyRelease" events seem to behave similarly;
        in my tests with the pure X11 code below, when X11 sends
        a KeyRelease event for the capslock key, the "event.xkey.state"
        shows accurate info when capslock is ENABLED, but INACCURATE INFO
        when capslock is disabled.

        You have to hit some other key to get the accurate state of
        capslock after lock release.

        So I think FLTK is simply passing this X11 behavior on to the app.
        Not really sure if FLTK can fix this if X11 gives similar info.

        My X11's a bit rusty, but there might be a way to acquire the realtime
        capslock state by a different X library call -- if there is, you should
        probably #ifdef that into your code.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

//
// Slightly modified X windows hello world
//
//     ref: http://www.cuillin.demon.co.uk/nazz/trivia/hw/hw_c.html
// compile: g++ hello.c -o hello -lXtst -lX11 -lXext
//

int main(int argc, char *argv[])
{
    Display    *dpy;            /* X server connection */
    Window      win;            /* Window ID */
    GC          gc;             /* GC to draw with */
    XFontStruct *fontstruct;    /* Font descriptor */
    XGCValues   gcv;            /* Struct for creating GC */
    XEvent      event;          /* Event received */
    XSetWindowAttributes xswa;  /* Temporary Set Window Attribute struct */

    // OPEN DISPLAY
    if ((dpy = XOpenDisplay(NULL)) == NULL) {
        fprintf(stderr, "%s: can't open %s\n", argv[0], XDisplayName(NULL));
        exit(1);
    }

    // CREATE 500x500 WINDOW
    win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy),
                              50,50,500,500,    // x,y,w,h
                              0,                // border width
                              0,0);             // border color, bg color

    XSelectInput(dpy, win, ExposureMask|KeyPressMask|KeyReleaseMask);

    // MAP WINDOW
    XMapWindow(dpy, win);

    // EVENT LOOP
    while (1) {
        XNextEvent(dpy, &event);
        switch ( event.type ) {
            case Expose:
                fprintf(stderr, "* Expose event\n");
                if ( event.xexpose.count == 0) {
                    while (XCheckTypedEvent(dpy, Expose, &event));

                    // GET CURRENT WINDOW SIZE (FOR TEXT CENTERING)
                    XWindowAttributes xwa;
                    if (XGetWindowAttributes(dpy, win, &xwa) == 0)
                        break;
                    XClearWindow(dpy, win);
                }
                break;
           case KeyPress:
           case KeyRelease: {
               const char *ename = (event.type==KeyPress) ? "  Press" : 
"Release";
               printf("%s keycode=0X%04x, state=0X%04x\n", ename, 
event.xkey.keycode, event.xkey.state);
               break;
           }
           default:
               fprintf(stderr, "* Ignored event '%d'\n", (int)event.type);
               break;
        }
    }
    return(1);
}
_______________________________________________
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to