summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-06-29 14:57:54 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-06-29 14:57:54 +0200
commit1c6a0c1a8fb254945179276ecbd359cc1926fbb1 (patch)
tree7ee3c70b3a49b60cbb62e80d3f5627ca8b37ee0e /src/drivers
parent55daede41d451d90d8fa71aa377e0f5e3a4eaf75 (diff)
Wayland: fix interactive moving and resizing of a subwindow - cont'd (#987)
This fix requires to be able to recognize whether Fl_Wayland_Window_Driver::resize() is called by a resize operation of an encompassing widget or not. To do that, private static int variable group_resize_depth_ is added to class Fl_Group and an accessor to this variable is added to class Fl_Window_Driver.
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx16
1 files changed, 6 insertions, 10 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index 5c0ff38df..21a02c8f4 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -1770,7 +1770,6 @@ int Fl_Wayland_Window_Driver::set_cursor_4args(const Fl_RGB_Image *rgb, int hotx
void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) {
- static int depth = 0;
struct wld_window *fl_win = fl_wl_xid(pWindow);
if (fl_win && fl_win->kind == DECORATED && !xdg_toplevel()) {
pWindow->wait_for_expose();
@@ -1788,14 +1787,13 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) {
int is_a_resize = (W != w() || H != h() || true_rescale);
if (is_a_move) force_position(1);
else if (!is_a_resize && !is_a_move) return;
- depth++;
if (shown() && !(parent() || popup_window())) {
X = Y = 0;
}
struct wld_window *parent_xid = parent() ? fl_wl_xid(pWindow->window()) : NULL;
// This condition excludes moving or resizing a subwindow while not changing its parent
// and delays application of new X,Y,W,H values if the parent is being committed.
- if (!parent_xid || depth > 1 || !parent_xid->frame_cb) {
+ if (true_rescale || !parent_xid || group_resize_depth() >= 1 || !parent_xid->frame_cb) {
if (is_a_resize) {
if (pWindow->parent()) {
if (W < 1) W = 1;
@@ -1866,18 +1864,16 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) {
}
if (fl_win && parent_xid) {
- if (depth == 1) {
+ if (group_resize_depth() < 1 && !parent_xid->frame_cb) {
// Interactive move or resize of a subwindow requires to commit the parent surface
// and requires to make sure the parent surface is ready to accept a new commit (#987).
- if (!parent_xid->frame_cb) {
- parent_xid->frame_cb = wl_surface_frame(parent_xid->wl_surface);
- wl_callback_add_listener(parent_xid->frame_cb, Fl_Wayland_Graphics_Driver::p_surface_frame_listener, parent_xid);
- wl_surface_commit(parent_xid->wl_surface);
- }
+ parent_xid->frame_cb = wl_surface_frame(parent_xid->wl_surface);
+ wl_callback_add_listener(parent_xid->frame_cb,
+ Fl_Wayland_Graphics_Driver::p_surface_frame_listener, parent_xid);
+ wl_surface_commit(parent_xid->wl_surface);
}
checkSubwindowFrame(); // make sure subwindow doesn't leak outside parent
}
- depth--;
}