i3 - improved tiling WM


add setting decoration colors for specific windows

Patch status: rejected

Patch by Lukas

To apply this patch, use:
curl http://cr.i3wm.org/patch/674/raw.patch | git am

b/docs/userguide

19
@@ -743,6 +743,8 @@ workspace 5 output VGA1
20
 workspace "2: vim" output VGA1
21
 ---------------------------
22
 
23
+[[changing_colors]]
24
+
25
 === Changing colors
26
 
27
 You can change all colors which i3 uses to draw the window decorations.
28
@@ -1873,9 +1875,26 @@ bindsym $mod+y border 1pixel
29
 bindsym $mod+u border none
30
 ----------------------------
31
 
32
-[[stack-limit]]
33
+
34
+=== Setting decoration colors for specific windows
35
+
36
+For setting the decoration colors of specific windows when they're not 
37
+focused, you can use the +set_color+ command.
38
+
39
+*Syntax*:
40
+------------------------------
41
+set_color none|(<border> <background> <text>)
42
+------------------------------
43
+
44
++none+ uses the default colors from +client.unfocused+, for the meaning 
45
+of +<border> <background> <text>+, see <<changing_colors>>.
46
+
47
+
48
+
49
 
50
 ///////////////////////////////////////////////////////////////////////////////
51
+[[stack-limit]]
52
+
53
 TODO: not yet implemented
54
 === Changing the stack-limit of a container
55
 

b/include/commands.h

60
@@ -276,6 +276,13 @@ void cmd_rename_workspace(I3_CMD, char *old_name, char *new_name);
61
  */
62
 void cmd_bar(I3_CMD, char *bar_type, char *bar_value, char *bar_id);
63
 
64
+/**
65
+ * Implementation of 'set_color none|(<border> <background> <text>)'
66
+ *
67
+ */
68
+void cmd_set_color(I3_CMD, char *enable, char *border, char *background, char *text);
69
+
70
+
71
 /*
72
  * Implementation of 'shmlog <size>|toggle|on|off'
73
  *

b/include/data.h

78
@@ -491,6 +491,10 @@ typedef enum { CF_NONE = 0,
79
  * A 'Con' represents everything from the X11 root window down to a single X11 window.
80
  *
81
  */
82
+
83
+#include "config.h"
84
+/* fixme, Con needs Colortriple, but config.h needs structs from this file */
85
+
86
 struct Con {
87
     bool mapped;
88
 
89
@@ -498,6 +502,11 @@ struct Con {
90
      * inside this container (if any) sets the urgency hint, for example. */
91
     bool urgent;
92
 
93
+    /* if true, custom_color will override the color when this container
94
+     * is unfocused */
95
+    bool has_custom_color;
96
+    struct Colortriple custom_color;
97
+
98
     /** This counter contains the number of UnmapNotify events for this
99
      * container (or, more precisely, for its ->frame) which should be ignored.
100
      * UnmapNotify events need to be ignored when they are caused by i3 itself,

b/parser-specs/commands.spec

105
@@ -39,6 +39,7 @@ state INITIAL:
106
   'scratchpad' -> SCRATCHPAD
107
   'mode' -> MODE
108
   'bar' -> BAR
109
+  'set_color' -> SET_COLOR_BORDER
110
 
111
 state CRITERIA:
112
   ctype = 'class' -> CRITERION
113
@@ -362,3 +363,17 @@ state BAR_W_ID:
114
       ->
115
   end
116
       -> call cmd_bar($bar_type, $bar_value, $bar_id)
117
+
118
+state SET_COLOR_BORDER:
119
+  'none'
120
+      -> call cmd_set_color("0", NULL, NULL, NULL)
121
+  border = word
122
+      -> SET_COLOR_BACKGROUND
123
+
124
+state SET_COLOR_BACKGROUND:
125
+  background = word
126
+      -> SET_COLOR_TEXT
127
+
128
+state SET_COLOR_TEXT:
129
+  text = word
130
+      -> call cmd_set_color("1", $border, $background, $text)

b/src/commands.c

135
@@ -2176,3 +2176,36 @@ void cmd_debuglog(I3_CMD, char *argument) {
136
     // XXX: default reply for now, make this a better reply
137
     ysuccess(true);
138
 }
139
+
140
+
141
+/*
142
+ * Implementation of 'set_color none|(<border> <background> <text>)'
143
+ *
144
+ */
145
+void cmd_set_color(I3_CMD, char *enable, char *border, char *background, char *text) {
146
+    owindow *current;
147
+
148
+    HANDLE_EMPTY_MATCH;
149
+
150
+    TAILQ_FOREACH(current, &owindows, owindows) {
151
+        DLOG("matching: %p / %s\n", current->con, current->con->name);
152
+        if(strcmp(enable, "1")==0) {
153
+            DLOG("enabling and setting custom colors\n");
154
+            current->con->has_custom_color=true;
155
+            current->con->custom_color.border=get_colorpixel(border);
156
+            current->con->custom_color.background=get_colorpixel(background);
157
+            current->con->custom_color.text=get_colorpixel(text);
158
+        }
159
+        else {
160
+            DLOG("disabling custom colors\n");
161
+            current->con->has_custom_color=false;
162
+        }
163
+
164
+        x_draw_decoration(current->con);
165
+    }
166
+
167
+    cmd_output->needs_tree_render = true;
168
+
169
+    // XXX: default reply for now, make this a better reply
170
+    ysuccess(true);
171
+}

b/src/con.c

176
@@ -43,6 +43,8 @@ Con *con_new_skeleton(Con *parent, i3Window *window) {
177
     new->window = window;
178
     new->border_style = config.default_border;
179
     new->current_border_width = -1;
180
+    new->has_custom_color = false;
181
+    new->custom_color = config.client.unfocused;
182
     if (window)
183
         new->depth = window->depth;
184
     else

b/src/x.c

189
@@ -345,6 +345,8 @@ void x_draw_decoration(Con *con) {
190
         p->color = &config.client.focused;
191
     else if (con == TAILQ_FIRST(&(parent->focus_head)))
192
         p->color = &config.client.focused_inactive;
193
+    else if (con->has_custom_color)
194
+        p->color = &con->custom_color;
195
     else
196
         p->color = &config.client.unfocused;
197