summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeder Stray <peder.stray@gmail.com>2021-12-02 14:54:11 +0100
committerPeder Stray <peder.stray@gmail.com>2021-12-11 14:20:07 +0100
commit813336e06811186bc0636fc2e79155cea2641781 (patch)
tree22816161af89f39745f2ed714b03390b37387190
parent729452448b5fe5aa63c31e2ca7fefc86c73b553b (diff)
downloadi3-813336e06811186bc0636fc2e79155cea2641781.tar.gz
i3-813336e06811186bc0636fc2e79155cea2641781.zip
Implement title_window_icon toggle
A feature described in i3/i3#4709
-rw-r--r--docs/userguide4
-rw-r--r--include/commands.h2
-rw-r--r--parser-specs/commands.spec2
-rw-r--r--release-notes/changes/4-title_window_icon-toggle1
-rw-r--r--src/commands.c30
-rwxr-xr-x[-rw-r--r--]testcases/t/314-window-icon-padding.t30
6 files changed, 61 insertions, 8 deletions
diff --git a/docs/userguide b/docs/userguide
index d43361b6..8026d87e 100644
--- a/docs/userguide
+++ b/docs/userguide
@@ -2728,8 +2728,8 @@ specific windows or for all windows (using the <<for_window>> directive).
*Syntax*:
-----------------------------
-title_window_icon <yes|no>
-title_window_icon padding <px>
+title_window_icon <yes|no|toggle>
+title_window_icon <padding|toggle> <px>
------------------------------
*Examples*:
diff --git a/include/commands.h b/include/commands.h
index c27cba4a..d0f0140b 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -333,7 +333,7 @@ void cmd_shmlog(I3_CMD, const char *argument);
void cmd_debuglog(I3_CMD, const char *argument);
/**
- * Implementation of 'title_window_icon <yes|no>' and 'title_window_icon padding <px>'
+ * Implementation of 'title_window_icon <yes|no|toggle>' and 'title_window_icon <padding|toggle> <px>'
*
*/
void cmd_title_window_icon(I3_CMD, const char *enable, int padding);
diff --git a/parser-specs/commands.spec b/parser-specs/commands.spec
index 6efaa855..486f20dd 100644
--- a/parser-specs/commands.spec
+++ b/parser-specs/commands.spec
@@ -468,6 +468,8 @@ state TITLE_FORMAT:
state TITLE_WINDOW_ICON:
'padding'
-> TITLE_WINDOW_ICON_PADDING
+ enable = 'toggle'
+ -> TITLE_WINDOW_ICON_PADDING
enable = '1', 'yes', 'true', 'on', 'enable', 'active', '0', 'no', 'false', 'off', 'disable', 'inactive'
-> call cmd_title_window_icon($enable, 0)
diff --git a/release-notes/changes/4-title_window_icon-toggle b/release-notes/changes/4-title_window_icon-toggle
new file mode 100644
index 00000000..f15e7a4a
--- /dev/null
+++ b/release-notes/changes/4-title_window_icon-toggle
@@ -0,0 +1 @@
+Add title_window_icon toggle
diff --git a/src/commands.c b/src/commands.c
index a4af1a39..27853bd0 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -2064,20 +2064,40 @@ void cmd_title_format(I3_CMD, const char *format) {
}
/*
- * Implementation of 'title_window_icon <yes|no>' and 'title_window_icon padding <px>'
+ * Implementation of 'title_window_icon <yes|no|toggle>' and 'title_window_icon padding <px>'
*
*/
void cmd_title_window_icon(I3_CMD, const char *enable, int padding) {
- if (enable != NULL && !boolstr(enable)) {
- padding = -1;
+ bool is_toggle = false;
+ if (enable != NULL) {
+ if (strcmp(enable, "toggle") == 0) {
+ is_toggle = true;
+ } else if (!boolstr(enable)) {
+ padding = -1;
+ }
}
DLOG("setting window_icon=%d\n", padding);
HANDLE_EMPTY_MATCH;
owindow *current;
TAILQ_FOREACH (current, &owindows, owindows) {
- DLOG("setting window_icon for %p / %s\n", current->con, current->con->name);
- current->con->window_icon_padding = padding;
+ if (is_toggle) {
+ const int current_padding = current->con->window_icon_padding;
+ if (padding > 0) {
+ if (current_padding < 0) {
+ current->con->window_icon_padding = padding;
+ } else {
+ /* toggle off, but store padding given */
+ current->con->window_icon_padding = -(padding + 1);
+ }
+ } else {
+ /* Set to negative of (current value+1) to keep old padding when toggling */
+ current->con->window_icon_padding = -(current_padding + 1);
+ }
+ } else {
+ current->con->window_icon_padding = padding;
+ }
+ DLOG("Set window_icon for %p / %s to %d\n", current->con, current->con->name, current->con->window_icon_padding);
if (current->con->window != NULL) {
/* Make sure the window title is redrawn immediately. */
diff --git a/testcases/t/314-window-icon-padding.t b/testcases/t/314-window-icon-padding.t
index 5320ab9f..71cf5bd5 100644..100755
--- a/testcases/t/314-window-icon-padding.t
+++ b/testcases/t/314-window-icon-padding.t
@@ -38,6 +38,36 @@ is(window_icon_padding($tmp), -1, 'window_icon_padding defaults to -1');
cmd 'title_window_icon on';
isnt(window_icon_padding($tmp), -1, 'window_icon_padding no longer -1');
+cmd 'title_window_icon toggle';
+is(window_icon_padding($tmp), -1, 'window_icon_padding back to -1');
+
+cmd 'title_window_icon toggle';
+isnt(window_icon_padding($tmp), -1, 'window_icon_padding no longer -1 again');
+
+cmd 'title_window_icon off';
+is(window_icon_padding($tmp), -1, 'window_icon_padding back to -1');
+
+cmd 'title_window_icon padding 3px';
+is(window_icon_padding($tmp), 3, 'window_icon_padding set to 3');
+
+cmd 'title_window_icon toggle';
+ok(window_icon_padding($tmp) < 0, 'window_icon_padding toggled off');
+
+cmd 'title_window_icon toggle';
+is(window_icon_padding($tmp), 3, 'window_icon_padding toggled back to 3');
+
+cmd 'title_window_icon toggle 5px';
+ok(window_icon_padding($tmp) < 0, 'window_icon_padding toggled off');
+
+cmd 'title_window_icon toggle 5px';
+is(window_icon_padding($tmp), 5, 'window_icon_padding toggled on to 5px');
+
+cmd 'title_window_icon toggle 5px';
+ok(window_icon_padding($tmp) < 0, 'window_icon_padding toggled off');
+
+cmd 'title_window_icon toggle 4px';
+is(window_icon_padding($tmp), 4, 'window_icon_padding toggled on to 4px');
+
exit_gracefully($pid);
################################################################################