diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-06-23 12:05:34 +0200 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2011-06-23 12:05:34 +0200 |
commit | 6f8bf9dec1a63499c08cd6d97ba5feece5523447 (patch) | |
tree | a191459916ceede23f14e20721a6f25224699e0d | |
parent | 0f7ce5150113c4ee74c49c3a260b85d9d310aab5 (diff) |
update to api changes
-rw-r--r-- | egl-wayland-pixmap-surface.c | 20 | ||||
-rw-r--r-- | egl-wayland-window.c | 74 |
2 files changed, 74 insertions, 20 deletions
diff --git a/egl-wayland-pixmap-surface.c b/egl-wayland-pixmap-surface.c index 353529e..8db686a 100644 --- a/egl-wayland-pixmap-surface.c +++ b/egl-wayland-pixmap-surface.c @@ -11,6 +11,7 @@ struct display { struct wl_display *display; + struct wl_visual *premultiplied_argb_visual; struct { struct wl_compositor *compositor; struct wl_shell *shell; @@ -74,8 +75,19 @@ static void create_egl_surface(struct display *display, struct window *window) { struct wl_visual *visual; + int done = 0; + + 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); + } + } - visual = wl_display_get_premultiplied_argb_visual(display->display); + visual = display->premultiplied_argb_visual; window->egl_pixmap = wl_egl_pixmap_create(window->width, @@ -279,6 +291,8 @@ main(int argc, char **argv) /* process connection events */ wl_display_iterate(display.display, WL_DISPLAY_READABLE); + wl_display_get_fd(display.display, event_mask_update, &display); + init_egl(&display); window.surface = wl_compositor_create_surface(display.interface.compositor); @@ -289,9 +303,9 @@ main(int argc, char **argv) wl_surface_map_toplevel(window.surface); - wl_display_frame_callback(display.display, window.surface, redraw, &window); + redraw(window.surface, &window, 0); + //wl_display_frame_callback(display.display, window.surface, redraw, &window); - wl_display_get_fd(display.display, event_mask_update, &display); while (true) wl_display_iterate(display.display, display.mask); diff --git a/egl-wayland-window.c b/egl-wayland-window.c index d8665a0..058e3c6 100644 --- a/egl-wayland-window.c +++ b/egl-wayland-window.c @@ -1,4 +1,5 @@ #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <stdbool.h> #include <assert.h> @@ -6,12 +7,12 @@ #include <wayland-client.h> #include <wayland-egl.h> -#include <GL/gl.h> #include <EGL/egl.h> +#include <GL/gl.h> struct display { struct wl_display *display; - struct wl_egl_display *egl_display; + struct wl_visual *premultiplied_argb_visual; struct { struct wl_compositor *compositor; struct wl_shell *shell; @@ -53,7 +54,7 @@ init_egl(struct display *display) EGL_NONE }; - display->egl.dpy = eglGetDisplay(display->egl_display); + display->egl.dpy = eglGetDisplay(display->display); assert(display->egl.dpy); assert(eglInitialize(display->egl.dpy, &major, &minor)); @@ -69,12 +70,31 @@ init_egl(struct display *display) } static void +sync_callback(void *data) +{ + int *done = data; + + *done = 1; +} + +static void create_egl_window(struct display *display, struct window *window) { struct wl_visual *visual; + int done = 0; + + 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); + } + } - visual = wl_display_get_premultiplied_argb_visual(display->display); - window->egl_window = wl_egl_window_create(display->egl_display, + visual = display->premultiplied_argb_visual; + window->egl_window = wl_egl_window_create( window->surface, window->width, window->height, @@ -107,7 +127,7 @@ init_gl(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] = { @@ -145,8 +165,9 @@ redraw(void *data, uint32_t time) glPopMatrix(); eglSwapBuffers(window->display->egl.dpy, window->egl.surf); + wl_shell_set_toplevel(window->display->interface.shell, window->surface); - wl_display_frame_callback(window->display->display, redraw, window); + wl_display_frame_callback(window->display->display, window->surface, redraw, window); } enum window_location { @@ -197,15 +218,36 @@ static const struct wl_shell_listener wayland_shell_listener = { }; static void +compositor_handle_visual(void *data, + struct wl_compositor *compositor, + uint32_t id, uint32_t token) +{ + struct display *d = data; + + switch (token) { + case WL_COMPOSITOR_VISUAL_PREMULTIPLIED_ARGB32: + d->premultiplied_argb_visual = + wl_visual_create(d->display, id, 1); + break; + } +} + +static const struct wl_compositor_listener compositor_listener = { + compositor_handle_visual, +}; + +static void display_handle_global(struct wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) { struct display *d = data; - if (strcmp(interface, "compositor") == 0) { - d->interface.compositor = wl_compositor_create(display, id); - } else if (strcmp(interface, "shell") == 0) { - d->interface.shell = wl_shell_create(display, id); + if (strcmp(interface, "wl_compositor") == 0) { + d->interface.compositor = wl_compositor_create(display, id, 1); + wl_compositor_add_listener(d->interface.compositor, + &compositor_listener, d); + } else if (strcmp(interface, "wl_shell") == 0) { + d->interface.shell = wl_shell_create(display, id, 1); wl_shell_add_listener(d->interface.shell, &wayland_shell_listener, d); } } @@ -233,14 +275,13 @@ main(int argc, char **argv) display.display = wl_display_connect(NULL); assert(display.display); - display.egl_display = wl_egl_display_create(display.display); - assert(display.egl_display); - wl_display_add_global_listener(display.display, display_handle_global, &display); /* process connection events */ wl_display_iterate(display.display, WL_DISPLAY_READABLE); + wl_display_get_fd(display.display, event_mask_update, &display); + init_egl(&display); window.surface = wl_compositor_create_surface(display.interface.compositor); @@ -249,11 +290,10 @@ main(int argc, char **argv) init_gl(&window); - wl_surface_map_toplevel(window.surface); + wl_shell_set_toplevel(display.interface.shell, window.surface); - wl_display_frame_callback(display.display, redraw, &window); + redraw(window.surface, &window, 0); - wl_display_get_fd(display.display, event_mask_update, &display); while (true) wl_display_iterate(display.display, display.mask); |