]> git.sur5r.net Git - i3/i3/blobdiff - src/cmdparse.l
Switch and Move to next workspace on the same Output. As requested in \#554
[i3/i3] / src / cmdparse.l
index d832057803a005ea0e233c564f7fffc8a7d814e7..d382c8db85740bc403e9e6851e4f9088d59d307c 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)
  *
@@ -19,6 +19,7 @@
 
 #include "config.h"
 #include "util.h"
+#include "libi3.h"
 
 int cmdyycolumn = 1;
 
@@ -30,17 +31,25 @@ 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
 
+%x EXEC
+
 %x BUFFER_LINE
 
 %%
@@ -65,8 +74,22 @@ EOL (\r?\n)
     cmdyycolumn = 1;
 }
 
-<WANT_STRING>[^\n]+             { BEGIN(INITIAL); cmdyylval.string = sstrdup(yytext); return STR; }
-<WANT_WS_STRING>[ \t]*          { BEGIN(WANT_STRING); return WHITESPACE; }
+    /* the next/prev/back_and_forth tokens are here to recognize them *before*
+     * handling strings ('workspace' command) */
+next                            { BEGIN(INITIAL); return TOK_NEXT; }
+prev                            { BEGIN(INITIAL); return TOK_PREV; }
+next_on_output                  { BEGIN(INITIAL); return TOK_NEXT_ON_OUTPUT; }
+prev_on_output                  { BEGIN(INITIAL); return TOK_PREV_ON_OUTPUT; }
+back_and_forth                  { BEGIN(INITIAL); return TOK_BACK_AND_FORTH; }
+
+<WANT_STRING>\"[^\"]+\"         {
+                                  BEGIN(INITIAL);
+                                  /* strip quotes */
+                                  char *copy = sstrdup(yytext+1);
+                                  copy[strlen(copy)-1] = '\0';
+                                  cmdyylval.string = copy;
+                                  return STR;
+                                }
 <WANT_QSTRING>\"[^\"]+\"        {
                                   BEGIN(INITIAL);
                                   /* strip quotes */
@@ -76,13 +99,21 @@ EOL (\r?\n)
                                   return STR;
                                 }
 
-[ \t]*                          { return WHITESPACE; }
-attach                          { return TOK_ATTACH; }
-exec                            { BEGIN(WANT_WS_STRING); return TOK_EXEC; }
+<WANT_STRING>[^;\n]+            { BEGIN(INITIAL); cmdyylval.string = sstrdup(yytext); return STR; }
+
+<EAT_WHITESPACE>[;\n]           { BEGIN(INITIAL); return ';'; }
+<EAT_WHITESPACE>[ \t]*          { yy_pop_state(); }
+
+[ \t]*                          { /* ignore whitespace */ ; }
+<EXEC>--no-startup-id           { printf("no startup id\n"); yy_pop_state(); return TOK_NO_STARTUP_ID; }
+<EXEC>.                         { printf("anything else: *%s*\n", yytext); yyless(0); yy_pop_state(); yy_pop_state(); }
+exec                            { WS_STRING; yy_push_state(EXEC); yy_push_state(EAT_WHITESPACE); 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; }
@@ -94,40 +125,51 @@ 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; }
+scratchpad                      { return TOK_SCRATCHPAD; }
+show                            { return TOK_SHOW; }
 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; }
-before                          { return TOK_BEFORE; }
-after                           { return TOK_AFTER; }
+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; }
+window_role                     { BEGIN(WANT_QSTRING); return TOK_WINDOW_ROLE; }
 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; }