1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 focus_cycle_indicator.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.
20 #include "focus_cycle.h"
21 #include "focus_cycle_indicator.h"
26 #include "obrender/render.h"
31 #define FOCUS_INDICATOR_WIDTH 6
35 ObInternalWindow *top;
36 ObInternalWindow *left;
37 ObInternalWindow *right;
38 ObInternalWindow *bottom;
41 static RrAppearance *a_focus_indicator;
42 static RrColor *color_white;
43 static gboolean visible;
45 static Window create_window(Window parent, gint depth, gulong mask,
46 XSetWindowAttributes *attrib)
48 return XCreateWindow(obt_display, parent, 0, 0, 1, 1, 0,
54 void focus_cycle_indicator_startup(gboolean reconfig)
58 XSetWindowAttributes attr;
64 depth = RrDepth(ob_rr_inst);
65 attr.override_redirect = True;
66 attr.background_pixel = BlackPixel(obt_display, ob_screen);
68 w = create_window(obt_root(ob_screen), depth,
69 CWOverrideRedirect | CWBackPixel, &attr);
70 focus_indicator.top = window_internal_new(w, depth);
71 w = create_window(obt_root(ob_screen), depth,
72 CWOverrideRedirect | CWBackPixel, &attr);
73 focus_indicator.left = window_internal_new(w, depth);
74 w = create_window(obt_root(ob_screen), depth,
75 CWOverrideRedirect | CWBackPixel, &attr);
76 focus_indicator.right = window_internal_new(w, depth);
77 w = create_window(obt_root(ob_screen), depth,
78 CWOverrideRedirect | CWBackPixel, &attr);
79 focus_indicator.bottom = window_internal_new(w, depth);
81 stacking_add(INTERNAL_AS_WINDOW(focus_indicator.top));
82 stacking_add(INTERNAL_AS_WINDOW(focus_indicator.left));
83 stacking_add(INTERNAL_AS_WINDOW(focus_indicator.right));
84 stacking_add(INTERNAL_AS_WINDOW(focus_indicator.bottom));
85 window_add(&focus_indicator.top->window,
86 INTERNAL_AS_WINDOW(focus_indicator.top));
87 window_add(&focus_indicator.left->window,
88 INTERNAL_AS_WINDOW(focus_indicator.left));
89 window_add(&focus_indicator.right->window,
90 INTERNAL_AS_WINDOW(focus_indicator.right));
91 window_add(&focus_indicator.bottom->window,
92 INTERNAL_AS_WINDOW(focus_indicator.bottom));
94 color_white = RrColorNew(ob_rr_inst, 0xff, 0xff, 0xff);
96 a_focus_indicator = RrAppearanceNew(ob_rr_inst, 4);
97 a_focus_indicator->surface.grad = RR_SURFACE_SOLID;
98 a_focus_indicator->surface.relief = RR_RELIEF_FLAT;
99 a_focus_indicator->surface.primary = RrColorNew(ob_rr_inst,
101 a_focus_indicator->texture[0].type = RR_TEXTURE_LINE_ART;
102 a_focus_indicator->texture[0].data.lineart.color = color_white;
103 a_focus_indicator->texture[1].type = RR_TEXTURE_LINE_ART;
104 a_focus_indicator->texture[1].data.lineart.color = color_white;
105 a_focus_indicator->texture[2].type = RR_TEXTURE_LINE_ART;
106 a_focus_indicator->texture[2].data.lineart.color = color_white;
107 a_focus_indicator->texture[3].type = RR_TEXTURE_LINE_ART;
108 a_focus_indicator->texture[3].data.lineart.color = color_white;
111 void focus_cycle_indicator_shutdown(gboolean reconfig)
113 if (reconfig) return;
115 RrColorFree(color_white);
117 RrAppearanceFree(a_focus_indicator);
119 window_cleanup(INTERNAL_AS_WINDOW(focus_indicator.top));
120 window_cleanup(INTERNAL_AS_WINDOW(focus_indicator.left));
121 window_cleanup(INTERNAL_AS_WINDOW(focus_indicator.right));
122 window_cleanup(INTERNAL_AS_WINDOW(focus_indicator.bottom));
124 window_remove(focus_indicator.top->window);
125 window_remove(focus_indicator.left->window);
126 window_remove(focus_indicator.right->window);
127 window_remove(focus_indicator.bottom->window);
129 stacking_remove(INTERNAL_AS_WINDOW(focus_indicator.top));
130 stacking_remove(INTERNAL_AS_WINDOW(focus_indicator.left));
131 stacking_remove(INTERNAL_AS_WINDOW(focus_indicator.right));
132 stacking_remove(INTERNAL_AS_WINDOW(focus_indicator.bottom));
134 XDestroyWindow(obt_display, focus_indicator.top->window);
135 XDestroyWindow(obt_display, focus_indicator.left->window);
136 XDestroyWindow(obt_display, focus_indicator.right->window);
137 XDestroyWindow(obt_display, focus_indicator.bottom->window);
139 window_free(INTERNAL_AS_WINDOW(focus_indicator.top));
140 window_free(INTERNAL_AS_WINDOW(focus_indicator.left));
141 window_free(INTERNAL_AS_WINDOW(focus_indicator.right));
142 window_free(INTERNAL_AS_WINDOW(focus_indicator.bottom));
145 void focus_cycle_update_indicator(ObClient *c)
148 focus_cycle_draw_indicator(c);
151 void focus_cycle_draw_indicator(ObClient *c)
156 /* kill enter events cause by this unmapping */
157 ignore_start = event_start_ignore_all_enters();
159 XUnmapWindow(obt_display, focus_indicator.top->window);
160 XUnmapWindow(obt_display, focus_indicator.left->window);
161 XUnmapWindow(obt_display, focus_indicator.right->window);
162 XUnmapWindow(obt_display, focus_indicator.bottom->window);
164 event_end_ignore_all_enters(ignore_start);
171 frame_adjust_focus(c->frame, FALSE);
172 frame_adjust_focus(c->frame, TRUE);
178 wt = wl = wr = wb = FOCUS_INDICATOR_WIDTH;
180 x = c->frame->area.x;
181 y = c->frame->area.y;
182 w = c->frame->area.width;
185 /* kill enter events cause by this moving */
186 ignore_start = event_start_ignore_all_enters();
188 XMoveResizeWindow(obt_display, focus_indicator.top->window,
190 a_focus_indicator->texture[0].data.lineart.x1 = 0;
191 a_focus_indicator->texture[0].data.lineart.y1 = h-1;
192 a_focus_indicator->texture[0].data.lineart.x2 = 0;
193 a_focus_indicator->texture[0].data.lineart.y2 = 0;
194 a_focus_indicator->texture[1].data.lineart.x1 = 0;
195 a_focus_indicator->texture[1].data.lineart.y1 = 0;
196 a_focus_indicator->texture[1].data.lineart.x2 = w-1;
197 a_focus_indicator->texture[1].data.lineart.y2 = 0;
198 a_focus_indicator->texture[2].data.lineart.x1 = w-1;
199 a_focus_indicator->texture[2].data.lineart.y1 = 0;
200 a_focus_indicator->texture[2].data.lineart.x2 = w-1;
201 a_focus_indicator->texture[2].data.lineart.y2 = h-1;
202 a_focus_indicator->texture[3].data.lineart.x1 = (wl-1);
203 a_focus_indicator->texture[3].data.lineart.y1 = h-1;
204 a_focus_indicator->texture[3].data.lineart.x2 = w - wr;
205 a_focus_indicator->texture[3].data.lineart.y2 = h-1;
206 RrPaint(a_focus_indicator, focus_indicator.top->window,
209 x = c->frame->area.x;
210 y = c->frame->area.y;
212 h = c->frame->area.height;
214 XMoveResizeWindow(obt_display, focus_indicator.left->window,
216 a_focus_indicator->texture[0].data.lineart.x1 = w-1;
217 a_focus_indicator->texture[0].data.lineart.y1 = 0;
218 a_focus_indicator->texture[0].data.lineart.x2 = 0;
219 a_focus_indicator->texture[0].data.lineart.y2 = 0;
220 a_focus_indicator->texture[1].data.lineart.x1 = 0;
221 a_focus_indicator->texture[1].data.lineart.y1 = 0;
222 a_focus_indicator->texture[1].data.lineart.x2 = 0;
223 a_focus_indicator->texture[1].data.lineart.y2 = h-1;
224 a_focus_indicator->texture[2].data.lineart.x1 = 0;
225 a_focus_indicator->texture[2].data.lineart.y1 = h-1;
226 a_focus_indicator->texture[2].data.lineart.x2 = w-1;
227 a_focus_indicator->texture[2].data.lineart.y2 = h-1;
228 a_focus_indicator->texture[3].data.lineart.x1 = w-1;
229 a_focus_indicator->texture[3].data.lineart.y1 = wt-1;
230 a_focus_indicator->texture[3].data.lineart.x2 = w-1;
231 a_focus_indicator->texture[3].data.lineart.y2 = h - wb;
232 RrPaint(a_focus_indicator, focus_indicator.left->window,
235 x = c->frame->area.x + c->frame->area.width - wr;
236 y = c->frame->area.y;
238 h = c->frame->area.height ;
240 XMoveResizeWindow(obt_display, focus_indicator.right->window,
242 a_focus_indicator->texture[0].data.lineart.x1 = 0;
243 a_focus_indicator->texture[0].data.lineart.y1 = 0;
244 a_focus_indicator->texture[0].data.lineart.x2 = w-1;
245 a_focus_indicator->texture[0].data.lineart.y2 = 0;
246 a_focus_indicator->texture[1].data.lineart.x1 = w-1;
247 a_focus_indicator->texture[1].data.lineart.y1 = 0;
248 a_focus_indicator->texture[1].data.lineart.x2 = w-1;
249 a_focus_indicator->texture[1].data.lineart.y2 = h-1;
250 a_focus_indicator->texture[2].data.lineart.x1 = w-1;
251 a_focus_indicator->texture[2].data.lineart.y1 = h-1;
252 a_focus_indicator->texture[2].data.lineart.x2 = 0;
253 a_focus_indicator->texture[2].data.lineart.y2 = h-1;
254 a_focus_indicator->texture[3].data.lineart.x1 = 0;
255 a_focus_indicator->texture[3].data.lineart.y1 = wt-1;
256 a_focus_indicator->texture[3].data.lineart.x2 = 0;
257 a_focus_indicator->texture[3].data.lineart.y2 = h - wb;
258 RrPaint(a_focus_indicator, focus_indicator.right->window,
261 x = c->frame->area.x;
262 y = c->frame->area.y + c->frame->area.height - wb;
263 w = c->frame->area.width;
266 XMoveResizeWindow(obt_display, focus_indicator.bottom->window,
268 a_focus_indicator->texture[0].data.lineart.x1 = 0;
269 a_focus_indicator->texture[0].data.lineart.y1 = 0;
270 a_focus_indicator->texture[0].data.lineart.x2 = 0;
271 a_focus_indicator->texture[0].data.lineart.y2 = h-1;
272 a_focus_indicator->texture[1].data.lineart.x1 = 0;
273 a_focus_indicator->texture[1].data.lineart.y1 = h-1;
274 a_focus_indicator->texture[1].data.lineart.x2 = w-1;
275 a_focus_indicator->texture[1].data.lineart.y2 = h-1;
276 a_focus_indicator->texture[2].data.lineart.x1 = w-1;
277 a_focus_indicator->texture[2].data.lineart.y1 = h-1;
278 a_focus_indicator->texture[2].data.lineart.x2 = w-1;
279 a_focus_indicator->texture[2].data.lineart.y2 = 0;
280 a_focus_indicator->texture[3].data.lineart.x1 = wl-1;
281 a_focus_indicator->texture[3].data.lineart.y1 = 0;
282 a_focus_indicator->texture[3].data.lineart.x2 = w - wr;
283 a_focus_indicator->texture[3].data.lineart.y2 = 0;
284 RrPaint(a_focus_indicator, focus_indicator.bottom->window,
287 XMapWindow(obt_display, focus_indicator.top->window);
288 XMapWindow(obt_display, focus_indicator.left->window);
289 XMapWindow(obt_display, focus_indicator.right->window);
290 XMapWindow(obt_display, focus_indicator.bottom->window);
292 event_end_ignore_all_enters(ignore_start);