mirror of
https://github.com/fltk/fltk.git
synced 2026-05-28 03:15:21 +08:00
Wayland: improve mapping and hiding of GL (subs)windows
This commit is contained in:
@@ -304,7 +304,7 @@ void Fl_Wayland_Gl_Window_Driver::make_current_before() {
|
|||||||
// OpenGL3-glut-test, OpenGL3test.
|
// OpenGL3-glut-test, OpenGL3test.
|
||||||
// Tested wayland compositors: mutter, kde-plasma, weston, sway on FreeBSD.
|
// Tested wayland compositors: mutter, kde-plasma, weston, sway on FreeBSD.
|
||||||
if (pWindow->parent()) win = fl_wl_xid(pWindow->top_window());
|
if (pWindow->parent()) win = fl_wl_xid(pWindow->top_window());
|
||||||
while (!win->xdg_surface) wl_display_roundtrip(fl_wl_display());
|
while (wl_list_empty(&win->outputs)) wl_display_dispatch(fl_wl_display());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -427,6 +427,11 @@ static void destroy_surface_caution_pointer_focus(struct wl_surface *surface,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void delayed_delete_Fl_X(Fl_X *i) {
|
||||||
|
delete i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Fl_Wayland_Window_Driver::hide() {
|
void Fl_Wayland_Window_Driver::hide() {
|
||||||
Fl_X* ip = Fl_X::flx(pWindow);
|
Fl_X* ip = Fl_X::flx(pWindow);
|
||||||
if (hide_common()) return;
|
if (hide_common()) return;
|
||||||
@@ -477,7 +482,21 @@ void Fl_Wayland_Window_Driver::hide() {
|
|||||||
//fprintf(stderr, "After hide: sub=%p frame=%p xdg=%p top=%p pop=%p surf=%p\n", wld_win->subsurface, wld_win->frame, wld_win->xdg_surface, wld_win->xdg_toplevel, wld_win->xdg_popup, wld_win->wl_surface);
|
//fprintf(stderr, "After hide: sub=%p frame=%p xdg=%p top=%p pop=%p surf=%p\n", wld_win->subsurface, wld_win->frame, wld_win->xdg_surface, wld_win->xdg_toplevel, wld_win->xdg_popup, wld_win->wl_surface);
|
||||||
free(wld_win);
|
free(wld_win);
|
||||||
}
|
}
|
||||||
delete ip;
|
if (pWindow->as_gl_window() && in_flush_) {
|
||||||
|
// Under Wayland and for a GL window, this scenario can occur (e.g. test/cube):
|
||||||
|
// Fl::flush() calls Fl_Wayland_Window_Driver::flush()
|
||||||
|
// calls Fl_Wayland_Gl_Window_Driver::swap_buffers()
|
||||||
|
// calls wl_display_dispatch_pending() calls Fl_Window::hide().
|
||||||
|
// 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
|
||||||
|
// Fl::flush().
|
||||||
|
ip->xid = 0;
|
||||||
|
ip->next = NULL;
|
||||||
|
Fl::damage(1); // make sure potential remaining damaged windows get drawn
|
||||||
|
Fl::add_timeout(.01, (Fl_Timeout_Handler)delayed_delete_Fl_X, ip);
|
||||||
|
} else {
|
||||||
|
delete ip;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -624,11 +643,6 @@ static struct libdecor_interface libdecor_iface = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static void delayed_redraw(Fl_Window *win) {
|
|
||||||
win->redraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void change_scale(Fl_Wayland_Screen_Driver::output *output, struct wld_window *window,
|
void change_scale(Fl_Wayland_Screen_Driver::output *output, struct wld_window *window,
|
||||||
float pre_scale) {
|
float pre_scale) {
|
||||||
Fl_Wayland_Window_Driver *win_driver = Fl_Wayland_Window_Driver::driver(window->fl_win);
|
Fl_Wayland_Window_Driver *win_driver = Fl_Wayland_Window_Driver::driver(window->fl_win);
|
||||||
@@ -655,11 +669,6 @@ void change_scale(Fl_Wayland_Screen_Driver::output *output, struct wld_window *w
|
|||||||
win_driver->is_a_rescale(true);
|
win_driver->is_a_rescale(true);
|
||||||
window->fl_win->size(window->fl_win->w(), window->fl_win->h());
|
window->fl_win->size(window->fl_win->w(), window->fl_win->h());
|
||||||
win_driver->is_a_rescale(false);
|
win_driver->is_a_rescale(false);
|
||||||
if (window->fl_win->as_gl_window() && !window->fl_win->parent() &&
|
|
||||||
post_scale != pre_scale) { // for opening toplevel GL window on 2-screen system
|
|
||||||
win_driver->Fl_Window_Driver::flush();
|
|
||||||
Fl::add_timeout(0.01, (Fl_Timeout_Handler)delayed_redraw, window->fl_win);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (window->fl_win->as_gl_window())
|
if (window->fl_win->as_gl_window())
|
||||||
|
|||||||
Reference in New Issue
Block a user