]> Dogcows Code - chaz/openbox/blob - openbox/framerender.c
remove the title separator width thing.
[chaz/openbox] / openbox / framerender.c
1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
2
3 framerender.c for the Openbox window manager
4 Copyright (c) 2006 Mikael Magnusson
5 Copyright (c) 2003-2007 Dana Jansens
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 See the COPYING file for a copy of the GNU General Public License.
18 */
19
20 #include "frame.h"
21 #include "openbox.h"
22 #include "screen.h"
23 #include "client.h"
24 #include "framerender.h"
25 #include "render/theme.h"
26
27 static void framerender_label(ObFrame *self, RrAppearance *a);
28 static void framerender_icon(ObFrame *self, RrAppearance *a);
29 static void framerender_max(ObFrame *self, RrAppearance *a);
30 static void framerender_iconify(ObFrame *self, RrAppearance *a);
31 static void framerender_desk(ObFrame *self, RrAppearance *a);
32 static void framerender_shade(ObFrame *self, RrAppearance *a);
33 static void framerender_close(ObFrame *self, RrAppearance *a);
34
35 void framerender_frame(ObFrame *self)
36 {
37 {
38 gulong px;
39
40 px = (self->focused ?
41 RrColorPixel(ob_rr_theme->cb_focused_color) :
42 RrColorPixel(ob_rr_theme->cb_unfocused_color));
43
44 XSetWindowBackground(ob_display, self->backback, px);
45 XClearWindow(ob_display, self->backback);
46 XSetWindowBackground(ob_display, self->innerleft, px);
47 XClearWindow(ob_display, self->innerleft);
48 XSetWindowBackground(ob_display, self->innertop, px);
49 XClearWindow(ob_display, self->innertop);
50 XSetWindowBackground(ob_display, self->innerright, px);
51 XClearWindow(ob_display, self->innerright);
52 XSetWindowBackground(ob_display, self->innerbottom, px);
53 XClearWindow(ob_display, self->innerbottom);
54
55 px = (self->focused ?
56 RrColorPixel(ob_rr_theme->frame_focused_border_color) :
57 RrColorPixel(ob_rr_theme->frame_unfocused_border_color));
58
59 XSetWindowBackground(ob_display, self->left, px);
60 XClearWindow(ob_display, self->left);
61 XSetWindowBackground(ob_display, self->right, px);
62 XClearWindow(ob_display, self->right);
63
64 XSetWindowBackground(ob_display, self->titleleft, px);
65 XClearWindow(ob_display, self->titleleft);
66 XSetWindowBackground(ob_display, self->titletop, px);
67 XClearWindow(ob_display, self->titletop);
68 XSetWindowBackground(ob_display, self->titletopleft, px);
69 XClearWindow(ob_display, self->titletopleft);
70 XSetWindowBackground(ob_display, self->titletopright, px);
71 XClearWindow(ob_display, self->titletopright);
72 XSetWindowBackground(ob_display, self->titleright, px);
73 XClearWindow(ob_display, self->titleright);
74
75 XSetWindowBackground(ob_display, self->handleleft, px);
76 XClearWindow(ob_display, self->handleleft);
77 XSetWindowBackground(ob_display, self->handletop, px);
78 XClearWindow(ob_display, self->handletop);
79 XSetWindowBackground(ob_display, self->handleright, px);
80 XClearWindow(ob_display, self->handleright);
81 XSetWindowBackground(ob_display, self->handlebottom, px);
82 XClearWindow(ob_display, self->handlebottom);
83
84 XSetWindowBackground(ob_display, self->lgripleft, px);
85 XClearWindow(ob_display, self->lgripleft);
86 XSetWindowBackground(ob_display, self->lgriptop, px);
87 XClearWindow(ob_display, self->lgriptop);
88 XSetWindowBackground(ob_display, self->lgripbottom, px);
89 XClearWindow(ob_display, self->lgripbottom);
90
91 XSetWindowBackground(ob_display, self->rgripright, px);
92 XClearWindow(ob_display, self->rgripright);
93 XSetWindowBackground(ob_display, self->rgriptop, px);
94 XClearWindow(ob_display, self->rgriptop);
95 XSetWindowBackground(ob_display, self->rgripbottom, px);
96 XClearWindow(ob_display, self->rgripbottom);
97
98 px = (self->focused ?
99 RrColorPixel(ob_rr_theme->title_separator_focused_color) :
100 RrColorPixel(ob_rr_theme->title_separator_unfocused_color));
101
102 XSetWindowBackground(ob_display, self->titlebottom, px);
103 XClearWindow(ob_display, self->titlebottom);
104 }
105
106 if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
107 RrAppearance *t, *l, *m, *n, *i, *d, *s, *c, *clear;
108 if (self->focused) {
109
110 t = self->a_focused_title;
111 l = self->a_focused_label;
112
113 m = (!(self->decorations & OB_FRAME_DECOR_MAXIMIZE) ?
114 ob_rr_theme->a_disabled_focused_max :
115 (self->client->max_vert || self->client->max_horz ?
116 (self->max_press ?
117 ob_rr_theme->a_toggled_focused_pressed_max :
118 (self->max_hover ?
119 ob_rr_theme->a_toggled_hover_focused_max :
120 ob_rr_theme->a_toggled_focused_unpressed_max)) :
121 (self->max_press ?
122 ob_rr_theme->a_focused_pressed_max :
123 (self->max_hover ?
124 ob_rr_theme->a_hover_focused_max :
125 ob_rr_theme->a_focused_unpressed_max))));
126 n = self->a_icon;
127 i = (!(self->decorations & OB_FRAME_DECOR_ICONIFY) ?
128 ob_rr_theme->a_disabled_focused_iconify :
129 (self->iconify_press ?
130 ob_rr_theme->a_focused_pressed_iconify :
131 (self->iconify_hover ?
132 ob_rr_theme->a_hover_focused_iconify :
133 ob_rr_theme->a_focused_unpressed_iconify)));
134 d = (!(self->decorations & OB_FRAME_DECOR_ALLDESKTOPS) ?
135 ob_rr_theme->a_disabled_focused_desk :
136 (self->client->desktop == DESKTOP_ALL ?
137 (self->desk_press ?
138 ob_rr_theme->a_toggled_focused_pressed_desk :
139 (self->desk_hover ?
140 ob_rr_theme->a_toggled_hover_focused_desk :
141 ob_rr_theme->a_toggled_focused_unpressed_desk)) :
142 (self->desk_press ?
143 ob_rr_theme->a_focused_pressed_desk :
144 (self->desk_hover ?
145 ob_rr_theme->a_hover_focused_desk :
146 ob_rr_theme->a_focused_unpressed_desk))));
147 s = (!(self->decorations & OB_FRAME_DECOR_SHADE) ?
148 ob_rr_theme->a_disabled_focused_shade :
149 (self->client->shaded ?
150 (self->shade_press ?
151 ob_rr_theme->a_toggled_focused_pressed_shade :
152 (self->shade_hover ?
153 ob_rr_theme->a_toggled_hover_focused_shade :
154 ob_rr_theme->a_toggled_focused_unpressed_shade)) :
155 (self->shade_press ?
156 ob_rr_theme->a_focused_pressed_shade :
157 (self->shade_hover ?
158 ob_rr_theme->a_hover_focused_shade :
159 ob_rr_theme->a_focused_unpressed_shade))));
160 c = (!(self->decorations & OB_FRAME_DECOR_CLOSE) ?
161 ob_rr_theme->a_disabled_focused_close :
162 (self->close_press ?
163 ob_rr_theme->a_focused_pressed_close :
164 (self->close_hover ?
165 ob_rr_theme->a_hover_focused_close :
166 ob_rr_theme->a_focused_unpressed_close)));
167 } else {
168 t = self->a_unfocused_title;
169 l = self->a_unfocused_label;
170 m = (!(self->decorations & OB_FRAME_DECOR_MAXIMIZE) ?
171 ob_rr_theme->a_disabled_unfocused_max :
172 (self->client->max_vert || self->client->max_horz ?
173 (self->max_press ?
174 ob_rr_theme->a_toggled_unfocused_pressed_max :
175 (self->max_hover ?
176 ob_rr_theme->a_toggled_hover_unfocused_max :
177 ob_rr_theme->a_toggled_unfocused_unpressed_max)) :
178 (self->max_press ?
179 ob_rr_theme->a_unfocused_pressed_max :
180 (self->max_hover ?
181 ob_rr_theme->a_hover_unfocused_max :
182 ob_rr_theme->a_unfocused_unpressed_max))));
183 n = self->a_icon;
184 i = (!(self->decorations & OB_FRAME_DECOR_ICONIFY) ?
185 ob_rr_theme->a_disabled_unfocused_iconify :
186 (self->iconify_press ?
187 ob_rr_theme->a_unfocused_pressed_iconify :
188 (self->iconify_hover ?
189 ob_rr_theme->a_hover_unfocused_iconify :
190 ob_rr_theme->a_unfocused_unpressed_iconify)));
191 d = (!(self->decorations & OB_FRAME_DECOR_ALLDESKTOPS) ?
192 ob_rr_theme->a_disabled_unfocused_desk :
193 (self->client->desktop == DESKTOP_ALL ?
194 (self->desk_press ?
195 ob_rr_theme->a_toggled_unfocused_pressed_desk :
196 (self->desk_hover ?
197 ob_rr_theme->a_toggled_hover_unfocused_desk :
198 ob_rr_theme->a_toggled_unfocused_unpressed_desk)) :
199 (self->desk_press ?
200 ob_rr_theme->a_unfocused_pressed_desk :
201 (self->desk_hover ?
202 ob_rr_theme->a_hover_unfocused_desk :
203 ob_rr_theme->a_unfocused_unpressed_desk))));
204 s = (!(self->decorations & OB_FRAME_DECOR_SHADE) ?
205 ob_rr_theme->a_disabled_unfocused_shade :
206 (self->client->shaded ?
207 (self->shade_press ?
208 ob_rr_theme->a_toggled_unfocused_pressed_shade :
209 (self->shade_hover ?
210 ob_rr_theme->a_toggled_hover_unfocused_shade :
211 ob_rr_theme->a_toggled_unfocused_unpressed_shade)) :
212 (self->shade_press ?
213 ob_rr_theme->a_unfocused_pressed_shade :
214 (self->shade_hover ?
215 ob_rr_theme->a_hover_unfocused_shade :
216 ob_rr_theme->a_unfocused_unpressed_shade))));
217 c = (!(self->decorations & OB_FRAME_DECOR_CLOSE) ?
218 ob_rr_theme->a_disabled_unfocused_close :
219 (self->close_press ?
220 ob_rr_theme->a_unfocused_pressed_close :
221 (self->close_hover ?
222 ob_rr_theme->a_hover_unfocused_close :
223 ob_rr_theme->a_unfocused_unpressed_close)));
224 }
225 clear = ob_rr_theme->a_clear;
226
227 RrPaint(t, self->title, self->width, ob_rr_theme->title_height);
228
229 clear->surface.parent = t;
230 clear->surface.parenty = 0;
231
232 clear->surface.parentx = ob_rr_theme->grip_width;
233
234 RrPaint(clear, self->topresize,
235 self->width - ob_rr_theme->grip_width * 2,
236 ob_rr_theme->paddingy + 1);
237
238 clear->surface.parentx = 0;
239
240 if (ob_rr_theme->grip_width > 0)
241 RrPaint(clear, self->tltresize,
242 ob_rr_theme->grip_width, ob_rr_theme->paddingy + 1);
243 if (ob_rr_theme->title_height > 0)
244 RrPaint(clear, self->tllresize,
245 ob_rr_theme->paddingx + 1, ob_rr_theme->title_height);
246
247 clear->surface.parentx = self->width - ob_rr_theme->grip_width;
248
249 if (ob_rr_theme->grip_width > 0)
250 RrPaint(clear, self->trtresize,
251 ob_rr_theme->grip_width, ob_rr_theme->paddingy + 1);
252
253 clear->surface.parentx = self->width - (ob_rr_theme->paddingx + 1);
254
255 if (ob_rr_theme->title_height > 0)
256 RrPaint(clear, self->trrresize,
257 ob_rr_theme->paddingx + 1, ob_rr_theme->title_height);
258
259 /* set parents for any parent relative guys */
260 l->surface.parent = t;
261 l->surface.parentx = self->label_x;
262 l->surface.parenty = ob_rr_theme->paddingy;
263
264 m->surface.parent = t;
265 m->surface.parentx = self->max_x;
266 m->surface.parenty = ob_rr_theme->paddingy + 1;
267
268 n->surface.parent = t;
269 n->surface.parentx = self->icon_x;
270 n->surface.parenty = ob_rr_theme->paddingy;
271
272 i->surface.parent = t;
273 i->surface.parentx = self->iconify_x;
274 i->surface.parenty = ob_rr_theme->paddingy + 1;
275
276 d->surface.parent = t;
277 d->surface.parentx = self->desk_x;
278 d->surface.parenty = ob_rr_theme->paddingy + 1;
279
280 s->surface.parent = t;
281 s->surface.parentx = self->shade_x;
282 s->surface.parenty = ob_rr_theme->paddingy + 1;
283
284 c->surface.parent = t;
285 c->surface.parentx = self->close_x;
286 c->surface.parenty = ob_rr_theme->paddingy + 1;
287
288 framerender_label(self, l);
289 framerender_max(self, m);
290 framerender_icon(self, n);
291 framerender_iconify(self, i);
292 framerender_desk(self, d);
293 framerender_shade(self, s);
294 framerender_close(self, c);
295 }
296
297 if (self->decorations & OB_FRAME_DECOR_HANDLE &&
298 ob_rr_theme->handle_height > 0)
299 {
300 RrAppearance *h, *g;
301
302 h = (self->focused ?
303 self->a_focused_handle : self->a_unfocused_handle);
304
305 RrPaint(h, self->handle, self->width, ob_rr_theme->handle_height);
306
307 if (self->decorations & OB_FRAME_DECOR_GRIPS) {
308 g = (self->focused ?
309 ob_rr_theme->a_focused_grip : ob_rr_theme->a_unfocused_grip);
310
311 if (g->surface.grad == RR_SURFACE_PARENTREL)
312 g->surface.parent = h;
313
314 g->surface.parentx = 0;
315 g->surface.parenty = 0;
316
317 RrPaint(g, self->lgrip,
318 ob_rr_theme->grip_width, ob_rr_theme->handle_height);
319
320 g->surface.parentx = self->width - ob_rr_theme->grip_width;
321 g->surface.parenty = 0;
322
323 RrPaint(g, self->rgrip,
324 ob_rr_theme->grip_width, ob_rr_theme->handle_height);
325 }
326 }
327
328 XFlush(ob_display);
329 }
330
331 static void framerender_label(ObFrame *self, RrAppearance *a)
332 {
333 if (!self->label_on) return;
334 /* set the texture's text! */
335 a->texture[0].data.text.string = self->client->title;
336 RrPaint(a, self->label, self->label_width, ob_rr_theme->label_height);
337 }
338
339 static void framerender_icon(ObFrame *self, RrAppearance *a)
340 {
341 const ObClientIcon *icon;
342
343 if (!self->icon_on) return;
344
345 icon = client_icon(self->client,
346 ob_rr_theme->button_size + 2,
347 ob_rr_theme->button_size + 2);
348 if (icon) {
349 a->texture[0].type = RR_TEXTURE_RGBA;
350 a->texture[0].data.rgba.width = icon->width;
351 a->texture[0].data.rgba.height = icon->height;
352 a->texture[0].data.rgba.alpha = 0xff;
353 a->texture[0].data.rgba.data = icon->data;
354 } else
355 a->texture[0].type = RR_TEXTURE_NONE;
356
357 RrPaint(a, self->icon,
358 ob_rr_theme->button_size + 2, ob_rr_theme->button_size + 2);
359 }
360
361 static void framerender_max(ObFrame *self, RrAppearance *a)
362 {
363 if (!self->max_on) return;
364 RrPaint(a, self->max, ob_rr_theme->button_size, ob_rr_theme->button_size);
365 }
366
367 static void framerender_iconify(ObFrame *self, RrAppearance *a)
368 {
369 if (!self->iconify_on) return;
370 RrPaint(a, self->iconify,
371 ob_rr_theme->button_size, ob_rr_theme->button_size);
372 }
373
374 static void framerender_desk(ObFrame *self, RrAppearance *a)
375 {
376 if (!self->desk_on) return;
377 RrPaint(a, self->desk, ob_rr_theme->button_size, ob_rr_theme->button_size);
378 }
379
380 static void framerender_shade(ObFrame *self, RrAppearance *a)
381 {
382 if (!self->shade_on) return;
383 RrPaint(a, self->shade,
384 ob_rr_theme->button_size, ob_rr_theme->button_size);
385 }
386
387 static void framerender_close(ObFrame *self, RrAppearance *a)
388 {
389 if (!self->close_on) return;
390 RrPaint(a, self->close,
391 ob_rr_theme->button_size, ob_rr_theme->button_size);
392 }
This page took 0.05131 seconds and 5 git commands to generate.