1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 framerender.c for the Openbox window manager
4 Copyright (c) 2006 Mikael Magnusson
5 Copyright (c) 2003-2007 Dana Jansens
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.
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.
17 See the COPYING file for a copy of the GNU General Public License.
24 #include "framerender.h"
25 #include "render/theme.h"
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
);
35 void framerender_frame(ObFrame
*self
)
41 RrColorPixel(ob_rr_theme
->cb_focused_color
) :
42 RrColorPixel(ob_rr_theme
->cb_unfocused_color
));
43 XSetWindowBackground(ob_display
, self
->inner
, px
);
44 XClearWindow(ob_display
, self
->inner
);
47 RrColorPixel(ob_rr_theme
->frame_focused_border_color
) :
48 RrColorPixel(ob_rr_theme
->frame_unfocused_border_color
));
49 XSetWindowBorder(ob_display
, self
->window
, px
);
50 XSetWindowBorder(ob_display
, self
->title
, px
);
51 XSetWindowBorder(ob_display
, self
->handle
, px
);
52 XSetWindowBorder(ob_display
, self
->rgrip
, px
);
53 XSetWindowBorder(ob_display
, self
->lgrip
, px
);
54 XSetWindowBorder(ob_display
, self
->leftresize
, px
);
55 XSetWindowBorder(ob_display
, self
->rightresize
, px
);
58 if (self
->decorations
& OB_FRAME_DECOR_TITLEBAR
) {
59 RrAppearance
*t
, *l
, *m
, *n
, *i
, *d
, *s
, *c
;
62 t
= self
->a_focused_title
;
63 l
= self
->a_focused_label
;
65 m
= (!(self
->decorations
& OB_FRAME_DECOR_MAXIMIZE
) ?
66 ob_rr_theme
->a_disabled_focused_max
:
67 (self
->client
->max_vert
|| self
->client
->max_horz
?
69 ob_rr_theme
->a_toggled_focused_pressed_max
:
71 ob_rr_theme
->a_toggled_hover_focused_max
:
72 ob_rr_theme
->a_toggled_focused_unpressed_max
)) :
74 ob_rr_theme
->a_focused_pressed_max
:
76 ob_rr_theme
->a_hover_focused_max
:
77 ob_rr_theme
->a_focused_unpressed_max
))));
79 i
= (!(self
->decorations
& OB_FRAME_DECOR_ICONIFY
) ?
80 ob_rr_theme
->a_disabled_focused_iconify
:
81 (self
->iconify_press
?
82 ob_rr_theme
->a_focused_pressed_iconify
:
83 (self
->iconify_hover
?
84 ob_rr_theme
->a_hover_focused_iconify
:
85 ob_rr_theme
->a_focused_unpressed_iconify
)));
86 d
= (!(self
->decorations
& OB_FRAME_DECOR_ALLDESKTOPS
) ?
87 ob_rr_theme
->a_disabled_focused_desk
:
88 (self
->client
->desktop
== DESKTOP_ALL
?
90 ob_rr_theme
->a_toggled_focused_pressed_desk
:
92 ob_rr_theme
->a_toggled_hover_focused_desk
:
93 ob_rr_theme
->a_toggled_focused_unpressed_desk
)) :
95 ob_rr_theme
->a_focused_pressed_desk
:
97 ob_rr_theme
->a_hover_focused_desk
:
98 ob_rr_theme
->a_focused_unpressed_desk
))));
99 s
= (!(self
->decorations
& OB_FRAME_DECOR_SHADE
) ?
100 ob_rr_theme
->a_disabled_focused_shade
:
101 (self
->client
->shaded
?
103 ob_rr_theme
->a_toggled_focused_pressed_shade
:
105 ob_rr_theme
->a_toggled_hover_focused_shade
:
106 ob_rr_theme
->a_toggled_focused_unpressed_shade
)) :
108 ob_rr_theme
->a_focused_pressed_shade
:
110 ob_rr_theme
->a_hover_focused_shade
:
111 ob_rr_theme
->a_focused_unpressed_shade
))));
112 c
= (!(self
->decorations
& OB_FRAME_DECOR_CLOSE
) ?
113 ob_rr_theme
->a_disabled_focused_close
:
115 ob_rr_theme
->a_focused_pressed_close
:
117 ob_rr_theme
->a_hover_focused_close
:
118 ob_rr_theme
->a_focused_unpressed_close
)));
120 t
= self
->a_unfocused_title
;
121 l
= self
->a_unfocused_label
;
122 m
= (!(self
->decorations
& OB_FRAME_DECOR_MAXIMIZE
) ?
123 ob_rr_theme
->a_disabled_unfocused_max
:
124 (self
->client
->max_vert
|| self
->client
->max_horz
?
126 ob_rr_theme
->a_toggled_unfocused_pressed_max
:
128 ob_rr_theme
->a_toggled_hover_unfocused_max
:
129 ob_rr_theme
->a_toggled_unfocused_unpressed_max
)) :
131 ob_rr_theme
->a_unfocused_pressed_max
:
133 ob_rr_theme
->a_hover_unfocused_max
:
134 ob_rr_theme
->a_unfocused_unpressed_max
))));
136 i
= (!(self
->decorations
& OB_FRAME_DECOR_ICONIFY
) ?
137 ob_rr_theme
->a_disabled_unfocused_iconify
:
138 (self
->iconify_press
?
139 ob_rr_theme
->a_unfocused_pressed_iconify
:
140 (self
->iconify_hover
?
141 ob_rr_theme
->a_hover_unfocused_iconify
:
142 ob_rr_theme
->a_unfocused_unpressed_iconify
)));
143 d
= (!(self
->decorations
& OB_FRAME_DECOR_ALLDESKTOPS
) ?
144 ob_rr_theme
->a_disabled_unfocused_desk
:
145 (self
->client
->desktop
== DESKTOP_ALL
?
147 ob_rr_theme
->a_toggled_unfocused_pressed_desk
:
149 ob_rr_theme
->a_toggled_hover_unfocused_desk
:
150 ob_rr_theme
->a_toggled_unfocused_unpressed_desk
)) :
152 ob_rr_theme
->a_unfocused_pressed_desk
:
154 ob_rr_theme
->a_hover_unfocused_desk
:
155 ob_rr_theme
->a_unfocused_unpressed_desk
))));
156 s
= (!(self
->decorations
& OB_FRAME_DECOR_SHADE
) ?
157 ob_rr_theme
->a_disabled_unfocused_shade
:
158 (self
->client
->shaded
?
160 ob_rr_theme
->a_toggled_unfocused_pressed_shade
:
162 ob_rr_theme
->a_toggled_hover_unfocused_shade
:
163 ob_rr_theme
->a_toggled_unfocused_unpressed_shade
)) :
165 ob_rr_theme
->a_unfocused_pressed_shade
:
167 ob_rr_theme
->a_hover_unfocused_shade
:
168 ob_rr_theme
->a_unfocused_unpressed_shade
))));
169 c
= (!(self
->decorations
& OB_FRAME_DECOR_CLOSE
) ?
170 ob_rr_theme
->a_disabled_unfocused_close
:
172 ob_rr_theme
->a_unfocused_pressed_close
:
174 ob_rr_theme
->a_hover_unfocused_close
:
175 ob_rr_theme
->a_unfocused_unpressed_close
)));
178 RrPaint(t
, self
->title
, self
->width
, ob_rr_theme
->title_height
);
180 ob_rr_theme
->a_clear
->surface
.parent
= t
;
181 ob_rr_theme
->a_clear
->surface
.parenty
= 0;
183 ob_rr_theme
->a_clear
->surface
.parentx
= ob_rr_theme
->grip_width
+
185 RrPaint(ob_rr_theme
->a_clear
, self
->topresize
,
186 self
->width
- (ob_rr_theme
->grip_width
+ self
->bwidth
) * 2,
187 ob_rr_theme
->paddingy
+ 1);
189 ob_rr_theme
->a_clear
->surface
.parentx
= 0;
191 if (ob_rr_theme
->grip_width
> 0)
192 RrPaint(ob_rr_theme
->a_clear
, self
->tltresize
,
193 ob_rr_theme
->grip_width
, ob_rr_theme
->paddingy
+ 1);
194 if (ob_rr_theme
->title_height
> 0)
195 RrPaint(ob_rr_theme
->a_clear
, self
->tllresize
,
196 ob_rr_theme
->paddingx
+ 1, ob_rr_theme
->title_height
);
198 ob_rr_theme
->a_clear
->surface
.parentx
=
199 self
->width
- ob_rr_theme
->grip_width
;
201 if (ob_rr_theme
->grip_width
> 0)
202 RrPaint(ob_rr_theme
->a_clear
, self
->trtresize
,
203 ob_rr_theme
->grip_width
, ob_rr_theme
->paddingy
+ 1);
205 ob_rr_theme
->a_clear
->surface
.parentx
=
206 self
->width
- (ob_rr_theme
->paddingx
+ 1);
208 if (ob_rr_theme
->title_height
> 0)
209 RrPaint(ob_rr_theme
->a_clear
, self
->trrresize
,
210 ob_rr_theme
->paddingx
+ 1, ob_rr_theme
->title_height
);
212 /* set parents for any parent relative guys */
213 l
->surface
.parent
= t
;
214 l
->surface
.parentx
= self
->label_x
;
215 l
->surface
.parenty
= ob_rr_theme
->paddingy
;
217 m
->surface
.parent
= t
;
218 m
->surface
.parentx
= self
->max_x
;
219 m
->surface
.parenty
= ob_rr_theme
->paddingy
+ 1;
221 n
->surface
.parent
= t
;
222 n
->surface
.parentx
= self
->icon_x
;
223 n
->surface
.parenty
= ob_rr_theme
->paddingy
;
225 i
->surface
.parent
= t
;
226 i
->surface
.parentx
= self
->iconify_x
;
227 i
->surface
.parenty
= ob_rr_theme
->paddingy
+ 1;
229 d
->surface
.parent
= t
;
230 d
->surface
.parentx
= self
->desk_x
;
231 d
->surface
.parenty
= ob_rr_theme
->paddingy
+ 1;
233 s
->surface
.parent
= t
;
234 s
->surface
.parentx
= self
->shade_x
;
235 s
->surface
.parenty
= ob_rr_theme
->paddingy
+ 1;
237 c
->surface
.parent
= t
;
238 c
->surface
.parentx
= self
->close_x
;
239 c
->surface
.parenty
= ob_rr_theme
->paddingy
+ 1;
241 framerender_label(self
, l
);
242 framerender_max(self
, m
);
243 framerender_icon(self
, n
);
244 framerender_iconify(self
, i
);
245 framerender_desk(self
, d
);
246 framerender_shade(self
, s
);
247 framerender_close(self
, c
);
250 if (self
->decorations
& OB_FRAME_DECOR_HANDLE
&&
251 ob_rr_theme
->handle_height
> 0)
256 self
->a_focused_handle
: self
->a_unfocused_handle
);
258 RrPaint(h
, self
->handle
, self
->width
, ob_rr_theme
->handle_height
);
260 if (self
->decorations
& OB_FRAME_DECOR_GRIPS
) {
262 ob_rr_theme
->a_focused_grip
: ob_rr_theme
->a_unfocused_grip
);
264 if (g
->surface
.grad
== RR_SURFACE_PARENTREL
)
265 g
->surface
.parent
= h
;
267 g
->surface
.parentx
= 0;
268 g
->surface
.parenty
= 0;
270 RrPaint(g
, self
->lgrip
,
271 ob_rr_theme
->grip_width
, ob_rr_theme
->handle_height
);
273 g
->surface
.parentx
= self
->width
- ob_rr_theme
->grip_width
;
274 g
->surface
.parenty
= 0;
276 RrPaint(g
, self
->rgrip
,
277 ob_rr_theme
->grip_width
, ob_rr_theme
->handle_height
);
284 static void framerender_label(ObFrame
*self
, RrAppearance
*a
)
286 if (!self
->label_on
) return;
287 /* set the texture's text! */
288 a
->texture
[0].data
.text
.string
= self
->client
->title
;
289 RrPaint(a
, self
->label
, self
->label_width
, ob_rr_theme
->label_height
);
292 static void framerender_icon(ObFrame
*self
, RrAppearance
*a
)
294 const ObClientIcon
*icon
;
296 if (!self
->icon_on
) return;
298 icon
= client_icon(self
->client
,
299 ob_rr_theme
->button_size
+ 2,
300 ob_rr_theme
->button_size
+ 2);
302 a
->texture
[0].type
= RR_TEXTURE_RGBA
;
303 a
->texture
[0].data
.rgba
.width
= icon
->width
;
304 a
->texture
[0].data
.rgba
.height
= icon
->height
;
305 a
->texture
[0].data
.rgba
.data
= icon
->data
;
307 a
->texture
[0].type
= RR_TEXTURE_NONE
;
309 RrPaint(a
, self
->icon
,
310 ob_rr_theme
->button_size
+ 2, ob_rr_theme
->button_size
+ 2);
313 static void framerender_max(ObFrame
*self
, RrAppearance
*a
)
315 if (!self
->max_on
) return;
316 RrPaint(a
, self
->max
, ob_rr_theme
->button_size
, ob_rr_theme
->button_size
);
319 static void framerender_iconify(ObFrame
*self
, RrAppearance
*a
)
321 if (!self
->iconify_on
) return;
322 RrPaint(a
, self
->iconify
,
323 ob_rr_theme
->button_size
, ob_rr_theme
->button_size
);
326 static void framerender_desk(ObFrame
*self
, RrAppearance
*a
)
328 if (!self
->desk_on
) return;
329 RrPaint(a
, self
->desk
, ob_rr_theme
->button_size
, ob_rr_theme
->button_size
);
332 static void framerender_shade(ObFrame
*self
, RrAppearance
*a
)
334 if (!self
->shade_on
) return;
335 RrPaint(a
, self
->shade
,
336 ob_rr_theme
->button_size
, ob_rr_theme
->button_size
);
339 static void framerender_close(ObFrame
*self
, RrAppearance
*a
)
341 if (!self
->close_on
) return;
342 RrPaint(a
, self
->close
,
343 ob_rr_theme
->button_size
, ob_rr_theme
->button_size
);