diff options
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx | 10 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 23 |
3 files changed, 16 insertions, 19 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H index a87a59878..0704a735d 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.H @@ -79,7 +79,7 @@ public: 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); + static void buffer_commit(struct wld_window *window, const struct wl_callback_listener*); 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 e817b6840..78586dc59 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx @@ -76,13 +76,19 @@ 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) { - if (!window->buffer->draw_buffer_needs_commit) return; +void Fl_Wayland_Graphics_Driver::buffer_commit(struct wld_window *window, + const struct wl_callback_listener *listener) { 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); wl_surface_attach(window->wl_surface, window->buffer->wl_buffer, 0, 0); wl_surface_set_buffer_scale(window->wl_surface, window->scale); + struct wl_callback *cb = wl_surface_frame(window->wl_surface); + if (listener) { + window->buffer->cb = cb; + wl_surface_damage_buffer(window->wl_surface, 0, 0, 1000000, 1000000); + wl_callback_add_listener(window->buffer->cb, 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 65bc72995..c751b47f8 100644 --- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx @@ -330,16 +330,13 @@ static const struct wl_callback_listener surface_frame_listener = { }; static void surface_frame_done(void *data, struct wl_callback *cb, uint32_t time) { - Window window = (Window)data; + 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) { - wl_surface_damage_buffer(window->wl_surface, 0, 0, 1000000, 1000000); - window->buffer->cb = wl_surface_frame(window->wl_surface); //fprintf(stderr,"surface_frame_done: new cb=%p \n", window->buffer->cb); - wl_callback_add_listener(window->buffer->cb, &surface_frame_listener, window); - Fl_Wayland_Graphics_Driver::buffer_commit(window); + Fl_Wayland_Graphics_Driver::buffer_commit(window, &surface_frame_listener); } } @@ -353,25 +350,21 @@ void Fl_Wayland_Window_Driver::make_current() { } struct wld_window *window = fl_xid(pWindow); - float scale = Fl::screen_scale(pWindow->screen_num()) * window->scale; - if (window && window->buffer) { + if (window->buffer) { ((Fl_Cairo_Graphics_Driver*)fl_graphics_driver)->needs_commit_tag( &window->buffer->draw_buffer_needs_commit); } // to support progressive drawing - if ( (!Fl_Wayland_Window_Driver::in_flush) && window && window->buffer && (!window->buffer->cb)) { - wl_surface_damage_buffer(window->wl_surface, 0, 0, pWindow->w() * scale, pWindow->h() * scale); - window->buffer->draw_buffer_needs_commit = true; - window->buffer->cb = wl_surface_frame(window->wl_surface); + if ( (!Fl_Wayland_Window_Driver::in_flush) && window->buffer && (!window->buffer->cb)) { //fprintf(stderr, "direct make_current: new cb=%p\n", window->buffer->cb); - wl_callback_add_listener(window->buffer->cb, &surface_frame_listener, window); - Fl_Wayland_Graphics_Driver::buffer_commit(window); + Fl_Wayland_Graphics_Driver::buffer_commit(window, &surface_frame_listener); } fl_graphics_driver->clip_region(0); fl_window = Fl_Wayland_Window_Driver::wld_window = window; if (!window->buffer) { + float scale = Fl::screen_scale(pWindow->screen_num()) * window->scale; window->buffer = Fl_Wayland_Graphics_Driver::create_shm_buffer( pWindow->w() * scale, pWindow->h() * scale); ((Fl_Cairo_Graphics_Driver*)fl_graphics_driver)->needs_commit_tag( @@ -431,9 +424,7 @@ void Fl_Wayland_Window_Driver::flush() { Fl_Window_Driver::flush(); Fl_Wayland_Window_Driver::in_flush = false; - window->buffer->draw_buffer_needs_commit = true; - wl_surface_frame(window->wl_surface); - Fl_Wayland_Graphics_Driver::buffer_commit(window); + Fl_Wayland_Graphics_Driver::buffer_commit(window, NULL); } |
