]> git.sur5r.net Git - i3/i3/commitdiff
display swallows criteria in placeholder windows
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 15 Dec 2013 10:25:58 +0000 (11:25 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 22 Dec 2013 20:52:49 +0000 (21:52 +0100)
include/data.h
src/commands.c
src/config_directives.c
src/load_layout.c
src/match.c
src/restore_layout.c

index ea1d3240d4157938d017cc37195da934cc7db2a5..e3f288893cab4e6d9d7f2a8988d4348a989d2587 100644 (file)
@@ -374,7 +374,7 @@ struct Match {
     struct regex *class;
     struct regex *instance;
     struct regex *mark;
-    struct regex *role;
+    struct regex *window_role;
     enum {
         U_DONTCHECK = -1,
         U_LATEST = 0,
index c8ec5fafb9a4a8c120e33bf1c40416616de7117a..d8eff106f59e318894d5bac80308751ad6c9d901 100644 (file)
@@ -339,7 +339,7 @@ void cmd_criteria_add(I3_CMD, char *ctype, char *cvalue) {
     }
 
     if (strcmp(ctype, "window_role") == 0) {
-        current_match->role = regex_new(cvalue);
+        current_match->window_role = regex_new(cvalue);
         return;
     }
 
index b28ad49d3d9c66e68e1b7195b2f4a884225890b2..96d29ee0737ccc072717b7f2629b7d40a1927fa6 100644 (file)
@@ -55,7 +55,7 @@ CFGFUN(criteria_add, const char *ctype, const char *cvalue) {
     }
 
     if (strcmp(ctype, "window_role") == 0) {
-        current_match->role = regex_new(cvalue);
+        current_match->window_role = regex_new(cvalue);
         return;
     }
 
index 11a8f97453efb021ca5de6847f8f8b4e422480eb..588f2d3b1dc30f7121aeeb438af7b6f8d43c2cd8 100644 (file)
@@ -158,7 +158,7 @@ static int json_string(void *ctx, const unsigned char *val, unsigned int len) {
         } else if (strcasecmp(last_key, "instance") == 0) {
             current_swallow->instance = regex_new(sval);
         } else if (strcasecmp(last_key, "window_role") == 0) {
-            current_swallow->role = regex_new(sval);
+            current_swallow->window_role = regex_new(sval);
         } else if (strcasecmp(last_key, "title") == 0) {
             current_swallow->title = regex_new(sval);
         } else {
index 350a2c11d0e115091e01ab7af96a31af55e29ebd..de3990fa3f36f1e9f9a533f59181633cd80ece4a 100644 (file)
@@ -47,7 +47,7 @@ bool match_is_empty(Match *match) {
             match->application == NULL &&
             match->class == NULL &&
             match->instance == NULL &&
-            match->role == NULL &&
+            match->window_role == NULL &&
             match->urgent == U_DONTCHECK &&
             match->id == XCB_NONE &&
             match->con_id == NULL &&
@@ -75,7 +75,7 @@ void match_copy(Match *dest, Match *src) {
     DUPLICATE_REGEX(application);
     DUPLICATE_REGEX(class);
     DUPLICATE_REGEX(instance);
-    DUPLICATE_REGEX(role);
+    DUPLICATE_REGEX(window_role);
 }
 
 /*
@@ -121,9 +121,9 @@ bool match_matches_window(Match *match, i3Window *window) {
         }
     }
 
-    if (match->role != NULL) {
+    if (match->window_role != NULL) {
         if (window->role != NULL &&
-            regex_matches(match->role, window->role)) {
+            regex_matches(match->window_role, window->role)) {
             LOG("window_role matches (%s)\n", window->role);
         } else {
             return false;
@@ -196,7 +196,7 @@ void match_free(Match *match) {
     regex_free(match->class);
     regex_free(match->instance);
     regex_free(match->mark);
-    regex_free(match->role);
+    regex_free(match->window_role);
 
     /* Second step: free the regex helper struct itself */
     FREE(match->title);
@@ -204,5 +204,5 @@ void match_free(Match *match) {
     FREE(match->class);
     FREE(match->instance);
     FREE(match->mark);
-    FREE(match->role);
+    FREE(match->window_role);
 }
index ac2a1e38ee7beea3171617cc98a9262333ae9146..b19f7f77cb725e9fe870a4f873aee29d3dde31bb 100644 (file)
@@ -109,8 +109,43 @@ static void update_placeholder_contents(placeholder_state *state) {
     xcb_flush(restore_conn);
     xcb_aux_sync(restore_conn);
 
-    // TODO: actually represent the criteria, most likely just line by line from (0, 0)
     set_font_colors(state->gc, config.client.focused.background, 0);
+
+    Match *swallows;
+    int n = 0;
+    TAILQ_FOREACH(swallows, &(state->con->swallow_head), matches) {
+        char *serialized = NULL;
+
+#define APPEND_REGEX(re_name) do { \
+    if (swallows->re_name != NULL) { \
+        sasprintf(&serialized, "%s%s" #re_name "=\"%s\"", \
+                  (serialized ? serialized : "["), \
+                  (serialized ? " " : ""), \
+                  swallows->re_name->pattern); \
+    } \
+} while (0)
+
+        APPEND_REGEX(class);
+        APPEND_REGEX(instance);
+        APPEND_REGEX(window_role);
+        APPEND_REGEX(title);
+
+        if (serialized == NULL) {
+            DLOG("This swallows specification is not serializable?!\n");
+            continue;
+        }
+
+        sasprintf(&serialized, "%s]", serialized);
+        DLOG("con %p (placeholder 0x%08x) line %d: %s\n", state->con, state->window, n, serialized);
+
+        i3String *str = i3string_from_utf8(serialized);
+        draw_text(str, state->pixmap, state->gc, 2, (n * (config.font.height + 2)) + 2, state->rect.width - 2);
+        i3string_free(str);
+        n++;
+        free(serialized);
+    }
+
+    // TODO: render the watch symbol in a bigger font
     i3String *line = i3string_from_utf8("⌚");
     int text_width = predict_text_width(line);
     int x = (state->rect.width / 2) - (text_width / 2);