mirror of
https://github.com/swaywm/sway.git
synced 2025-11-08 13:29:50 -05:00
Implement scratchpad
Implements the following commands: * move scratchpad * scratchpad show * [criteria] scratchpad show Also fixes these: * Fix memory leak when executing command with criteria (use `list_free(views)` instead of `free(views)`) * Fix crash when running `move to` with no further arguments
This commit is contained in:
parent
89dc047ca9
commit
81e8f31cc6
13 changed files with 290 additions and 5 deletions
|
|
@ -9,6 +9,7 @@
|
|||
#include "sway/input/cursor.h"
|
||||
#include "sway/input/seat.h"
|
||||
#include "sway/output.h"
|
||||
#include "sway/scratchpad.h"
|
||||
#include "sway/tree/arrange.h"
|
||||
#include "sway/tree/container.h"
|
||||
#include "sway/tree/layout.h"
|
||||
|
|
@ -296,6 +297,19 @@ static struct cmd_results *move_to_position(struct sway_container *container,
|
|||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||
}
|
||||
|
||||
static struct cmd_results *move_to_scratchpad(struct sway_container *con) {
|
||||
if (con->type != C_CONTAINER && con->type != C_VIEW) {
|
||||
return cmd_results_new(CMD_INVALID, "move",
|
||||
"Only views and containers can be moved to the scratchpad");
|
||||
}
|
||||
if (con->scratchpad) {
|
||||
return cmd_results_new(CMD_INVALID, "move",
|
||||
"Container is already in the scratchpad");
|
||||
}
|
||||
scratchpad_add_container(con);
|
||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||
}
|
||||
|
||||
struct cmd_results *cmd_move(int argc, char **argv) {
|
||||
struct cmd_results *error = NULL;
|
||||
if ((error = checkarg(argc, "move", EXPECTED_AT_LEAST, 1))) {
|
||||
|
|
@ -317,10 +331,9 @@ struct cmd_results *cmd_move(int argc, char **argv) {
|
|||
} else if (strcasecmp(argv[0], "workspace") == 0) {
|
||||
return cmd_move_workspace(current, argc, argv);
|
||||
} else if (strcasecmp(argv[0], "scratchpad") == 0
|
||||
|| (strcasecmp(argv[0], "to") == 0
|
||||
|| (strcasecmp(argv[0], "to") == 0 && argc == 2
|
||||
&& strcasecmp(argv[1], "scratchpad") == 0)) {
|
||||
// TODO: scratchpad
|
||||
return cmd_results_new(CMD_FAILURE, "move", "Unimplemented");
|
||||
return move_to_scratchpad(current);
|
||||
} else if (strcasecmp(argv[0], "position") == 0) {
|
||||
return move_to_position(current, argc, argv);
|
||||
} else if (strcasecmp(argv[0], "absolute") == 0) {
|
||||
|
|
|
|||
37
sway/commands/scratchpad.c
Normal file
37
sway/commands/scratchpad.c
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
#include "log.h"
|
||||
#include "sway/commands.h"
|
||||
#include "sway/config.h"
|
||||
#include "sway/scratchpad.h"
|
||||
#include "sway/server.h"
|
||||
#include "sway/tree/container.h"
|
||||
|
||||
struct cmd_results *cmd_scratchpad(int argc, char **argv) {
|
||||
struct cmd_results *error = NULL;
|
||||
if ((error = checkarg(argc, "scratchpad", EXPECTED_EQUAL_TO, 1))) {
|
||||
return error;
|
||||
}
|
||||
if (strcmp(argv[0], "show") != 0) {
|
||||
return cmd_results_new(CMD_INVALID, "scratchpad",
|
||||
"Expected 'scratchpad show'");
|
||||
}
|
||||
if (!server.scratchpad->length) {
|
||||
return cmd_results_new(CMD_INVALID, "scratchpad",
|
||||
"Scratchpad is empty");
|
||||
}
|
||||
|
||||
if (config->handler_context.using_criteria) {
|
||||
// If using criteria, this command is executed for every container which
|
||||
// matches the criteria. If this container isn't in the scratchpad,
|
||||
// we'll just silently return a success.
|
||||
struct sway_container *con = config->handler_context.current_container;
|
||||
wlr_log(WLR_INFO, "cmd_scratchpad(%s)", con->name);
|
||||
if (!con->scratchpad) {
|
||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||
}
|
||||
scratchpad_toggle_container(con);
|
||||
} else {
|
||||
scratchpad_toggle_auto();
|
||||
}
|
||||
|
||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue