diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx | 15 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H | 1 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx | 16 |
3 files changed, 12 insertions, 20 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx index 473afd810..b821ae201 100644 --- a/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Gl_Window_Driver.cxx @@ -397,18 +397,6 @@ 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()); @@ -421,7 +409,8 @@ void Fl_Wayland_Gl_Window_Driver::resize(int is_a_resize, int W, int 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_callback_add_listener(xid->frame_cb, + Fl_Wayland_Graphics_Driver::p_surface_frame_listener, xid); } wl_egl_window_resize(egl_window, W, H, 0, 0); } diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H index b8c7a2a8d..c3730dee4 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H @@ -53,6 +53,7 @@ public: }; static const uint32_t wld_format; static struct wl_shm_pool *current_pool; + static FL_EXPORT const struct wl_callback_listener *p_surface_frame_listener; void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen osrc, int srcx, int srcy) FL_OVERRIDE; void cache_size(Fl_Image *img, int &width, int &height) FL_OVERRIDE; diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx index a5b7c2dfe..2dd6ac527 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx @@ -118,15 +118,13 @@ struct Fl_Wayland_Graphics_Driver::wld_buffer * } -// used to support both normal and progressive drawing +// used to support both normal and progressive drawing and for top-level GL windows 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->frame_cb = NULL; - if (window->buffer->draw_buffer_needs_commit) { - Fl_Wayland_Graphics_Driver::buffer_commit(window); - } + window->frame_cb = NULL; + if (window->buffer && window->buffer->draw_buffer_needs_commit) { + Fl_Wayland_Graphics_Driver::buffer_commit(window); } } @@ -136,6 +134,10 @@ static const struct wl_callback_listener surface_frame_listener = { }; +const struct wl_callback_listener *Fl_Wayland_Graphics_Driver::p_surface_frame_listener = + &surface_frame_listener; + + // copy pixels in region r from the Cairo surface to the Wayland buffer static void copy_region(struct wld_window *window, struct flCairoRegion *r) { struct Fl_Wayland_Graphics_Driver::wld_buffer *buffer = window->buffer; @@ -178,7 +180,7 @@ void Fl_Wayland_Graphics_Driver::buffer_commit(struct wld_window *window, struct Fl_Wayland_Window_Driver::driver(window->fl_win)->wld_scale() ); if (!window->covered) { // see issue #878 window->frame_cb = wl_surface_frame(window->wl_surface); - wl_callback_add_listener(window->frame_cb, &surface_frame_listener, window); + wl_callback_add_listener(window->frame_cb, p_surface_frame_listener, window); } wl_surface_commit(window->wl_surface); window->buffer->draw_buffer_needs_commit = false; |
