aboutsummaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar Tarmack <git@tarmack.eu>2018-10-11 21:51:11 +0200
committerLibravatar Tarmack <git@tarmack.eu>2018-10-13 17:42:49 +0200
commit36d9037f2c419756b00d1fe2dbeefca278bc2799 (patch)
treed2300c007bbd28a68fc83d1d36faf459c971186c /sway
parentMerge pull request #2825 from RyanDwyer/fractional-scale-pixel-leaks (diff)
downloadsway-36d9037f2c419756b00d1fe2dbeefca278bc2799.tar.gz
sway-36d9037f2c419756b00d1fe2dbeefca278bc2799.tar.zst
sway-36d9037f2c419756b00d1fe2dbeefca278bc2799.zip
fix_edge_gaps: Allow negative values for outer gaps.
While allowing negative values for the outer gaps it is still prevented that negative values move windows out of the container. This replaces the non-i3 option for edge_gaps.
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/gaps.c50
-rw-r--r--sway/commands/workspace.c16
-rw-r--r--sway/config.c1
-rw-r--r--sway/sway.5.scd8
-rw-r--r--sway/tree/workspace.c7
5 files changed, 30 insertions, 52 deletions
diff --git a/sway/commands/gaps.c b/sway/commands/gaps.c
index 2e0876a9..042b415f 100644
--- a/sway/commands/gaps.c
+++ b/sway/commands/gaps.c
@@ -20,31 +20,6 @@ struct gaps_data {
20 int amount; 20 int amount;
21}; 21};
22 22
23// gaps edge_gaps on|off|toggle
24static struct cmd_results *gaps_edge_gaps(int argc, char **argv) {
25 struct cmd_results *error;
26 if ((error = checkarg(argc, "gaps", EXPECTED_AT_LEAST, 2))) {
27 return error;
28 }
29
30 if (strcmp(argv[1], "on") == 0) {
31 config->edge_gaps = true;
32 } else if (strcmp(argv[1], "off") == 0) {
33 config->edge_gaps = false;
34 } else if (strcmp(argv[1], "toggle") == 0) {
35 if (!config->active) {
36 return cmd_results_new(CMD_INVALID, "gaps",
37 "Cannot toggle gaps while not running.");
38 }
39 config->edge_gaps = !config->edge_gaps;
40 } else {
41 return cmd_results_new(CMD_INVALID, "gaps",
42 "gaps edge_gaps on|off|toggle");
43 }
44 arrange_root();
45 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
46}
47
48// gaps inner|outer <px> 23// gaps inner|outer <px>
49static struct cmd_results *gaps_set_defaults(int argc, char **argv) { 24static struct cmd_results *gaps_set_defaults(int argc, char **argv) {
50 struct cmd_results *error = checkarg(argc, "gaps", EXPECTED_EQUAL_TO, 2); 25 struct cmd_results *error = checkarg(argc, "gaps", EXPECTED_EQUAL_TO, 2);
@@ -68,15 +43,17 @@ static struct cmd_results *gaps_set_defaults(int argc, char **argv) {
68 return cmd_results_new(CMD_INVALID, "gaps", 43 return cmd_results_new(CMD_INVALID, "gaps",
69 "Expected 'gaps inner|outer <px>'"); 44 "Expected 'gaps inner|outer <px>'");
70 } 45 }
71 if (amount < 0) {
72 amount = 0;
73 }
74
75 if (inner) { 46 if (inner) {
76 config->gaps_inner = amount; 47 config->gaps_inner = (amount >= 0) ? amount : 0;
77 } else { 48 } else {
78 config->gaps_outer = amount; 49 config->gaps_outer = amount;
79 } 50 }
51
52 // Prevent negative outer gaps from moving windows out of the workspace.
53 if (config->gaps_outer < -config->gaps_inner) {
54 config->gaps_outer = -config->gaps_inner;
55 }
56
80 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 57 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
81} 58}
82 59
@@ -95,8 +72,12 @@ static void configure_gaps(struct sway_workspace *ws, void *_data) {
95 *prop -= data->amount; 72 *prop -= data->amount;
96 break; 73 break;
97 } 74 }
98 if (*prop < 0) { 75 // Prevent invalid gaps configurations.
99 *prop = 0; 76 if (ws->gaps_inner < 0) {
77 ws->gaps_inner = 0;
78 }
79 if (ws->gaps_outer < -ws->gaps_inner) {
80 ws->gaps_outer = -ws->gaps_inner;
100 } 81 }
101 arrange_workspace(ws); 82 arrange_workspace(ws);
102} 83}
@@ -156,7 +137,6 @@ static struct cmd_results *gaps_set_runtime(int argc, char **argv) {
156 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 137 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
157} 138}
158 139
159// gaps edge_gaps on|off|toggle
160// gaps inner|outer <px> - sets defaults for workspaces 140// gaps inner|outer <px> - sets defaults for workspaces
161// gaps inner|outer current|all set|plus|minus <px> - runtime only 141// gaps inner|outer current|all set|plus|minus <px> - runtime only
162struct cmd_results *cmd_gaps(int argc, char **argv) { 142struct cmd_results *cmd_gaps(int argc, char **argv) {
@@ -165,10 +145,6 @@ struct cmd_results *cmd_gaps(int argc, char **argv) {
165 return error; 145 return error;
166 } 146 }
167 147
168 if (strcmp(argv[0], "edge_gaps") == 0) {
169 return gaps_edge_gaps(argc, argv);
170 }
171
172 if (argc == 2) { 148 if (argc == 2) {
173 return gaps_set_defaults(argc, argv); 149 return gaps_set_defaults(argc, argv);
174 } 150 }
diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c
index 63f29641..61aa443d 100644
--- a/sway/commands/workspace.c
+++ b/sway/commands/workspace.c
@@ -1,5 +1,6 @@
1#define _XOPEN_SOURCE 500 1#define _XOPEN_SOURCE 500
2#include <ctype.h> 2#include <ctype.h>
3#include <limits.h>
3#include <string.h> 4#include <string.h>
4#include <strings.h> 5#include <strings.h>
5#include "sway/commands.h" 6#include "sway/commands.h"
@@ -20,8 +21,8 @@ static struct workspace_config *workspace_config_find_or_create(char *ws_name) {
20 return NULL; 21 return NULL;
21 } 22 }
22 wsc->workspace = strdup(ws_name); 23 wsc->workspace = strdup(ws_name);
23 wsc->gaps_inner = -1; 24 wsc->gaps_inner = INT_MIN;
24 wsc->gaps_outer = -1; 25 wsc->gaps_outer = INT_MIN;
25 list_add(config->workspace_configs, wsc); 26 list_add(config->workspace_configs, wsc);
26 return wsc; 27 return wsc;
27} 28}
@@ -94,7 +95,16 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
94 return cmd_results_new(CMD_FAILURE, "workspace gaps", 95 return cmd_results_new(CMD_FAILURE, "workspace gaps",
95 "Expected 'workspace <ws> gaps inner|outer <px>'"); 96 "Expected 'workspace <ws> gaps inner|outer <px>'");
96 } 97 }
97 *prop = val >= 0 ? val : 0; 98 *prop = val;
99
100 // Prevent invalid gaps configurations.
101 if (wsc->gaps_inner < 0) {
102 wsc->gaps_inner = 0;
103 }
104 if (wsc->gaps_outer < -wsc->gaps_inner) {
105 wsc->gaps_outer = -wsc->gaps_inner;
106 }
107
98 } else { 108 } else {
99 if (config->reading || !config->active) { 109 if (config->reading || !config->active) {
100 return cmd_results_new(CMD_DEFER, "workspace", NULL); 110 return cmd_results_new(CMD_DEFER, "workspace", NULL);
diff --git a/sway/config.c b/sway/config.c
index f239ba1d..89b89464 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -234,7 +234,6 @@ static void config_defaults(struct sway_config *config) {
234 config->show_marks = true; 234 config->show_marks = true;
235 config->tiling_drag = true; 235 config->tiling_drag = true;
236 236
237 config->edge_gaps = true;
238 config->smart_gaps = false; 237 config->smart_gaps = false;
239 config->gaps_inner = 0; 238 config->gaps_inner = 0;
240 config->gaps_outer = 0; 239 config->gaps_outer = 0;
diff --git a/sway/sway.5.scd b/sway/sway.5.scd
index f7b778cf..2e1d13a8 100644
--- a/sway/sway.5.scd
+++ b/sway/sway.5.scd
@@ -420,15 +420,11 @@ The default colors are:
420 _focus\_wrapping force_. This is only available for convenience. Please 420 _focus\_wrapping force_. This is only available for convenience. Please
421 use _focus\_wrapping_ instead when possible. 421 use _focus\_wrapping_ instead when possible.
422 422
423*gaps* edge\_gaps on|off|toggle
424 When _on_, gaps will be added between windows and workspace edges if the
425 inner gap is nonzero. When _off_, gaps will only be added between views.
426 _toggle_ cannot be used in the configuration file.
427
428*gaps* inner|outer <amount> 423*gaps* inner|outer <amount>
429 Sets default _amount_ pixels of _inner_ or _outer_ gap, where the inner 424 Sets default _amount_ pixels of _inner_ or _outer_ gap, where the inner
430 affects spacing around each view and outer affects the spacing around each 425 affects spacing around each view and outer affects the spacing around each
431 workspace. Outer gaps are in addition to inner gaps. 426 workspace. Outer gaps are in addition to inner gaps. To reduce or remove
427 outer gaps, outer gaps can be set to a negative value.
432 428
433 This affects new workspaces only, and is used when the workspace doesn't 429 This affects new workspaces only, and is used when the workspace doesn't
434 have its own gaps settings (see: workspace <ws> gaps inner|outer <amount>). 430 have its own gaps settings (see: workspace <ws> gaps inner|outer <amount>).
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index d7650560..a1282c1e 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -73,10 +73,10 @@ struct sway_workspace *workspace_create(struct sway_output *output,
73 if (name) { 73 if (name) {
74 struct workspace_config *wsc = workspace_find_config(name); 74 struct workspace_config *wsc = workspace_find_config(name);
75 if (wsc) { 75 if (wsc) {
76 if (wsc->gaps_outer != -1) { 76 if (wsc->gaps_outer != INT_MIN) {
77 ws->gaps_outer = wsc->gaps_outer; 77 ws->gaps_outer = wsc->gaps_outer;
78 } 78 }
79 if (wsc->gaps_inner != -1) { 79 if (wsc->gaps_inner != INT_MIN) {
80 ws->gaps_inner = wsc->gaps_inner; 80 ws->gaps_inner = wsc->gaps_inner;
81 } 81 }
82 } 82 }
@@ -618,9 +618,6 @@ void workspace_add_gaps(struct sway_workspace *ws) {
618 if (ws->current_gaps > 0) { 618 if (ws->current_gaps > 0) {
619 return; 619 return;
620 } 620 }
621 if (!config->edge_gaps) {
622 return;
623 }
624 if (config->smart_gaps) { 621 if (config->smart_gaps) {
625 struct sway_seat *seat = input_manager_get_default_seat(input_manager); 622 struct sway_seat *seat = input_manager_get_default_seat(input_manager);
626 struct sway_container *focus = 623 struct sway_container *focus =