-left := <h> | <cursor-left>
-right := <l> | <cursor-right>
-up := <j> | <cursor-up>
-down := <k> | <cursor-down>
-
-where := <left|right|up|down> | <tag>
-move := <m>
-snap := <s>
-
-Eingabe ist entweder
-
-cmd := [ <times> ] [ <move> | <snap> ] <where>
-
-oder
+---------------------
+- Command mode
+---------------------
-with := <w> { [ <times> ] <where> }+ <space> <cmd>
+This is the grammar for the command mode (your configuration file uses these commands, too).
-oder
-
-jump := [ "<window class>[/<window title>]" | <workspace> [ <column> <row> ] ]
-
-oder
+left := <h> | <cursor-left>
+right := <l> | <cursor-right>
+up := <j> | <cursor-up>
+down := <k> | <cursor-down>
+where := <left|right|up|down> | <tag>
+move := <m>
+snap := <s>
+
+cmd := [ <times> ] [ <move> | <snap> ] <where>
+with := <w> { [ <times> ] <where> }+ <space> <cmd>
+jump := [ "<window class>[/<window title>]" | <workspace> [ <column> <row> ] ]
+focus := focus [ <times> ]
+(travels the focus stack backwards the given amount of times (by default 1), so
+ it selects the window which had the focus before you focused the current one when
+ specifying "focus 1")
special := [ exec <path> | kill | exit | restart ]
-an jeder Stelle kann mit escape abgebrochen werden
+input := [ <cmd> | <with> | <jump> | <focus> | <special> ]
+
+you can cancel command mode by pressing escape anytime.
-Beispiele:
+Some examples:
-Fenster links neben dem aktuellen auswählen:
+Select the window on the left:
h
-Fenster zwei links neben dem aktuellen auswählen:
+Select the window two places on the left:
2h
-Fenster nach rechts verschieben:
+Move window to the right:
ml
-Fenster und Fenster untendrunter nach rechts verschieben:
+Move window and window on the bottom to the right:
wk ml
CIRCLEQ_FOREACH(client, &(con->clients), clients) {
LOG("Checking client with class=%s, name=%s\n", client->window_class, client->name);
- if (client_matches_class_name(client, to_class, to_title, to_title_ucs, to_title_ucs_len)) {
- set_focus(conn, client);
- goto done;
- }
+ if (!client_matches_class_name(client, to_class, to_title, to_title_ucs, to_title_ucs_len))
+ continue;
+
+ set_focus(conn, client, true);
+ goto done;
}
}
}
LOG("Jumping to col %d, row %d\n", col, row);
if (c_ws->table[col][row]->currently_focused != NULL)
- set_focus(conn, c_ws->table[col][row]->currently_focused);
+ set_focus(conn, c_ws->table[col][row]->currently_focused, true);
+}
+
+/*
+ * Travels the focus stack by the given number of times (or once, if no argument
+ * was specified). That is, selects the window you were in before you focused
+ * the current window.
+ *
+ */
+static void travel_focus_stack(xcb_connection_t *conn, const char *arguments) {
+ /* Start count at -1 to always skip the first element */
+ int times, count = -1;
+ Client *current;
+
+ if (sscanf(arguments, "%u", ×) != 1) {
+ LOG("No or invalid argument given (\"%s\"), using default of 1 times\n", arguments);
+ times = 1;
+ }
+
+ Workspace *ws = CUR_CELL->workspace;
+
+ SLIST_FOREACH(current, &(ws->focus_stack), focus_clients) {
+ if (++count < times) {
+ LOG("Skipping\n");
+ continue;
+ }
+
+ LOG("Focussing\n");
+ set_focus(conn, current, true);
+ break;
+ }
}
/*
return;
}
- /* Is it a jump to a specified workspae,row,col? */
+ /* Is it a jump to a specified workspae, row, col? */
if (STARTS_WITH(command, "jump ")) {
const char *arguments = command + strlen("jump ");
if (arguments[0] == '"')
return;
}
+ /* Should we travel the focus stack? */
+ if (STARTS_WITH(command, "focus")) {
+ const char *arguments = command + strlen("focus");
+ travel_focus_stack(conn, arguments);
+ return;
+ }
+
/* Is it 'f' for fullscreen? */
if (command[0] == 'f') {
if (CUR_CELL->currently_focused == NULL)