+/*
+ * 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);
+ }
+
+ /* A window we made sticky might not be on a visible workspace right now, so we need to make
+ * sure it gets pushed to the front now. */
+ output_push_sticky_windows(focused);
+
+ cmd_output->needs_tree_render = true;
+ ysuccess(true);
+}
+