diff options
-rw-r--r-- | backend/drm/renderer.c | 8 | ||||
-rw-r--r-- | backend/headless/output.c | 6 | ||||
-rw-r--r-- | backend/wayland/output.c | 2 | ||||
-rw-r--r-- | backend/x11/output.c | 2 | ||||
-rw-r--r-- | examples/layer-shell.c | 7 | ||||
-rw-r--r-- | include/wlr/render/egl.h | 2 | ||||
-rw-r--r-- | include/wlr/types/wlr_layer_shell.h | 2 | ||||
-rw-r--r-- | render/egl.c | 14 | ||||
-rw-r--r-- | render/gles2/texture.c | 5 | ||||
-rw-r--r-- | types/wlr_cursor.c | 4 | ||||
-rw-r--r-- | types/wlr_layer_shell.c | 31 |
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); |