]> git.sur5r.net Git - i3/i3/blobdiff - src/cmdparse.l
Merge branch 'master' into next
[i3/i3] / src / cmdparse.l
index 3e5dc889098c50fd28834ec3fae9f183a9359672..c7c64e356f2b74978520a003b16c5faf5f39d823 100644 (file)
@@ -2,7 +2,7 @@
  * vim:ts=4:sw=4:expandtab
  *
  * i3 - an improved dynamic tiling window manager
- * © 2009-2010 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
  *
  * cmdparse.l: the lexer for commands you send to i3 (or bind on keys)
  *
@@ -30,14 +30,20 @@ int cmdyycolumn = 1;
     cmdyycolumn += yyleng; \
 }
 
+/* macro to first eat whitespace, then expect a string */
+#define WS_STRING do { \
+    yy_push_state(WANT_STRING); \
+    yy_push_state(EAT_WHITESPACE); \
+} while (0)
+
 %}
 
 EOL (\r?\n)
 
 /* handle everything up to \n as a string */
 %s WANT_STRING
-/* first expect a whitespace, then a string */
-%s WANT_WS_STRING
+/* eat a whitespace, then go to the next state on the stack */
+%s EAT_WHITESPACE
 /* handle a quoted string or everything up to the next whitespace */
 %s WANT_QSTRING
 
@@ -65,7 +71,11 @@ EOL (\r?\n)
     cmdyycolumn = 1;
 }
 
-<WANT_WS_STRING>[ \t]*          { BEGIN(WANT_STRING); return WHITESPACE; }
+    /* the next/prev tokens are here to recognize them *before* handling
+     * strings ('workspace' command) */
+next                            { return TOK_NEXT; }
+prev                            { return TOK_PREV; }
+
 <WANT_STRING>\"[^\"]+\"         {
                                   BEGIN(INITIAL);
                                   /* strip quotes */
@@ -73,25 +83,29 @@ EOL (\r?\n)
                                   copy[strlen(copy)-1] = '\0';
                                   cmdyylval.string = copy;
                                   return STR;
-                                 }
-<WANT_QSTRING>\"[^\"]+\"         {
+                                }
+<WANT_QSTRING>\"[^\"]+\"        {
                                   BEGIN(INITIAL);
                                   /* strip quotes */
                                   char *copy = sstrdup(yytext+1);
                                   copy[strlen(copy)-1] = '\0';
                                   cmdyylval.string = copy;
                                   return STR;
-                                 }
+                                }
 
-<WANT_STRING>[^;\n]+             { BEGIN(INITIAL); cmdyylval.string = sstrdup(yytext); return STR; }
+<WANT_STRING>[^;\n]+            { BEGIN(INITIAL); cmdyylval.string = sstrdup(yytext); return STR; }
 
-[ \t]*                          { return WHITESPACE; }
-attach                          { return TOK_ATTACH; }
-exec                            { BEGIN(WANT_WS_STRING); return TOK_EXEC; }
+<EAT_WHITESPACE>[;\n]           { BEGIN(INITIAL); return ';'; }
+<EAT_WHITESPACE>[ \t]*          { yy_pop_state(); }
+
+[ \t]*                          { /* ignore whitespace */ ; }
+exec                            { WS_STRING; return TOK_EXEC; }
 exit                            { return TOK_EXIT; }
 reload                          { return TOK_RELOAD; }
 restart                         { return TOK_RESTART; }
 kill                            { return TOK_KILL; }
+window                          { return TOK_WINDOW; }
+client                          { return TOK_CLIENT; }
 fullscreen                      { return TOK_FULLSCREEN; }
 global                          { return TOK_GLOBAL; }
 layout                          { return TOK_LAYOUT; }
@@ -103,38 +117,48 @@ border                          { return TOK_BORDER; }
 normal                          { return TOK_NORMAL; }
 none                            { return TOK_NONE; }
 1pixel                          { return TOK_1PIXEL; }
-mode                            { return TOK_MODE; }
+mode                            { BEGIN(WANT_QSTRING); return TOK_MODE; }
 tiling                          { return TOK_TILING; }
 floating                        { return TOK_FLOATING; }
 toggle                          { return TOK_TOGGLE; }
-workspace                       { BEGIN(WANT_WS_STRING); return TOK_WORKSPACE; }
+mode_toggle                     { return TOK_MODE_TOGGLE; }
+workspace                       { WS_STRING; return TOK_WORKSPACE; }
+output                          { WS_STRING; return TOK_OUTPUT; }
 focus                           { return TOK_FOCUS; }
 move                            { return TOK_MOVE; }
 open                            { return TOK_OPEN; }
-next                            { return TOK_NEXT; }
-prev                            { return TOK_PREV; }
 split                           { return TOK_SPLIT; }
 horizontal                      { return TOK_HORIZONTAL; }
 vertical                        { return TOK_VERTICAL; }
-level                           { return TOK_LEVEL; }
 up                              { return TOK_UP; }
 down                            { return TOK_DOWN; }
 left                            { return TOK_LEFT; }
 right                           { return TOK_RIGHT; }
+parent                          { return TOK_PARENT; }
+child                           { return TOK_CHILD; }
 resize                          { return TOK_RESIZE; }
 shrink                          { return TOK_SHRINK; }
 grow                            { return TOK_GROW; }
 px                              { return TOK_PX; }
 or                              { return TOK_OR; }
 ppt                             { return TOK_PPT; }
-nop                             { BEGIN(WANT_WS_STRING); return TOK_NOP; }
-restore                         { BEGIN(WANT_WS_STRING); return TOK_RESTORE; }
-mark                            { BEGIN(WANT_WS_STRING); return TOK_MARK; }
+nop                             { WS_STRING; return TOK_NOP; }
+append_layout                   { WS_STRING; return TOK_APPEND_LAYOUT; }
+mark                            { WS_STRING; return TOK_MARK; }
+
+enable                          { return TOK_ENABLE; }
+true                            { return TOK_ENABLE; }
+yes                             { return TOK_ENABLE; }
+disable                         { return TOK_DISABLE; }
+false                           { return TOK_DISABLE; }
+no                              { return TOK_DISABLE; }
 
 class                           { BEGIN(WANT_QSTRING); return TOK_CLASS; }
+instance                        { BEGIN(WANT_QSTRING); return TOK_INSTANCE; }
 id                              { BEGIN(WANT_QSTRING); return TOK_ID; }
 con_id                          { BEGIN(WANT_QSTRING); return TOK_CON_ID; }
 con_mark                        { BEGIN(WANT_QSTRING); return TOK_MARK; }
+title                           { BEGIN(WANT_QSTRING); return TOK_TITLE; }
 
 [0-9]+                          { cmdyylval.number = atoi(yytext); return NUMBER; }