aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2015-12-03 08:35:22 -0500
committerDrew DeVault <sir@cmpwn.com>2015-12-03 08:35:22 -0500
commit71afa388906bf29dcd937aa92b65a97c8b320f60 (patch)
tree7e7efa0fccde6eb99b1b1bd9d20b1d0f1b2b5f3b /sway
parent2b38f298ff23b73ea26fc900c4422c2c4dd85bba (diff)
Add swaylock protocol, add resource destructors
This prevents sway crashing if swaybg or swaybar dies.
Diffstat (limited to 'sway')
-rw-r--r--sway/extensions.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/sway/extensions.c b/sway/extensions.c
index 1f8e9a7c..18621015 100644
--- a/sway/extensions.c
+++ b/sway/extensions.c
@@ -8,6 +8,31 @@
struct desktop_shell_state desktop_shell;
+void background_surface_destructor(struct wl_resource *resource) {
+ sway_log(L_DEBUG, "Background surface killed");
+ int i;
+ for (i = 0; i < desktop_shell.backgrounds->length; ++i) {
+ struct background_config *config = desktop_shell.backgrounds->items[i];
+ if (config->resource == resource) {
+ list_del(desktop_shell.backgrounds, i);
+ break;
+ }
+ }
+}
+
+void panel_surface_destructor(struct wl_resource *resource) {
+ sway_log(L_DEBUG, "Panel surface killed");
+ int i;
+ for (i = 0; i < desktop_shell.panels->length; ++i) {
+ struct panel_config *config = desktop_shell.panels->items[i];
+ if (config->resource == resource) {
+ list_del(desktop_shell.panels, i);
+ arrange_windows(&root_container, -1, -1);
+ break;
+ }
+ }
+}
+
static void set_background(struct wl_client *client, struct wl_resource *resource,
struct wl_resource *_output, struct wl_resource *surface) {
wlc_handle output = wlc_handle_from_wl_output_resource(_output);
@@ -18,7 +43,9 @@ static void set_background(struct wl_client *client, struct wl_resource *resourc
struct background_config *config = malloc(sizeof(struct background_config));
config->output = output;
config->surface = wlc_resource_from_wl_surface_resource(surface);
+ config->resource = surface;
list_add(desktop_shell.backgrounds, config);
+ wl_resource_set_destructor(surface, background_surface_destructor);
}
static void set_panel(struct wl_client *client, struct wl_resource *resource,
@@ -31,7 +58,9 @@ static void set_panel(struct wl_client *client, struct wl_resource *resource,
struct panel_config *config = malloc(sizeof(struct panel_config));
config->output = output;
config->surface = wlc_resource_from_wl_surface_resource(surface);
+ config->resource = surface;
list_add(desktop_shell.panels, config);
+ wl_resource_set_destructor(surface, panel_surface_destructor);
desktop_shell.panel_size = *wlc_surface_get_size(config->surface);
arrange_windows(&root_container, -1, -1);
}