On Tuesday 10 December 2002 3:26 pm, Lars Gullik Bjønnes wrote:
> What we do not want is cursors, auto-repeat chars that just continue
> to go after the key has been released. so we use xsync for this.
> The problem is to know when to run this xsync, we want to loose as few
> xevents as possible.
> | So adjacent Release and Press events have the same time stamp. Next
> | step?
> this means that you are autorepeating.

Ok. I'm getting there. You want code like this:

handler() {
        static Time time_released;
        static unsigned int last_key_pressed;
        static unsigned int last_state_pressed;

        switch (event) {
        case FL_KEYPRESS:
        {
                if (!ev) break;
                XKeyEvent * xke = reinterpret_cast<XKeyEvent *>(ev);

                if (xke->time - time_released < 25 // should perhaps be tunable
                    && xke->state == last_state_pressed
                    && xke->keycode == last_key_pressed) {
                        // purge events
                        if (XEventsQueued(fl_get_display(), QueuedAlready) > 0)
                                waitForX(true);
                                break;
                }

                // Go on to handle the key press and dispatch it to workAreaKeyPress
                ...
                break;
        }       
        case FL_KEYRELEASE:
                if (!ev) break;
                time_released = ev->xkey.time;
                last_key_pressed = ev->xkey.keycode;
                last_state_pressed  = ev->xkey.state;
                break;
        }
}

Am I there?
Angus

Reply via email to