summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-01-18 08:10:33 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2024-01-18 08:10:33 +0100
commitb7fba465cec78b00a46a47ebd3f8f231b5feb5ee (patch)
treeb4dc9b1261b24e5d4aa24757fa1718c69dbd486a /src/drivers
parent554bccbecdc2acdc73fd1ff851c541839ed8b523 (diff)
Wayland: throttle resize operations also for top-level GL windows
Member cb of struct wld_buffer is replaced by member frame_cb of struct wld_window. This allows frame_cb to be used both for non-GL and for top-level GL windows.
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx17
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H1
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx8
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.H1
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx8
5 files changed, 26 insertions, 9 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx
index aec93283b..473afd810 100644
--- a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx
@@ -397,6 +397,18 @@ static void delayed_scissor(Fl_Wayland_Gl_Window_Driver *dr) {
}*/
+static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) {
+ struct wld_window *xid = (struct wld_window *)data;
+ wl_callback_destroy(cb);
+ xid->frame_cb = NULL;
+}
+
+
+static const struct wl_callback_listener surface_frame_listener = {
+ .done = surface_frame_done,
+};
+
+
void Fl_Wayland_Gl_Window_Driver::resize(int is_a_resize, int W, int H) {
if (!egl_window) return;
float f = Fl::screen_scale(pWindow->screen_num());
@@ -406,6 +418,11 @@ void Fl_Wayland_Gl_Window_Driver::resize(int is_a_resize, int W, int H) {
int W2, H2;
wl_egl_window_get_attached_size(egl_window, &W2, &H2);
if (W2 != W || H2 != H) {
+ struct wld_window *xid = fl_wl_xid(pWindow);
+ if (xid->kind == Fl_Wayland_Window_Driver::DECORATED && !xid->frame_cb) {
+ xid->frame_cb = wl_surface_frame(xid->wl_surface);
+ wl_callback_add_listener(xid->frame_cb, &surface_frame_listener, xid);
+ }
wl_egl_window_resize(egl_window, W, H, 0, 0);
}
/* CONTROL_LEAKING_SUB_GL_WINDOWS
diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H
index 73af80701..b8c7a2a8d 100644
--- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H
+++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H
@@ -41,7 +41,6 @@ public:
struct wl_list link; // links all buffers from the same wl_shm_pool
struct wl_buffer *wl_buffer;
void *data;
- struct wl_callback *cb;
struct wl_shm_pool *shm_pool;
bool draw_buffer_needs_commit;
bool in_use; // true while being committed
diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
index 3ec0ffd38..a5b7c2dfe 100644
--- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
@@ -123,7 +123,7 @@ static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time
struct wld_window *window = (struct wld_window *)data;
wl_callback_destroy(cb);
if (window->buffer) { // fix for issue #712
- window->buffer->cb = NULL;
+ window->frame_cb = NULL;
if (window->buffer->draw_buffer_needs_commit) {
Fl_Wayland_Graphics_Driver::buffer_commit(window);
}
@@ -177,8 +177,8 @@ void Fl_Wayland_Graphics_Driver::buffer_commit(struct wld_window *window, struct
wl_surface_set_buffer_scale( window->wl_surface,
Fl_Wayland_Window_Driver::driver(window->fl_win)->wld_scale() );
if (!window->covered) { // see issue #878
- window->buffer->cb = wl_surface_frame(window->wl_surface);
- wl_callback_add_listener(window->buffer->cb, &surface_frame_listener, window);
+ window->frame_cb = wl_surface_frame(window->wl_surface);
+ wl_callback_add_listener(window->frame_cb, &surface_frame_listener, window);
}
wl_surface_commit(window->wl_surface);
window->buffer->draw_buffer_needs_commit = false;
@@ -237,7 +237,7 @@ void Fl_Wayland_Graphics_Driver::buffer_release(struct wld_window *window)
{
if (window->buffer && !window->buffer->released) {
window->buffer->released = true;
- if (window->buffer->cb) wl_callback_destroy(window->buffer->cb);
+ if (window->frame_cb) { wl_callback_destroy(window->frame_cb); window->frame_cb = NULL; }
delete[] window->buffer->draw_buffer.buffer;
window->buffer->draw_buffer.buffer = NULL;
cairo_destroy(window->buffer->draw_buffer.cairo_);
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.H b/src/drivers/Wayland/Fl_Wayland_Window_Driver.H
index 680ef70b7..8bc1a10f8 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.H
+++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.H
@@ -144,6 +144,7 @@ struct wld_window {
Fl_Window *fl_win;
struct wl_list outputs; // linked list of displays where part or whole of window maps
struct wl_surface *wl_surface;
+ struct wl_callback *frame_cb;
struct Fl_Wayland_Graphics_Driver::wld_buffer *buffer;
struct xdg_surface *xdg_surface;
enum Fl_Wayland_Window_Driver::kind kind;
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index e32943caa..138ef53d5 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -352,7 +352,7 @@ void Fl_Wayland_Window_Driver::make_current() {
}
// to support progressive drawing
- if ( (!Fl_Wayland_Window_Driver::in_flush_) && window->buffer && (!window->buffer->cb)
+ if ( (!Fl_Wayland_Window_Driver::in_flush_) && window->buffer && (!window->frame_cb)
&& window->buffer->draw_buffer_needs_commit && (!wait_for_expose_value) ) {
Fl_Wayland_Graphics_Driver::buffer_commit(window);
}
@@ -415,7 +415,7 @@ void Fl_Wayland_Window_Driver::flush() {
Fl_Wayland_Window_Driver::in_flush_ = true;
Fl_Window_Driver::flush();
Fl_Wayland_Window_Driver::in_flush_ = false;
- if (!window->buffer->cb) Fl_Wayland_Graphics_Driver::buffer_commit(window, r);
+ if (!window->frame_cb) Fl_Wayland_Graphics_Driver::buffer_commit(window, r);
}
@@ -909,9 +909,9 @@ static void handle_configure(struct libdecor_frame *frame,
#ifndef LIBDECOR_MR131
bool in_decorated_window_resizing = (window->state & LIBDECOR_WINDOW_STATE_RESIZING);
#endif
- bool condition = in_decorated_window_resizing && window->buffer;
+ bool condition = in_decorated_window_resizing;
if (condition) { // see issue #878
- condition = (window->covered ? window->buffer->in_use : (window->buffer->cb != NULL));
+ condition = (window->covered ? (window->buffer && window->buffer->in_use) : (window->frame_cb != NULL));
}
if (condition) {
// Skip resizing & redrawing. The last resize request won't be skipped because