diff --git a/src/cmdparse.l b/src/cmdparse.l index 55b1d28f..0102d145 100644 --- a/src/cmdparse.l +++ b/src/cmdparse.l @@ -95,6 +95,7 @@ none { return TOK_NONE; } mode { return TOK_MODE; } tiling { return TOK_TILING; } floating { return TOK_FLOATING; } +toggle { return TOK_TOGGLE; } workspace { BEGIN(WANT_WS_STRING); return TOK_WORKSPACE; } focus { return TOK_FOCUS; } move { return TOK_MOVE; } diff --git a/src/cmdparse.y b/src/cmdparse.y index 31d7535b..cc710a49 100644 --- a/src/cmdparse.y +++ b/src/cmdparse.y @@ -109,6 +109,7 @@ void parse_cmd(const char *new) { %token TOK_TILING "tiling" %token TOK_FLOATING "floating" %token TOK_WORKSPACE "workspace" +%token TOK_TOGGLE "toggle" %token TOK_FOCUS "focus" %token TOK_MOVE "move" %token TOK_OPEN "open" @@ -398,14 +399,20 @@ direction: mode: TOK_MODE WHITESPACE window_mode { - printf("should switch mode to %s\n", ($3 == TOK_FLOATING ? "floating" : "tiling")); - /* TODO: actually switch mode (not toggle) */ + if ($3 == TOK_TOGGLE) { + printf("should toggle mode\n"); + toggle_floating_mode(focused, false); + } else { + printf("should switch mode to %s\n", ($3 == TOK_FLOATING ? "floating" : "tiling")); + /* TODO: actually switch mode (not toggle) */ + } } ; window_mode: TOK_FLOATING { $$ = TOK_FLOATING; } | TOK_TILING { $$ = TOK_TILING; } + | TOK_TOGGLE { $$ = TOK_TOGGLE; } ; level: diff --git a/src/floating.c b/src/floating.c index 2afe1b82..416873e5 100644 --- a/src/floating.c +++ b/src/floating.c @@ -37,6 +37,7 @@ void toggle_floating_mode(Con *con, bool automatic) { /* 2: kill parent container */ TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows); + TAILQ_REMOVE(&(con->parent->parent->focus_head), con->parent, focused); tree_close(con->parent, false); /* 3: re-attach to previous parent */ @@ -44,6 +45,8 @@ void toggle_floating_mode(Con *con, bool automatic) { TAILQ_INSERT_TAIL(&(con->parent->nodes_head), con, nodes); TAILQ_INSERT_TAIL(&(con->parent->focus_head), con, focused); + con->floating = FLOATING_USER_OFF; + return; } @@ -72,6 +75,7 @@ void toggle_floating_mode(Con *con, bool automatic) { nc->orientation = NO_ORIENTATION; nc->type = CT_FLOATING_CON; TAILQ_INSERT_TAIL(&(nc->parent->floating_head), nc, floating_windows); + TAILQ_INSERT_TAIL(&(nc->parent->focus_head), nc, focused); /* 3: attach the child to the new parent container */ con->old_parent = con->parent;