aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Crisci <tony@dubstepdish.com>2018-01-20 14:10:11 -0500
committerTony Crisci <tony@dubstepdish.com>2018-01-20 14:10:11 -0500
commitc353e01c85049cfbc09510657e453b6aa5fd9c2d (patch)
treec6ef14cfc08861ff8c62675ca1fbbbb00e9197cf
parentcc3c713889e529c74888d9cd89af7039bfbae20c (diff)
add kill command
-rw-r--r--include/sway/config.h1
-rw-r--r--include/sway/input/input-manager.h3
-rw-r--r--include/sway/view.h1
-rw-r--r--sway/commands.c1
-rw-r--r--sway/commands/kill.c25
-rw-r--r--sway/desktop/wl_shell.c9
-rw-r--r--sway/desktop/xdg_shell_v6.c11
-rw-r--r--sway/desktop/xwayland.c8
-rw-r--r--sway/input/input-manager.c11
-rw-r--r--sway/input/keyboard.c9
-rw-r--r--sway/meson.build1
11 files changed, 77 insertions, 3 deletions
diff --git a/include/sway/config.h b/include/sway/config.h
index 27fae0c6..be29082e 100644
--- a/include/sway/config.h
+++ b/include/sway/config.h
@@ -355,6 +355,7 @@ struct sway_config {
struct {
struct input_config *input_config;
struct seat_config *seat_config;
+ struct sway_seat *seat;
} handler_context;
};
diff --git a/include/sway/input/input-manager.h b/include/sway/input/input-manager.h
index 58a93fe3..2bf297ce 100644
--- a/include/sway/input/input-manager.h
+++ b/include/sway/input/input-manager.h
@@ -43,4 +43,7 @@ void sway_input_manager_apply_input_config(struct sway_input_manager *input,
void sway_input_manager_apply_seat_config(struct sway_input_manager *input,
struct seat_config *seat_config);
+struct sway_seat *sway_input_manager_get_default_seat(
+ struct sway_input_manager *input);
+
#endif
diff --git a/include/sway/view.h b/include/sway/view.h
index 08c5480b..240ffaa5 100644
--- a/include/sway/view.h
+++ b/include/sway/view.h
@@ -92,6 +92,7 @@ struct sway_view {
void (*set_position)(struct sway_view *view,
double ox, double oy);
void (*set_activated)(struct sway_view *view, bool activated);
+ void (*close)(struct sway_view *view);
} iface;
// only used for unmanaged views (shell specific)
diff --git a/sway/commands.c b/sway/commands.c
index 414ef809..28943963 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -132,6 +132,7 @@ static struct cmd_handler handlers[] = {
{ "exit", cmd_exit },
{ "include", cmd_include },
{ "input", cmd_input },
+ { "kill", cmd_kill },
{ "output", cmd_output },
{ "seat", cmd_seat },
{ "set", cmd_set },
diff --git a/sway/commands/kill.c b/sway/commands/kill.c
new file mode 100644
index 00000000..4bbf94e5
--- /dev/null
+++ b/sway/commands/kill.c
@@ -0,0 +1,25 @@
+#include "sway/input/input-manager.h"
+#include "sway/input/seat.h"
+#include "sway/view.h"
+#include "sway/commands.h"
+
+struct cmd_results *cmd_kill(int argc, char **argv) {
+ struct sway_seat *seat = config->handler_context.seat;
+ if (!seat) {
+ seat = sway_input_manager_get_default_seat(input_manager);
+ }
+
+ // TODO context for arbitrary sway containers (when we get criteria
+ // working) will make seat context not explicitly required
+ if (!seat) {
+ return cmd_results_new(CMD_FAILURE, NULL, "no seat context given");
+ }
+
+ struct sway_view *view = seat->focus->sway_view;
+
+ if (view->iface.close) {
+ view->iface.close(view);
+ }
+
+ return cmd_results_new(CMD_SUCCESS, NULL, NULL);
+}
diff --git a/sway/desktop/wl_shell.c b/sway/desktop/wl_shell.c
index e34f5160..0cde6583 100644
--- a/sway/desktop/wl_shell.c
+++ b/sway/desktop/wl_shell.c
@@ -51,6 +51,14 @@ static void set_activated(struct sway_view *view, bool activated) {
// no way to activate wl_shell
}
+static void close(struct sway_view *view) {
+ if (!assert_wl_shell(view)) {
+ return;
+ }
+
+ wl_client_destroy(view->wlr_wl_shell_surface->client);
+}
+
static void handle_commit(struct wl_listener *listener, void *data) {
struct sway_wl_shell_surface *sway_surface =
wl_container_of(listener, sway_surface, commit);
@@ -103,6 +111,7 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) {
sway_view->iface.set_size = set_size;
sway_view->iface.set_position = set_position;
sway_view->iface.set_activated = set_activated;
+ sway_view->iface.close = close;
sway_view->wlr_wl_shell_surface = shell_surface;
sway_view->sway_wl_shell_surface = sway_surface;
sway_view->surface = shell_surface->surface;
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c
index df48345c..4b50093f 100644
--- a/sway/desktop/xdg_shell_v6.c
+++ b/sway/desktop/xdg_shell_v6.c
@@ -57,6 +57,16 @@ static void set_activated(struct sway_view *view, bool activated) {
}
}
+static void close(struct sway_view *view) {
+ if (!assert_xdg(view)) {
+ return;
+ }
+ struct wlr_xdg_surface_v6 *surface = view->wlr_xdg_surface_v6;
+ if (surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL) {
+ wlr_xdg_toplevel_v6_send_close(surface);
+ }
+}
+
static void handle_commit(struct wl_listener *listener, void *data) {
struct sway_xdg_surface_v6 *sway_surface =
wl_container_of(listener, sway_surface, commit);
@@ -107,6 +117,7 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) {
sway_view->iface.set_size = set_size;
sway_view->iface.set_position = set_position;
sway_view->iface.set_activated = set_activated;
+ sway_view->iface.close = close;
sway_view->wlr_xdg_surface_v6 = xdg_surface;
sway_view->sway_xdg_surface_v6 = sway_surface;
sway_view->surface = xdg_surface->surface;
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index a4d9687d..7603d3ca 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -80,6 +80,13 @@ static void set_activated(struct sway_view *view, bool activated) {
wlr_xwayland_surface_activate(surface, activated);
}
+static void close(struct sway_view *view) {
+ if (!assert_xwayland(view)) {
+ return;
+ }
+ wlr_xwayland_surface_close(view->wlr_xwayland_surface);
+}
+
static void handle_commit(struct wl_listener *listener, void *data) {
struct sway_xwayland_surface *sway_surface =
wl_container_of(listener, sway_surface, commit);
@@ -192,6 +199,7 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
sway_view->iface.set_size = set_size;
sway_view->iface.set_position = set_position;
sway_view->iface.set_activated = set_activated;
+ sway_view->iface.close = close;
sway_view->wlr_xwayland_surface = xsurface;
sway_view->sway_xwayland_surface = sway_surface;
sway_view->surface = xsurface->surface;
diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c
index 26cf5035..7b19991b 100644
--- a/sway/input/input-manager.c
+++ b/sway/input/input-manager.c
@@ -369,3 +369,14 @@ void sway_input_manager_configure_xcursor(struct sway_input_manager *input) {
sway_seat_configure_xcursor(seat);
}
}
+
+struct sway_seat *sway_input_manager_get_default_seat(
+ struct sway_input_manager *input) {
+ struct sway_seat *seat = NULL;
+ wl_list_for_each(seat, &input->seats, link) {
+ if (strcmp(seat->wlr_seat->name, "seat0") == 0) {
+ return seat;
+ }
+ }
+ return seat;
+}
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index 5827a1ca..6dc57d46 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -89,9 +89,12 @@ static bool binding_matches_key_state(struct sway_binding *binding,
return false;
}
-static void binding_execute_command(struct sway_binding *binding) {
+static void keyboard_execute_command(struct sway_keyboard *keyboard,
+ struct sway_binding *binding) {
wlr_log(L_DEBUG, "running command for binding: %s",
binding->command);
+ config_clear_handler_context(config);
+ config->handler_context.seat = keyboard->seat_device->sway_seat;
struct cmd_results *results = handle_command(binding->command);
if (results->status != CMD_SUCCESS) {
wlr_log(L_DEBUG, "could not run command for binding: %s",
@@ -160,7 +163,7 @@ static bool keyboard_execute_bindsym(struct sway_keyboard *keyboard,
}
if (match) {
- binding_execute_command(binding);
+ keyboard_execute_command(keyboard, binding);
return true;
}
}
@@ -267,7 +270,7 @@ static bool keyboard_execute_bindcode(struct sway_keyboard *keyboard,
for (int i = 0; i < keycode_bindings->length; ++i) {
struct sway_binding *binding = keycode_bindings->items[i];
if (binding_matches_keycodes(wlr_keyboard, binding, event)) {
- binding_execute_command(binding);
+ keyboard_execute_command(keyboard, binding);
return true;
}
}
diff --git a/sway/meson.build b/sway/meson.build
index 30ec166b..d5dead42 100644
--- a/sway/meson.build
+++ b/sway/meson.build
@@ -10,6 +10,7 @@ sway_sources = files(
'commands/exit.c',
'commands/exec.c',
'commands/exec_always.c',
+ 'commands/kill.c',
'commands/include.c',
'commands/input.c',
'commands/seat.c',