implement 'move' command in the new parser

This commit is contained in:
Michael Stapelberg 2010-05-11 22:46:49 +02:00
parent 98dbe63e35
commit a0e33c1d68
3 changed files with 23 additions and 2 deletions

View File

@ -107,6 +107,8 @@ vertical { return TOK_VERTICAL; }
level { return TOK_LEVEL; } level { return TOK_LEVEL; }
up { return TOK_UP; } up { return TOK_UP; }
down { return TOK_DOWN; } down { return TOK_DOWN; }
before { return TOK_BEFORE; }
after { return TOK_AFTER; }
class { BEGIN(WANT_QSTRING); return TOK_CLASS; } class { BEGIN(WANT_QSTRING); return TOK_CLASS; }
id { BEGIN(WANT_QSTRING); return TOK_ID; } id { BEGIN(WANT_QSTRING); return TOK_ID; }

View File

@ -120,6 +120,8 @@ void parse_cmd(const char *new) {
%token TOK_LEVEL "level" %token TOK_LEVEL "level"
%token TOK_UP "up" %token TOK_UP "up"
%token TOK_DOWN "down" %token TOK_DOWN "down"
%token TOK_AFTER "after"
%token TOK_BEFORE "before"
%token TOK_CLASS "class" %token TOK_CLASS "class"
%token TOK_ID "id" %token TOK_ID "id"
@ -249,8 +251,8 @@ operation:
/*| reload /*| reload
| mark | mark
| layout | layout
| border | border */
| move*/ | move
| workspace | workspace
| attach | attach
| focus | focus
@ -418,3 +420,18 @@ level_direction:
TOK_UP { $<chr>$ = 'u'; } TOK_UP { $<chr>$ = 'u'; }
| TOK_DOWN { $<chr>$ = 'd'; } | TOK_DOWN { $<chr>$ = 'd'; }
; ;
move:
TOK_MOVE WHITESPACE before_after WHITESPACE direction
{
printf("moving: %s and %c\n", ($<number>3 == TOK_BEFORE ? "before" : "after"), $<chr>5);
/* TODO: change API for the next call, we need to convert in both directions while ideally
* we should not need any of both */
tree_move(($<number>3 == TOK_BEFORE ? 'p' : 'n'), ($<chr>5 == 'v' ? VERT : HORIZ));
}
;
before_after:
TOK_BEFORE { $<number>$ = TOK_BEFORE; }
| TOK_AFTER { $<number>$ = TOK_AFTER; }
;

View File

@ -271,6 +271,8 @@ void tree_next(char way, orientation_t orientation) {
void tree_move(char way, orientation_t orientation) { void tree_move(char way, orientation_t orientation) {
/* 1: get the first parent with the same orientation */ /* 1: get the first parent with the same orientation */
Con *parent = focused->parent; Con *parent = focused->parent;
if (parent->type == CT_OUTPUT)
return;
bool level_changed = false; bool level_changed = false;
while (parent->orientation != orientation) { while (parent->orientation != orientation) {
LOG("need to go one level further up\n"); LOG("need to go one level further up\n");