]> icculus.org git repositories - mikachu/openbox.git/blob - openbox/framerender.c
invisible resizing areas/grips in the top corners of the window
[mikachu/openbox.git] / openbox / framerender.c
1 #include "frame.h"
2 #include "openbox.h"
3 #include "screen.h"
4 #include "client.h"
5 #include "framerender.h"
6 #include "render/theme.h"
7
8 static void framerender_label(ObFrame *self, RrAppearance *a);
9 static void framerender_icon(ObFrame *self, RrAppearance *a);
10 static void framerender_max(ObFrame *self, RrAppearance *a);
11 static void framerender_iconify(ObFrame *self, RrAppearance *a);
12 static void framerender_desk(ObFrame *self, RrAppearance *a);
13 static void framerender_shade(ObFrame *self, RrAppearance *a);
14 static void framerender_close(ObFrame *self, RrAppearance *a);
15
16 void framerender_frame(ObFrame *self)
17 {
18     if (self->focused)
19         XSetWindowBorder(ob_display, self->plate,
20                          RrColorPixel(ob_rr_theme->cb_focused_color));
21     else
22         XSetWindowBorder(ob_display, self->plate,
23                          RrColorPixel(ob_rr_theme->cb_unfocused_color));
24
25     if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
26         RrAppearance *t, *l, *m, *n, *i, *d, *s, *c;
27
28         t = (self->focused ?
29              self->a_focused_title : self->a_unfocused_title);
30         l = (self->focused ?
31              self->a_focused_label : self->a_unfocused_label);
32         m = (!(self->decorations & OB_FRAME_DECOR_MAXIMIZE) ?
33              (self->focused ?
34               ob_rr_theme->a_disabled_focused_max :
35               ob_rr_theme->a_disabled_unfocused_max) :
36              (self->focused ?
37               (self->client->max_vert || self->client->max_horz ?
38                ob_rr_theme->a_toggled_focused_max :
39                (self->max_press ?
40                 ob_rr_theme->a_focused_pressed_max :
41                 (self->max_hover ?
42                  ob_rr_theme->a_hover_focused_max : 
43                  ob_rr_theme->a_focused_unpressed_max))) :
44               (self->client->max_vert || self->client->max_horz ?
45                ob_rr_theme->a_toggled_unfocused_max :
46                (self->max_press ?
47                 ob_rr_theme->a_unfocused_pressed_max :
48                 (self->max_hover ?
49                  ob_rr_theme->a_hover_unfocused_max : 
50                  ob_rr_theme->a_unfocused_unpressed_max)))));
51         n = self->a_icon;
52         i = (!(self->decorations & OB_FRAME_DECOR_ICONIFY) ?
53              (self->focused ?
54               ob_rr_theme->a_disabled_focused_iconify :
55               ob_rr_theme->a_disabled_unfocused_iconify) :
56              (self->focused ?
57               (self->iconify_press ?
58                ob_rr_theme->a_focused_pressed_iconify :
59                (self->iconify_hover ?
60                 ob_rr_theme->a_hover_focused_iconify : 
61                 ob_rr_theme->a_focused_unpressed_iconify)) :
62               (self->iconify_press ?
63                ob_rr_theme->a_unfocused_pressed_iconify :
64                (self->iconify_hover ?
65                 ob_rr_theme->a_hover_unfocused_iconify : 
66                 ob_rr_theme->a_unfocused_unpressed_iconify))));
67         d = (!(self->decorations & OB_FRAME_DECOR_ALLDESKTOPS) ?
68              (self->focused ?
69               ob_rr_theme->a_disabled_focused_desk :
70               ob_rr_theme->a_disabled_unfocused_desk) :
71              (self->focused ?
72               (self->client->desktop == DESKTOP_ALL ?
73                ob_rr_theme->a_toggled_focused_desk :
74                (self->desk_press ?
75                 ob_rr_theme->a_focused_pressed_desk :
76                 (self->desk_hover ?
77                  ob_rr_theme->a_hover_focused_desk : 
78                  ob_rr_theme->a_focused_unpressed_desk))) :
79               (self->client->desktop == DESKTOP_ALL ?
80                ob_rr_theme->a_toggled_unfocused_desk :
81                (self->desk_press ?
82                 ob_rr_theme->a_unfocused_pressed_desk :
83                 (self->desk_hover ?
84                  ob_rr_theme->a_hover_unfocused_desk : 
85                  ob_rr_theme->a_unfocused_unpressed_desk)))));
86         s = (!(self->decorations & OB_FRAME_DECOR_SHADE) ?
87              (self->focused ?
88               ob_rr_theme->a_disabled_focused_shade :
89               ob_rr_theme->a_disabled_unfocused_shade) :
90              (self->focused ?
91               (self->client->shaded ?
92                ob_rr_theme->a_toggled_focused_shade :
93                (self->shade_press ?
94                 ob_rr_theme->a_focused_pressed_shade :
95                 (self->shade_hover ?
96                  ob_rr_theme->a_hover_focused_shade : 
97                  ob_rr_theme->a_focused_unpressed_shade))) :
98               (self->client->shaded ?
99                ob_rr_theme->a_toggled_unfocused_shade :
100                (self->shade_press ?
101                 ob_rr_theme->a_unfocused_pressed_shade :
102                 (self->shade_hover ?
103                  ob_rr_theme->a_hover_unfocused_shade : 
104                  ob_rr_theme->a_unfocused_unpressed_shade)))));
105         c = (!(self->decorations & OB_FRAME_DECOR_CLOSE) ?
106              (self->focused ?
107               ob_rr_theme->a_disabled_focused_close :
108               ob_rr_theme->a_disabled_unfocused_close) :
109              (self->focused ?
110               (self->close_press ?
111                ob_rr_theme->a_focused_pressed_close :
112                (self->close_hover ?
113                 ob_rr_theme->a_hover_focused_close : 
114                 ob_rr_theme->a_focused_unpressed_close)) :
115               (self->close_press ?
116                ob_rr_theme->a_unfocused_pressed_close :
117                (self->close_hover ?
118                 ob_rr_theme->a_hover_unfocused_close : 
119                 ob_rr_theme->a_unfocused_unpressed_close))));
120
121         RrPaint(t, self->title, self->width, ob_rr_theme->title_height);
122
123         ob_rr_theme->a_clear->surface.parent = t;
124         ob_rr_theme->a_clear->surface.parentx = 0;
125         ob_rr_theme->a_clear->surface.parenty = 0;
126
127         RrPaint(ob_rr_theme->a_clear, self->tlresize,
128                 ob_rr_theme->grip_width, ob_rr_theme->handle_height);
129
130         ob_rr_theme->a_clear->surface.parentx =
131             self->width - ob_rr_theme->grip_width;
132
133         RrPaint(ob_rr_theme->a_clear, self->trresize,
134                 ob_rr_theme->grip_width, ob_rr_theme->handle_height);
135
136
137         /* set parents for any parent relative guys */
138         l->surface.parent = t;
139         l->surface.parentx = self->label_x;
140         l->surface.parenty = ob_rr_theme->bevel;
141
142         m->surface.parent = t;
143         m->surface.parentx = self->max_x;
144         m->surface.parenty = ob_rr_theme->bevel + 1;
145
146         n->surface.parent = t;
147         n->surface.parentx = self->icon_x;
148         n->surface.parenty = ob_rr_theme->bevel;
149
150         i->surface.parent = t;
151         i->surface.parentx = self->iconify_x;
152         i->surface.parenty = ob_rr_theme->bevel + 1;
153
154         d->surface.parent = t;
155         d->surface.parentx = self->desk_x;
156         d->surface.parenty = ob_rr_theme->bevel + 1;
157
158         s->surface.parent = t;
159         s->surface.parentx = self->shade_x;
160         s->surface.parenty = ob_rr_theme->bevel + 1;
161
162         c->surface.parent = t;
163         c->surface.parentx = self->close_x;
164         c->surface.parenty = ob_rr_theme->bevel + 1;
165
166         framerender_label(self, l);
167         framerender_max(self, m);
168         framerender_icon(self, n);
169         framerender_iconify(self, i);
170         framerender_desk(self, d);
171         framerender_shade(self, s);
172         framerender_close(self, c);
173     }
174
175     if (self->decorations & OB_FRAME_DECOR_HANDLE) {
176         RrAppearance *h, *g;
177
178         h = (self->focused ?
179              self->a_focused_handle : self->a_unfocused_handle);
180
181         RrPaint(h, self->handle, self->width, ob_rr_theme->handle_height);
182
183         if (self->decorations & OB_FRAME_DECOR_GRIPS) {
184             g = (self->focused ?
185                  ob_rr_theme->a_focused_grip : ob_rr_theme->a_unfocused_grip);
186
187             if (g->surface.grad == RR_SURFACE_PARENTREL)
188                 g->surface.parent = h;
189
190             g->surface.parentx = 0;
191             g->surface.parenty = 0;
192
193             RrPaint(g, self->lgrip,
194                     ob_rr_theme->grip_width, ob_rr_theme->handle_height);
195
196             g->surface.parentx = self->width - ob_rr_theme->grip_width;
197             g->surface.parenty = 0;
198
199             RrPaint(g, self->rgrip,
200                     ob_rr_theme->grip_width, ob_rr_theme->handle_height);
201         }
202     }
203 }
204
205 static void framerender_label(ObFrame *self, RrAppearance *a)
206 {
207     if (self->label_x < 0) return;
208     /* set the texture's text! */
209     a->texture[0].data.text.string = self->client->title;
210     RrPaint(a, self->label, self->label_width, ob_rr_theme->label_height);
211 }
212
213 static void framerender_icon(ObFrame *self, RrAppearance *a)
214 {
215     if (self->icon_x < 0) return;
216
217     if (self->client->nicons) {
218         ObClientIcon *icon = client_icon(self->client,
219                                          ob_rr_theme->button_size + 2,
220                                          ob_rr_theme->button_size + 2);
221         a->texture[0].type = RR_TEXTURE_RGBA;
222         a->texture[0].data.rgba.width = icon->width;
223         a->texture[0].data.rgba.height = icon->height;
224         a->texture[0].data.rgba.data = icon->data;
225     } else
226         a->texture[0].type = RR_TEXTURE_NONE;
227
228     RrPaint(a, self->icon,
229             ob_rr_theme->button_size + 2, ob_rr_theme->button_size + 2);
230 }
231
232 static void framerender_max(ObFrame *self, RrAppearance *a)
233 {
234     if (self->max_x < 0) return;
235     RrPaint(a, self->max, ob_rr_theme->button_size, ob_rr_theme->button_size);
236 }
237
238 static void framerender_iconify(ObFrame *self, RrAppearance *a)
239 {
240     if (self->iconify_x < 0) return;
241     RrPaint(a, self->iconify,
242             ob_rr_theme->button_size, ob_rr_theme->button_size);
243 }
244
245 static void framerender_desk(ObFrame *self, RrAppearance *a)
246 {
247     if (self->desk_x < 0) return;
248     RrPaint(a, self->desk, ob_rr_theme->button_size, ob_rr_theme->button_size);
249 }
250
251 static void framerender_shade(ObFrame *self, RrAppearance *a)
252 {
253     if (self->shade_x < 0) return;
254     RrPaint(a, self->shade,
255             ob_rr_theme->button_size, ob_rr_theme->button_size);
256 }
257
258 static void framerender_close(ObFrame *self, RrAppearance *a)
259 {
260     if (self->close_x < 0) return;
261     RrPaint(a, self->close,
262             ob_rr_theme->button_size, ob_rr_theme->button_size);
263 }