aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/drm/renderer.c8
-rw-r--r--backend/headless/output.c6
-rw-r--r--backend/wayland/output.c2
-rw-r--r--backend/x11/output.c2
-rw-r--r--examples/layer-shell.c7
-rw-r--r--include/wlr/render/egl.h2
-rw-r--r--include/wlr/types/wlr_layer_shell.h2
-rw-r--r--render/egl.c14
-rw-r--r--render/gles2/texture.c5
-rw-r--r--types/wlr_cursor.c4
-rw-r--r--types/wlr_layer_shell.c31
11 files changed, 45 insertions, 38 deletions
diff --git a/backend/drm/renderer.c b/backend/drm/renderer.c
index f06de1ee..ea46a5e9 100644
--- a/backend/drm/renderer.c
+++ b/backend/drm/renderer.c
@@ -79,9 +79,7 @@ bool wlr_drm_surface_init(struct wlr_drm_surface *surf,
}
gbm_surface_destroy(surf->gbm);
}
- if (surf->egl) {
- eglDestroySurface(surf->renderer->egl.display, surf->egl);
- }
+ wlr_egl_destroy_surface(&surf->renderer->egl, surf->egl);
surf->gbm = gbm_surface_create(renderer->gbm, width, height,
format, GBM_BO_USE_RENDERING | flags);
@@ -117,9 +115,7 @@ void wlr_drm_surface_finish(struct wlr_drm_surface *surf) {
gbm_surface_release_buffer(surf->gbm, surf->back);
}
- if (surf->egl) {
- eglDestroySurface(surf->renderer->egl.display, surf->egl);
- }
+ wlr_egl_destroy_surface(&surf->renderer->egl, surf->egl);
if (surf->gbm) {
gbm_surface_destroy(surf->gbm);
}
diff --git a/backend/headless/output.c b/backend/headless/output.c
index 9c479cde..f71b4cdb 100644
--- a/backend/headless/output.c
+++ b/backend/headless/output.c
@@ -29,9 +29,7 @@ static bool output_set_custom_mode(struct wlr_output *wlr_output, int32_t width,
refresh = HEADLESS_DEFAULT_REFRESH;
}
- if (output->egl_surface) {
- eglDestroySurface(backend->egl.display, output->egl_surface);
- }
+ wlr_egl_destroy_surface(&backend->egl, output->egl_surface);
output->egl_surface = egl_create_surface(&backend->egl, width, height);
if (output->egl_surface == EGL_NO_SURFACE) {
@@ -73,7 +71,7 @@ static void output_destroy(struct wlr_output *wlr_output) {
wl_event_source_remove(output->frame_timer);
- eglDestroySurface(output->backend->egl.display, output->egl_surface);
+ wlr_egl_destroy_surface(&output->backend->egl, output->egl_surface);
free(output);
}
diff --git a/backend/wayland/output.c b/backend/wayland/output.c
index c1fa638a..9391f07f 100644
--- a/backend/wayland/output.c
+++ b/backend/wayland/output.c
@@ -184,7 +184,7 @@ static void wlr_wl_output_destroy(struct wlr_output *wlr_output) {
wl_callback_destroy(output->frame_callback);
}
- eglDestroySurface(output->backend->egl.display, output->surface);
+ wlr_egl_destroy_surface(&output->backend->egl, output->egl_surface);
wl_egl_window_destroy(output->egl_window);
zxdg_toplevel_v6_destroy(output->xdg_toplevel);
zxdg_surface_v6_destroy(output->xdg_surface);
diff --git a/backend/x11/output.c b/backend/x11/output.c
index df4ff043..77b4fb07 100644
--- a/backend/x11/output.c
+++ b/backend/x11/output.c
@@ -61,7 +61,7 @@ static void output_destroy(struct wlr_output *wlr_output) {
wl_list_remove(&output->link);
wl_event_source_remove(output->frame_timer);
- eglDestroySurface(x11->egl.display, output->surf);
+ wlr_egl_destroy_surface(&x11->egl, output->surf);
xcb_destroy_window(x11->xcb_conn, output->win);
xcb_flush(x11->xcb_conn);
free(output);
diff --git a/examples/layer-shell.c b/examples/layer-shell.c
index d9deb7b0..ec25fe42 100644
--- a/examples/layer-shell.c
+++ b/examples/layer-shell.c
@@ -188,9 +188,8 @@ static void xdg_popup_configure(void *data, struct xdg_popup *xdg_popup,
}
}
-static void popup_destroy()
-{
- eglDestroySurface(egl.display, popup_egl_surface);
+static void popup_destroy() {
+ wlr_egl_destroy_surface(&egl, popup_egl_surface);
wl_egl_window_destroy(popup_egl_window);
xdg_popup_destroy(popup);
wl_surface_destroy(popup_wl_surface);
@@ -262,7 +261,7 @@ static void layer_surface_configure(void *data,
static void layer_surface_closed(void *data,
struct zwlr_layer_surface_v1 *surface) {
- eglDestroySurface(egl.display, egl_surface);
+ wlr_egl_destroy_surface(&egl, egl_surface);
wl_egl_window_destroy(egl_window);
zwlr_layer_surface_v1_destroy(surface);
wl_surface_destroy(wl_surface);
diff --git a/include/wlr/render/egl.h b/include/wlr/render/egl.h
index 0b7f1dde..4d837138 100644
--- a/include/wlr/render/egl.h
+++ b/include/wlr/render/egl.h
@@ -98,4 +98,6 @@ bool wlr_egl_is_current(struct wlr_egl *egl);
bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
pixman_region32_t *damage);
+bool wlr_egl_destroy_surface(struct wlr_egl *egl, EGLSurface surface);
+
#endif
diff --git a/include/wlr/types/wlr_layer_shell.h b/include/wlr/types/wlr_layer_shell.h
index 6040478d..22352906 100644
--- a/include/wlr/types/wlr_layer_shell.h
+++ b/include/wlr/types/wlr_layer_shell.h
@@ -61,7 +61,7 @@ struct wlr_layer_surface {
struct wlr_layer_shell *shell;
struct wl_list popups; // wlr_xdg_popup::link
- const char *namespace;
+ char *namespace;
enum zwlr_layer_shell_v1_layer layer;
bool added, configured, mapped, closed;
diff --git a/render/egl.c b/render/egl.c
index b52682ea..95bdef55 100644
--- a/render/egl.c
+++ b/render/egl.c
@@ -225,9 +225,10 @@ bool wlr_egl_destroy_image(struct wlr_egl *egl, EGLImage image) {
if (!eglDestroyImageKHR) {
return false;
}
-
- eglDestroyImageKHR(egl->display, image);
- return true;
+ if (!image) {
+ return true;
+ }
+ return eglDestroyImageKHR(egl->display, image);
}
EGLSurface wlr_egl_create_surface(struct wlr_egl *egl, void *window) {
@@ -499,3 +500,10 @@ int wlr_egl_get_dmabuf_modifiers(struct wlr_egl *egl,
}
return num;
}
+
+bool wlr_egl_destroy_surface(struct wlr_egl *egl, EGLSurface surface) {
+ if (!surface) {
+ return true;
+ }
+ return eglDestroySurface(egl->display, surface);
+}
diff --git a/render/gles2/texture.c b/render/gles2/texture.c
index 45169daf..45425fbf 100644
--- a/render/gles2/texture.c
+++ b/render/gles2/texture.c
@@ -88,10 +88,7 @@ static void gles2_texture_destroy(struct wlr_texture *wlr_texture) {
if (texture->image_tex) {
glDeleteTextures(1, &texture->image_tex);
}
- if (texture->image) {
- assert(eglDestroyImageKHR);
- wlr_egl_destroy_image(texture->egl, texture->image);
- }
+ wlr_egl_destroy_image(texture->egl, texture->image);
if (texture->type == WLR_GLES2_TEXTURE_GLTEX) {
glDeleteTextures(1, &texture->gl_tex);
diff --git a/types/wlr_cursor.c b/types/wlr_cursor.c
index 5142513b..c24601d6 100644
--- a/types/wlr_cursor.c
+++ b/types/wlr_cursor.c
@@ -262,8 +262,8 @@ void wlr_cursor_warp_absolute(struct wlr_cursor *cur,
mapping = wlr_output_layout_get_box(cur->state->layout, NULL);
}
- x = x > 0 ? mapping->width * x + mapping->x : cur->x;
- y = y > 0 ? mapping->height * y + mapping->y : cur->y;
+ x = x >= 0 ? mapping->width * x + mapping->x : cur->x;
+ y = y >= 0 ? mapping->height * y + mapping->y : cur->y;
wlr_cursor_warp_unchecked(cur, x, y);
}
diff --git a/types/wlr_layer_shell.c b/types/wlr_layer_shell.c
index c61556bf..ec73bc61 100644
--- a/types/wlr_layer_shell.c
+++ b/types/wlr_layer_shell.c
@@ -183,6 +183,7 @@ static void layer_surface_destroy(struct wlr_layer_surface *surface) {
wl_list_init(&surface->surface_destroy_listener.link);
wlr_surface_set_role_committed(surface->surface, NULL, NULL);
wl_list_remove(&surface->link);
+ free(surface->namespace);
free(surface);
}
@@ -300,7 +301,7 @@ static void handle_wlr_surface_committed(struct wlr_surface *wlr_surface,
}
}
-static void handle_wlr_surface_destroyed(struct wl_listener *listener,
+static void handle_surface_destroyed(struct wl_listener *listener,
void *data) {
struct wlr_layer_surface *layer_surface =
wl_container_of(listener, layer_surface, surface_destroy_listener);
@@ -334,22 +335,28 @@ static void layer_shell_handle_get_layer_surface(struct wl_client *wl_client,
if (output_resource) {
surface->output = wlr_output_from_resource(output_resource);
}
- surface->resource = wl_resource_create(wl_client,
- &zwlr_layer_surface_v1_interface,
- wl_resource_get_version(client_resource),
- id);
- surface->namespace = strdup(namespace);
surface->layer = layer;
- if (surface->resource == NULL || surface->namespace == NULL) {
- free(surface);
- wl_client_post_no_memory(wl_client);
- return;
- }
if (layer > ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY) {
+ free(surface);
wl_resource_post_error(surface->resource,
ZWLR_LAYER_SHELL_V1_ERROR_INVALID_LAYER,
"Invalid layer %d", layer);
+ return;
+ }
+ surface->namespace = strdup(namespace);
+ if (surface->namespace == NULL) {
free(surface);
+ wl_client_post_no_memory(wl_client);
+ return;
+ }
+ surface->resource = wl_resource_create(wl_client,
+ &zwlr_layer_surface_v1_interface,
+ wl_resource_get_version(client_resource),
+ id);
+ if (surface->resource == NULL) {
+ free(surface->namespace);
+ free(surface);
+ wl_client_post_no_memory(wl_client);
return;
}
@@ -359,7 +366,7 @@ static void layer_shell_handle_get_layer_surface(struct wl_client *wl_client,
wl_signal_init(&surface->events.destroy);
wl_signal_add(&surface->surface->events.destroy,
&surface->surface_destroy_listener);
- surface->surface_destroy_listener.notify = handle_wlr_surface_destroyed;
+ surface->surface_destroy_listener.notify = handle_surface_destroyed;
wl_signal_init(&surface->events.map);
wl_signal_init(&surface->events.unmap);
wl_signal_init(&surface->events.new_popup);