]> git.sur5r.net Git - i3/i3/blobdiff - src/cfgparse.y
Introduce the i3-sensible-{pager,editor,terminal} scripts
[i3/i3] / src / cfgparse.y
index 8faeff8503b8b587ba74524115d0bea6b2b811bc..9a417f2aba0b54aeb65cd059f9947d756e617c6d 100644 (file)
@@ -240,6 +240,10 @@ static void nagbar_exited(EV_P_ ev_child *watcher, int revents) {
     configerror_pid = -1;
 }
 
+/* We need ev >= 4 for the following code. Since it is not *that* important (it
+ * only makes sure that there are no i3-nagbar instances left behind) we still
+ * support old systems with libev 3. */
+#if EV_VERSION_MAJOR >= 4
 /*
  * Cleanup handler. Will be called when i3 exits. Kills i3-nagbar with signal
  * SIGKILL (9) to make sure there are no left-over i3-nagbar processes.
@@ -251,6 +255,7 @@ static void nagbar_cleanup(EV_P_ ev_cleanup *watcher, int revent) {
         kill(configerror_pid, SIGKILL);
     }
 }
+#endif
 
 /*
  * Starts an i3-nagbar process which alerts the user that his configuration
@@ -271,9 +276,9 @@ static void start_configerror_nagbar(const char *config_path) {
     if (configerror_pid == 0) {
         char *editaction,
              *pageraction;
-        if (asprintf(&editaction, TERM_EMU " -e sh -c \"${EDITOR:-vi} \"%s\" && i3-msg reload\"", config_path) == -1)
+        if (asprintf(&editaction, "i3-sensible-terminal -e sh -c \"i3-sensible-editor \\\"%s\\\" && i3-msg reload\"", config_path) == -1)
             exit(1);
-        if (asprintf(&pageraction, TERM_EMU " -e sh -c \"${PAGER:-less} \"%s\"\"", errorfilename) == -1)
+        if (asprintf(&pageraction, "i3-sensible-terminal -e i3-sensible-pager \"%s\"", errorfilename) == -1)
             exit(1);
         char *argv[] = {
             NULL, /* will be replaced by the executable path */
@@ -296,11 +301,16 @@ static void start_configerror_nagbar(const char *config_path) {
     ev_child_init(child, &nagbar_exited, configerror_pid, 0);
     ev_child_start(main_loop, child);
 
+/* We need ev >= 4 for the following code. Since it is not *that* important (it
+ * only makes sure that there are no i3-nagbar instances left behind) we still
+ * support old systems with libev 3. */
+#if EV_VERSION_MAJOR >= 4
     /* install a cleanup watcher (will be called when i3 exits and i3-nagbar is
      * still running) */
     ev_cleanup *cleanup = smalloc(sizeof(ev_cleanup));
     ev_cleanup_init(cleanup, nagbar_cleanup);
     ev_cleanup_start(main_loop, cleanup);
+#endif
 }
 
 /*
@@ -423,12 +433,14 @@ void parse_file(const char *f) {
 
             /* get key/value for this variable */
             char *v_key = value, *v_value;
-            if ((v_value = strstr(value, " ")) == NULL &&
-                (v_value = strstr(value, "\t")) == NULL) {
+            if (strstr(value, " ") == NULL && strstr(value, "\t") == NULL) {
                 ELOG("Malformed variable assignment, need a value\n");
                 continue;
             }
 
+            if (!(v_value = strstr(value, " ")))
+                v_value = strstr(value, "\t");
+
             *(v_value++) = '\0';
 
             struct Variable *new = scalloc(sizeof(struct Variable));
@@ -453,7 +465,8 @@ void parse_file(const char *f) {
         int extra = (strlen(current->value) - strlen(current->key));
         char *next;
         for (next = bufcopy;
-             (next = strcasestr(bufcopy + (next - bufcopy), current->key)) != NULL;
+             next < (bufcopy + stbuf.st_size) &&
+             (next = strcasestr(next, current->key)) != NULL;
              next += strlen(current->key)) {
             *next = '_';
             extra_bytes += extra;
@@ -609,6 +622,7 @@ void parse_file(const char *f) {
 %token                  TOK_1PIXEL                  "1pixel"
 %token                  TOKFOCUSFOLLOWSMOUSE        "focus_follows_mouse"
 %token                  TOK_FORCE_FOCUS_WRAPPING    "force_focus_wrapping"
+%token                  TOK_FORCE_XINERAMA          "force_xinerama"
 %token                  TOKWORKSPACEBAR             "workspace_bar"
 %token                  TOK_DEFAULT                 "default"
 %token                  TOK_STACKING                "stacking"
@@ -622,6 +636,7 @@ void parse_file(const char *f) {
 %token              TOK_MARK            "mark"
 %token              TOK_CLASS           "class"
 %token              TOK_INSTANCE        "instance"
+%token              TOK_WINDOW_ROLE     "window_role"
 %token              TOK_ID              "id"
 %token              TOK_CON_ID          "con_id"
 %token              TOK_TITLE           "title"
@@ -663,6 +678,7 @@ line:
     | new_float
     | focus_follows_mouse
     | force_focus_wrapping
+    | force_xinerama
     | workspace_bar
     | workspace
     | assign
@@ -782,6 +798,12 @@ criterion:
         current_match.instance = regex_new($3);
         free($3);
     }
+    | TOK_WINDOW_ROLE '=' STR
+    {
+        printf("criteria: window_role = %s\n", $3);
+        current_match.role = regex_new($3);
+        free($3);
+    }
     | TOK_CON_ID '=' STR
     {
         printf("criteria: id = %s\n", $3);
@@ -1005,6 +1027,14 @@ force_focus_wrapping:
     }
     ;
 
+force_xinerama:
+    TOK_FORCE_XINERAMA bool
+    {
+        DLOG("force xinerama = %d\n", $2);
+        config.force_xinerama = $2;
+    }
+    ;
+
 workspace_bar:
     TOKWORKSPACEBAR bool
     {