Use the new wl_callback interface
This commit is contained in:
+18
-20
@@ -189,14 +189,6 @@ init_gl(struct window *window)
|
||||
glGetUniformLocation(window->gl.program, "rotation");
|
||||
}
|
||||
|
||||
static void
|
||||
sync_callback(void *data)
|
||||
{
|
||||
int *done = data;
|
||||
|
||||
*done = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
create_surface(struct window *window)
|
||||
{
|
||||
@@ -205,14 +197,11 @@ create_surface(struct window *window)
|
||||
EGLBoolean ret;
|
||||
int done = 0;
|
||||
|
||||
if (!display->premultiplied_argb_visual)
|
||||
wl_display_roundtrip(display->display);
|
||||
if (!display->premultiplied_argb_visual) {
|
||||
wl_display_sync_callback(display->display, sync_callback, &done);
|
||||
while (!done)
|
||||
wl_display_iterate(display->display, display->mask);
|
||||
if (!display->premultiplied_argb_visual) {
|
||||
fprintf(stderr, "premultiplied argb visual missing\n");
|
||||
exit(1);
|
||||
}
|
||||
fprintf(stderr, "premultiplied argb visual missing\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
window->surface = wl_compositor_create_surface(display->compositor);
|
||||
@@ -235,8 +224,10 @@ create_surface(struct window *window)
|
||||
assert(ret == EGL_TRUE);
|
||||
}
|
||||
|
||||
static const struct wl_callback_listener frame_listener;
|
||||
|
||||
static void
|
||||
redraw(struct wl_surface *surface, void *data, uint32_t time)
|
||||
redraw(void *data, struct wl_callback *callback, uint32_t time)
|
||||
{
|
||||
struct window *window = data;
|
||||
static const GLfloat verts[3][2] = {
|
||||
@@ -287,11 +278,17 @@ redraw(struct wl_surface *surface, void *data, uint32_t time)
|
||||
glFlush();
|
||||
|
||||
eglSwapBuffers(window->display->egl.dpy, window->egl_surface);
|
||||
wl_display_frame_callback(window->display->display,
|
||||
window->surface,
|
||||
redraw, window);
|
||||
if (callback)
|
||||
wl_callback_destroy(callback);
|
||||
|
||||
callback = wl_surface_frame(window->surface);
|
||||
wl_callback_add_listener(callback, &frame_listener, window);
|
||||
}
|
||||
|
||||
static const struct wl_callback_listener frame_listener = {
|
||||
redraw
|
||||
};
|
||||
|
||||
static void
|
||||
compositor_handle_visual(void *data,
|
||||
struct wl_compositor *compositor,
|
||||
@@ -356,12 +353,13 @@ main(int argc, char **argv)
|
||||
display_handle_global, &display);
|
||||
|
||||
wl_display_get_fd(display.display, event_mask_update, &display);
|
||||
wl_display_iterate(display.display, WL_DISPLAY_READABLE);
|
||||
|
||||
init_egl(&display);
|
||||
create_surface(&window);
|
||||
init_gl(&window);
|
||||
|
||||
redraw(window.surface, &window, 0);
|
||||
redraw(&window, NULL, 0);
|
||||
|
||||
while (true)
|
||||
wl_display_iterate(display.display, display.mask);
|
||||
|
||||
+14
-16
@@ -112,8 +112,10 @@ create_window(struct display *display, int width, int height)
|
||||
return window;
|
||||
}
|
||||
|
||||
static const struct wl_callback_listener frame_listener;
|
||||
|
||||
static void
|
||||
redraw(struct wl_surface *surface, void *data, uint32_t time)
|
||||
redraw(void *data, struct wl_callback *callback, uint32_t time)
|
||||
{
|
||||
struct window *window = data;
|
||||
uint32_t *p;
|
||||
@@ -130,11 +132,17 @@ redraw(struct wl_surface *surface, void *data, uint32_t time)
|
||||
wl_surface_damage(window->surface,
|
||||
0, 0, window->width, window->height);
|
||||
|
||||
wl_display_frame_callback(window->display->display,
|
||||
window->surface,
|
||||
redraw, window);
|
||||
if (callback)
|
||||
wl_callback_destroy(callback);
|
||||
|
||||
callback = wl_surface_frame(window->surface);
|
||||
wl_callback_add_listener(callback, &frame_listener, window);
|
||||
}
|
||||
|
||||
static const struct wl_callback_listener frame_listener = {
|
||||
redraw
|
||||
};
|
||||
|
||||
static void
|
||||
compositor_handle_visual(void *data,
|
||||
struct wl_compositor *compositor,
|
||||
@@ -180,19 +188,10 @@ event_mask_update(uint32_t mask, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
sync_callback(void *data)
|
||||
{
|
||||
int *done = data;
|
||||
|
||||
*done = 1;
|
||||
}
|
||||
|
||||
static struct display *
|
||||
create_display(void)
|
||||
{
|
||||
struct display *display;
|
||||
int done;
|
||||
|
||||
display = malloc(sizeof *display);
|
||||
display->display = wl_display_connect(NULL);
|
||||
@@ -204,9 +203,8 @@ create_display(void)
|
||||
|
||||
wl_display_get_fd(display->display, event_mask_update, display);
|
||||
|
||||
wl_display_sync_callback(display->display, sync_callback, &done);
|
||||
while (!display->xrgb_visual)
|
||||
wl_display_iterate(display->display, display->mask);
|
||||
wl_display_roundtrip(display->display);
|
||||
|
||||
return display;
|
||||
}
|
||||
@@ -220,7 +218,7 @@ main(int argc, char **argv)
|
||||
display = create_display();
|
||||
window = create_window(display, 250, 250);
|
||||
|
||||
redraw(window->surface, window, 0);
|
||||
redraw(window, NULL, 0);
|
||||
|
||||
while (true)
|
||||
wl_display_iterate(display->display, display->mask);
|
||||
|
||||
+1
-20
@@ -1887,25 +1887,6 @@ init_egl(struct display *d)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
sync_callback(void *data)
|
||||
{
|
||||
int *done = data;
|
||||
|
||||
*done = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
force_roundtrip(struct display *d)
|
||||
{
|
||||
int done = 0;
|
||||
|
||||
wl_display_sync_callback(d->display, sync_callback, &done);
|
||||
wl_display_iterate(d->display, WL_DISPLAY_WRITABLE);
|
||||
while (!done)
|
||||
wl_display_iterate(d->display, WL_DISPLAY_READABLE);
|
||||
}
|
||||
|
||||
struct display *
|
||||
display_create(int *argc, char **argv[], const GOptionEntry *option_entries,
|
||||
display_global_handler_t handler)
|
||||
@@ -1966,7 +1947,7 @@ display_create(int *argc, char **argv[], const GOptionEntry *option_entries,
|
||||
d->destroy_image = (void *) eglGetProcAddress("eglDestroyImageKHR");
|
||||
|
||||
if (!d->premultiplied_argb_visual || !d->rgb_visual) {
|
||||
force_roundtrip(d);
|
||||
wl_display_roundtrip(d->display);
|
||||
if (!d->premultiplied_argb_visual || !d->rgb_visual) {
|
||||
fprintf(stderr, "failed to retreive visuals\n");
|
||||
return NULL;
|
||||
|
||||
Reference in New Issue
Block a user