summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-03-24 15:34:35 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2023-03-24 15:34:35 +0100
commite918d94b6791e81438233e7672ad0b2223c57dc8 (patch)
tree159a6941f8fefc8653327343e27d330de1979756 /src/drivers
parentdcb4c39956092b6a4b9d8e0e85c2065099804119 (diff)
Fix: Wayland backend draws everything two or three times (#708)
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index a6c31ced2..9dad205cb 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -641,8 +641,9 @@ static void surface_enter(void *data, struct wl_surface *wl_surface, struct wl_o
return;
//printf("surface_enter win=%p wl_output=%p wld_scale=%d\n", window->fl_win, wl_output, output->wld_scale);
- window->output = output;
Fl_Wayland_Window_Driver *win_driver = Fl_Wayland_Window_Driver::driver(window->fl_win);
+ float pre_scale = Fl::screen_scale(win_driver->screen_num()) * win_driver->wld_scale();
+ window->output = output;
if (!window->fl_win->parent()) { // for top-level, set its screen number
Fl_Wayland_Screen_Driver::output *running_output;
Fl_Wayland_Screen_Driver *scr_dr = (Fl_Wayland_Screen_Driver*)Fl::screen_driver();
@@ -660,9 +661,13 @@ static void surface_enter(void *data, struct wl_surface *wl_surface, struct wl_o
Fl_Wayland_Graphics_Driver::buffer_release(window);
window->fl_win->redraw();
} else {
- win_driver->is_a_rescale(true);
- window->fl_win->size(window->fl_win->w(), window->fl_win->h());
- win_driver->is_a_rescale(false);
+ float post_scale = Fl::screen_scale(win_driver->screen_num()) * output->wld_scale;
+ //printf("pre_scale=%.1f post_scale=%.1f\n", pre_scale, post_scale);
+ if (window->fl_win->as_gl_window() || post_scale != pre_scale) {
+ 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())
wl_surface_set_buffer_scale(window->wl_surface, output->wld_scale);
}
@@ -690,6 +695,8 @@ static void handle_configure(struct libdecor_frame *frame,
enum libdecor_window_state window_state;
struct libdecor_state *state;
Fl_Wayland_Window_Driver *driver = Fl_Wayland_Window_Driver::driver(window->fl_win);
+ // true exactly for the 1st run of handle_configure() for this window
+ bool is_1st_run = (window->xdg_surface == 0);
// true exactly for the 2nd run of handle_configure() for this window
bool is_2nd_run = (window->xdg_surface != 0 && driver->wait_for_expose_value);
float f = Fl::screen_scale(window->fl_win->screen_num());
@@ -766,7 +773,6 @@ static void handle_configure(struct libdecor_frame *frame,
}
libdecor_state_free(state);
- window->fl_win->redraw();
// necessary with SSD
driver->in_handle_configure = true;
if (!window->fl_win->as_gl_window()) {
@@ -775,6 +781,9 @@ static void handle_configure(struct libdecor_frame *frame,
driver->Fl_Window_Driver::flush(); // GL window
}
driver->in_handle_configure = false;
+ if (Fl_Wayland_Screen_Driver::compositor != Fl_Wayland_Screen_Driver::WESTON || !is_1st_run) {
+ window->fl_win->clear_damage();
+ }
}
@@ -841,8 +850,8 @@ static void xdg_surface_configure(void *data, struct xdg_surface *xdg_surface, u
}
window->configured_width = window->fl_win->w();
window->configured_height = window->fl_win->h();
- window->fl_win->redraw();
Fl_Window_Driver::driver(window->fl_win)->flush();
+ window->fl_win->clear_damage();
}
static const struct xdg_surface_listener xdg_surface_listener = {