mirror of
https://github.com/fltk/fltk.git
synced 2026-05-31 13:55:38 +08:00
Have Fl_Wayland_Window_Driver use Fl::add_check() when adequate
This commit is contained in:
@@ -427,8 +427,9 @@ static void destroy_surface_caution_pointer_focus(struct wl_surface *surface,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void delayed_delete_Fl_X(Fl_X *i) {
|
static void delayed_delete_Fl_X(void *data) {
|
||||||
delete i;
|
Fl::remove_check(delayed_delete_Fl_X, data);
|
||||||
|
delete (Fl_X*)data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -483,17 +484,18 @@ void Fl_Wayland_Window_Driver::hide() {
|
|||||||
free(wld_win);
|
free(wld_win);
|
||||||
}
|
}
|
||||||
if (pWindow->as_gl_window() && in_flush_) {
|
if (pWindow->as_gl_window() && in_flush_) {
|
||||||
// Under Wayland and for a GL window, this scenario can occur (e.g. test/cube):
|
// Under Wayland and for a GL window, this summarized scenario can occur
|
||||||
|
// when closing a window with "escape" (e.g. test/cube):
|
||||||
// Fl::flush() calls Fl_Wayland_Window_Driver::flush()
|
// Fl::flush() calls Fl_Wayland_Window_Driver::flush()
|
||||||
// calls Fl_Wayland_Gl_Window_Driver::swap_buffers()
|
// calls Fl_Wayland_Gl_Window_Driver::swap_buffers()
|
||||||
// calls wl_display_dispatch_pending() calls Fl_Window::hide().
|
// calls wl_display_dispatch_pending() calls Fl_Wayland_Window_Driver::hide().
|
||||||
// We make sure here to force exit from the loop over all damaged windows
|
// We make sure here to force exit from the loop over all damaged windows
|
||||||
// in Fl::flush() and delay deletion of the Fl_X record after return from
|
// in Fl::flush(), and postpone deletion of the Fl_X record until after return
|
||||||
// Fl::flush().
|
// from Fl::flush().
|
||||||
ip->xid = 0;
|
ip->xid = 0;
|
||||||
ip->next = NULL;
|
ip->next = NULL;
|
||||||
Fl::damage(1); // make sure potential remaining damaged windows get drawn
|
Fl::damage(1); // make sure potential remaining damaged windows get drawn
|
||||||
Fl::add_timeout(.01, (Fl_Timeout_Handler)delayed_delete_Fl_X, ip);
|
Fl::add_check(delayed_delete_Fl_X, ip);
|
||||||
} else {
|
} else {
|
||||||
delete ip;
|
delete ip;
|
||||||
}
|
}
|
||||||
@@ -880,14 +882,15 @@ void Fl_Wayland_Window_Driver::wait_for_expose()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delayed_close(Fl_Window *win) {
|
static void delayed_close(void *data) {
|
||||||
Fl::handle(FL_CLOSE, win);
|
Fl::remove_check(delayed_close, data);
|
||||||
|
Fl::handle(FL_CLOSE, (Fl_Window*)data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_close(struct libdecor_frame *frame, void *user_data)
|
static void handle_close(struct libdecor_frame *frame, void *user_data)
|
||||||
{
|
{ // runs when the close button of a window titlebar is pushed
|
||||||
struct wld_window* wl_win = (struct wld_window*)user_data;
|
struct wld_window* wl_win = (struct wld_window*)user_data;
|
||||||
Fl::add_timeout(0.01, (Fl_Timeout_Handler)delayed_close, wl_win->fl_win);
|
Fl::add_check(delayed_close, wl_win->fl_win);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user