aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/commands.c17
-rw-r--r--sway/config.c1
-rw-r--r--sway/layout.c20
3 files changed, 36 insertions, 2 deletions
diff --git a/sway/commands.c b/sway/commands.c
index 19b8e1a9..2cfda07c 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -761,7 +761,8 @@ static struct cmd_results *cmd_gaps(int argc, char **argv) {
return error;
}
const char* expected_syntax =
- "Expected 'gaps <inner|outer> <current|all|workspace> <set|plus|minus n>'";
+ "Expected 'gaps edge_gaps <on|off|toggle>' or "
+ "'gaps <inner|outer> <current|all|workspace> <set|plus|minus n>'";
const char *amount_str = argv[0];
// gaps amount
if (argc >= 1 && isdigit(*amount_str)) {
@@ -789,6 +790,20 @@ static struct cmd_results *cmd_gaps(int argc, char **argv) {
}
arrange_windows(&root_container, -1, -1);
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
+ } else if (argc == 2 && strcasecmp(argv[0], "edge_gaps") == 0) {
+ // gaps edge_gaps <on|off|toggle>
+ if (strcasecmp(argv[1], "toggle") == 0) {
+ if (config->reading) {
+ return cmd_results_new(CMD_FAILURE, "gaps edge_gaps toggle",
+ "Can't be used in config file.");
+ }
+ config->edge_gaps = !config->edge_gaps;
+ } else {
+ config->edge_gaps =
+ (strcasecmp(argv[1], "yes") == 0 || strcasecmp(argv[1], "on") == 0);
+ }
+ arrange_windows(&root_container, -1, -1);
+ return cmd_results_new(CMD_SUCCESS, NULL, NULL);
}
// gaps inner|outer current|all set|plus|minus n
if (argc < 4 || config->reading) {
diff --git a/sway/config.c b/sway/config.c
index 7e0b22f9..20e4919d 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -105,6 +105,7 @@ static void config_defaults(struct sway_config *config) {
config->seamless_mouse = true;
config->reading = false;
+ config->edge_gaps = false;
config->gaps_inner = 0;
config->gaps_outer = 0;
}
diff --git a/sway/layout.c b/sway/layout.c
index c6a05107..3bc297a6 100644
--- a/sway/layout.c
+++ b/sway/layout.c
@@ -367,9 +367,27 @@ void update_geometry(swayc_t *container) {
if (op->focused == ws) {
wlc_view_bring_to_front(container->handle);
}
+ } else if (!config->edge_gaps && gap > 0) {
+ // Remove gap against the workspace edges. Because a pixel is not
+ // divisable, depending on gap size and the number of siblings our view
+ // might be at the workspace edge without being exactly so (thus test
+ // with gap, and align correctly).
+ if (container->x - gap <= ws->x) {
+ geometry.origin.x = ws->x;
+ geometry.size.w = container->width - gap/2;
+ }
+ if (container->y - gap <= ws->y) {
+ geometry.origin.y = ws->y;
+ geometry.size.h = container->height - gap/2;
+ }
+ if (container->x + container->width + gap >= ws->x + ws->width) {
+ geometry.size.w = ws->width - geometry.origin.x;
+ }
+ if (container->y + container->height + gap >= ws->y + ws->height) {
+ geometry.size.h = ws->height - geometry.origin.y;
+ }
}
wlc_view_set_geometry(container->handle, 0, &geometry);
- return;
}
static void arrange_windows_r(swayc_t *container, double width, double height) {