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:
+22
-1
@@ -123,6 +123,7 @@ struct window {
|
|||||||
int x, y;
|
int x, y;
|
||||||
int resize_edges;
|
int resize_edges;
|
||||||
int redraw_scheduled;
|
int redraw_scheduled;
|
||||||
|
int redraw_needed;
|
||||||
struct task redraw_task;
|
struct task redraw_task;
|
||||||
int resize_scheduled;
|
int resize_scheduled;
|
||||||
struct task resize_task;
|
struct task resize_task;
|
||||||
@@ -2132,21 +2133,41 @@ widget_redraw(struct widget *widget)
|
|||||||
widget_redraw(child);
|
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
|
static void
|
||||||
idle_redraw(struct task *task, uint32_t events)
|
idle_redraw(struct task *task, uint32_t events)
|
||||||
{
|
{
|
||||||
struct window *window =
|
struct window *window =
|
||||||
container_of(task, struct window, redraw_task);
|
container_of(task, struct window, redraw_task);
|
||||||
|
struct wl_callback *callback;
|
||||||
|
|
||||||
window_create_surface(window);
|
window_create_surface(window);
|
||||||
widget_redraw(window->widget);
|
widget_redraw(window->widget);
|
||||||
window_flush(window);
|
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
|
void
|
||||||
window_schedule_redraw(struct window *window)
|
window_schedule_redraw(struct window *window)
|
||||||
{
|
{
|
||||||
|
window->redraw_needed = 1;
|
||||||
if (!window->redraw_scheduled) {
|
if (!window->redraw_scheduled) {
|
||||||
window->redraw_task.run = idle_redraw;
|
window->redraw_task.run = idle_redraw;
|
||||||
display_defer(window->display, &window->redraw_task);
|
display_defer(window->display, &window->redraw_task);
|
||||||
|
|||||||
Reference in New Issue
Block a user