diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-06-03 09:50:41 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-06-03 09:50:41 +0200 |
| commit | ce46b4b68be0d140e2cd5d2e1bd75b7f0cc90140 (patch) | |
| tree | 468c15aa1172c0eb7343da7c5982f775b354d2f9 /src/drivers/Wayland | |
| parent | d792ed21f55a8fadbcb0edb99647e5fb3ef01669 (diff) | |
Wayland: fix interactive moving and resizing of a subwindow (#987)
Diffstat (limited to 'src/drivers/Wayland')
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx index be0abf38e..4d36f8ce9 100644 --- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx @@ -1784,11 +1784,12 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) { } int is_a_move = (X != x() || Y != y()); bool true_rescale = Fl_Window::is_a_rescale(); + float f = Fl::screen_scale(pWindow->screen_num()); if (fl_win && fl_win->buffer) { - float scale = Fl::screen_scale(pWindow->screen_num()) * wld_scale(); + int scale = wld_scale(); int stride = cairo_format_stride_for_width( - Fl_Cairo_Graphics_Driver::cairo_format, int(W * scale) ); - size_t bsize = stride * int(H * scale); + Fl_Cairo_Graphics_Driver::cairo_format, int(W * f) * scale ); + size_t bsize = stride * int(H * f) * scale; true_rescale = (bsize != fl_win->buffer->draw_buffer.data_size); } int is_a_resize = (W != w() || H != h() || true_rescale); @@ -1811,7 +1812,6 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) { } if (shown()) { - float f = Fl::screen_scale(pWindow->screen_num()); if (is_a_resize) { if (pWindow->as_overlay_window() && other_xid) { destroy_double_buffer(); @@ -1861,13 +1861,17 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) { Fl::e_state = 0; } } else if (fl_win->kind == SUBWINDOW && fl_win->subsurface) { - wl_subsurface_set_position(fl_win->subsurface, pWindow->x() * f, pWindow->y() * f); + wl_subsurface_set_position(fl_win->subsurface, X * f, Y * f); } } } - if (fl_win && fl_win->kind == SUBWINDOW && fl_win->subsurface) - checkSubwindowFrame(); // make sure subwindow doesn't leak outside parent + if (fl_win && fl_win->kind == SUBWINDOW && fl_win->subsurface) { + Fl_Window *parent = pWindow->window(); + struct wld_window *xid = fl_wl_xid(parent); + if (xid) wl_surface_commit(xid->wl_surface); + checkSubwindowFrame(); // make sure subwindow doesn't leak outside parent + } } |
