diff options
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H | 3 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx | 25 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 22 |
3 files changed, 24 insertions, 26 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H index 855bce1c7..01932fc50 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H @@ -78,8 +78,7 @@ public: virtual void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen osrc, int srcx, int srcy); static struct fl_wld_buffer *create_shm_buffer(int width, int height); static void buffer_release(struct wld_window *window); - static void buffer_commit(struct wld_window *window, const struct wl_callback_listener*, - bool need_damage = true); + static void buffer_commit(struct wld_window *window, bool need_damage = true); static void cairo_init(struct fl_wld_buffer *buffer, int width, int height, int stride, cairo_format_t format); virtual void *gc(); virtual void gc(void *gc); diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx index e4632b4c5..98474ec24 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx @@ -75,9 +75,26 @@ struct fl_wld_buffer *Fl_Wayland_Graphics_Driver::create_shm_buffer(int width, i } -void Fl_Wayland_Graphics_Driver::buffer_commit(struct wld_window *window, - const struct wl_callback_listener *listener, - bool need_damage) { +// used to support both normal and progressive drawing +static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time); + +static const struct wl_callback_listener surface_frame_listener = { + .done = surface_frame_done, +}; + +static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) { + struct wld_window *window = (struct wld_window *)data; +//fprintf(stderr,"surface_frame_done: destroy cb=%p draw_buffer_needs_commit=%d\n", cb, window->buffer->draw_buffer_needs_commit); + wl_callback_destroy(cb); + window->buffer->cb = NULL; + if (window->buffer->draw_buffer_needs_commit) { +//fprintf(stderr,"surface_frame_done: new cb=%p \n", window->buffer->cb); + Fl_Wayland_Graphics_Driver::buffer_commit(window, &surface_frame_listener); + } +} + + +void Fl_Wayland_Graphics_Driver::buffer_commit(struct wld_window *window, bool need_damage) { cairo_surface_t *surf = cairo_get_target(window->buffer->cairo_); cairo_surface_flush(surf); memcpy(window->buffer->data, window->buffer->draw_buffer, window->buffer->data_size); @@ -85,7 +102,7 @@ void Fl_Wayland_Graphics_Driver::buffer_commit(struct wld_window *window, wl_surface_set_buffer_scale(window->wl_surface, window->scale); window->buffer->cb = wl_surface_frame(window->wl_surface); if (need_damage) wl_surface_damage_buffer(window->wl_surface, 0, 0, 1000000, 1000000); - wl_callback_add_listener(window->buffer->cb, listener, window); + wl_callback_add_listener(window->buffer->cb, &surface_frame_listener, window); wl_surface_commit(window->wl_surface); window->buffer->draw_buffer_needs_commit = false; //fprintf(stderr,"buffer_commit %s\n", window->fl_win->parent()?"child":"top"); diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx index 79747004f..5291f80b0 100644 --- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx @@ -322,24 +322,6 @@ void Fl_Wayland_Window_Driver::capture_titlebar_and_borders(Fl_RGB_Image*& top, top->scale(pWindow->w(), htop); } -// used to support both normal and progressive drawing -static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time); - -static const struct wl_callback_listener surface_frame_listener = { - .done = surface_frame_done, -}; - -static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) { - struct wld_window *window = (struct wld_window *)data; -//fprintf(stderr,"surface_frame_done: destroy cb=%p draw_buffer_needs_commit=%d\n", cb, window->buffer->draw_buffer_needs_commit); - wl_callback_destroy(cb); - window->buffer->cb = NULL; - if (window->buffer->draw_buffer_needs_commit) { -//fprintf(stderr,"surface_frame_done: new cb=%p \n", window->buffer->cb); - Fl_Wayland_Graphics_Driver::buffer_commit(window, &surface_frame_listener); - } -} - // make drawing go into this window (called by subclass flush() impl.) void Fl_Wayland_Window_Driver::make_current() { @@ -358,7 +340,7 @@ void Fl_Wayland_Window_Driver::make_current() { // to support progressive drawing if ( (!Fl_Wayland_Window_Driver::in_flush) && window->buffer && (!window->buffer->cb)) { //fprintf(stderr, "direct make_current: new cb=%p\n", window->buffer->cb); - Fl_Wayland_Graphics_Driver::buffer_commit(window, &surface_frame_listener); + Fl_Wayland_Graphics_Driver::buffer_commit(window); } Fl_Wayland_Window_Driver::wld_window = window; @@ -425,7 +407,7 @@ void Fl_Wayland_Window_Driver::flush() { Fl_Window_Driver::flush(); Fl_Wayland_Window_Driver::in_flush = false; if (window->buffer->cb) wl_callback_destroy(window->buffer->cb); - Fl_Wayland_Graphics_Driver::buffer_commit(window, &surface_frame_listener, false); + Fl_Wayland_Graphics_Driver::buffer_commit(window, false); } |
