diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-03-24 15:34:35 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2023-03-24 15:34:35 +0100 |
| commit | e918d94b6791e81438233e7672ad0b2223c57dc8 (patch) | |
| tree | 159a6941f8fefc8653327343e27d330de1979756 /src | |
| parent | dcb4c39956092b6a4b9d8e0e85c2065099804119 (diff) | |
Fix: Wayland backend draws everything two or three times (#708)
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 21 |
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 = { |
