Support per surface frame events
This fixes tearing with multi head.
This commit is contained in:
+3
-1
@@ -334,7 +334,7 @@ redraw_handler(struct window *window, void *data)
|
||||
}
|
||||
|
||||
static void
|
||||
frame_callback(void *data, uint32_t time)
|
||||
frame_callback(struct wl_surface *surface, void *data, uint32_t time)
|
||||
{
|
||||
struct gears *gears = data;
|
||||
|
||||
@@ -344,6 +344,7 @@ frame_callback(void *data, uint32_t time)
|
||||
|
||||
window_schedule_redraw(gears->window);
|
||||
wl_display_frame_callback(display_get_display(gears->d),
|
||||
window_get_wl_surface(gears->window),
|
||||
frame_callback, gears);
|
||||
}
|
||||
|
||||
@@ -412,6 +413,7 @@ gears_create(struct display *display)
|
||||
|
||||
draw_gears(gears);
|
||||
wl_display_frame_callback(display_get_display(gears->d),
|
||||
window_get_wl_surface(gears->window),
|
||||
frame_callback, gears);
|
||||
|
||||
return gears;
|
||||
|
||||
+4
-3
@@ -49,7 +49,7 @@ struct resizor {
|
||||
};
|
||||
|
||||
static void
|
||||
frame_callback(void *data, uint32_t time)
|
||||
frame_callback(struct wl_surface *surface, void *data, uint32_t time)
|
||||
{
|
||||
struct resizor *resizor = data;
|
||||
double force, height;
|
||||
@@ -107,6 +107,7 @@ resizor_draw(struct resizor *resizor)
|
||||
|
||||
if (fabs(resizor->height.previous - resizor->height.target) > 0.1) {
|
||||
wl_display_frame_callback(display_get_display(resizor->display),
|
||||
window_get_wl_surface(resizor->window),
|
||||
frame_callback, resizor);
|
||||
}
|
||||
}
|
||||
@@ -140,11 +141,11 @@ key_handler(struct window *window, struct input *input, uint32_t time,
|
||||
switch (sym) {
|
||||
case XK_Down:
|
||||
resizor->height.target = 400;
|
||||
frame_callback(resizor, 0);
|
||||
frame_callback(window_get_wl_surface(window), resizor, 0);
|
||||
break;
|
||||
case XK_Up:
|
||||
resizor->height.target = 200;
|
||||
frame_callback(resizor, 0);
|
||||
frame_callback(window_get_wl_surface(window), resizor, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,7 +216,7 @@ create_surface(struct window *window)
|
||||
}
|
||||
|
||||
static void
|
||||
redraw(void *data, uint32_t time)
|
||||
redraw(struct wl_surface *surface, void *data, uint32_t time)
|
||||
{
|
||||
struct window *window = data;
|
||||
static const GLfloat verts[3][2] = {
|
||||
@@ -267,7 +267,9 @@ redraw(void *data, uint32_t time)
|
||||
glFlush();
|
||||
|
||||
eglSwapBuffers(window->display->egl.dpy, window->egl_surface);
|
||||
wl_display_frame_callback(window->display->display, redraw, window);
|
||||
wl_display_frame_callback(window->display->display,
|
||||
window->surface,
|
||||
redraw, window);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -315,7 +317,8 @@ main(int argc, char **argv)
|
||||
create_surface(&window);
|
||||
init_gl(&window);
|
||||
|
||||
wl_display_frame_callback(display.display, redraw, &window);
|
||||
wl_display_frame_callback(display.display, window.surface,
|
||||
redraw, &window);
|
||||
|
||||
wl_display_get_fd(display.display, event_mask_update, &display);
|
||||
while (true)
|
||||
|
||||
+3
-1
@@ -173,7 +173,7 @@ static void render(struct smoke *smoke)
|
||||
}
|
||||
|
||||
static void
|
||||
frame_callback(void *data, uint32_t time)
|
||||
frame_callback(struct wl_surface *surface, void *data, uint32_t time)
|
||||
{
|
||||
struct smoke *smoke = data;
|
||||
|
||||
@@ -201,6 +201,7 @@ frame_callback(void *data, uint32_t time)
|
||||
|
||||
window_damage(smoke->window, 0, 0, smoke->width, smoke->height);
|
||||
wl_display_frame_callback(display_get_display(smoke->display),
|
||||
window_get_wl_surface(smoke->window),
|
||||
frame_callback, smoke);
|
||||
}
|
||||
|
||||
@@ -288,6 +289,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
window_set_user_data(smoke.window, &smoke);
|
||||
wl_display_frame_callback(display_get_display(d),
|
||||
window_get_wl_surface(smoke.window),
|
||||
frame_callback, &smoke);
|
||||
|
||||
display_run(d);
|
||||
|
||||
@@ -792,6 +792,12 @@ window_get_surface(struct window *window)
|
||||
return cairo_surface_reference(window->cairo_surface);
|
||||
}
|
||||
|
||||
struct wl_surface *
|
||||
window_get_wl_surface(struct window *window)
|
||||
{
|
||||
return window->surface;
|
||||
}
|
||||
|
||||
static int
|
||||
get_pointer_location(struct window *window, int32_t x, int32_t y)
|
||||
{
|
||||
|
||||
@@ -157,6 +157,9 @@ window_damage(struct window *window, int32_t x, int32_t y,
|
||||
cairo_surface_t *
|
||||
window_get_surface(struct window *window);
|
||||
|
||||
struct wl_surface *
|
||||
window_get_wl_surface(struct window *window);
|
||||
|
||||
void
|
||||
window_flush(struct window *window);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user