summaryrefslogtreecommitdiff
path: root/src/drivers/Wayland
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-06-03 09:50:41 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-06-03 09:50:41 +0200
commitce46b4b68be0d140e2cd5d2e1bd75b7f0cc90140 (patch)
tree468c15aa1172c0eb7343da7c5982f775b354d2f9 /src/drivers/Wayland
parentd792ed21f55a8fadbcb0edb99647e5fb3ef01669 (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.cxx18
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
+ }
}