commands/exec: enable targeted exec

Cause sway's internal launcher contexts to inherit the workspace of the
handler context, rather than the focused workspace. This has the same
behavior by default, but enables criteria targeted exec commands such as

'[workspace=3]' exec foot

to launch a client on workspace 3.
This commit is contained in:
Ronan Pigott 2023-02-12 10:57:10 -07:00
parent 9162b536f6
commit aabff469c6
3 changed files with 12 additions and 8 deletions

View file

@ -26,7 +26,7 @@ void launcher_ctx_consume(struct launcher_ctx *ctx);
void launcher_ctx_destroy(struct launcher_ctx *ctx);
struct launcher_ctx *launcher_ctx_create_internal(void);
struct launcher_ctx *launcher_ctx_create_internal(struct sway_node *node);
struct launcher_ctx *launcher_ctx_create(
struct wlr_xdg_activation_token_v1 *token, struct sway_node *node);

View file

@ -63,7 +63,8 @@ struct cmd_results *cmd_exec_process(int argc, char **argv) {
}
pid_t pid, child;
struct launcher_ctx *ctx = launcher_ctx_create_internal();
struct sway_workspace *ws = config->handler_context.workspace;
struct launcher_ctx *ctx = launcher_ctx_create_internal(&ws->node);
// Fork process
if ((pid = fork()) == 0) {
// Fork child process again

View file

@ -228,19 +228,22 @@ struct launcher_ctx *launcher_ctx_create(struct wlr_xdg_activation_token_v1 *tok
}
// Creates a context with a new token for the internal launcher
struct launcher_ctx *launcher_ctx_create_internal() {
struct launcher_ctx *launcher_ctx_create_internal(struct sway_node *node) {
struct sway_seat *seat = input_manager_current_seat();
struct sway_workspace *ws = seat_get_focused_workspace(seat);
if (!ws) {
sway_log(SWAY_DEBUG, "Failed to create launch context. No workspace.");
return NULL;
if (!node) {
struct sway_workspace *ws = seat_get_focused_workspace(seat);
if (!ws) {
sway_log(SWAY_DEBUG, "Failed to create launch context. No workspace.");
return NULL;
}
node = &ws->node;
}
struct wlr_xdg_activation_token_v1 *token =
wlr_xdg_activation_token_v1_create(server.xdg_activation_v1);
token->seat = seat->wlr_seat;
struct launcher_ctx *ctx = launcher_ctx_create(token, &ws->node);
struct launcher_ctx *ctx = launcher_ctx_create(token, node);
if (!ctx) {
wlr_xdg_activation_token_v1_destroy(token);
return NULL;