Add smart_gaps inverse_outer command

Add a subcommand for `smart_gaps` that enables outer gaps only
on workspaces with exactly one visible child.
Also add documentation for `smart_gaps toggle`.
This commit is contained in:
bR3iN 2021-10-28 15:31:23 +02:00 committed by Simon Ser
parent aaf68cf423
commit 9969de9e00
5 changed files with 44 additions and 20 deletions

View file

@ -283,6 +283,12 @@ struct side_gaps {
int left; int left;
}; };
enum smart_gaps_mode {
SMART_GAPS_OFF,
SMART_GAPS_ON,
SMART_GAPS_INVERSE_OUTER,
};
/** /**
* Stores configuration for a workspace, regardless of whether the workspace * Stores configuration for a workspace, regardless of whether the workspace
* exists. * exists.
@ -512,7 +518,7 @@ struct sway_config {
bool tiling_drag; bool tiling_drag;
int tiling_drag_threshold; int tiling_drag_threshold;
bool smart_gaps; enum smart_gaps_mode smart_gaps;
int gaps_inner; int gaps_inner;
struct side_gaps gaps_outer; struct side_gaps gaps_outer;

View file

@ -15,7 +15,12 @@ struct cmd_results *cmd_smart_gaps(int argc, char **argv) {
return error; return error;
} }
config->smart_gaps = parse_boolean(argv[0], config->smart_gaps); if (strcmp(argv[0], "inverse_outer") == 0) {
config->smart_gaps = SMART_GAPS_INVERSE_OUTER;
} else {
config->smart_gaps = parse_boolean(argv[0], config->smart_gaps)
? SMART_GAPS_ON : SMART_GAPS_OFF;
}
arrange_root(); arrange_root();

View file

@ -266,7 +266,7 @@ static void config_defaults(struct sway_config *config) {
config->tiling_drag = true; config->tiling_drag = true;
config->tiling_drag_threshold = 9; config->tiling_drag_threshold = 9;
config->smart_gaps = false; config->smart_gaps = SMART_GAPS_OFF;
config->gaps_inner = 0; config->gaps_inner = 0;
config->gaps_outer.top = 0; config->gaps_outer.top = 0;
config->gaps_outer.right = 0; config->gaps_outer.right = 0;

View file

@ -692,9 +692,10 @@ The default colors are:
borders will only be enabled if the workspace has more than one visible borders will only be enabled if the workspace has more than one visible
child and gaps equal to zero. child and gaps equal to zero.
*smart_gaps* on|off *smart_gaps* on|off|toggle|inverse_outer
If smart_gaps are _on_ gaps will only be enabled if a workspace has more If smart_gaps are _on_ gaps will only be enabled if a workspace has more
than one child. than one child. If smart_gaps are _inverse_outer_ outer gaps will only
be enabled if a workspace has exactly one child.
*mark* --add|--replace [--toggle] <identifier> *mark* --add|--replace [--toggle] <identifier>
Marks are arbitrary labels that can be used to identify certain windows and Marks are arbitrary labels that can be used to identify certain windows and

View file

@ -844,24 +844,36 @@ struct sway_container *workspace_insert_tiling(struct sway_workspace *workspace,
return con; return con;
} }
bool workspace_has_single_visible_container(struct sway_workspace *ws) {
struct sway_seat *seat = input_manager_get_default_seat();
struct sway_container *focus =
seat_get_focus_inactive_tiling(seat, ws);
if (focus && !focus->view) {
focus = seat_get_focus_inactive_view(seat, &focus->node);
}
return (focus && focus->view && view_ancestor_is_only_visible(focus->view));
}
void workspace_add_gaps(struct sway_workspace *ws) { void workspace_add_gaps(struct sway_workspace *ws) {
if (config->smart_gaps) { if (config->smart_gaps == SMART_GAPS_ON
struct sway_seat *seat = input_manager_get_default_seat(); && workspace_has_single_visible_container(ws)) {
struct sway_container *focus = ws->current_gaps.top = 0;
seat_get_focus_inactive_tiling(seat, ws); ws->current_gaps.right = 0;
if (focus && !focus->view) { ws->current_gaps.bottom = 0;
focus = seat_get_focus_inactive_view(seat, &focus->node); ws->current_gaps.left = 0;
} return;
if (focus && focus->view && view_ancestor_is_only_visible(focus->view)) { }
ws->current_gaps.top = 0;
ws->current_gaps.right = 0; if (config->smart_gaps == SMART_GAPS_INVERSE_OUTER
ws->current_gaps.bottom = 0; && !workspace_has_single_visible_container(ws)) {
ws->current_gaps.left = 0; ws->current_gaps.top = 0;
return; ws->current_gaps.right = 0;
} ws->current_gaps.bottom = 0;
ws->current_gaps.left = 0;
} else {
ws->current_gaps = ws->gaps_outer;
} }
ws->current_gaps = ws->gaps_outer;
// Add inner gaps and make sure we don't turn out negative // Add inner gaps and make sure we don't turn out negative
ws->current_gaps.top = fmax(0, ws->current_gaps.top + ws->gaps_inner); ws->current_gaps.top = fmax(0, ws->current_gaps.top + ws->gaps_inner);
ws->current_gaps.right = fmax(0, ws->current_gaps.right + ws->gaps_inner); ws->current_gaps.right = fmax(0, ws->current_gaps.right + ws->gaps_inner);