]> git.sur5r.net Git - i3/i3/commitdiff
Introduce a cached boolean for changes to the mark of a window.
authorIngo Bürk <ingo.buerk@tngtech.com>
Sat, 28 Mar 2015 23:13:44 +0000 (00:13 +0100)
committerIngo Bürk <ingo.buerk@tngtech.com>
Mon, 30 Mar 2015 21:08:25 +0000 (23:08 +0200)
This is necessary to correctly redraw window decorations when the mark of
a window is added or removed.

include/data.h
src/commands.c
src/x.c

index cec571e9df8eecf71f10c32ebb8c2098f8770d16..d40ed29296e1136669473a83060e1c7b48b71067 100644 (file)
@@ -543,6 +543,8 @@ struct Con {
 
     /* user-definable mark to jump to this container later */
     char *mark;
+    /* cached to decide whether a redraw is needed */
+    bool mark_changed;
 
     double percent;
 
index 2aa1f53757b1b9d314332c3f3de84b2b08271093..6c24e24d7016750d2b58917c4c5ae8321966b53c 100644 (file)
@@ -1046,6 +1046,7 @@ void cmd_mark(I3_CMD, char *mark, char *toggle) {
     owindow *current;
     TAILQ_FOREACH(current, &owindows, owindows) {
         DLOG("matching: %p / %s\n", current->con, current->con->name);
+        current->con->mark_changed=true;
         if (toggle != NULL && current->con->mark && strcmp(current->con->mark, mark) == 0) {
             DLOG("removing window mark %s\n", mark);
             FREE(current->con->mark);
@@ -1070,8 +1071,10 @@ void cmd_mark(I3_CMD, char *mark, char *toggle) {
         if (matched)
             continue;
 
-        if (con->mark && strcmp(con->mark, mark) == 0)
+        if (con->mark && strcmp(con->mark, mark) == 0) {
             FREE(con->mark);
+            con->mark_changed = true;
+        }
     }
 
     cmd_output->needs_tree_render = true;
@@ -1087,14 +1090,20 @@ void cmd_unmark(I3_CMD, char *mark) {
     if (mark == NULL) {
         Con *con;
         TAILQ_FOREACH(con, &all_cons, all_cons) {
+            if (con->mark == NULL)
+                continue;
+
             FREE(con->mark);
+            con->mark_changed = true;
         }
         DLOG("removed all window marks");
     } else {
         Con *con;
         TAILQ_FOREACH(con, &all_cons, all_cons) {
-            if (con->mark && strcmp(con->mark, mark) == 0)
+            if (con->mark && strcmp(con->mark, mark) == 0) {
                 FREE(con->mark);
+                con->mark_changed = true;
+            }
         }
         DLOG("removed window mark %s\n", mark);
     }
diff --git a/src/x.c b/src/x.c
index a3810942d27d7884c06fd1f6204a597e6ba48d16..1d4bfdf11fd6aa2775ffa388af9d71038ee41b7a 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -363,6 +363,7 @@ void x_draw_decoration(Con *con) {
         (con->window == NULL || !con->window->name_x_changed) &&
         !parent->pixmap_recreated &&
         !con->pixmap_recreated &&
+        !con->mark_changed &&
         memcmp(p, con->deco_render_params, sizeof(struct deco_render_params)) == 0) {
         free(p);
         goto copy_pixmaps;
@@ -381,6 +382,7 @@ void x_draw_decoration(Con *con) {
 
     parent->pixmap_recreated = false;
     con->pixmap_recreated = false;
+    con->mark_changed = false;
 
     /* 2: draw the client.background, but only for the parts around the client_rect */
     if (con->window != NULL) {