mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-08 04:18:05 +02:00
window.c; Only redraw once per frame
Based on a patch from Martin Minarik <minarik11@student.fiit.stuba.sk> who tracked down the excessive redraw problem.
This commit is contained in:
parent
56456d6578
commit
6bd4d97271
1 changed files with 22 additions and 1 deletions
|
|
@ -123,6 +123,7 @@ struct window {
|
|||
int x, y;
|
||||
int resize_edges;
|
||||
int redraw_scheduled;
|
||||
int redraw_needed;
|
||||
struct task redraw_task;
|
||||
int resize_scheduled;
|
||||
struct task resize_task;
|
||||
|
|
@ -2132,21 +2133,41 @@ widget_redraw(struct widget *widget)
|
|||
widget_redraw(child);
|
||||
}
|
||||
|
||||
static void
|
||||
frame_callback(void *data, struct wl_callback *callback, uint32_t time)
|
||||
{
|
||||
struct window *window = data;
|
||||
|
||||
wl_callback_destroy(callback);
|
||||
window->redraw_scheduled = 0;
|
||||
if (window->redraw_needed)
|
||||
window_schedule_redraw(window);
|
||||
}
|
||||
|
||||
static const struct wl_callback_listener listener = {
|
||||
frame_callback
|
||||
};
|
||||
|
||||
static void
|
||||
idle_redraw(struct task *task, uint32_t events)
|
||||
{
|
||||
struct window *window =
|
||||
container_of(task, struct window, redraw_task);
|
||||
struct wl_callback *callback;
|
||||
|
||||
window_create_surface(window);
|
||||
widget_redraw(window->widget);
|
||||
window_flush(window);
|
||||
window->redraw_scheduled = 0;
|
||||
window->redraw_needed = 0;
|
||||
|
||||
callback = wl_surface_frame(window->surface);
|
||||
wl_callback_add_listener(callback, &listener, window);
|
||||
}
|
||||
|
||||
void
|
||||
window_schedule_redraw(struct window *window)
|
||||
{
|
||||
window->redraw_needed = 1;
|
||||
if (!window->redraw_scheduled) {
|
||||
window->redraw_task.run = idle_redraw;
|
||||
display_defer(window->display, &window->redraw_task);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue