Wayland: restore support of Fl_Tile with subwindow widget

This commit is contained in:
ManoloFLTK 2024-07-26 16:01:16 +02:00
parent 3cc12d203f
commit b740c48ee8
4 changed files with 11 additions and 2 deletions

View File

@ -25,6 +25,9 @@
*/
class FL_EXPORT Fl_Tile : public Fl_Group {
friend class Fl_Window_Driver;
private:
static bool in_drag_intersection_;
public:
int handle(int event) FL_OVERRIDE;
Fl_Tile(int X, int Y, int W, int H, const char *L=0);

View File

@ -482,6 +482,8 @@ void Fl_Tile::move_intersection(int oldx, int oldy, int newx, int newy) {
}
}
bool Fl_Tile::in_drag_intersection_ = false;
/**
Drags the intersection at (\p oldx,\p oldy) to (\p newx,\p newy).
@ -532,10 +534,12 @@ void Fl_Tile::drag_intersection(int oldx, int oldy, int newx, int newy) {
}
}
// resize all children that have changed in size
in_drag_intersection_ = true;
for (i = 0; i < children(); i++) {
Fl_Rect &r = final_size[i];
child(i)->damage_resize(r.x(), r.y(), r.w(), r.h());
}
in_drag_intersection_ = false;
delete[] final_size;
} else {
move_intersection(oldx, oldy, newx, newy);

View File

@ -31,6 +31,7 @@
#include <FL/Fl_Export.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Overlay_Window.H>
#include <FL/Fl_Tile.H>
#include <stdlib.h>
@ -208,6 +209,7 @@ public:
virtual fl_uintptr_t os_id() { return 0; }
virtual void allow_expand_outside_parent() {}
static bool in_tile_intersection_drag() { return Fl_Tile::in_drag_intersection_; }
};
#endif // FL_WINDOW_DRIVER_H

View File

@ -1831,7 +1831,7 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) {
// When moving or resizing a non-GL subwindow independently from its parent, this condition
// delays application of X,Y,W,H values until the compositor signals
// it's ready for a new frame using the frame callback mechanism.
if (depth > 1 || pWindow->as_gl_window() || !parent_xid || wait_for_expose_value || (parent_xid->frame_cb && !xid_rect)) {
if (in_tile_intersection_drag() || depth > 1 || pWindow->as_gl_window() || !parent_xid || wait_for_expose_value || (parent_xid->frame_cb && !xid_rect)) {
if (is_a_resize) {
if (pWindow->parent()) {
if (W < 1) W = 1;
@ -1909,7 +1909,7 @@ void Fl_Wayland_Window_Driver::resize(int X, int Y, int W, int H) {
}
Fl_Wayland_Graphics_Driver::buffer_commit(parent_xid);
} else {
if (!parent_xid->frame_cb) {
if (!in_tile_intersection_drag() && !parent_xid->frame_cb) {
// use the frame callback mechanism and memorize current X,Y,W,H values
xid_rect = new xid_and_rect;
xid_rect->xid = parent_xid;