diff --git a/compositor.c b/compositor.c index da1a6582..0ce2d09a 100644 --- a/compositor.c +++ b/compositor.c @@ -442,6 +442,7 @@ surface_attach(struct wl_client *client, { struct wlsc_surface *es = (struct wlsc_surface *) surface; struct wlsc_compositor *ec = es->compositor; + EGLImageKHR image; EGLint attribs[] = { EGL_WIDTH, 0, EGL_HEIGHT, 0, @@ -450,14 +451,36 @@ surface_attach(struct wl_client *client, EGL_NONE }; + attribs[1] = width; + attribs[3] = height; + attribs[5] = stride / 4; + + image = eglCreateImageKHR(ec->display, ec->context, + EGL_DRM_IMAGE_MESA, + (EGLClientBuffer) name, attribs); + if (image == NULL) { + /* FIXME: Define a real exception event instead of + * abusing this one */ + wl_client_post_event(client, ec->wl_display, + WL_DISPLAY_INVALID_OBJECT, 0); + fprintf(stderr, "failed to create image for name %d\n", name); + return; + } + if (visual == &ec->argb_visual) es->visual = &ec->argb_visual; else if (visual == &ec->premultiplied_argb_visual) es->visual = &ec->premultiplied_argb_visual; else if (visual == &ec->rgb_visual) es->visual = &ec->rgb_visual; - else - /* FIXME: Smack client with an exception event */; + else { + /* FIXME: Define a real exception event instead of + * abusing this one */ + wl_client_post_event(client, ec->display, + WL_DISPLAY_INVALID_OBJECT, 0); + fprintf(stderr, "invalid visual in surface_attach\n"); + return; + } glBindTexture(GL_TEXTURE_2D, es->texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -468,13 +491,8 @@ surface_attach(struct wl_client *client, if (es->image) eglDestroyImageKHR(ec->display, es->image); - attribs[1] = width; - attribs[3] = height; - attribs[5] = stride / 4; + es->image = image; - es->image = eglCreateImageKHR(ec->display, ec->context, - EGL_DRM_IMAGE_MESA, - (EGLClientBuffer) name, attribs); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, es->image); } diff --git a/connection.c b/connection.c index 577e83c2..76d4ce0e 100644 --- a/connection.c +++ b/connection.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "wayland-util.h" #include "connection.h" @@ -69,6 +70,7 @@ wl_connection_create(int fd, void wl_connection_destroy(struct wl_connection *connection) { + close(connection->fd); free(connection); } diff --git a/wayland-client.c b/wayland-client.c index 561f900e..5ac65419 100644 --- a/wayland-client.c +++ b/wayland-client.c @@ -308,6 +308,7 @@ display_handle_invalid_object(void *data, struct wl_display *display, uint32_t id) { fprintf(stderr, "sent request to invalid object\n"); + abort(); } static void @@ -316,6 +317,7 @@ display_handle_invalid_method(void *data, uint32_t id, uint32_t opcode) { fprintf(stderr, "sent invalid request opcode\n"); + abort(); } static void @@ -323,6 +325,7 @@ display_handle_no_memory(void *data, struct wl_display *display) { fprintf(stderr, "server out of memory\n"); + abort(); } static void diff --git a/wayland.c b/wayland.c index de2a5c07..8802c33a 100644 --- a/wayland.c +++ b/wayland.c @@ -65,9 +65,6 @@ struct wl_global { struct wl_list link; }; -void -wl_client_destroy(struct wl_client *client); - WL_EXPORT void wl_client_post_event(struct wl_client *client, struct wl_object *sender, uint32_t opcode, ...) @@ -210,7 +207,7 @@ wl_object_destroy(struct wl_object *object) interface->destroy(NULL, (struct wl_surface *) object); } -void +WL_EXPORT void wl_client_destroy(struct wl_client *client) { struct wl_surface *surface; diff --git a/wayland.h b/wayland.h index 511fdefe..96df34fc 100644 --- a/wayland.h +++ b/wayland.h @@ -89,6 +89,8 @@ typedef void (*wl_client_connect_func_t)(struct wl_client *client, struct wl_obj int wl_display_add_global(struct wl_display *display, struct wl_object *object, wl_client_connect_func_t func); +void wl_client_destroy(struct wl_client *client); + struct wl_compositor { struct wl_object base; const char *device;