dwm-status2d-6.3.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-status2d-6.3.diff (4272B)
---
1 diff --git a/dwm.c b/dwm.c
2 index a96f33c..24b1eeb 100644
3 --- a/dwm.c
4 +++ b/dwm.c
5 @@ -163,6 +163,7 @@ static void detachstack(Client *c);
6 static Monitor *dirtomon(int dir);
7 static void drawbar(Monitor *m);
8 static void drawbars(void);
9 +static int drawstatusbar(Monitor *m, int bh, char* text);
10 static void enternotify(XEvent *e);
11 static void expose(XEvent *e);
12 static void focus(Client *c);
13 @@ -237,7 +238,7 @@ static void zoom(const Arg *arg);
14
15 /* variables */
16 static const char broken[] = "broken";
17 -static char stext[256];
18 +static char stext[1024];
19 static int screen;
20 static int sw, sh; /* X display screen geometry width, height */
21 static int bh, blw = 0; /* bar geometry */
22 @@ -485,7 +486,7 @@ cleanup(void)
23 cleanupmon(mons);
24 for (i = 0; i < CurLast; i++)
25 drw_cur_free(drw, cursor[i]);
26 - for (i = 0; i < LENGTH(colors); i++)
27 + for (i = 0; i < LENGTH(colors) + 1; i++)
28 free(scheme[i]);
29 XDestroyWindow(dpy, wmcheckwin);
30 drw_free(drw);
31 @@ -693,6 +694,114 @@ dirtomon(int dir)
32 return m;
33 }
34
35 +int
36 +drawstatusbar(Monitor *m, int bh, char* stext) {
37 + int ret, i, w, x, len;
38 + short isCode = 0;
39 + char *text;
40 + char *p;
41 +
42 + len = strlen(stext) + 1 ;
43 + if (!(text = (char*) malloc(sizeof(char)*len)))
44 + die("malloc");
45 + p = text;
46 + memcpy(text, stext, len);
47 +
48 + /* compute width of the status text */
49 + w = 0;
50 + i = -1;
51 + while (text[++i]) {
52 + if (text[i] == '^') {
53 + if (!isCode) {
54 + isCode = 1;
55 + text[i] = '\0';
56 + w += TEXTW(text) - lrpad;
57 + text[i] = '^';
58 + if (text[++i] == 'f')
59 + w += atoi(text + ++i);
60 + } else {
61 + isCode = 0;
62 + text = text + i + 1;
63 + i = -1;
64 + }
65 + }
66 + }
67 + if (!isCode)
68 + w += TEXTW(text) - lrpad;
69 + else
70 + isCode = 0;
71 + text = p;
72 +
73 + w += 2; /* 1px padding on both sides */
74 + ret = x = m->ww - w;
75 +
76 + drw_setscheme(drw, scheme[LENGTH(colors)]);
77 + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
78 + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
79 + drw_rect(drw, x, 0, w, bh, 1, 1);
80 + x++;
81 +
82 + /* process status text */
83 + i = -1;
84 + while (text[++i]) {
85 + if (text[i] == '^' && !isCode) {
86 + isCode = 1;
87 +
88 + text[i] = '\0';
89 + w = TEXTW(text) - lrpad;
90 + drw_text(drw, x, 0, w, bh, 0, text, 0);
91 +
92 + x += w;
93 +
94 + /* process code */
95 + while (text[++i] != '^') {
96 + if (text[i] == 'c') {
97 + char buf[8];
98 + memcpy(buf, (char*)text+i+1, 7);
99 + buf[7] = '\0';
100 + drw_clr_create(drw, &drw->scheme[ColFg], buf);
101 + i += 7;
102 + } else if (text[i] == 'b') {
103 + char buf[8];
104 + memcpy(buf, (char*)text+i+1, 7);
105 + buf[7] = '\0';
106 + drw_clr_create(drw, &drw->scheme[ColBg], buf);
107 + i += 7;
108 + } else if (text[i] == 'd') {
109 + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg];
110 + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg];
111 + } else if (text[i] == 'r') {
112 + int rx = atoi(text + ++i);
113 + while (text[++i] != ',');
114 + int ry = atoi(text + ++i);
115 + while (text[++i] != ',');
116 + int rw = atoi(text + ++i);
117 + while (text[++i] != ',');
118 + int rh = atoi(text + ++i);
119 +
120 + drw_rect(drw, rx + x, ry, rw, rh, 1, 0);
121 + } else if (text[i] == 'f') {
122 + x += atoi(text + ++i);
123 + }
124 + }
125 +
126 + text = text + i + 1;
127 + i=-1;
128 + isCode = 0;
129 + }
130 + }
131 +
132 + if (!isCode) {
133 + w = TEXTW(text) - lrpad;
134 + drw_text(drw, x, 0, w, bh, 0, text, 0);
135 + }
136 +
137 + drw_setscheme(drw, scheme[SchemeNorm]);
138 + free(p);
139 +
140 + return ret;
141 +}
142 +
143 void
144 drawbar(Monitor *m)
145 {
146 @@ -707,9 +816,7 @@ drawbar(Monitor *m)
147
148 /* draw status first so it can be overdrawn by tags later */
149 if (m == selmon) { /* status is only drawn on selected monitor */
150 - drw_setscheme(drw, scheme[SchemeNorm]);
151 - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
152 - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
153 + tw = m->ww - drawstatusbar(m, bh, stext);
154 }
155
156 for (c = m->clients; c; c = c->next) {
157 @@ -1571,7 +1678,8 @@ setup(void)
158 cursor[CurResize] = drw_cur_create(drw, XC_sizing);
159 cursor[CurMove] = drw_cur_create(drw, XC_fleur);
160 /* init appearance */
161 - scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
162 + scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *));
163 + scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3);
164 for (i = 0; i < LENGTH(colors); i++)
165 scheme[i] = drw_scm_create(drw, colors[i], 3);
166 /* init bars */