diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-06-23 19:12:35 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-06-23 19:12:35 +0200 |
| commit | 617dc2ce12eb6183b4ae3d3fe73572e43629c825 (patch) | |
| tree | c86e3c5e6ab31708aa69bb227c8c03ca7f157020 /src | |
| parent | e698af035a8d9363ac6d212a8e986e1f4fdac969 (diff) | |
Fix for issue #450: Fl_Counter slips into infinite loop.
This issue revealed that the macOS and Wayland platform processed events slightly differently
from other platforms.
Under X11 and Windows, Fl::wait() processes one event if one is present, and also all other events
present in the event queue immediately after the processing of that event.
Under macOS and Wayland, Fl::wait() processes one event if one is present and returns.
This commits makes the macOS and Wayland platforms behave as other platforms.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_cocoa.mm | 8 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx | 2 |
2 files changed, 7 insertions, 3 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 1fe7f68cc..889b5c37b 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -768,12 +768,14 @@ static int do_queued_events( double time = 0.0 ) time = Fl_Timeout::time_to_wait(time); fl_unlock_function(); - NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask + NSEvent *event; + while ( (event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate dateWithTimeIntervalSinceNow:time] - inMode:NSDefaultRunLoopMode dequeue:YES]; - if (event != nil) { + inMode:NSDefaultRunLoopMode + dequeue:YES]) != nil ) { got_events = 1; [FLApplication sendEvent:event]; // will then call [NSApplication sendevent:] + time = 0; } fl_lock_function(); diff --git a/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx index 81f6b9258..dad143cb0 100644 --- a/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx @@ -1058,6 +1058,8 @@ static const struct wl_registry_listener registry_listener = { static void fd_callback(int unused, struct wl_display *display) { wl_display_dispatch(display); + static Fl_Wayland_System_Driver *sys_dr = (Fl_Wayland_System_Driver*)Fl::system_driver(); + while (sys_dr->poll_or_select() > 0) wl_display_dispatch(display); } |
