summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2011-06-23 12:05:34 +0200
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2011-06-23 12:05:34 +0200
commit6f8bf9dec1a63499c08cd6d97ba5feece5523447 (patch)
treea191459916ceede23f14e20721a6f25224699e0d
parent0f7ce5150113c4ee74c49c3a260b85d9d310aab5 (diff)
update to api changes
-rw-r--r--egl-wayland-pixmap-surface.c20
-rw-r--r--egl-wayland-window.c74
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);