Implement mode toggle

This commit is contained in:
Michael Stapelberg 2010-05-31 22:48:28 +02:00
parent e67c712f31
commit 71e0e49c0e
3 changed files with 14 additions and 2 deletions

View File

@ -95,6 +95,7 @@ none { return TOK_NONE; }
mode { return TOK_MODE; } mode { return TOK_MODE; }
tiling { return TOK_TILING; } tiling { return TOK_TILING; }
floating { return TOK_FLOATING; } floating { return TOK_FLOATING; }
toggle { return TOK_TOGGLE; }
workspace { BEGIN(WANT_WS_STRING); return TOK_WORKSPACE; } workspace { BEGIN(WANT_WS_STRING); return TOK_WORKSPACE; }
focus { return TOK_FOCUS; } focus { return TOK_FOCUS; }
move { return TOK_MOVE; } move { return TOK_MOVE; }

View File

@ -109,6 +109,7 @@ void parse_cmd(const char *new) {
%token TOK_TILING "tiling" %token TOK_TILING "tiling"
%token TOK_FLOATING "floating" %token TOK_FLOATING "floating"
%token TOK_WORKSPACE "workspace" %token TOK_WORKSPACE "workspace"
%token TOK_TOGGLE "toggle"
%token TOK_FOCUS "focus" %token TOK_FOCUS "focus"
%token TOK_MOVE "move" %token TOK_MOVE "move"
%token TOK_OPEN "open" %token TOK_OPEN "open"
@ -398,14 +399,20 @@ direction:
mode: mode:
TOK_MODE WHITESPACE window_mode TOK_MODE WHITESPACE window_mode
{ {
printf("should switch mode to %s\n", ($<number>3 == TOK_FLOATING ? "floating" : "tiling")); if ($<number>3 == TOK_TOGGLE) {
/* TODO: actually switch mode (not toggle) */ printf("should toggle mode\n");
toggle_floating_mode(focused, false);
} else {
printf("should switch mode to %s\n", ($<number>3 == TOK_FLOATING ? "floating" : "tiling"));
/* TODO: actually switch mode (not toggle) */
}
} }
; ;
window_mode: window_mode:
TOK_FLOATING { $<number>$ = TOK_FLOATING; } TOK_FLOATING { $<number>$ = TOK_FLOATING; }
| TOK_TILING { $<number>$ = TOK_TILING; } | TOK_TILING { $<number>$ = TOK_TILING; }
| TOK_TOGGLE { $<number>$ = TOK_TOGGLE; }
; ;
level: level:

View File

@ -37,6 +37,7 @@ void toggle_floating_mode(Con *con, bool automatic) {
/* 2: kill parent container */ /* 2: kill parent container */
TAILQ_REMOVE(&(con->parent->parent->floating_head), con->parent, floating_windows); 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); tree_close(con->parent, false);
/* 3: re-attach to previous parent */ /* 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->nodes_head), con, nodes);
TAILQ_INSERT_TAIL(&(con->parent->focus_head), con, focused); TAILQ_INSERT_TAIL(&(con->parent->focus_head), con, focused);
con->floating = FLOATING_USER_OFF;
return; return;
} }
@ -72,6 +75,7 @@ void toggle_floating_mode(Con *con, bool automatic) {
nc->orientation = NO_ORIENTATION; nc->orientation = NO_ORIENTATION;
nc->type = CT_FLOATING_CON; nc->type = CT_FLOATING_CON;
TAILQ_INSERT_TAIL(&(nc->parent->floating_head), nc, floating_windows); 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 */ /* 3: attach the child to the new parent container */
con->old_parent = con->parent; con->old_parent = con->parent;