diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-12-03 08:35:22 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-12-03 08:35:22 -0500 |
commit | 71afa388906bf29dcd937aa92b65a97c8b320f60 (patch) | |
tree | 7e7efa0fccde6eb99b1b1bd9d20b1d0f1b2b5f3b | |
parent | 2b38f298ff23b73ea26fc900c4422c2c4dd85bba (diff) |
Add swaylock protocol, add resource destructors
This prevents sway crashing if swaybg or swaybar dies.
-rw-r--r-- | common/libsway-common.a | bin | 0 -> 59254 bytes | |||
-rw-r--r-- | include/extensions.h | 11 | ||||
-rw-r--r-- | protocols/CMakeLists.txt | 11 | ||||
-rw-r--r-- | protocols/libsway-protocols.a | bin | 0 -> 31798 bytes | |||
-rw-r--r-- | protocols/swaylock.xml | 18 | ||||
-rw-r--r-- | sway/extensions.c | 29 | ||||
-rw-r--r-- | wayland/libsway-wayland.a | bin | 0 -> 70060 bytes |
7 files changed, 68 insertions, 1 deletions
diff --git a/common/libsway-common.a b/common/libsway-common.a Binary files differnew file mode 100644 index 00000000..22267800 --- /dev/null +++ b/common/libsway-common.a diff --git a/include/extensions.h b/include/extensions.h index 1ef7d920..872fd3bd 100644 --- a/include/extensions.h +++ b/include/extensions.h @@ -1,18 +1,21 @@ #ifndef _SWAY_EXTENSIONS_H #define _SWAY_EXTENSIONS_H +#include <wayland-server-core.h> +#include <wlc/wlc-wayland.h> #include "wayland-desktop-shell-server-protocol.h" #include "list.h" -#include "wlc/wlc-wayland.h" struct background_config { wlc_handle output; wlc_resource surface; + struct wl_resource *resource; }; struct panel_config { wlc_handle output; wlc_resource surface; + struct wl_resource *resource; }; struct desktop_shell_state { @@ -22,6 +25,12 @@ struct desktop_shell_state { struct wlc_size panel_size; }; +struct swaylock_state { + bool active; + wlc_handle output; + wlc_resource surface; +}; + extern struct desktop_shell_state desktop_shell; void register_extensions(void); diff --git a/protocols/CMakeLists.txt b/protocols/CMakeLists.txt index 07becc36..d7516d0c 100644 --- a/protocols/CMakeLists.txt +++ b/protocols/CMakeLists.txt @@ -13,10 +13,21 @@ WAYLAND_ADD_PROTOCOL_SERVER(proto-server-desktop-shell desktop-shell ) +WAYLAND_ADD_PROTOCOL_CLIENT(proto-client-swaylock + swaylock.xml + swaylock +) +WAYLAND_ADD_PROTOCOL_SERVER(proto-server-swaylock + swaylock.xml + swaylock +) + add_library(sway-protocols ${proto-client-xdg-shell} ${proto-client-desktop-shell} ${proto-server-desktop-shell} + ${proto-client-swaylock} + ${proto-server-swaylock} ) set(PROTOCOLS_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/protocols PARENT_SCOPE) diff --git a/protocols/libsway-protocols.a b/protocols/libsway-protocols.a Binary files differnew file mode 100644 index 00000000..284f46c2 --- /dev/null +++ b/protocols/libsway-protocols.a diff --git a/protocols/swaylock.xml b/protocols/swaylock.xml new file mode 100644 index 00000000..c7a102dd --- /dev/null +++ b/protocols/swaylock.xml @@ -0,0 +1,18 @@ +<protocol name="lock"> + + <interface name="lock" version="1"> + <description summary="create lock screen UIs"> + The Weston desktop-shell protocol's locking functionality depends more + on the behavior of the compositor than of a screen locking client, so + another protocol is necessary. + </description> + + <request name="set_lock_surface"> + <arg name="output" type="object" interface="wl_output"/> + <arg name="surface" type="object" interface="wl_surface"/> + </request> + + <request name="unlock"/> + + </interface> +</protocol> 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); } diff --git a/wayland/libsway-wayland.a b/wayland/libsway-wayland.a Binary files differnew file mode 100644 index 00000000..ac0f682c --- /dev/null +++ b/wayland/libsway-wayland.a |