*Example*:
------------------------------------------------------------------------
-# Press $mod+o followed by either f, t, Esc or Return to launch firefox,
+# Press $mod+o followed by either f, t, Escape or Return to launch firefox,
# thunderbird or return to the default mode, respectively.
set $mode_launcher Launch: [f]irefox [t]hunderbird
bindsym $mod+o mode "$mode_launcher"
bindsym f exec firefox
bindsym t exec thunderbird
- bindsym Esc mode "default"
+ bindsym Escape mode "default"
bindsym Return mode "default"
}
------------------------------------------------------------------------
=== Focus follows mouse
-By default, window focus follows your mouse movements. However, if you have a
-setup where your mouse usually is in your way (like a touchpad on your laptop
-which you do not want to disable completely), you might want to disable 'focus
-follows mouse' and control focus only by using your keyboard. The mouse will
-still be useful inside the currently active window (for example to click on
-links in your browser window).
+By default, window focus follows your mouse movements as the mouse crosses
+window borders. However, if you have a setup where your mouse usually is in your
+way (like a touchpad on your laptop which you do not want to disable
+completely), you might want to disable 'focus follows mouse' and control focus
+only by using your keyboard. The mouse will still be useful inside the
+currently active window (for example to click on links in your browser window).
*Syntax*:
--------------------------
contains a single window. Otherwise it makes the current window a split
container with opposite orientation compared to the parent container.
Use +layout toggle split+ to change the layout of any split container from
- splitv to splith or vice-versa.
+ splitv to splith or vice-versa. You can also define a custom sequence of layouts
+ to cycle through with +layout toggle+, see <<manipulating_layout>>.
*Syntax*:
--------------------------------
or +layout splith+ to change the current container layout to splith/splitv,
stacking, tabbed layout, splitv or splith, respectively.
+ Specify up to four layouts after +layout toggle+ to cycle through them. Every
+ time the command is executed, the layout specified after the currently active
+ one will be applied. If the currently active layout is not in the list, the
+ first layout in the list will be activated.
+
To make the current window (!) fullscreen, use +fullscreen enable+ (or
+fullscreen enable global+ for the global mode), to leave either fullscreen
mode use +fullscreen disable+, and to toggle between these two states use
--------------------------------------------
layout default|tabbed|stacking|splitv|splith
layout toggle [split|all]
+ layout toggle [split|tabbed|stacking|splitv|splith] [split|tabbed|stacking|splitv|splith]…
--------------------------------------------
*Examples*:
# Toggle between stacking/tabbed/splith/splitv:
bindsym $mod+x layout toggle all
+ # Toggle between stacking/tabbed/splith:
+ bindsym $mod+x layout toggle stacking tabbed splith
+
+ # Toggle between splitv/tabbed
+ bindsym $mod+x layout toggle splitv tabbed
+
+ # Toggle between last split layout/tabbed/stacking
+ bindsym $mod+x layout toggle split tabbed stacking
+
# Toggle fullscreen
bindsym $mod+f fullscreen toggle
bindsym $mod+r exec i3-input -F 'rename workspace to "%s"' -P 'New name: '
--------------------------------------------------------------------------
+If you want to rename workspaces on demand while keeping the navigation stable,
+you can use a setup like this:
+
+*Example*:
+-------------------------
+bindsym $mod+1 workspace number "1: www"
+bindsym $mod+2 workspace number "2: mail"
+...
+-------------------------
+
+If a workspace does not exist, the command +workspace number "1: mail"+ will
+create workspace "1: mail".
+
+If a workspace with number 1 does already exist, the command will switch to this
+workspace and ignore the text part. So even when the workspace has been renamed
+to "1: web", the above command will still switch to it.
+
=== Moving workspaces to a different screen
See <<move_to_outputs>> for how to move a container/workspace to a different
void cmd_layout(I3_CMD, const char *layout_str) {
HANDLE_EMPTY_MATCH;
- if (strcmp(layout_str, "stacking") == 0)
- layout_str = "stacked";
layout_t layout;
- /* default is a special case which will be handled in con_set_layout(). */
- if (strcmp(layout_str, "default") == 0)
- layout = L_DEFAULT;
- else if (strcmp(layout_str, "stacked") == 0)
- layout = L_STACKED;
- else if (strcmp(layout_str, "tabbed") == 0)
- layout = L_TABBED;
- else if (strcmp(layout_str, "splitv") == 0)
- layout = L_SPLITV;
- else if (strcmp(layout_str, "splith") == 0)
- layout = L_SPLITH;
- else {
+ if (!layout_from_name(layout_str, &layout)) {
ELOG("Unknown layout \"%s\", this is a mismatch between code and parser spec.\n", layout_str);
return;
}
#ifdef I3_ASAN_ENABLED
__lsan_do_leak_check();
#endif
- ipc_shutdown();
+ ipc_shutdown(SHUTDOWN_REASON_EXIT);
unlink(config.ipc_socket_path);
xcb_disconnect(conn);
exit(0);
*/
void cmd_restart(I3_CMD) {
LOG("restarting i3\n");
- ipc_shutdown();
+ ipc_shutdown(SHUTDOWN_REASON_RESTART);
unlink(config.ipc_socket_path);
/* We need to call this manually since atexit handlers don’t get called
* when exec()ing */
return true;
}
+ /*
+ * Set 'out' to the layout_t value for the given layout. The function
+ * returns true on success or false if the passed string is not a valid
+ * layout name.
+ *
+ */
+ bool layout_from_name(const char *layout_str, layout_t *out) {
+ if (strcmp(layout_str, "default") == 0) {
+ *out = L_DEFAULT;
+ return true;
+ } else if (strcasecmp(layout_str, "stacked") == 0 ||
+ strcasecmp(layout_str, "stacking") == 0) {
+ *out = L_STACKED;
+ return true;
+ } else if (strcasecmp(layout_str, "tabbed") == 0) {
+ *out = L_TABBED;
+ return true;
+ } else if (strcasecmp(layout_str, "splitv") == 0) {
+ *out = L_SPLITV;
+ return true;
+ } else if (strcasecmp(layout_str, "splith") == 0) {
+ *out = L_SPLITH;
+ return true;
+ }
+
+ return false;
+ }
+
/*
* Parses the workspace name as a number. Returns -1 if the workspace should be
* interpreted as a "named workspace".
restore_geometry();
- ipc_shutdown();
+ ipc_shutdown(SHUTDOWN_REASON_RESTART);
LOG("restarting \"%s\"...\n", start_argv[0]);
/* make sure -a is in the argument list or add it */