mirror of
https://github.com/swaywm/sway.git
synced 2024-11-25 09:21:28 +00:00
Add swaylock protocol, add resource destructors
This prevents sway crashing if swaybg or swaybar dies.
This commit is contained in:
parent
2b38f298ff
commit
71afa38890
BIN
common/libsway-common.a
Normal file
BIN
common/libsway-common.a
Normal file
Binary file not shown.
|
@ -1,18 +1,21 @@
|
||||||
#ifndef _SWAY_EXTENSIONS_H
|
#ifndef _SWAY_EXTENSIONS_H
|
||||||
#define _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 "wayland-desktop-shell-server-protocol.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "wlc/wlc-wayland.h"
|
|
||||||
|
|
||||||
struct background_config {
|
struct background_config {
|
||||||
wlc_handle output;
|
wlc_handle output;
|
||||||
wlc_resource surface;
|
wlc_resource surface;
|
||||||
|
struct wl_resource *resource;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct panel_config {
|
struct panel_config {
|
||||||
wlc_handle output;
|
wlc_handle output;
|
||||||
wlc_resource surface;
|
wlc_resource surface;
|
||||||
|
struct wl_resource *resource;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct desktop_shell_state {
|
struct desktop_shell_state {
|
||||||
|
@ -22,6 +25,12 @@ struct desktop_shell_state {
|
||||||
struct wlc_size panel_size;
|
struct wlc_size panel_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct swaylock_state {
|
||||||
|
bool active;
|
||||||
|
wlc_handle output;
|
||||||
|
wlc_resource surface;
|
||||||
|
};
|
||||||
|
|
||||||
extern struct desktop_shell_state desktop_shell;
|
extern struct desktop_shell_state desktop_shell;
|
||||||
|
|
||||||
void register_extensions(void);
|
void register_extensions(void);
|
||||||
|
|
|
@ -13,10 +13,21 @@ WAYLAND_ADD_PROTOCOL_SERVER(proto-server-desktop-shell
|
||||||
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
|
add_library(sway-protocols
|
||||||
${proto-client-xdg-shell}
|
${proto-client-xdg-shell}
|
||||||
${proto-client-desktop-shell}
|
${proto-client-desktop-shell}
|
||||||
${proto-server-desktop-shell}
|
${proto-server-desktop-shell}
|
||||||
|
${proto-client-swaylock}
|
||||||
|
${proto-server-swaylock}
|
||||||
)
|
)
|
||||||
|
|
||||||
set(PROTOCOLS_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/protocols PARENT_SCOPE)
|
set(PROTOCOLS_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/protocols PARENT_SCOPE)
|
||||||
|
|
BIN
protocols/libsway-protocols.a
Normal file
BIN
protocols/libsway-protocols.a
Normal file
Binary file not shown.
18
protocols/swaylock.xml
Normal file
18
protocols/swaylock.xml
Normal file
|
@ -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>
|
|
@ -8,6 +8,31 @@
|
||||||
|
|
||||||
struct desktop_shell_state desktop_shell;
|
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,
|
static void set_background(struct wl_client *client, struct wl_resource *resource,
|
||||||
struct wl_resource *_output, struct wl_resource *surface) {
|
struct wl_resource *_output, struct wl_resource *surface) {
|
||||||
wlc_handle output = wlc_handle_from_wl_output_resource(_output);
|
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));
|
struct background_config *config = malloc(sizeof(struct background_config));
|
||||||
config->output = output;
|
config->output = output;
|
||||||
config->surface = wlc_resource_from_wl_surface_resource(surface);
|
config->surface = wlc_resource_from_wl_surface_resource(surface);
|
||||||
|
config->resource = surface;
|
||||||
list_add(desktop_shell.backgrounds, config);
|
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,
|
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));
|
struct panel_config *config = malloc(sizeof(struct panel_config));
|
||||||
config->output = output;
|
config->output = output;
|
||||||
config->surface = wlc_resource_from_wl_surface_resource(surface);
|
config->surface = wlc_resource_from_wl_surface_resource(surface);
|
||||||
|
config->resource = surface;
|
||||||
list_add(desktop_shell.panels, config);
|
list_add(desktop_shell.panels, config);
|
||||||
|
wl_resource_set_destructor(surface, panel_surface_destructor);
|
||||||
desktop_shell.panel_size = *wlc_surface_get_size(config->surface);
|
desktop_shell.panel_size = *wlc_surface_get_size(config->surface);
|
||||||
arrange_windows(&root_container, -1, -1);
|
arrange_windows(&root_container, -1, -1);
|
||||||
}
|
}
|
||||||
|
|
BIN
wayland/libsway-wayland.a
Normal file
BIN
wayland/libsway-wayland.a
Normal file
Binary file not shown.
Loading…
Reference in a new issue