Support per surface frame events

This fixes tearing with multi head.
This commit is contained in:
Benjamin Franzke
2011-03-14 12:07:26 +01:00
parent 9c26ff3507
commit ec4d342aa9
12 changed files with 157 additions and 75 deletions
+3 -1
View File
@@ -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
View File
@@ -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;
}
}
+6 -3
View File
@@ -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
View File
@@ -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);
+6
View File
@@ -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)
{
+3
View File
@@ -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);