mirror of
https://github.com/fltk/fltk.git
synced 2026-05-30 21:25:30 +08:00
Wayland platform: move repeated code into Fl_Wayland_Graphics_Driver::buffer_commit().
This commit is contained in:
@@ -79,7 +79,7 @@ public:
|
|||||||
void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen osrc, int srcx, int srcy);
|
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 struct fl_wld_buffer *create_shm_buffer(int width, int height);
|
||||||
static void buffer_release(struct wld_window *window);
|
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);
|
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();
|
||||||
virtual void gc(void *gc);
|
virtual void gc(void *gc);
|
||||||
|
|||||||
@@ -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) {
|
void Fl_Wayland_Graphics_Driver::buffer_commit(struct wld_window *window,
|
||||||
if (!window->buffer->draw_buffer_needs_commit) return;
|
const struct wl_callback_listener *listener) {
|
||||||
cairo_surface_t *surf = cairo_get_target(window->buffer->cairo_);
|
cairo_surface_t *surf = cairo_get_target(window->buffer->cairo_);
|
||||||
cairo_surface_flush(surf);
|
cairo_surface_flush(surf);
|
||||||
memcpy(window->buffer->data, window->buffer->draw_buffer, window->buffer->data_size);
|
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_attach(window->wl_surface, window->buffer->wl_buffer, 0, 0);
|
||||||
wl_surface_set_buffer_scale(window->wl_surface, window->scale);
|
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);
|
wl_surface_commit(window->wl_surface);
|
||||||
window->buffer->draw_buffer_needs_commit = false;
|
window->buffer->draw_buffer_needs_commit = false;
|
||||||
//fprintf(stderr,"buffer_commit %s\n", window->fl_win->parent()?"child":"top");
|
//fprintf(stderr,"buffer_commit %s\n", window->fl_win->parent()?"child":"top");
|
||||||
|
|||||||
@@ -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) {
|
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);
|
//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);
|
wl_callback_destroy(cb);
|
||||||
window->buffer->cb = NULL;
|
window->buffer->cb = NULL;
|
||||||
if (window->buffer->draw_buffer_needs_commit) {
|
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);
|
//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, &surface_frame_listener);
|
||||||
Fl_Wayland_Graphics_Driver::buffer_commit(window);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,25 +350,21 @@ void Fl_Wayland_Window_Driver::make_current() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct wld_window *window = fl_xid(pWindow);
|
struct wld_window *window = fl_xid(pWindow);
|
||||||
float scale = Fl::screen_scale(pWindow->screen_num()) * window->scale;
|
if (window->buffer) {
|
||||||
if (window && window->buffer) {
|
|
||||||
((Fl_Cairo_Graphics_Driver*)fl_graphics_driver)->needs_commit_tag(
|
((Fl_Cairo_Graphics_Driver*)fl_graphics_driver)->needs_commit_tag(
|
||||||
&window->buffer->draw_buffer_needs_commit);
|
&window->buffer->draw_buffer_needs_commit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// to support progressive drawing
|
// to support progressive drawing
|
||||||
if ( (!Fl_Wayland_Window_Driver::in_flush) && window && window->buffer && (!window->buffer->cb)) {
|
if ( (!Fl_Wayland_Window_Driver::in_flush) && 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);
|
|
||||||
//fprintf(stderr, "direct make_current: new cb=%p\n", 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, &surface_frame_listener);
|
||||||
Fl_Wayland_Graphics_Driver::buffer_commit(window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fl_graphics_driver->clip_region(0);
|
fl_graphics_driver->clip_region(0);
|
||||||
fl_window = Fl_Wayland_Window_Driver::wld_window = window;
|
fl_window = Fl_Wayland_Window_Driver::wld_window = window;
|
||||||
if (!window->buffer) {
|
if (!window->buffer) {
|
||||||
|
float scale = Fl::screen_scale(pWindow->screen_num()) * window->scale;
|
||||||
window->buffer = Fl_Wayland_Graphics_Driver::create_shm_buffer(
|
window->buffer = Fl_Wayland_Graphics_Driver::create_shm_buffer(
|
||||||
pWindow->w() * scale, pWindow->h() * scale);
|
pWindow->w() * scale, pWindow->h() * scale);
|
||||||
((Fl_Cairo_Graphics_Driver*)fl_graphics_driver)->needs_commit_tag(
|
((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_Window_Driver::flush();
|
||||||
Fl_Wayland_Window_Driver::in_flush = false;
|
Fl_Wayland_Window_Driver::in_flush = false;
|
||||||
|
|
||||||
window->buffer->draw_buffer_needs_commit = true;
|
Fl_Wayland_Graphics_Driver::buffer_commit(window, NULL);
|
||||||
wl_surface_frame(window->wl_surface);
|
|
||||||
Fl_Wayland_Graphics_Driver::buffer_commit(window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user