]> git.sur5r.net Git - i3/i3/commitdiff
Implement new 'sticky' command to manually set, remove or toggle the sticky state...
authorIngo Bürk <ingo.buerk@tngtech.com>
Sat, 22 Aug 2015 21:37:41 +0000 (23:37 +0200)
committerIngo Bürk <ingo.buerk@tngtech.com>
Sun, 13 Sep 2015 18:40:20 +0000 (20:40 +0200)
docs/userguide
include/commands.h
include/ewmh.h
parser-specs/commands.spec
src/commands.c
src/ewmh.c
testcases/t/187-commands-parser.t

index 5e148ff547ef930ca89ad6fb978aa691adcfc18c..d1660c49e2c2fc46ad489843a4970510febeab1b 100644 (file)
@@ -1834,6 +1834,27 @@ bindsym $mod+c move absolute position center
 bindsym $mod+m move position mouse
 -------------------------------------------------------
 
+=== Sticky floating windows
+
+If you want a window to stick to the glass, i.e., have it stay on screen even
+if you switch to another workspace, you can use the +sticky+ command. For
+example, this can be useful for notepads, a media player or a video chat
+window.
+
+Note that while any window can be made sticky through this command, it will
+only take effect if the window is floating.
+
+*Syntax*:
+----------------------------
+sticky enable|disable|toggle
+----------------------------
+
+*Examples*:
+------------------------------------------------------
+# make a terminal sticky that was started as a notepad
+for_window [instance=notepad] sticky enable
+------------------------------------------------------
+
 === Changing (named) workspaces/moving to workspaces
 
 To change to a specific workspace, use the +workspace+ command, followed by the
index b243b9e0f0a8c8f5aeccead872614d64c80a89b4..80b0efb020e91dfe00c278cb1e56116b48b3fb63 100644 (file)
@@ -204,6 +204,12 @@ void cmd_focus(I3_CMD);
  */
 void cmd_fullscreen(I3_CMD, char *action, char *fullscreen_mode);
 
+/**
+ * Implementation of 'sticky enable|disable|toggle'.
+ *
+ */
+void cmd_sticky(I3_CMD, char *action);
+
 /**
  * Implementation of 'move <direction> [<pixels> [px]]'.
  *
index d94b7f3a364d1727416300b4b32e4ad8a64f874d..7ed9b544a7b5321296cbe97d1dc9daa90e974a07 100644 (file)
@@ -68,6 +68,12 @@ void ewmh_update_client_list(xcb_window_t *list, int num_windows);
  */
 void ewmh_update_client_list_stacking(xcb_window_t *stack, int num_windows);
 
+/**
+ * Set or remove _NET_WM_STATE_STICKY on the window.
+ *
+ */
+void ewmh_update_sticky(xcb_window_t window, bool sticky);
+
 /**
  * Set up the EWMH hints on the root window.
  *
index f5fb9884b2513706d4bdd2206976c3989ef19ffd..5e2bfd8f0b0296373c6be9bba040e1f3a469669a 100644 (file)
@@ -29,6 +29,7 @@ state INITIAL:
   'kill' -> KILL
   'open' -> call cmd_open()
   'fullscreen' -> FULLSCREEN
+  'sticky' -> STICKY
   'split' -> SPLIT
   'floating' -> FLOATING
   'mark' -> MARK
@@ -183,6 +184,11 @@ state FULLSCREEN_COMPAT:
   end
       -> call cmd_fullscreen("toggle", "output")
 
+# sticky enable|disable|toggle
+state STICKY:
+  action = 'enable', 'disable', 'toggle'
+      -> call cmd_sticky($action)
+
 # split v|h|vertical|horizontal
 state SPLIT:
   direction = 'horizontal', 'vertical', 'v', 'h'
index 443edf4a66304634e3b3d7b96fcbbd78427417c7..c8164da60e918422565198a94356ab415a9e07d8 100644 (file)
@@ -1569,6 +1569,37 @@ void cmd_fullscreen(I3_CMD, char *action, char *fullscreen_mode) {
     ysuccess(true);
 }
 
+/*
+ * Implementation of 'sticky enable|disable|toggle'.
+ *
+ */
+void cmd_sticky(I3_CMD, char *action) {
+    DLOG("%s sticky on window\n", action);
+    HANDLE_EMPTY_MATCH;
+
+    owindow *current;
+    TAILQ_FOREACH(current, &owindows, owindows) {
+        if (current->con->window == NULL) {
+            ELOG("only containers holding a window can be made sticky, skipping con = %p\n", current->con);
+            continue;
+        }
+        DLOG("setting sticky for container = %p / %s\n", current->con, current->con->name);
+
+        bool sticky = false;
+        if (strcmp(action, "enable") == 0)
+            sticky = true;
+        else if (strcmp(action, "disable") == 0)
+            sticky = false;
+        else if (strcmp(action, "toggle") == 0)
+            sticky = !current->con->sticky;
+
+        current->con->sticky = sticky;
+        ewmh_update_sticky(current->con->window->id, sticky);
+    }
+
+    ysuccess(true);
+}
+
 /*
  * Implementation of 'move <direction> [<pixels> [px]]'.
  *
index 36c6a16080d263569bda9b4daa4c99625a870bea..eb6a6ea60d39af252364885f87f9b0f695ecb9ba 100644 (file)
@@ -213,6 +213,20 @@ void ewmh_update_client_list_stacking(xcb_window_t *stack, int num_windows) {
         stack);
 }
 
+/*
+ * Set or remove _NET_WM_STATE_STICKY on the window.
+ *
+ */
+void ewmh_update_sticky(xcb_window_t window, bool sticky) {
+    uint32_t values[1];
+    unsigned int num = 0;
+
+    if (sticky)
+        values[num++] = A__NET_WM_STATE_STICKY;
+
+    xcb_change_property(conn, XCB_PROP_MODE_REPLACE, window, A__NET_WM_STATE, XCB_ATOM_ATOM, 32, num, values);
+}
+
 /*
  * Set up the EWMH hints on the root window.
  *
index fc7fa882797f861e2d4ddefd1f6ad133fb1ae5cc..8aff1f6dea0a5a759fec52b24b3b98205eeef4ce 100644 (file)
@@ -144,7 +144,7 @@ is(parser_calls("\nworkspace test"),
 ################################################################################
 
 is(parser_calls('unknown_literal'),
-   "ERROR: Expected one of these tokens: <end>, '[', 'move', 'exec', 'exit', 'restart', 'reload', 'shmlog', 'debuglog', 'border', 'layout', 'append_layout', 'workspace', 'focus', 'kill', 'open', 'fullscreen', 'split', 'floating', 'mark', 'unmark', 'resize', 'rename', 'nop', 'scratchpad', 'title_format', 'mode', 'bar'\n" .
+   "ERROR: Expected one of these tokens: <end>, '[', 'move', 'exec', 'exit', 'restart', 'reload', 'shmlog', 'debuglog', 'border', 'layout', 'append_layout', 'workspace', 'focus', 'kill', 'open', 'fullscreen', 'sticky', 'split', 'floating', 'mark', 'unmark', 'resize', 'rename', 'nop', 'scratchpad', 'title_format', 'mode', 'bar'\n" .
    "ERROR: Your command: unknown_literal\n" .
    "ERROR:               ^^^^^^^^^^^^^^^",
    'error for unknown literal ok');