summaryrefslogtreecommitdiff
path: root/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-05-11 18:42:07 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-05-11 18:42:07 +0200
commit37abac2d8e3d4b3d810554dfd965f367be706c18 (patch)
treebab5b85aa55198519ff53b62e46b5e781fb60bbe /src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
parent4fb18ffbddfb1c6e5b90e42e6bfcd79117597f90 (diff)
Wayland: fix opening GL top-level window on 2-screen system
Diffstat (limited to 'src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx')
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index cedd04502..98880cbf4 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -623,6 +623,12 @@ static struct libdecor_interface libdecor_iface = {
.error = handle_error,
};
+
+static void delayed_redraw(Fl_Window *win) {
+ win->redraw();
+}
+
+
static void surface_enter(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output)
{
struct wld_window *window = (struct wld_window*)data;
@@ -661,9 +667,14 @@ static void surface_enter(void *data, struct wl_surface *wl_surface, struct wl_o
win_driver->is_a_rescale(true);
window->fl_win->size(window->fl_win->w(), window->fl_win->h());
win_driver->is_a_rescale(false);
+ if (window->fl_win->as_gl_window() && !window->fl_win->parent() &&
+ post_scale != pre_scale) { // necessary for glpuzzle on 2-screen system
+ Fl::add_timeout(0.01, (Fl_Timeout_Handler)delayed_redraw, window->fl_win);
+ }
} else if (window->buffer) {
- if (window->buffer->cb) wl_callback_destroy(window->buffer->cb);
- Fl_Wayland_Graphics_Driver::buffer_commit(window);
+ if (!window->buffer->cb) {
+ Fl_Wayland_Graphics_Driver::buffer_commit(window);
+ }
}
if (window->fl_win->as_gl_window())
wl_surface_set_buffer_scale(window->wl_surface, output->wld_scale);