rename container functions

This commit is contained in:
Tony Crisci 2018-03-29 16:17:55 -04:00
parent 83d09cf594
commit b90099b4b7
23 changed files with 290 additions and 282 deletions

View file

@ -299,8 +299,8 @@ struct sway_config {
char *floating_scroll_down_cmd; char *floating_scroll_down_cmd;
char *floating_scroll_left_cmd; char *floating_scroll_left_cmd;
char *floating_scroll_right_cmd; char *floating_scroll_right_cmd;
enum swayc_layouts default_orientation; enum sway_container_layout default_orientation;
enum swayc_layouts default_layout; enum sway_container_layout default_layout;
char *font; char *font;
int font_height; int font_height;
@ -324,8 +324,8 @@ struct sway_config {
list_t *config_chain; list_t *config_chain;
const char *current_config; const char *current_config;
enum swayc_border_types border; enum sway_container_border border;
enum swayc_border_types floating_border; enum sway_container_border floating_border;
int border_thickness; int border_thickness;
int floating_border_thickness; int floating_border_thickness;
enum edge_border_types hide_edge_borders; enum edge_border_types hide_edge_borders;

View file

@ -71,7 +71,7 @@ struct sway_container *sway_seat_get_focus_inactive(struct sway_seat *seat,
struct sway_container *container); struct sway_container *container);
struct sway_container *sway_seat_get_focus_by_type(struct sway_seat *seat, struct sway_container *sway_seat_get_focus_by_type(struct sway_seat *seat,
enum swayc_types type); enum sway_container_type type);
void sway_seat_set_config(struct sway_seat *seat, struct seat_config *seat_config); void sway_seat_set_config(struct sway_seat *seat, struct seat_config *seat_config);

View file

@ -17,7 +17,7 @@ struct sway_seat;
* This enum is in order. A container will never be inside of a container below * This enum is in order. A container will never be inside of a container below
* it on this list. * it on this list.
*/ */
enum swayc_types { enum sway_container_type {
C_ROOT, C_ROOT,
C_OUTPUT, C_OUTPUT,
C_WORKSPACE, C_WORKSPACE,
@ -27,7 +27,7 @@ enum swayc_types {
C_TYPES, C_TYPES,
}; };
enum swayc_layouts { enum sway_container_layout {
L_NONE, L_NONE,
L_HORIZ, L_HORIZ,
L_VERT, L_VERT,
@ -39,7 +39,7 @@ enum swayc_layouts {
L_LAYOUTS, L_LAYOUTS,
}; };
enum swayc_border_types { enum sway_container_border {
B_NONE, B_NONE,
B_PIXEL, B_PIXEL,
B_NORMAL, B_NORMAL,
@ -65,10 +65,10 @@ struct sway_container {
char *name; char *name;
enum swayc_types type; enum sway_container_type type;
enum swayc_layouts layout; enum sway_container_layout layout;
enum swayc_layouts prev_layout; enum sway_container_layout prev_layout;
enum swayc_layouts workspace_layout; enum sway_container_layout workspace_layout;
// TODO convert to layout coordinates // TODO convert to layout coordinates
double x, y; double x, y;
@ -87,53 +87,61 @@ struct sway_container {
} events; } events;
}; };
void swayc_descendants_of_type(struct sway_container *root, // TODO only one container create function and pass the type?
enum swayc_types type, struct sway_container *sway_container_output_create(
struct sway_output *sway_output);
struct sway_container *sway_container_workspace_create(
struct sway_container *output, const char *name);
struct sway_container *sway_container_view_create(
struct sway_container *sibling, struct sway_view *sway_view);
struct sway_container *sway_container_output_destroy(
struct sway_container *output);
struct sway_container *sway_container_view_destroy(struct sway_container *view);
struct sway_container *sway_container_set_layout(
struct sway_container *container, enum sway_container_layout layout);
void sway_container_descendents(struct sway_container *root,
enum sway_container_type type,
void (*func)(struct sway_container *item, void *data), void *data); void (*func)(struct sway_container *item, void *data), void *data);
// TODO only one container create function and pass the type? // XXX: what is this?
struct sway_container *new_output(struct sway_output *sway_output);
struct sway_container *new_workspace(struct sway_container *output,
const char *name);
struct sway_container *new_view(struct sway_container *sibling,
struct sway_view *sway_view);
struct sway_container *destroy_output(struct sway_container *output);
struct sway_container *destroy_view(struct sway_container *view);
struct sway_container *next_view_sibling(struct sway_seat *seat); struct sway_container *next_view_sibling(struct sway_seat *seat);
/** /**
* Finds a container based on test criteria. Returns the first container that * Finds a container based on test criteria. Returns the first container that
* passes the test. * passes the test.
*/ */
struct sway_container *swayc_by_test(struct sway_container *container, struct sway_container *sway_container_find(struct sway_container *container,
bool (*test)(struct sway_container *view, void *data), void *data); bool (*test)(struct sway_container *view, void *data), void *data);
/** /**
* Finds a parent container with the given swayc_type. * Finds a parent container with the given struct sway_containerype.
*/ */
struct sway_container *swayc_parent_by_type(struct sway_container *container, struct sway_container *sway_container_parent(struct sway_container *container,
enum swayc_types type); enum sway_container_type type);
/** /**
* Maps a container's children over a function. * Run a function for each child.
*/ */
void container_map(struct sway_container *container, void sway_container_for_each(struct sway_container *container,
void (*f)(struct sway_container *view, void *data), void *data); void (*f)(struct sway_container *view, void *data), void *data);
struct sway_container *swayc_at(struct sway_container *parent, double lx, /**
double ly, struct wlr_surface **surface, double *sx, double *sy); * Find a container at the given coordinates.
*/
struct sway_container *sway_container_at(struct sway_container *parent,
double lx, double ly, struct wlr_surface **surface,
double *sx, double *sy);
/** /**
* Apply the function for each child of the container breadth first. * Apply the function for each child of the container breadth first.
*/ */
void container_for_each_bfs(struct sway_container *con, void (*f)(struct void sway_container_for_each_bfs(struct sway_container *container,
sway_container *con, void *data), void *data); void (*f)(struct sway_container *container, void *data), void *data);
struct sway_container *swayc_change_layout(struct sway_container *container,
enum swayc_layouts layout);
#endif #endif

View file

@ -39,7 +39,7 @@ struct sway_container *add_sibling(struct sway_container *parent,
struct sway_container *remove_child(struct sway_container *child); struct sway_container *remove_child(struct sway_container *child);
enum swayc_layouts default_layout(struct sway_container *output); enum sway_container_layout default_layout(struct sway_container *output);
void sort_workspaces(struct sway_container *output); void sort_workspaces(struct sway_container *output);

View file

@ -32,7 +32,7 @@ static bool parse_movement_direction(const char *name,
} }
struct cmd_results *cmd_focus(int argc, char **argv) { struct cmd_results *cmd_focus(int argc, char **argv) {
swayc_t *con = config->handler_context.current_container; struct sway_container *con = config->handler_context.current_container;
struct sway_seat *seat = config->handler_context.seat; struct sway_seat *seat = config->handler_context.seat;
if (con->type < C_WORKSPACE) { if (con->type < C_WORKSPACE) {
return cmd_results_new(CMD_FAILURE, "focus", return cmd_results_new(CMD_FAILURE, "focus",
@ -51,7 +51,7 @@ struct cmd_results *cmd_focus(int argc, char **argv) {
"Expected 'focus <direction|parent|child|mode_toggle>' or 'focus output <direction|name>'"); "Expected 'focus <direction|parent|child|mode_toggle>' or 'focus output <direction|name>'");
} }
swayc_t *next_focus = get_swayc_in_direction(con, seat, direction); struct sway_container *next_focus = get_swayc_in_direction(con, seat, direction);
if (next_focus) { if (next_focus) {
sway_seat_set_focus(seat, next_focus); sway_seat_set_focus(seat, next_focus);
} }

View file

@ -6,7 +6,7 @@
#include "sway/commands.h" #include "sway/commands.h"
struct cmd_results *cmd_kill(int argc, char **argv) { struct cmd_results *cmd_kill(int argc, char **argv) {
enum swayc_types type = config->handler_context.current_container->type; enum sway_container_type type = config->handler_context.current_container->type;
if (type != C_VIEW && type != C_CONTAINER) { if (type != C_VIEW && type != C_CONTAINER) {
return cmd_results_new(CMD_INVALID, NULL, return cmd_results_new(CMD_INVALID, NULL,
"Can only kill views and containers with this command"); "Can only kill views and containers with this command");

View file

@ -10,7 +10,7 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
if ((error = checkarg(argc, "layout", EXPECTED_MORE_THAN, 0))) { if ((error = checkarg(argc, "layout", EXPECTED_MORE_THAN, 0))) {
return error; return error;
} }
swayc_t *parent = config->handler_context.current_container; struct sway_container *parent = config->handler_context.current_container;
// TODO: floating // TODO: floating
/* /*
@ -28,7 +28,7 @@ struct cmd_results *cmd_layout(int argc, char **argv) {
if (strcasecmp(argv[0], "default") == 0) { if (strcasecmp(argv[0], "default") == 0) {
swayc_change_layout(parent, parent->prev_layout); swayc_change_layout(parent, parent->prev_layout);
if (parent->layout == L_NONE) { if (parent->layout == L_NONE) {
swayc_t *output = swayc_parent_by_type(parent, C_OUTPUT); struct sway_container *output = sway_container_parent(parent, C_OUTPUT);
swayc_change_layout(parent, default_layout(output)); swayc_change_layout(parent, default_layout(output));
} }
} else { } else {

View file

@ -296,7 +296,7 @@ struct cmd_results *cmd_output(int argc, char **argv) {
char identifier[128]; char identifier[128];
bool all = strcmp(output->name, "*") == 0; bool all = strcmp(output->name, "*") == 0;
for (int i = 0; i < root_container.children->length; ++i) { for (int i = 0; i < root_container.children->length; ++i) {
swayc_t *cont = root_container.children->items[i]; struct sway_container *cont = root_container.children->items[i];
if (cont->type != C_OUTPUT) { if (cont->type != C_OUTPUT) {
continue; continue;
} }

View file

@ -17,15 +17,15 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
int output_location = -1; int output_location = -1;
swayc_t *current_container = config->handler_context.current_container; struct sway_container *current_container = config->handler_context.current_container;
swayc_t *old_workspace = NULL, *old_output = NULL; struct sway_container *old_workspace = NULL, *old_output = NULL;
if (current_container) { if (current_container) {
if (current_container->type == C_WORKSPACE) { if (current_container->type == C_WORKSPACE) {
old_workspace = current_container; old_workspace = current_container;
} else { } else {
old_workspace = swayc_parent_by_type(current_container, C_WORKSPACE); old_workspace = sway_container_parent(current_container, C_WORKSPACE);
} }
old_output = swayc_parent_by_type(current_container, C_OUTPUT); old_output = sway_container_parent(current_container, C_OUTPUT);
} }
for (int i = 0; i < argc; ++i) { for (int i = 0; i < argc; ++i) {
@ -57,7 +57,7 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
if (config->reading || !config->active) { if (config->reading || !config->active) {
return cmd_results_new(CMD_DEFER, "workspace", NULL); return cmd_results_new(CMD_DEFER, "workspace", NULL);
} }
swayc_t *ws = NULL; struct sway_container *ws = NULL;
if (strcasecmp(argv[0], "number") == 0) { if (strcasecmp(argv[0], "number") == 0) {
if (!(ws = workspace_by_number(argv[1]))) { if (!(ws = workspace_by_number(argv[1]))) {
char *name = join_args(argv + 1, argc - 1); char *name = join_args(argv + 1, argc - 1);
@ -92,7 +92,7 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
workspace_switch(ws); workspace_switch(ws);
current_container = current_container =
sway_seat_get_focus(config->handler_context.seat); sway_seat_get_focus(config->handler_context.seat);
swayc_t *new_output = swayc_parent_by_type(current_container, C_OUTPUT); struct sway_container *new_output = sway_container_parent(current_container, C_OUTPUT);
if (config->mouse_warping && old_output != new_output) { if (config->mouse_warping && old_output != new_output) {
// TODO: Warp mouse // TODO: Warp mouse

View file

@ -120,14 +120,14 @@ void terminate_swaybg(pid_t pid) {
} }
} }
void apply_output_config(struct output_config *oc, swayc_t *output) { void apply_output_config(struct output_config *oc, struct sway_container *output) {
assert(output->type == C_OUTPUT); assert(output->type == C_OUTPUT);
struct wlr_output *wlr_output = output->sway_output->wlr_output; struct wlr_output *wlr_output = output->sway_output->wlr_output;
if (oc && oc->enabled == 0) { if (oc && oc->enabled == 0) {
wlr_output_layout_remove(root_container.sway_root->output_layout, wlr_output_layout_remove(root_container.sway_root->output_layout,
wlr_output); wlr_output);
destroy_output(output); sway_container_output_destroy(output);
return; return;
} }

View file

@ -272,7 +272,7 @@ static int regex_cmp(const char *item, const pcre *regex) {
} }
// test a single view if it matches list of criteria tokens (all of them). // test a single view if it matches list of criteria tokens (all of them).
static bool criteria_test(swayc_t *cont, list_t *tokens) { static bool criteria_test(struct sway_container *cont, list_t *tokens) {
if (cont->type != C_VIEW) { if (cont->type != C_VIEW) {
return false; return false;
} }
@ -398,7 +398,7 @@ void free_criteria(struct criteria *crit) {
free(crit); free(crit);
} }
bool criteria_any(swayc_t *cont, list_t *criteria) { bool criteria_any(struct sway_container *cont, list_t *criteria) {
for (int i = 0; i < criteria->length; i++) { for (int i = 0; i < criteria->length; i++) {
struct criteria *bc = criteria->items[i]; struct criteria *bc = criteria->items[i];
if (criteria_test(cont, bc->tokens)) { if (criteria_test(cont, bc->tokens)) {
@ -408,7 +408,7 @@ bool criteria_any(swayc_t *cont, list_t *criteria) {
return false; return false;
} }
list_t *criteria_for(swayc_t *cont) { list_t *criteria_for(struct sway_container *cont) {
list_t *criteria = config->criteria, *matches = create_list(); list_t *criteria = config->criteria, *matches = create_list();
for (int i = 0; i < criteria->length; i++) { for (int i = 0; i < criteria->length; i++) {
struct criteria *bc = criteria->items[i]; struct criteria *bc = criteria->items[i];
@ -424,7 +424,7 @@ struct list_tokens {
list_t *tokens; list_t *tokens;
}; };
static void container_match_add(swayc_t *container, static void container_match_add(struct sway_container *container,
struct list_tokens *list_tokens) { struct list_tokens *list_tokens) {
if (criteria_test(container, list_tokens->tokens)) { if (criteria_test(container, list_tokens->tokens)) {
list_add(list_tokens->list, container); list_add(list_tokens->list, container);
@ -435,8 +435,8 @@ list_t *container_for_crit_tokens(list_t *tokens) {
struct list_tokens list_tokens = struct list_tokens list_tokens =
(struct list_tokens){create_list(), tokens}; (struct list_tokens){create_list(), tokens};
container_map(&root_container, sway_container_for_each(&root_container,
(void (*)(swayc_t *, void *))container_match_add, (void (*)(struct sway_container *, void *))container_match_add,
&list_tokens); &list_tokens);
// TODO look in the scratchpad // TODO look in the scratchpad

View file

@ -145,7 +145,7 @@ struct render_data {
struct timespec *now; struct timespec *now;
}; };
static void output_frame_view(swayc_t *view, void *data) { static void output_frame_view(struct sway_container *view, void *data) {
struct render_data *rdata = data; struct render_data *rdata = data;
struct sway_output *output = rdata->output; struct sway_output *output = rdata->output;
struct timespec *now = rdata->now; struct timespec *now = rdata->now;
@ -218,16 +218,16 @@ static void output_frame_notify(struct wl_listener *listener, void *data) {
&soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]); &soutput->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]);
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *focus = sway_seat_get_focus_inactive(seat, soutput->swayc); struct sway_container *focus = sway_seat_get_focus_inactive(seat, soutput->swayc);
swayc_t *workspace = (focus->type == C_WORKSPACE ? struct sway_container *workspace = (focus->type == C_WORKSPACE ?
focus : focus :
swayc_parent_by_type(focus, C_WORKSPACE)); sway_container_parent(focus, C_WORKSPACE));
struct render_data rdata = { struct render_data rdata = {
.output = soutput, .output = soutput,
.now = &now, .now = &now,
}; };
swayc_descendants_of_type(workspace, C_VIEW, output_frame_view, &rdata); sway_container_descendents(workspace, C_VIEW, output_frame_view, &rdata);
// render unmanaged views on top // render unmanaged views on top
struct sway_view *view; struct sway_view *view;
@ -258,7 +258,7 @@ static void handle_output_destroy(struct wl_listener *listener, void *data) {
struct wlr_output *wlr_output = data; struct wlr_output *wlr_output = data;
wlr_log(L_DEBUG, "Output %p %s removed", wlr_output, wlr_output->name); wlr_log(L_DEBUG, "Output %p %s removed", wlr_output, wlr_output->name);
destroy_output(output->swayc); sway_container_output_destroy(output->swayc);
} }
static void handle_output_mode(struct wl_listener *listener, void *data) { static void handle_output_mode(struct wl_listener *listener, void *data) {
@ -286,7 +286,7 @@ void handle_new_output(struct wl_listener *listener, void *data) {
wlr_output_set_mode(wlr_output, mode); wlr_output_set_mode(wlr_output, mode);
} }
output->swayc = new_output(output); output->swayc = sway_container_output_create(output);
if (!output->swayc) { if (!output->swayc) {
free(output); free(output);
return; return;

View file

@ -74,7 +74,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
wl_container_of(listener, sway_surface, destroy); wl_container_of(listener, sway_surface, destroy);
wl_list_remove(&sway_surface->commit.link); wl_list_remove(&sway_surface->commit.link);
wl_list_remove(&sway_surface->destroy.link); wl_list_remove(&sway_surface->destroy.link);
swayc_t *parent = destroy_view(sway_surface->view->swayc); struct sway_container *parent = sway_container_view_destroy(sway_surface->view->swayc);
free(sway_surface->view); free(sway_surface->view);
free(sway_surface); free(sway_surface);
arrange_windows(parent, -1, -1); arrange_windows(parent, -1, -1);
@ -132,8 +132,8 @@ void handle_wl_shell_surface(struct wl_listener *listener, void *data) {
wl_signal_add(&shell_surface->events.destroy, &sway_surface->destroy); wl_signal_add(&shell_surface->events.destroy, &sway_surface->destroy);
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *focus = sway_seat_get_focus_inactive(seat, &root_container); struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container);
swayc_t *cont = new_view(focus, sway_view); struct sway_container *cont = sway_container_view_create(focus, sway_view);
sway_view->swayc = cont; sway_view->swayc = cont;
arrange_windows(cont->parent, -1, -1); arrange_windows(cont->parent, -1, -1);

View file

@ -83,7 +83,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
wl_container_of(listener, sway_xdg_surface, destroy); wl_container_of(listener, sway_xdg_surface, destroy);
wl_list_remove(&sway_xdg_surface->commit.link); wl_list_remove(&sway_xdg_surface->commit.link);
wl_list_remove(&sway_xdg_surface->destroy.link); wl_list_remove(&sway_xdg_surface->destroy.link);
swayc_t *parent = destroy_view(sway_xdg_surface->view->swayc); struct sway_container *parent = sway_container_view_destroy(sway_xdg_surface->view->swayc);
free(sway_xdg_surface->view); free(sway_xdg_surface->view);
free(sway_xdg_surface); free(sway_xdg_surface);
arrange_windows(parent, -1, -1); arrange_windows(parent, -1, -1);
@ -136,8 +136,8 @@ void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data) {
wl_signal_add(&xdg_surface->events.destroy, &sway_surface->destroy); wl_signal_add(&xdg_surface->events.destroy, &sway_surface->destroy);
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *focus = sway_seat_get_focus_inactive(seat, &root_container); struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container);
swayc_t *cont = new_view(focus, sway_view); struct sway_container *cont = sway_container_view_create(focus, sway_view);
sway_view->swayc = cont; sway_view->swayc = cont;
arrange_windows(cont->parent, -1, -1); arrange_windows(cont->parent, -1, -1);

View file

@ -49,11 +49,11 @@ static void set_position(struct sway_view *view, double ox, double oy) {
if (!assert_xwayland(view)) { if (!assert_xwayland(view)) {
return; return;
} }
swayc_t *output = swayc_parent_by_type(view->swayc, C_OUTPUT); struct sway_container *output = sway_container_parent(view->swayc, C_OUTPUT);
if (!sway_assert(output, "view must be within tree to set position")) { if (!sway_assert(output, "view must be within tree to set position")) {
return; return;
} }
swayc_t *root = swayc_parent_by_type(output, C_ROOT); struct sway_container *root = sway_container_parent(output, C_ROOT);
if (!sway_assert(root, "output must be within tree to set position")) { if (!sway_assert(root, "output must be within tree to set position")) {
return; return;
} }
@ -114,7 +114,7 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
} }
} }
swayc_t *parent = destroy_view(sway_surface->view->swayc); struct sway_container *parent = sway_container_view_destroy(sway_surface->view->swayc);
if (parent) { if (parent) {
arrange_windows(parent, -1, -1); arrange_windows(parent, -1, -1);
} }
@ -132,7 +132,7 @@ static void handle_unmap_notify(struct wl_listener *listener, void *data) {
} }
// take it out of the tree // take it out of the tree
swayc_t *parent = destroy_view(sway_surface->view->swayc); struct sway_container *parent = sway_container_view_destroy(sway_surface->view->swayc);
if (parent) { if (parent) {
arrange_windows(parent, -1, -1); arrange_windows(parent, -1, -1);
} }
@ -155,12 +155,12 @@ static void handle_map_notify(struct wl_listener *listener, void *data) {
&sway_surface->view->unmanaged_view_link); &sway_surface->view->unmanaged_view_link);
} else { } else {
struct sway_view *view = sway_surface->view; struct sway_view *view = sway_surface->view;
destroy_view(view->swayc); sway_container_view_destroy(view->swayc);
swayc_t *parent = root_container.children->items[0]; struct sway_container *parent = root_container.children->items[0];
parent = parent->children->items[0]; // workspace parent = parent->children->items[0]; // workspace
swayc_t *cont = new_view(parent, view); struct sway_container *cont = sway_container_view_create(parent, view);
view->swayc = cont; view->swayc = cont;
arrange_windows(cont->parent, -1, -1); arrange_windows(cont->parent, -1, -1);
@ -238,8 +238,8 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
} }
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *focus = sway_seat_get_focus_inactive(seat, &root_container); struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container);
swayc_t *cont = new_view(focus, sway_view); struct sway_container *cont = sway_container_view_create(focus, sway_view);
sway_view->swayc = cont; sway_view->swayc = cont;
arrange_windows(cont->parent, -1, -1); arrange_windows(cont->parent, -1, -1);

View file

@ -49,8 +49,8 @@ static void cursor_send_pointer_motion(struct sway_cursor *cursor,
} }
} }
swayc_t *swayc = struct sway_container *swayc =
swayc_at(&root_container, cursor->x, cursor->y, &surface, &sx, &sy); sway_container_at(&root_container, cursor->x, cursor->y, &surface, &sx, &sy);
if (swayc) { if (swayc) {
wlr_seat_pointer_notify_enter(seat, surface, sx, sy); wlr_seat_pointer_notify_enter(seat, surface, sx, sy);
wlr_seat_pointer_notify_motion(seat, time, sx, sy); wlr_seat_pointer_notify_motion(seat, time, sx, sy);
@ -87,8 +87,8 @@ static void handle_cursor_button(struct wl_listener *listener, void *data) {
if (event->button == BTN_LEFT) { if (event->button == BTN_LEFT) {
struct wlr_surface *surface = NULL; struct wlr_surface *surface = NULL;
double sx, sy; double sx, sy;
swayc_t *swayc = struct sway_container *swayc =
swayc_at(&root_container, cursor->x, cursor->y, &surface, &sx, &sy); sway_container_at(&root_container, cursor->x, cursor->y, &surface, &sx, &sy);
sway_seat_set_focus(cursor->seat, swayc); sway_seat_set_focus(cursor->seat, swayc);
} }

View file

@ -37,7 +37,7 @@ static void handle_seat_container_destroy(struct wl_listener *listener,
struct sway_seat_container *seat_con = struct sway_seat_container *seat_con =
wl_container_of(listener, seat_con, destroy); wl_container_of(listener, seat_con, destroy);
struct sway_seat *seat = seat_con->seat; struct sway_seat *seat = seat_con->seat;
swayc_t *con = seat_con->container; struct sway_container *con = seat_con->container;
bool is_focus = (sway_seat_get_focus(seat) == con); bool is_focus = (sway_seat_get_focus(seat) == con);
@ -46,7 +46,7 @@ static void handle_seat_container_destroy(struct wl_listener *listener,
if (is_focus) { if (is_focus) {
// pick next focus // pick next focus
sway_seat_set_focus(seat, NULL); sway_seat_set_focus(seat, NULL);
swayc_t *next = sway_seat_get_focus_inactive(seat, con->parent); struct sway_container *next = sway_seat_get_focus_inactive(seat, con->parent);
if (next == NULL) { if (next == NULL) {
next = con->parent; next = con->parent;
} }
@ -59,7 +59,7 @@ static void handle_seat_container_destroy(struct wl_listener *listener,
} }
static struct sway_seat_container *seat_container_from_container( static struct sway_seat_container *seat_container_from_container(
struct sway_seat *seat, swayc_t *con) { struct sway_seat *seat, struct sway_container *con) {
if (con->type < C_WORKSPACE) { if (con->type < C_WORKSPACE) {
// these don't get seat containers ever // these don't get seat containers ever
return NULL; return NULL;
@ -89,11 +89,11 @@ static struct sway_seat_container *seat_container_from_container(
static void handle_new_container(struct wl_listener *listener, void *data) { static void handle_new_container(struct wl_listener *listener, void *data) {
struct sway_seat *seat = wl_container_of(listener, seat, new_container); struct sway_seat *seat = wl_container_of(listener, seat, new_container);
swayc_t *con = data; struct sway_container *con = data;
seat_container_from_container(seat, con); seat_container_from_container(seat, con);
} }
static void collect_focus_iter(swayc_t *con, void *data) { static void collect_focus_iter(struct sway_container *con, void *data) {
struct sway_seat *seat = data; struct sway_seat *seat = data;
if (con->type > C_WORKSPACE) { if (con->type > C_WORKSPACE) {
return; return;
@ -130,7 +130,7 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input,
// init the focus stack // init the focus stack
wl_list_init(&seat->focus_stack); wl_list_init(&seat->focus_stack);
container_for_each_bfs(&root_container, collect_focus_iter, seat); sway_container_for_each_bfs(&root_container, collect_focus_iter, seat);
wl_signal_add(&root_container.sway_root->events.new_container, wl_signal_add(&root_container.sway_root->events.new_container,
&seat->new_container); &seat->new_container);
@ -166,7 +166,7 @@ static void seat_configure_keyboard(struct sway_seat *seat,
sway_keyboard_configure(seat_device->keyboard); sway_keyboard_configure(seat_device->keyboard);
wlr_seat_set_keyboard(seat->wlr_seat, wlr_seat_set_keyboard(seat->wlr_seat,
seat_device->input_device->wlr_device); seat_device->input_device->wlr_device);
swayc_t *focus = sway_seat_get_focus(seat); struct sway_container *focus = sway_seat_get_focus(seat);
if (focus && focus->type == C_VIEW) { if (focus && focus->type == C_VIEW) {
// force notify reenter to pick up the new configuration // force notify reenter to pick up the new configuration
wlr_seat_keyboard_clear_focus(seat->wlr_seat); wlr_seat_keyboard_clear_focus(seat->wlr_seat);
@ -270,7 +270,7 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) {
} }
for (int i = 0; i < root_container.children->length; ++i) { for (int i = 0; i < root_container.children->length; ++i) {
swayc_t *output_container = root_container.children->items[i]; struct sway_container *output_container = root_container.children->items[i];
struct wlr_output *output = struct wlr_output *output =
output_container->sway_output->wlr_output; output_container->sway_output->wlr_output;
bool result = bool result =
@ -289,8 +289,8 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) {
seat->cursor->cursor->y); seat->cursor->cursor->y);
} }
void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) { void sway_seat_set_focus(struct sway_seat *seat, struct sway_container *container) {
swayc_t *last_focus = sway_seat_get_focus(seat); struct sway_container *last_focus = sway_seat_get_focus(seat);
if (container && last_focus == container) { if (container && last_focus == container) {
return; return;
@ -330,9 +330,9 @@ void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) {
seat->has_focus = (container != NULL); seat->has_focus = (container != NULL);
} }
swayc_t *sway_seat_get_focus_inactive(struct sway_seat *seat, swayc_t *container) { struct sway_container *sway_seat_get_focus_inactive(struct sway_seat *seat, struct sway_container *container) {
struct sway_seat_container *current = NULL; struct sway_seat_container *current = NULL;
swayc_t *parent = NULL; struct sway_container *parent = NULL;
wl_list_for_each(current, &seat->focus_stack, link) { wl_list_for_each(current, &seat->focus_stack, link) {
parent = current->container->parent; parent = current->container->parent;
@ -351,21 +351,21 @@ swayc_t *sway_seat_get_focus_inactive(struct sway_seat *seat, swayc_t *container
return NULL; return NULL;
} }
swayc_t *sway_seat_get_focus(struct sway_seat *seat) { struct sway_container *sway_seat_get_focus(struct sway_seat *seat) {
if (!seat->has_focus) { if (!seat->has_focus) {
return NULL; return NULL;
} }
return sway_seat_get_focus_inactive(seat, &root_container); return sway_seat_get_focus_inactive(seat, &root_container);
} }
swayc_t *sway_seat_get_focus_by_type(struct sway_seat *seat, struct sway_container *sway_seat_get_focus_by_type(struct sway_seat *seat,
enum swayc_types type) { enum sway_container_type type) {
swayc_t *focus = sway_seat_get_focus_inactive(seat, &root_container); struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container);
if (focus->type == type) { if (focus->type == type) {
return focus; return focus;
} }
return swayc_parent_by_type(focus, type); return sway_container_parent(focus, type);
} }
void sway_seat_set_config(struct sway_seat *seat, void sway_seat_set_config(struct sway_seat *seat,

View file

@ -25,7 +25,7 @@ json_object *ipc_json_get_version() {
return version; return version;
} }
static json_object *ipc_json_create_rect(swayc_t *c) { static json_object *ipc_json_create_rect(struct sway_container *c) {
json_object *rect = json_object_new_object(); json_object *rect = json_object_new_object();
json_object_object_add(rect, "x", json_object_new_int((int32_t)c->x)); json_object_object_add(rect, "x", json_object_new_int((int32_t)c->x));
@ -36,7 +36,7 @@ static json_object *ipc_json_create_rect(swayc_t *c) {
return rect; return rect;
} }
static void ipc_json_describe_root(swayc_t *root, json_object *object) { static void ipc_json_describe_root(struct sway_container *root, json_object *object) {
json_object_object_add(object, "type", json_object_new_string("root")); json_object_object_add(object, "type", json_object_new_string("root"));
json_object_object_add(object, "layout", json_object_new_string("splith")); json_object_object_add(object, "layout", json_object_new_string("splith"));
} }
@ -63,7 +63,7 @@ static const char *ipc_json_get_output_transform(enum wl_output_transform transf
return NULL; return NULL;
} }
static void ipc_json_describe_output(swayc_t *container, json_object *object) { static void ipc_json_describe_output(struct sway_container *container, json_object *object) {
struct wlr_output *wlr_output = container->sway_output->wlr_output; struct wlr_output *wlr_output = container->sway_output->wlr_output;
json_object_object_add(object, "type", json_object_new_string("output")); json_object_object_add(object, "type", json_object_new_string("output"));
json_object_object_add(object, "active", json_object_new_boolean(true)); json_object_object_add(object, "active", json_object_new_boolean(true));
@ -94,7 +94,7 @@ static void ipc_json_describe_output(swayc_t *container, json_object *object) {
json_object_object_add(object, "modes", modes_array); json_object_object_add(object, "modes", modes_array);
} }
static void ipc_json_describe_workspace(swayc_t *workspace, json_object *object) { static void ipc_json_describe_workspace(struct sway_container *workspace, json_object *object) {
int num = (isdigit(workspace->name[0])) ? atoi(workspace->name) : -1; int num = (isdigit(workspace->name[0])) ? atoi(workspace->name) : -1;
json_object_object_add(object, "num", json_object_new_int(num)); json_object_object_add(object, "num", json_object_new_int(num));
@ -102,11 +102,11 @@ static void ipc_json_describe_workspace(swayc_t *workspace, json_object *object)
json_object_object_add(object, "type", json_object_new_string("workspace")); json_object_object_add(object, "type", json_object_new_string("workspace"));
} }
static void ipc_json_describe_view(swayc_t *c, json_object *object) { static void ipc_json_describe_view(struct sway_container *c, json_object *object) {
json_object_object_add(object, "name", (c->name) ? json_object_new_string(c->name) : NULL); json_object_object_add(object, "name", (c->name) ? json_object_new_string(c->name) : NULL);
} }
json_object *ipc_json_describe_container(swayc_t *c) { json_object *ipc_json_describe_container(struct sway_container *c) {
if (!(sway_assert(c, "Container must not be null."))) { if (!(sway_assert(c, "Container must not be null."))) {
return NULL; return NULL;
} }
@ -147,7 +147,7 @@ json_object *ipc_json_describe_container(swayc_t *c) {
return object; return object;
} }
json_object *ipc_json_describe_container_recursive(swayc_t *c) { json_object *ipc_json_describe_container_recursive(struct sway_container *c) {
json_object *object = ipc_json_describe_container(c); json_object *object = ipc_json_describe_container(c);
int i; int i;

View file

@ -279,7 +279,7 @@ static void ipc_send_event(const char *json_string, enum ipc_command_type event)
} }
} }
void ipc_event_window(swayc_t *window, const char *change) { void ipc_event_window(struct sway_container *window, const char *change) {
wlr_log(L_DEBUG, "Sending window::%s event", change); wlr_log(L_DEBUG, "Sending window::%s event", change);
json_object *obj = json_object_new_object(); json_object *obj = json_object_new_object();
json_object_object_add(obj, "change", json_object_new_string(change)); json_object_object_add(obj, "change", json_object_new_string(change));
@ -400,7 +400,7 @@ void ipc_client_handle_command(struct ipc_client *client) {
{ {
json_object *outputs = json_object_new_array(); json_object *outputs = json_object_new_array();
for (int i = 0; i < root_container.children->length; ++i) { for (int i = 0; i < root_container.children->length; ++i) {
swayc_t *container = root_container.children->items[i]; struct sway_container *container = root_container.children->items[i];
if (container->type == C_OUTPUT) { if (container->type == C_OUTPUT) {
json_object_array_add(outputs, json_object_array_add(outputs,
ipc_json_describe_container(container)); ipc_json_describe_container(container));

View file

@ -33,48 +33,15 @@ static list_t *get_bfs_queue() {
return bfs_queue; return bfs_queue;
} }
static void notify_new_container(swayc_t *container) { static void notify_new_container(struct sway_container *container) {
wl_signal_emit(&root_container.sway_root->events.new_container, container); wl_signal_emit(&root_container.sway_root->events.new_container, container);
ipc_event_window(container, "new"); ipc_event_window(container, "new");
} }
swayc_t *swayc_by_test(swayc_t *container, static struct sway_container *new_swayc(enum sway_container_type type) {
bool (*test)(swayc_t *view, void *data), void *data) {
if (!container->children) {
return NULL;
}
// TODO: floating windows
for (int i = 0; i < container->children->length; ++i) {
swayc_t *child = container->children->items[i];
if (test(child, data)) {
return child;
} else {
swayc_t *res = swayc_by_test(child, test, data);
if (res) {
return res;
}
}
}
return NULL;
}
void swayc_descendants_of_type(swayc_t *root, enum swayc_types type,
void (*func)(swayc_t *item, void *data), void *data) {
for (int i = 0; i < root->children->length; ++i) {
swayc_t *item = root->children->items[i];
if (item->type == type) {
func(item, data);
}
if (item->children && item->children->length) {
swayc_descendants_of_type(item, type, func, data);
}
}
}
static swayc_t *new_swayc(enum swayc_types type) {
// next id starts at 1 because 0 is assigned to root_container in layout.c // next id starts at 1 because 0 is assigned to root_container in layout.c
static size_t next_id = 1; static size_t next_id = 1;
swayc_t *c = calloc(1, sizeof(swayc_t)); struct sway_container *c = calloc(1, sizeof(struct sway_container));
if (!c) { if (!c) {
return NULL; return NULL;
} }
@ -91,7 +58,7 @@ static swayc_t *new_swayc(enum swayc_types type) {
return c; return c;
} }
static void free_swayc(swayc_t *cont) { static void free_swayc(struct sway_container *cont) {
if (!sway_assert(cont, "free_swayc passed NULL")) { if (!sway_assert(cont, "free_swayc passed NULL")) {
return; return;
} }
@ -119,7 +86,7 @@ static void free_swayc(swayc_t *cont) {
free(cont); free(cont);
} }
swayc_t *new_output(struct sway_output *sway_output) { struct sway_container *sway_container_output_create(struct sway_output *sway_output) {
struct wlr_box size; struct wlr_box size;
wlr_output_effective_resolution(sway_output->wlr_output, &size.width, wlr_output_effective_resolution(sway_output->wlr_output, &size.width,
&size.height); &size.height);
@ -154,7 +121,7 @@ swayc_t *new_output(struct sway_output *sway_output) {
return NULL; return NULL;
} }
swayc_t *output = new_swayc(C_OUTPUT); struct sway_container *output = new_swayc(C_OUTPUT);
output->sway_output = sway_output; output->sway_output = sway_output;
output->name = strdup(name); output->name = strdup(name);
if (output->name == NULL) { if (output->name == NULL) {
@ -169,7 +136,7 @@ swayc_t *new_output(struct sway_output *sway_output) {
// Create workspace // Create workspace
char *ws_name = workspace_next_name(output->name); char *ws_name = workspace_next_name(output->name);
wlr_log(L_DEBUG, "Creating default workspace %s", ws_name); wlr_log(L_DEBUG, "Creating default workspace %s", ws_name);
swayc_t *ws = new_workspace(output, ws_name); struct sway_container *ws = sway_container_workspace_create(output, ws_name);
// Set each seat's focus if not already set // Set each seat's focus if not already set
struct sway_seat *seat = NULL; struct sway_seat *seat = NULL;
wl_list_for_each(seat, &input_manager->seats, link) { wl_list_for_each(seat, &input_manager->seats, link) {
@ -183,12 +150,12 @@ swayc_t *new_output(struct sway_output *sway_output) {
return output; return output;
} }
swayc_t *new_workspace(swayc_t *output, const char *name) { struct sway_container *sway_container_workspace_create(struct sway_container *output, const char *name) {
if (!sway_assert(output, "new_workspace called with null output")) { if (!sway_assert(output, "sway_container_workspace_create called with null output")) {
return NULL; return NULL;
} }
wlr_log(L_DEBUG, "Added workspace %s for output %s", name, output->name); wlr_log(L_DEBUG, "Added workspace %s for output %s", name, output->name);
swayc_t *workspace = new_swayc(C_WORKSPACE); struct sway_container *workspace = new_swayc(C_WORKSPACE);
workspace->x = output->x; workspace->x = output->x;
workspace->y = output->y; workspace->y = output->y;
@ -205,12 +172,12 @@ swayc_t *new_workspace(swayc_t *output, const char *name) {
return workspace; return workspace;
} }
swayc_t *new_view(swayc_t *sibling, struct sway_view *sway_view) { struct sway_container *sway_container_view_create(struct sway_container *sibling, struct sway_view *sway_view) {
if (!sway_assert(sibling, "new_view called with NULL sibling/parent")) { if (!sway_assert(sibling, "sway_container_view_create called with NULL sibling/parent")) {
return NULL; return NULL;
} }
const char *title = view_get_title(sway_view); const char *title = view_get_title(sway_view);
swayc_t *swayc = new_swayc(C_VIEW); struct sway_container *swayc = new_swayc(C_VIEW);
wlr_log(L_DEBUG, "Adding new view %p:%s to container %p %d %s", wlr_log(L_DEBUG, "Adding new view %p:%s to container %p %d %s",
swayc, title, sibling, sibling ? sibling->type : 0, sibling->name); swayc, title, sibling, sibling ? sibling->type : 0, sibling->name);
// Setup values // Setup values
@ -230,8 +197,8 @@ swayc_t *new_view(swayc_t *sibling, struct sway_view *sway_view) {
return swayc; return swayc;
} }
swayc_t *destroy_output(swayc_t *output) { struct sway_container *sway_container_output_destroy(struct sway_container *output) {
if (!sway_assert(output, "null output passed to destroy_output")) { if (!sway_assert(output, "null output passed to sway_container_output_destroy")) {
return NULL; return NULL;
} }
@ -243,7 +210,7 @@ swayc_t *destroy_output(swayc_t *output) {
int p = root_container.children->items[0] == output; int p = root_container.children->items[0] == output;
// Move workspace from this output to another output // Move workspace from this output to another output
while (output->children->length) { while (output->children->length) {
swayc_t *child = output->children->items[0]; struct sway_container *child = output->children->items[0];
remove_child(child); remove_child(child);
add_child(root_container.children->items[p], child); add_child(root_container.children->items[p], child);
} }
@ -262,12 +229,12 @@ swayc_t *destroy_output(swayc_t *output) {
return &root_container; return &root_container;
} }
swayc_t *destroy_view(swayc_t *view) { struct sway_container *sway_container_view_destroy(struct sway_container *view) {
if (!view) { if (!view) {
return NULL; return NULL;
} }
wlr_log(L_DEBUG, "Destroying view '%s'", view->name); wlr_log(L_DEBUG, "Destroying view '%s'", view->name);
swayc_t *parent = view->parent; struct sway_container *parent = view->parent;
free_swayc(view); free_swayc(view);
// TODO WLR: Destroy empty containers // TODO WLR: Destroy empty containers
@ -279,7 +246,52 @@ swayc_t *destroy_view(swayc_t *view) {
return parent; return parent;
} }
swayc_t *swayc_parent_by_type(swayc_t *container, enum swayc_types type) { struct sway_container *swayc_change_layout(struct sway_container *container, enum sway_container_layout layout) {
if (container->type == C_WORKSPACE) {
container->workspace_layout = layout;
if (layout == L_HORIZ || layout == L_VERT) {
container->layout = layout;
}
} else {
container->layout = layout;
}
return container;
}
void sway_container_descendents(struct sway_container *root, enum sway_container_type type,
void (*func)(struct sway_container *item, void *data), void *data) {
for (int i = 0; i < root->children->length; ++i) {
struct sway_container *item = root->children->items[i];
if (item->type == type) {
func(item, data);
}
if (item->children && item->children->length) {
sway_container_descendents(item, type, func, data);
}
}
}
struct sway_container *sway_container_find(struct sway_container *container,
bool (*test)(struct sway_container *view, void *data), void *data) {
if (!container->children) {
return NULL;
}
// TODO: floating windows
for (int i = 0; i < container->children->length; ++i) {
struct sway_container *child = container->children->items[i];
if (test(child, data)) {
return child;
} else {
struct sway_container *res = sway_container_find(child, test, data);
if (res) {
return res;
}
}
}
return NULL;
}
struct sway_container *sway_container_parent(struct sway_container *container, enum sway_container_type type) {
if (!sway_assert(container, "container is NULL")) { if (!sway_assert(container, "container is NULL")) {
return NULL; return NULL;
} }
@ -292,7 +304,29 @@ swayc_t *swayc_parent_by_type(swayc_t *container, enum swayc_types type) {
return container; return container;
} }
swayc_t *swayc_at(swayc_t *parent, double lx, double ly, void sway_container_for_each(struct sway_container *container, void (*f)(struct sway_container *view, void *data), void *data) {
if (container) {
int i;
if (container->children) {
for (i = 0; i < container->children->length; ++i) {
struct sway_container *child = container->children->items[i];
sway_container_for_each(child, f, data);
}
}
// TODO
/*
if (container->floating) {
for (i = 0; i < container->floating->length; ++i) {
struct sway_container *child = container->floating->items[i];
container_map(child, f, data);
}
}
*/
f(container, data);
}
}
struct sway_container *sway_container_at(struct sway_container *parent, double lx, double ly,
struct wlr_surface **surface, double *sx, double *sy) { struct wlr_surface **surface, double *sx, double *sy) {
list_t *queue = get_bfs_queue(); list_t *queue = get_bfs_queue();
if (!queue) { if (!queue) {
@ -301,13 +335,13 @@ swayc_t *swayc_at(swayc_t *parent, double lx, double ly,
list_add(queue, parent); list_add(queue, parent);
swayc_t *swayc = NULL; struct sway_container *swayc = NULL;
while (queue->length) { while (queue->length) {
swayc = queue->items[0]; swayc = queue->items[0];
list_del(queue, 0); list_del(queue, 0);
if (swayc->type == C_VIEW) { if (swayc->type == C_VIEW) {
struct sway_view *sview = swayc->sway_view; struct sway_view *sview = swayc->sway_view;
swayc_t *soutput = swayc_parent_by_type(swayc, C_OUTPUT); struct sway_container *soutput = sway_container_parent(swayc, C_OUTPUT);
struct wlr_box *output_box = struct wlr_box *output_box =
wlr_output_layout_get_box( wlr_output_layout_get_box(
root_container.sway_root->output_layout, root_container.sway_root->output_layout,
@ -377,29 +411,7 @@ swayc_t *swayc_at(swayc_t *parent, double lx, double ly,
return NULL; return NULL;
} }
void container_map(swayc_t *container, void (*f)(swayc_t *view, void *data), void *data) { void sway_container_for_each_bfs(struct sway_container *con, void (*f)(struct sway_container *con, void *data),
if (container) {
int i;
if (container->children) {
for (i = 0; i < container->children->length; ++i) {
swayc_t *child = container->children->items[i];
container_map(child, f, data);
}
}
// TODO
/*
if (container->floating) {
for (i = 0; i < container->floating->length; ++i) {
swayc_t *child = container->floating->items[i];
container_map(child, f, data);
}
}
*/
f(container, data);
}
}
void container_for_each_bfs(swayc_t *con, void (*f)(swayc_t *con, void *data),
void *data) { void *data) {
list_t *queue = get_bfs_queue(); list_t *queue = get_bfs_queue();
if (!queue) { if (!queue) {
@ -413,7 +425,7 @@ void container_for_each_bfs(swayc_t *con, void (*f)(swayc_t *con, void *data),
list_add(queue, con); list_add(queue, con);
swayc_t *current = NULL; struct sway_container *current = NULL;
while (queue->length) { while (queue->length) {
current = queue->items[0]; current = queue->items[0];
list_del(queue, 0); list_del(queue, 0);
@ -422,15 +434,3 @@ void container_for_each_bfs(swayc_t *con, void (*f)(swayc_t *con, void *data),
list_cat(queue, current->children); list_cat(queue, current->children);
} }
} }
swayc_t *swayc_change_layout(swayc_t *container, enum swayc_layouts layout) {
if (container->type == C_WORKSPACE) {
container->workspace_layout = layout;
if (layout == L_HORIZ || layout == L_VERT) {
container->layout = layout;
}
} else {
container->layout = layout;
}
return container;
}

View file

@ -14,7 +14,7 @@
#include "list.h" #include "list.h"
#include "log.h" #include "log.h"
swayc_t root_container; struct sway_container root_container;
static void output_layout_change_notify(struct wl_listener *listener, void *data) { static void output_layout_change_notify(struct wl_listener *listener, void *data) {
struct wlr_box *layout_box = wlr_output_layout_get_box( struct wlr_box *layout_box = wlr_output_layout_get_box(
@ -23,7 +23,7 @@ static void output_layout_change_notify(struct wl_listener *listener, void *data
root_container.height = layout_box->height; root_container.height = layout_box->height;
for (int i = 0 ; i < root_container.children->length; ++i) { for (int i = 0 ; i < root_container.children->length; ++i) {
swayc_t *output_container = root_container.children->items[i]; struct sway_container *output_container = root_container.children->items[i];
if (output_container->type != C_OUTPUT) { if (output_container->type != C_OUTPUT) {
continue; continue;
} }
@ -62,9 +62,9 @@ void init_layout(void) {
&root_container.sway_root->output_layout_change); &root_container.sway_root->output_layout_change);
} }
static int index_child(const swayc_t *child) { static int index_child(const struct sway_container *child) {
// TODO handle floating // TODO handle floating
swayc_t *parent = child->parent; struct sway_container *parent = child->parent;
int i, len; int i, len;
len = parent->children->length; len = parent->children->length;
for (i = 0; i < len; ++i) { for (i = 0; i < len; ++i) {
@ -79,16 +79,16 @@ static int index_child(const swayc_t *child) {
return i; return i;
} }
swayc_t *add_sibling(swayc_t *fixed, swayc_t *active) { struct sway_container *add_sibling(struct sway_container *fixed, struct sway_container *active) {
// TODO handle floating // TODO handle floating
swayc_t *parent = fixed->parent; struct sway_container *parent = fixed->parent;
int i = index_child(fixed); int i = index_child(fixed);
list_insert(parent->children, i + 1, active); list_insert(parent->children, i + 1, active);
active->parent = parent; active->parent = parent;
return active->parent; return active->parent;
} }
void add_child(swayc_t *parent, swayc_t *child) { void add_child(struct sway_container *parent, struct sway_container *child) {
wlr_log(L_DEBUG, "Adding %p (%d, %fx%f) to %p (%d, %fx%f)", wlr_log(L_DEBUG, "Adding %p (%d, %fx%f) to %p (%d, %fx%f)",
child, child->type, child->width, child->height, child, child->type, child->width, child->height,
parent, parent->type, parent->width, parent->height); parent, parent->type, parent->width, parent->height);
@ -102,9 +102,9 @@ void add_child(swayc_t *parent, swayc_t *child) {
*/ */
} }
swayc_t *remove_child(swayc_t *child) { struct sway_container *remove_child(struct sway_container *child) {
int i; int i;
swayc_t *parent = child->parent; struct sway_container *parent = child->parent;
for (i = 0; i < parent->children->length; ++i) { for (i = 0; i < parent->children->length; ++i) {
if (parent->children->items[i] == child) { if (parent->children->items[i] == child) {
list_del(parent->children, i); list_del(parent->children, i);
@ -115,7 +115,7 @@ swayc_t *remove_child(swayc_t *child) {
return parent; return parent;
} }
enum swayc_layouts default_layout(swayc_t *output) { enum sway_container_layout default_layout(struct sway_container *output) {
/* TODO WLR /* TODO WLR
if (config->default_layout != L_NONE) { if (config->default_layout != L_NONE) {
//return config->default_layout; //return config->default_layout;
@ -129,8 +129,8 @@ enum swayc_layouts default_layout(swayc_t *output) {
} }
static int sort_workspace_cmp_qsort(const void *_a, const void *_b) { static int sort_workspace_cmp_qsort(const void *_a, const void *_b) {
swayc_t *a = *(void **)_a; struct sway_container *a = *(void **)_a;
swayc_t *b = *(void **)_b; struct sway_container *b = *(void **)_b;
int retval = 0; int retval = 0;
if (isdigit(a->name[0]) && isdigit(b->name[0])) { if (isdigit(a->name[0]) && isdigit(b->name[0])) {
@ -146,21 +146,21 @@ static int sort_workspace_cmp_qsort(const void *_a, const void *_b) {
return retval; return retval;
} }
void sort_workspaces(swayc_t *output) { void sort_workspaces(struct sway_container *output) {
list_stable_sort(output->children, sort_workspace_cmp_qsort); list_stable_sort(output->children, sort_workspace_cmp_qsort);
} }
static void apply_horiz_layout(swayc_t *container, const double x, static void apply_horiz_layout(struct sway_container *container, const double x,
const double y, const double width, const double y, const double width,
const double height, const int start, const double height, const int start,
const int end); const int end);
static void apply_vert_layout(swayc_t *container, const double x, static void apply_vert_layout(struct sway_container *container, const double x,
const double y, const double width, const double y, const double width,
const double height, const int start, const double height, const int start,
const int end); const int end);
void arrange_windows(swayc_t *container, double width, double height) { void arrange_windows(struct sway_container *container, double width, double height) {
int i; int i;
if (width == -1 || height == -1) { if (width == -1 || height == -1) {
width = container->width; width = container->width;
@ -181,7 +181,7 @@ void arrange_windows(swayc_t *container, double width, double height) {
case C_ROOT: case C_ROOT:
// TODO: wlr_output_layout probably // TODO: wlr_output_layout probably
for (i = 0; i < container->children->length; ++i) { for (i = 0; i < container->children->length; ++i) {
swayc_t *output = container->children->items[i]; struct sway_container *output = container->children->items[i];
wlr_log(L_DEBUG, "Arranging output '%s' at %f,%f", wlr_log(L_DEBUG, "Arranging output '%s' at %f,%f",
output->name, output->x, output->y); output->name, output->x, output->y);
arrange_windows(output, -1, -1); arrange_windows(output, -1, -1);
@ -197,13 +197,13 @@ void arrange_windows(swayc_t *container, double width, double height) {
} }
// arrange all workspaces: // arrange all workspaces:
for (i = 0; i < container->children->length; ++i) { for (i = 0; i < container->children->length; ++i) {
swayc_t *child = container->children->items[i]; struct sway_container *child = container->children->items[i];
arrange_windows(child, -1, -1); arrange_windows(child, -1, -1);
} }
return; return;
case C_WORKSPACE: case C_WORKSPACE:
{ {
swayc_t *output = swayc_parent_by_type(container, C_OUTPUT); struct sway_container *output = sway_container_parent(container, C_OUTPUT);
struct wlr_box *area = &output->sway_output->usable_area; struct wlr_box *area = &output->sway_output->usable_area;
wlr_log(L_DEBUG, "Usable area for ws: %dx%d@%d,%d", wlr_log(L_DEBUG, "Usable area for ws: %dx%d@%d,%d",
area->width, area->height, area->x, area->y); area->width, area->height, area->x, area->y);
@ -252,14 +252,14 @@ void arrange_windows(swayc_t *container, double width, double height) {
} }
} }
static void apply_horiz_layout(swayc_t *container, static void apply_horiz_layout(struct sway_container *container,
const double x, const double y, const double x, const double y,
const double width, const double height, const double width, const double height,
const int start, const int end) { const int start, const int end) {
double scale = 0; double scale = 0;
// Calculate total width // Calculate total width
for (int i = start; i < end; ++i) { for (int i = start; i < end; ++i) {
double *old_width = &((swayc_t *)container->children->items[i])->width; double *old_width = &((struct sway_container *)container->children->items[i])->width;
if (*old_width <= 0) { if (*old_width <= 0) {
if (end - start > 1) { if (end - start > 1) {
*old_width = width / (end - start - 1); *old_width = width / (end - start - 1);
@ -276,7 +276,7 @@ static void apply_horiz_layout(swayc_t *container,
if (scale > 0.1) { if (scale > 0.1) {
wlr_log(L_DEBUG, "Arranging %p horizontally", container); wlr_log(L_DEBUG, "Arranging %p horizontally", container);
for (int i = start; i < end; ++i) { for (int i = start; i < end; ++i) {
swayc_t *child = container->children->items[i]; struct sway_container *child = container->children->items[i];
wlr_log(L_DEBUG, wlr_log(L_DEBUG,
"Calculating arrangement for %p:%d (will scale %f by %f)", "Calculating arrangement for %p:%d (will scale %f by %f)",
child, child->type, width, scale); child, child->type, width, scale);
@ -301,7 +301,7 @@ static void apply_horiz_layout(swayc_t *container,
} }
} }
void apply_vert_layout(swayc_t *container, void apply_vert_layout(struct sway_container *container,
const double x, const double y, const double x, const double y,
const double width, const double height, const int start, const double width, const double height, const int start,
const int end) { const int end) {
@ -309,7 +309,7 @@ void apply_vert_layout(swayc_t *container,
double scale = 0; double scale = 0;
// Calculate total height // Calculate total height
for (i = start; i < end; ++i) { for (i = start; i < end; ++i) {
double *old_height = &((swayc_t *)container->children->items[i])->height; double *old_height = &((struct sway_container *)container->children->items[i])->height;
if (*old_height <= 0) { if (*old_height <= 0) {
if (end - start > 1) { if (end - start > 1) {
*old_height = height / (end - start - 1); *old_height = height / (end - start - 1);
@ -326,7 +326,7 @@ void apply_vert_layout(swayc_t *container,
if (scale > 0.1) { if (scale > 0.1) {
wlr_log(L_DEBUG, "Arranging %p vertically", container); wlr_log(L_DEBUG, "Arranging %p vertically", container);
for (i = start; i < end; ++i) { for (i = start; i < end; ++i) {
swayc_t *child = container->children->items[i]; struct sway_container *child = container->children->items[i];
wlr_log(L_DEBUG, wlr_log(L_DEBUG,
"Calculating arrangement for %p:%d (will scale %f by %f)", "Calculating arrangement for %p:%d (will scale %f by %f)",
child, child->type, height, scale); child, child->type, height, scale);
@ -354,15 +354,15 @@ void apply_vert_layout(swayc_t *container,
/** /**
* Get swayc in the direction of newly entered output. * Get swayc in the direction of newly entered output.
*/ */
static swayc_t *get_swayc_in_output_direction(swayc_t *output, static struct sway_container *get_swayc_in_output_direction(struct sway_container *output,
enum movement_direction dir, struct sway_seat *seat) { enum movement_direction dir, struct sway_seat *seat) {
if (!output) { if (!output) {
return NULL; return NULL;
} }
swayc_t *ws = sway_seat_get_focus_inactive(seat, output); struct sway_container *ws = sway_seat_get_focus_inactive(seat, output);
if (ws->type != C_WORKSPACE) { if (ws->type != C_WORKSPACE) {
ws = swayc_parent_by_type(ws, C_WORKSPACE); ws = sway_container_parent(ws, C_WORKSPACE);
} }
if (ws == NULL) { if (ws == NULL) {
@ -380,9 +380,9 @@ static swayc_t *get_swayc_in_output_direction(swayc_t *output,
return ws->children->items[0]; return ws->children->items[0];
case MOVE_UP: case MOVE_UP:
case MOVE_DOWN: { case MOVE_DOWN: {
swayc_t *focused = sway_seat_get_focus_inactive(seat, ws); struct sway_container *focused = sway_seat_get_focus_inactive(seat, ws);
if (focused && focused->parent) { if (focused && focused->parent) {
swayc_t *parent = focused->parent; struct sway_container *parent = focused->parent;
if (parent->layout == L_VERT) { if (parent->layout == L_VERT) {
if (dir == MOVE_UP) { if (dir == MOVE_UP) {
// get child furthest down on new output // get child furthest down on new output
@ -404,13 +404,13 @@ static swayc_t *get_swayc_in_output_direction(swayc_t *output,
return ws; return ws;
} }
static void get_layout_center_position(swayc_t *container, int *x, int *y) { static void get_layout_center_position(struct sway_container *container, int *x, int *y) {
// FIXME view coords are inconsistently referred to in layout/output systems // FIXME view coords are inconsistently referred to in layout/output systems
if (container->type == C_OUTPUT) { if (container->type == C_OUTPUT) {
*x = container->x + container->width/2; *x = container->x + container->width/2;
*y = container->y + container->height/2; *y = container->y + container->height/2;
} else { } else {
swayc_t *output = swayc_parent_by_type(container, C_OUTPUT); struct sway_container *output = sway_container_parent(container, C_OUTPUT);
if (container->type == C_WORKSPACE) { if (container->type == C_WORKSPACE) {
// Workspace coordinates are actually wrong/arbitrary, but should // Workspace coordinates are actually wrong/arbitrary, but should
// be same as output. // be same as output.
@ -444,12 +444,12 @@ static bool sway_dir_to_wlr(enum movement_direction dir, enum wlr_direction *out
return true; return true;
} }
static swayc_t *sway_output_from_wlr(struct wlr_output *output) { static struct sway_container *sway_output_from_wlr(struct wlr_output *output) {
if (output == NULL) { if (output == NULL) {
return NULL; return NULL;
} }
for (int i = 0; i < root_container.children->length; ++i) { for (int i = 0; i < root_container.children->length; ++i) {
swayc_t *o = root_container.children->items[i]; struct sway_container *o = root_container.children->items[i];
if (o->type == C_OUTPUT && o->sway_output->wlr_output == output) { if (o->type == C_OUTPUT && o->sway_output->wlr_output == output) {
return o; return o;
} }
@ -457,13 +457,13 @@ static swayc_t *sway_output_from_wlr(struct wlr_output *output) {
return NULL; return NULL;
} }
static swayc_t *get_swayc_in_direction_under(swayc_t *container, static struct sway_container *get_swayc_in_direction_under(struct sway_container *container,
enum movement_direction dir, struct sway_seat *seat, swayc_t *limit) { enum movement_direction dir, struct sway_seat *seat, struct sway_container *limit) {
if (dir == MOVE_CHILD) { if (dir == MOVE_CHILD) {
return sway_seat_get_focus_inactive(seat, container); return sway_seat_get_focus_inactive(seat, container);
} }
swayc_t *parent = container->parent; struct sway_container *parent = container->parent;
if (dir == MOVE_PARENT) { if (dir == MOVE_PARENT) {
if (parent->type == C_OUTPUT) { if (parent->type == C_OUTPUT) {
return NULL; return NULL;
@ -496,9 +496,9 @@ static swayc_t *get_swayc_in_direction_under(swayc_t *container,
/* /*
if (container->type == C_VIEW && swayc_is_fullscreen(container)) { if (container->type == C_VIEW && swayc_is_fullscreen(container)) {
wlr_log(L_DEBUG, "Moving from fullscreen view, skipping to output"); wlr_log(L_DEBUG, "Moving from fullscreen view, skipping to output");
container = swayc_parent_by_type(container, C_OUTPUT); container = sway_container_parent(container, C_OUTPUT);
get_layout_center_position(container, &abs_pos); get_layout_center_position(container, &abs_pos);
swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true); struct sway_container *output = swayc_adjacent_output(container, dir, &abs_pos, true);
return get_swayc_in_output_direction(output, dir); return get_swayc_in_output_direction(output, dir);
} }
if (container->type == C_WORKSPACE && container->fullscreen) { if (container->type == C_WORKSPACE && container->fullscreen) {
@ -507,7 +507,7 @@ static swayc_t *get_swayc_in_direction_under(swayc_t *container,
} }
*/ */
swayc_t *wrap_candidate = NULL; struct sway_container *wrap_candidate = NULL;
while (true) { while (true) {
// Test if we can even make a difference here // Test if we can even make a difference here
bool can_move = false; bool can_move = false;
@ -525,12 +525,12 @@ static swayc_t *get_swayc_in_direction_under(swayc_t *container,
struct wlr_output *wlr_adjacent = struct wlr_output *wlr_adjacent =
wlr_output_layout_adjacent_output(layout, wlr_dir, wlr_output_layout_adjacent_output(layout, wlr_dir,
container->sway_output->wlr_output, lx, ly); container->sway_output->wlr_output, lx, ly);
swayc_t *adjacent = sway_output_from_wlr(wlr_adjacent); struct sway_container *adjacent = sway_output_from_wlr(wlr_adjacent);
if (!adjacent || adjacent == container) { if (!adjacent || adjacent == container) {
return wrap_candidate; return wrap_candidate;
} }
swayc_t *next = get_swayc_in_output_direction(adjacent, dir, seat); struct sway_container *next = get_swayc_in_output_direction(adjacent, dir, seat);
if (next == NULL) { if (next == NULL) {
return NULL; return NULL;
} }
@ -587,7 +587,7 @@ static swayc_t *get_swayc_in_direction_under(swayc_t *container,
} }
} }
swayc_t *get_swayc_in_direction(swayc_t *container, struct sway_seat *seat, struct sway_container *get_swayc_in_direction(struct sway_container *container, struct sway_seat *seat,
enum movement_direction dir) { enum movement_direction dir) {
return get_swayc_in_direction_under(container, dir, seat, NULL); return get_swayc_in_direction_under(container, dir, seat, NULL);
} }

View file

@ -17,7 +17,7 @@ struct workspace_by_number_data {
const char *name; const char *name;
}; };
void next_name_map(swayc_t *ws, void *data) { void next_name_map(struct sway_container *ws, void *data) {
int *count = data; int *count = data;
++count; ++count;
} }
@ -37,7 +37,7 @@ char *workspace_next_name(const char *output_name) {
return name; return name;
} }
static bool _workspace_by_number(swayc_t *view, void *data) { static bool _workspace_by_number(struct sway_container *view, void *data) {
if (view->type != C_WORKSPACE) { if (view->type != C_WORKSPACE) {
return false; return false;
} }
@ -46,27 +46,27 @@ static bool _workspace_by_number(swayc_t *view, void *data) {
return a == wbnd->len && strncmp(view->name, wbnd->name, a) == 0; return a == wbnd->len && strncmp(view->name, wbnd->name, a) == 0;
} }
swayc_t *workspace_by_number(const char* name) { struct sway_container *workspace_by_number(const char* name) {
struct workspace_by_number_data wbnd = {0, "1234567890", name}; struct workspace_by_number_data wbnd = {0, "1234567890", name};
wbnd.len = strspn(name, wbnd.cset); wbnd.len = strspn(name, wbnd.cset);
if (wbnd.len <= 0) { if (wbnd.len <= 0) {
return NULL; return NULL;
} }
return swayc_by_test(&root_container, _workspace_by_number, (void *) &wbnd); return sway_container_find(&root_container, _workspace_by_number, (void *) &wbnd);
} }
static bool _workspace_by_name(swayc_t *view, void *data) { static bool _workspace_by_name(struct sway_container *view, void *data) {
return (view->type == C_WORKSPACE) && return (view->type == C_WORKSPACE) &&
(strcasecmp(view->name, (char *) data) == 0); (strcasecmp(view->name, (char *) data) == 0);
} }
swayc_t *workspace_by_name(const char *name) { struct sway_container *workspace_by_name(const char *name) {
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *current_workspace = NULL, *current_output = NULL; struct sway_container *current_workspace = NULL, *current_output = NULL;
swayc_t *focus = sway_seat_get_focus(seat); struct sway_container *focus = sway_seat_get_focus(seat);
if (focus) { if (focus) {
current_workspace = swayc_parent_by_type(focus, C_WORKSPACE); current_workspace = sway_container_parent(focus, C_WORKSPACE);
current_output = swayc_parent_by_type(focus, C_OUTPUT); current_output = sway_container_parent(focus, C_OUTPUT);
} }
if (strcmp(name, "prev") == 0) { if (strcmp(name, "prev") == 0) {
return workspace_prev(current_workspace); return workspace_prev(current_workspace);
@ -79,12 +79,12 @@ swayc_t *workspace_by_name(const char *name) {
} else if (strcmp(name, "current") == 0) { } else if (strcmp(name, "current") == 0) {
return current_workspace; return current_workspace;
} else { } else {
return swayc_by_test(&root_container, _workspace_by_name, (void *) name); return sway_container_find(&root_container, _workspace_by_name, (void *) name);
} }
} }
swayc_t *workspace_create(const char *name) { struct sway_container *workspace_create(const char *name) {
swayc_t *parent; struct sway_container *parent;
// Search for workspace<->output pair // Search for workspace<->output pair
int i, e = config->workspace_outputs->length; int i, e = config->workspace_outputs->length;
for (i = 0; i < e; ++i) { for (i = 0; i < e; ++i) {
@ -95,7 +95,7 @@ swayc_t *workspace_create(const char *name) {
for (i = 0; i < e; ++i) { for (i = 0; i < e; ++i) {
parent = root_container.children->items[i]; parent = root_container.children->items[i];
if (strcmp(parent->name, wso->output) == 0) { if (strcmp(parent->name, wso->output) == 0) {
return new_workspace(parent, name); return sway_container_workspace_create(parent, name);
} }
} }
break; break;
@ -103,10 +103,10 @@ swayc_t *workspace_create(const char *name) {
} }
// Otherwise create a new one // Otherwise create a new one
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *focus = sway_seat_get_focus_inactive(seat, &root_container); struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container);
parent = focus; parent = focus;
parent = swayc_parent_by_type(parent, C_OUTPUT); parent = sway_container_parent(parent, C_OUTPUT);
return new_workspace(parent, name); return sway_container_workspace_create(parent, name);
} }
/** /**
@ -114,17 +114,17 @@ swayc_t *workspace_create(const char *name) {
* the end and beginning. If next is false, the previous workspace is returned, * the end and beginning. If next is false, the previous workspace is returned,
* otherwise the next one is returned. * otherwise the next one is returned.
*/ */
swayc_t *workspace_output_prev_next_impl(swayc_t *output, bool next) { struct sway_container *workspace_output_prev_next_impl(struct sway_container *output, bool next) {
if (!sway_assert(output->type == C_OUTPUT, if (!sway_assert(output->type == C_OUTPUT,
"Argument must be an output, is %d", output->type)) { "Argument must be an output, is %d", output->type)) {
return NULL; return NULL;
} }
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *focus = sway_seat_get_focus_inactive(seat, output); struct sway_container *focus = sway_seat_get_focus_inactive(seat, output);
swayc_t *workspace = (focus->type == C_WORKSPACE ? struct sway_container *workspace = (focus->type == C_WORKSPACE ?
focus : focus :
swayc_parent_by_type(focus, C_WORKSPACE)); sway_container_parent(focus, C_WORKSPACE));
int i; int i;
for (i = 0; i < output->children->length; i++) { for (i = 0; i < output->children->length; i++) {
@ -144,13 +144,13 @@ swayc_t *workspace_output_prev_next_impl(swayc_t *output, bool next) {
* next is false, the previous workspace is returned, otherwise the next one is * next is false, the previous workspace is returned, otherwise the next one is
* returned. * returned.
*/ */
swayc_t *workspace_prev_next_impl(swayc_t *workspace, bool next) { struct sway_container *workspace_prev_next_impl(struct sway_container *workspace, bool next) {
if (!sway_assert(workspace->type == C_WORKSPACE, if (!sway_assert(workspace->type == C_WORKSPACE,
"Argument must be a workspace, is %d", workspace->type)) { "Argument must be a workspace, is %d", workspace->type)) {
return NULL; return NULL;
} }
swayc_t *current_output = workspace->parent; struct sway_container *current_output = workspace->parent;
int offset = next ? 1 : -1; int offset = next ? 1 : -1;
int start = next ? 0 : 1; int start = next ? 0 : 1;
int end; int end;
@ -170,7 +170,7 @@ swayc_t *workspace_prev_next_impl(swayc_t *workspace, bool next) {
int num_outputs = root_container.children->length; int num_outputs = root_container.children->length;
for (i = 0; i < num_outputs; i++) { for (i = 0; i < num_outputs; i++) {
if (root_container.children->items[i] == current_output) { if (root_container.children->items[i] == current_output) {
swayc_t *next_output = root_container.children->items[ struct sway_container *next_output = root_container.children->items[
wrap(i + offset, num_outputs)]; wrap(i + offset, num_outputs)];
return workspace_output_prev_next_impl(next_output, next); return workspace_output_prev_next_impl(next_output, next);
} }
@ -180,40 +180,40 @@ swayc_t *workspace_prev_next_impl(swayc_t *workspace, bool next) {
return NULL; return NULL;
} }
swayc_t *workspace_output_next(swayc_t *current) { struct sway_container *workspace_output_next(struct sway_container *current) {
return workspace_output_prev_next_impl(current, true); return workspace_output_prev_next_impl(current, true);
} }
swayc_t *workspace_next(swayc_t *current) { struct sway_container *workspace_next(struct sway_container *current) {
return workspace_prev_next_impl(current, true); return workspace_prev_next_impl(current, true);
} }
swayc_t *workspace_output_prev(swayc_t *current) { struct sway_container *workspace_output_prev(struct sway_container *current) {
return workspace_output_prev_next_impl(current, false); return workspace_output_prev_next_impl(current, false);
} }
swayc_t *workspace_prev(swayc_t *current) { struct sway_container *workspace_prev(struct sway_container *current) {
return workspace_prev_next_impl(current, false); return workspace_prev_next_impl(current, false);
} }
bool workspace_switch(swayc_t *workspace) { bool workspace_switch(struct sway_container *workspace) {
if (!workspace) { if (!workspace) {
return false; return false;
} }
struct sway_seat *seat = input_manager_current_seat(input_manager); struct sway_seat *seat = input_manager_current_seat(input_manager);
swayc_t *focus = sway_seat_get_focus_inactive(seat, &root_container); struct sway_container *focus = sway_seat_get_focus_inactive(seat, &root_container);
if (!seat || !focus) { if (!seat || !focus) {
return false; return false;
} }
swayc_t *active_ws = focus; struct sway_container *active_ws = focus;
if (active_ws->type != C_WORKSPACE) { if (active_ws->type != C_WORKSPACE) {
swayc_parent_by_type(focus, C_WORKSPACE); sway_container_parent(focus, C_WORKSPACE);
} }
if (config->auto_back_and_forth if (config->auto_back_and_forth
&& active_ws == workspace && active_ws == workspace
&& prev_workspace_name) { && prev_workspace_name) {
swayc_t *new_ws = workspace_by_name(prev_workspace_name); struct sway_container *new_ws = workspace_by_name(prev_workspace_name);
workspace = new_ws ? new_ws : workspace_create(prev_workspace_name); workspace = new_ws ? new_ws : workspace_create(prev_workspace_name);
} }
@ -231,12 +231,12 @@ bool workspace_switch(swayc_t *workspace) {
// TODO: Deal with sticky containers // TODO: Deal with sticky containers
wlr_log(L_DEBUG, "Switching to workspace %p:%s", workspace, workspace->name); wlr_log(L_DEBUG, "Switching to workspace %p:%s", workspace, workspace->name);
swayc_t *next = sway_seat_get_focus_inactive(seat, workspace); struct sway_container *next = sway_seat_get_focus_inactive(seat, workspace);
if (next == NULL) { if (next == NULL) {
next = workspace; next = workspace;
} }
sway_seat_set_focus(seat, next); sway_seat_set_focus(seat, next);
swayc_t *output = swayc_parent_by_type(workspace, C_OUTPUT); struct sway_container *output = sway_container_parent(workspace, C_OUTPUT);
arrange_windows(output, -1, -1); arrange_windows(output, -1, -1);
return true; return true;
} }

View file

@ -352,7 +352,7 @@ void ipc_bar_init(struct bar *bar, const char *bar_id) {
} }
// add bar to the output // add bar to the output
struct output *bar_output = new_output(name); struct output *bar_output = sway_container_output_create(name);
bar_output->idx = i; bar_output->idx = i;
list_add(bar->outputs, bar_output); list_add(bar->outputs, bar_output);
} }