Re: [fltk.general] Re: Losing keyboard input under user 'spamming' input

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.general  ]
Previous Message ]New Message | Reply ]Next Message ]

Re: Re: Losing keyboard input under user 'spamming' input Ian MacArthur 01:24 Sep 24 top right image
On Friday, 24 September 2021 at 08:57:20 UTC+1 Ian MacArthur wrote:

Interestingly, I actually looked at the docs for Keyboard Events, and it includes this exhortation:

Todo: Add details on how to detect repeating keys, since on some X servers a repeating key will generate both FL_KEYUP and FL_KEYDOWN, such that to tell if a key is held, you need Fl::event_key(int) to detect if the key is being held down during FL_KEYUP or not.

I don't know who wrote that (I'm fairly sure it was not me, at any rate!) but that sounds like exactly the thing... Might be worth a try.

And for (even more!) completeness, here's what I think that might mean - though given that I'm not on X11 today I have no clue of this will work or not.
Works. OK on Win10, but that's not all that helpful in this instance...

#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Menu_Bar.H>

static int shown_v = 0;

class my_win : public Fl_Double_Window {

    int handle (int);

    int please_change;
    my_win(int x, int y,int w,int h,const char* L):Fl_Double_Window(x,y,w,h,L), please_change(0) {};
}; // my_win

int my_win::handle (int e) {
    int ret = Fl_Double_Window::handle(e);
    if (e == FL_KEYDOWN) {
        if (Fl::event_state() & FL_ALT) {
            if (Fl::event_key() == 's') {
                please_change = (-1);
                return 1;
    else if (e == FL_KEYUP) {
        if (please_change) {
            if ((Fl::event_state() & FL_ALT) && (Fl::event_key() == 's')) {
                // Probably a synthetic repeat keyup on X11? Ignore...
                return 1;
            else { // Assumed to be a real keyup
                please_change = 0;
                if (shown_v) {
                    shown_v = 0;
                else {
                    shown_v = 1;
                return 1;
    return ret;
} // my_win::handle

static void toggle_win (Fl_Widget*,void* data) {
    my_win* w = static_cast<my_win*>(data);

    if (shown_v) {
        shown_v = 0;
    else {
        shown_v = 1;
} // toggle_win

int main() {
    shown_v = 0;

    my_win *win2 = new my_win(0.5*Fl::w()-100,0.5*Fl::h()-100,200,200,"2nd Win");

    Fl_Double_Window *win = new Fl_Double_Window(0.5*Fl::w()-200,0.5*Fl::h()-200,400,400,"Main Win");
    win->box (FL_FLAT_BOX);

    Fl_Menu_Item items[] = {
        {"Menu1",0,0,0,FL_SUBMENU,0,0,FL_NORMAL_SIZE,FL_BLACK}, //0
        {"Hide/show second window",FL_ALT+'s',toggle_win,win2,0,0,0,FL_NORMAL_SIZE,FL_BLACK},

    Fl_Menu_Bar *menu = new Fl_Menu_Bar(0, 0, win->w(),25);
    menu->box (FL_BORDER_BOX);

    return Fl::run();
} // main
// end of file

You received this message because you are subscribed to the Google Groups "fltk.general" group.
To unsubscribe from this group and stop receiving emails from it, send an email to
To view this discussion on the web visit
Direct Link to Message ]
bottom left image   bottom right image
Previous Message ]New Message | Reply ]Next Message ]

Comments are owned by the poster. All other content is copyright 1998-2022 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to ''.