mirror of
https://github.com/NickHu/sway
synced 2024-12-28 22:23:30 +01:00
f4bc25bcc6
* container_move is only called from the move command * container_move_to was called from both the move command and the sticky command, but the sticky command can easily not call it * container_get_in_direction is only called from the focus command Moving these functions to their respective commands gives better separation of code and removes bloat from layout.c. These functions will need to be refactored to take advantage of type safety, so separating them will make this easier to refactor. The following static functions have also been moved: * is_parellel * invert_movement * move_offs * container_limit * workspace_rejigger * move_out_of_tabs_stacks * get_swayc_in_output_direction They were all used by the move functions, except for the last one which is used by focus. Other changes: * index_child has been renamed to container_sibling_index, moved to container.c and made public * sway_output_from_wlr has been renamed to output_from_wlr_output, moved to output.c and made public * container_handle_fullscreen_reparent has been made public * sway_dir_to_wlr has been made public No changes have been made to any of the moved functions, other than updating calls to functions that have been renamed.
59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
#include <string.h>
|
|
#include <strings.h>
|
|
#include "sway/commands.h"
|
|
#include "sway/input/seat.h"
|
|
#include "sway/ipc-server.h"
|
|
#include "sway/output.h"
|
|
#include "sway/tree/arrange.h"
|
|
#include "sway/tree/container.h"
|
|
#include "sway/tree/layout.h"
|
|
#include "sway/tree/view.h"
|
|
#include "sway/tree/workspace.h"
|
|
#include "list.h"
|
|
|
|
struct cmd_results *cmd_sticky(int argc, char **argv) {
|
|
struct cmd_results *error = NULL;
|
|
if ((error = checkarg(argc, "sticky", EXPECTED_EQUAL_TO, 1))) {
|
|
return error;
|
|
}
|
|
struct sway_container *container =
|
|
config->handler_context.current_container;
|
|
if (!container_is_floating(container)) {
|
|
return cmd_results_new(CMD_FAILURE, "sticky",
|
|
"Can't set sticky on a tiled container");
|
|
}
|
|
|
|
bool wants_sticky;
|
|
if (strcasecmp(argv[0], "enable") == 0) {
|
|
wants_sticky = true;
|
|
} else if (strcasecmp(argv[0], "disable") == 0) {
|
|
wants_sticky = false;
|
|
} else if (strcasecmp(argv[0], "toggle") == 0) {
|
|
wants_sticky = !container->is_sticky;
|
|
} else {
|
|
return cmd_results_new(CMD_FAILURE, "sticky",
|
|
"Expected 'sticky <enable|disable|toggle>'");
|
|
}
|
|
|
|
container->is_sticky = wants_sticky;
|
|
|
|
if (wants_sticky) {
|
|
// move container to focused workspace
|
|
struct sway_container *output = container_parent(container, C_OUTPUT);
|
|
struct sway_seat *seat = input_manager_current_seat(input_manager);
|
|
struct sway_container *focus = seat_get_focus_inactive(seat, output);
|
|
struct sway_container *focused_workspace = container_parent(focus, C_WORKSPACE);
|
|
struct sway_container *current_workspace = container_parent(container, C_WORKSPACE);
|
|
if (current_workspace != focused_workspace) {
|
|
container_remove_child(container);
|
|
workspace_add_floating(focused_workspace, container);
|
|
container_handle_fullscreen_reparent(container, current_workspace);
|
|
arrange_windows(focused_workspace);
|
|
if (!container_reap_empty(current_workspace)) {
|
|
arrange_windows(current_workspace);
|
|
}
|
|
}
|
|
}
|
|
|
|
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
|
}
|