4 #include "moveresize.h"
9 #include "framerender.h"
17 Action
*action_new(void (*func
)(union ActionData
*data
))
19 Action
*a
= g_new0(Action
, 1);
25 void action_free(Action
*a
)
27 if (a
== NULL
) return;
29 /* deal with pointers */
30 if (a
->func
== action_execute
|| a
->func
== action_restart
)
31 g_free(a
->data
.execute
.path
);
32 else if (a
->func
== action_showmenu
)
33 g_free(a
->data
.showmenu
.name
);
38 Action
*action_from_string(char *name
)
41 if (!g_ascii_strcasecmp(name
, "execute")) {
42 a
= action_new(action_execute
);
43 } else if (!g_ascii_strcasecmp(name
, "focus")) {
44 a
= action_new(action_focus
);
45 } else if (!g_ascii_strcasecmp(name
, "unfocus")) {
46 a
= action_new(action_unfocus
);
47 } else if (!g_ascii_strcasecmp(name
, "iconify")) {
48 a
= action_new(action_iconify
);
49 } else if (!g_ascii_strcasecmp(name
, "raise")) {
50 a
= action_new(action_raise
);
51 } else if (!g_ascii_strcasecmp(name
, "lower")) {
52 a
= action_new(action_lower
);
53 } else if (!g_ascii_strcasecmp(name
, "focusraise")) {
54 a
= action_new(action_focusraise
);
55 } else if (!g_ascii_strcasecmp(name
, "close")) {
56 a
= action_new(action_close
);
57 } else if (!g_ascii_strcasecmp(name
, "kill")) {
58 a
= action_new(action_kill
);
59 } else if (!g_ascii_strcasecmp(name
, "shadelower")) {
60 a
= action_new(action_shadelower
);
61 } else if (!g_ascii_strcasecmp(name
, "unshaderaise")) {
62 a
= action_new(action_unshaderaise
);
63 } else if (!g_ascii_strcasecmp(name
, "shade")) {
64 a
= action_new(action_shade
);
65 } else if (!g_ascii_strcasecmp(name
, "unshade")) {
66 a
= action_new(action_unshade
);
67 } else if (!g_ascii_strcasecmp(name
, "toggleshade")) {
68 a
= action_new(action_toggle_shade
);
69 } else if (!g_ascii_strcasecmp(name
, "toggleomnipresent")) {
70 a
= action_new(action_toggle_omnipresent
);
71 } else if (!g_ascii_strcasecmp(name
, "moverelativehorz")) {
72 a
= action_new(action_move_relative_horz
);
73 } else if (!g_ascii_strcasecmp(name
, "moverelativevert")) {
74 a
= action_new(action_move_relative_vert
);
75 } else if (!g_ascii_strcasecmp(name
, "resizerelativehorz")) {
76 a
= action_new(action_resize_relative_horz
);
77 } else if (!g_ascii_strcasecmp(name
, "resizerelativevert")) {
78 a
= action_new(action_resize_relative_vert
);
79 } else if (!g_ascii_strcasecmp(name
, "maximizefull")) {
80 a
= action_new(action_maximize_full
);
81 } else if (!g_ascii_strcasecmp(name
, "unmaximizefull")) {
82 a
= action_new(action_unmaximize_full
);
83 } else if (!g_ascii_strcasecmp(name
, "togglemaximizefull")) {
84 a
= action_new(action_toggle_maximize_full
);
85 } else if (!g_ascii_strcasecmp(name
, "maximizehorz")) {
86 a
= action_new(action_maximize_horz
);
87 } else if (!g_ascii_strcasecmp(name
, "unmaximizehorz")) {
88 a
= action_new(action_unmaximize_horz
);
89 } else if (!g_ascii_strcasecmp(name
, "togglemaximizehorz")) {
90 a
= action_new(action_toggle_maximize_horz
);
91 } else if (!g_ascii_strcasecmp(name
, "maximizevert")) {
92 a
= action_new(action_maximize_vert
);
93 } else if (!g_ascii_strcasecmp(name
, "unmaximizevert")) {
94 a
= action_new(action_unmaximize_vert
);
95 } else if (!g_ascii_strcasecmp(name
, "togglemaximizevert")) {
96 a
= action_new(action_toggle_maximize_vert
);
97 } else if (!g_ascii_strcasecmp(name
, "sendtodesktop")) {
98 a
= action_new(action_send_to_desktop
);
99 a
->data
.sendto
.follow
= TRUE
;
100 } else if (!g_ascii_strcasecmp(name
, "sendtonextdesktop")) {
101 a
= action_new(action_send_to_next_desktop
);
102 a
->data
.sendtonextprev
.wrap
= FALSE
;
103 a
->data
.sendtonextprev
.follow
= TRUE
;
104 } else if (!g_ascii_strcasecmp(name
, "sendtonextdesktopwrap")) {
105 a
= action_new(action_send_to_next_desktop
);
106 a
->data
.sendtonextprev
.wrap
= TRUE
;
107 a
->data
.sendtonextprev
.follow
= TRUE
;
108 } else if (!g_ascii_strcasecmp(name
, "sendtopreviousdesktop")) {
109 a
= action_new(action_send_to_previous_desktop
);
110 a
->data
.sendtonextprev
.wrap
= FALSE
;
111 a
->data
.sendtonextprev
.follow
= TRUE
;
112 } else if (!g_ascii_strcasecmp(name
, "sendtopreviousdesktopwrap")) {
113 a
= action_new(action_send_to_previous_desktop
);
114 a
->data
.sendtonextprev
.wrap
= TRUE
;
115 a
->data
.sendtonextprev
.follow
= TRUE
;
116 } else if (!g_ascii_strcasecmp(name
, "desktop")) {
117 a
= action_new(action_desktop
);
118 } else if (!g_ascii_strcasecmp(name
, "nextdesktop")) {
119 a
= action_new(action_next_desktop
);
120 a
->data
.nextprevdesktop
.wrap
= FALSE
;
121 } else if (!g_ascii_strcasecmp(name
, "nextdesktopwrap")) {
122 a
= action_new(action_next_desktop
);
123 a
->data
.nextprevdesktop
.wrap
= TRUE
;
124 } else if (!g_ascii_strcasecmp(name
, "previousdesktop")) {
125 a
= action_new(action_previous_desktop
);
126 a
->data
.nextprevdesktop
.wrap
= FALSE
;
127 } else if (!g_ascii_strcasecmp(name
, "previousdesktopwrap")) {
128 a
= action_new(action_previous_desktop
);
129 a
->data
.nextprevdesktop
.wrap
= TRUE
;
130 } else if (!g_ascii_strcasecmp(name
, "nextdesktopcolumn")) {
131 a
= action_new(action_next_desktop_column
);
132 a
->data
.nextprevdesktop
.wrap
= FALSE
;
133 } else if (!g_ascii_strcasecmp(name
, "nextdesktopcolumnwrap")) {
134 a
= action_new(action_next_desktop_column
);
135 a
->data
.nextprevdesktop
.wrap
= TRUE
;
136 } else if (!g_ascii_strcasecmp(name
, "previousdesktopcolumn")) {
137 a
= action_new(action_previous_desktop_column
);
138 a
->data
.nextprevdesktop
.wrap
= FALSE
;
139 } else if (!g_ascii_strcasecmp(name
, "previousdesktopcolumnwrap")) {
140 a
= action_new(action_previous_desktop_column
);
141 a
->data
.nextprevdesktop
.wrap
= TRUE
;
142 } else if (!g_ascii_strcasecmp(name
, "nextdesktoprow")) {
143 a
= action_new(action_next_desktop_row
);
144 a
->data
.nextprevdesktop
.wrap
= FALSE
;
145 } else if (!g_ascii_strcasecmp(name
, "nextdesktoprowwrap")) {
146 a
= action_new(action_next_desktop_row
);
147 a
->data
.nextprevdesktop
.wrap
= TRUE
;
148 } else if (!g_ascii_strcasecmp(name
, "previousdesktoprow")) {
149 a
= action_new(action_previous_desktop_row
);
150 a
->data
.nextprevdesktop
.wrap
= FALSE
;
151 } else if (!g_ascii_strcasecmp(name
, "previousdesktoprowwrap")) {
152 a
= action_new(action_previous_desktop_row
);
153 a
->data
.nextprevdesktop
.wrap
= TRUE
;
154 } else if (!g_ascii_strcasecmp(name
, "toggledecorations")) {
155 a
= action_new(action_toggle_decorations
);
156 } else if (!g_ascii_strcasecmp(name
, "keyboardmove")) {
157 a
= action_new(action_moveresize
);
158 a
->data
.moveresize
.corner
= prop_atoms
.net_wm_moveresize_move_keyboard
;
159 } else if (!g_ascii_strcasecmp(name
, "move")) {
160 a
= action_new(action_moveresize
);
161 a
->data
.moveresize
.corner
= prop_atoms
.net_wm_moveresize_move
;
162 } else if (!g_ascii_strcasecmp(name
, "resize")) {
163 a
= action_new(action_moveresize
);
164 a
->data
.moveresize
.corner
= prop_atoms
.net_wm_moveresize_size_topleft
;
165 } else if (!g_ascii_strcasecmp(name
, "keyboardresize")) {
166 a
= action_new(action_moveresize
);
167 a
->data
.moveresize
.corner
= prop_atoms
.net_wm_moveresize_size_keyboard
;
168 } else if (!g_ascii_strcasecmp(name
, "restart")) {
169 a
= action_new(action_restart
);
170 } else if (!g_ascii_strcasecmp(name
, "exit")) {
171 a
= action_new(action_exit
);
172 } else if (!g_ascii_strcasecmp(name
, "showmenu")) {
173 a
= action_new(action_showmenu
);
174 } else if (!g_ascii_strcasecmp(name
, "nextwindowlinear")) {
175 a
= action_new(action_cycle_windows
);
176 a
->data
.cycle
.linear
= TRUE
;
177 a
->data
.cycle
.forward
= TRUE
;
178 } else if (!g_ascii_strcasecmp(name
, "previouswindowlinear")) {
179 a
= action_new(action_cycle_windows
);
180 a
->data
.cycle
.linear
= TRUE
;
181 a
->data
.cycle
.forward
= FALSE
;
182 } else if (!g_ascii_strcasecmp(name
, "nextwindow")) {
183 a
= action_new(action_cycle_windows
);
184 a
->data
.cycle
.linear
= FALSE
;
185 a
->data
.cycle
.forward
= TRUE
;
186 } else if (!g_ascii_strcasecmp(name
, "previouswindow")) {
187 a
= action_new(action_cycle_windows
);
188 a
->data
.cycle
.linear
= FALSE
;
189 a
->data
.cycle
.forward
= FALSE
;
195 void action_execute(union ActionData
*data
)
198 if (data
->execute
.path
)
199 if (!g_spawn_command_line_async(data
->execute
.path
, &e
)) {
200 g_warning("failed to execute '%s': %s",
201 data
->execute
.path
, e
->message
);
205 void action_focus(union ActionData
*data
)
208 client_focus(data
->client
.c
);
211 void action_unfocus (union ActionData
*data
)
214 client_unfocus(data
->client
.c
);
217 void action_iconify(union ActionData
*data
)
220 client_iconify(data
->client
.c
, TRUE
, TRUE
);
223 void action_focusraise(union ActionData
*data
)
225 if (data
->client
.c
) {
226 client_focus(data
->client
.c
);
227 stacking_raise(data
->client
.c
);
231 void action_raise(union ActionData
*data
)
234 stacking_raise(data
->client
.c
);
237 void action_unshaderaise(union ActionData
*data
)
239 if (data
->client
.c
) {
240 if (data
->client
.c
->shaded
)
241 client_shade(data
->client
.c
, FALSE
);
243 stacking_raise(data
->client
.c
);
247 void action_shadelower(union ActionData
*data
)
249 if (data
->client
.c
) {
250 if (data
->client
.c
->shaded
)
251 stacking_lower(data
->client
.c
);
253 client_shade(data
->client
.c
, TRUE
);
257 void action_lower(union ActionData
*data
)
260 stacking_lower(data
->client
.c
);
263 void action_close(union ActionData
*data
)
266 client_close(data
->client
.c
);
269 void action_kill(union ActionData
*data
)
272 client_kill(data
->client
.c
);
275 void action_shade(union ActionData
*data
)
278 client_shade(data
->client
.c
, TRUE
);
281 void action_unshade(union ActionData
*data
)
284 client_shade(data
->client
.c
, FALSE
);
287 void action_toggle_shade(union ActionData
*data
)
290 client_shade(data
->client
.c
, !data
->client
.c
->shaded
);
293 void action_toggle_omnipresent(union ActionData
*data
)
296 client_set_desktop(data
->client
.c
,
297 data
->client
.c
->desktop
== DESKTOP_ALL
?
298 screen_desktop
: DESKTOP_ALL
, FALSE
);
301 void action_move_relative_horz(union ActionData
*data
)
303 Client
*c
= data
->relative
.c
;
305 client_configure(c
, Corner_TopLeft
,
306 c
->area
.x
+ data
->relative
.delta
, c
->area
.y
,
307 c
->area
.width
, c
->area
.height
, TRUE
, TRUE
);
310 void action_move_relative_vert(union ActionData
*data
)
312 Client
*c
= data
->relative
.c
;
314 client_configure(c
, Corner_TopLeft
,
315 c
->area
.x
, c
->area
.y
+ data
->relative
.delta
,
316 c
->area
.width
, c
->area
.height
, TRUE
, TRUE
);
319 void action_resize_relative_horz(union ActionData
*data
)
321 Client
*c
= data
->relative
.c
;
323 client_configure(c
, Corner_TopLeft
, c
->area
.x
, c
->area
.y
,
324 c
->area
.width
+ data
->relative
.delta
,
325 c
->area
.height
, TRUE
, TRUE
);
328 void action_resize_relative_vert(union ActionData
*data
)
330 Client
*c
= data
->relative
.c
;
332 client_configure(c
, Corner_TopLeft
, c
->area
.x
, c
->area
.y
,
333 c
->area
.width
, c
->area
.height
+ data
->relative
.delta
,
337 void action_maximize_full(union ActionData
*data
)
340 client_maximize(data
->client
.c
, TRUE
, 0, TRUE
);
343 void action_unmaximize_full(union ActionData
*data
)
346 client_maximize(data
->client
.c
, FALSE
, 0, TRUE
);
349 void action_toggle_maximize_full(union ActionData
*data
)
352 client_maximize(data
->client
.c
,
353 !(data
->client
.c
->max_horz
||
354 data
->client
.c
->max_vert
),
358 void action_maximize_horz(union ActionData
*data
)
361 client_maximize(data
->client
.c
, TRUE
, 1, TRUE
);
364 void action_unmaximize_horz(union ActionData
*data
)
367 client_maximize(data
->client
.c
, FALSE
, 1, TRUE
);
370 void action_toggle_maximize_horz(union ActionData
*data
)
373 client_maximize(data
->client
.c
, !data
->client
.c
->max_horz
, 1, TRUE
);
376 void action_maximize_vert(union ActionData
*data
)
379 client_maximize(data
->client
.c
, TRUE
, 2, TRUE
);
382 void action_unmaximize_vert(union ActionData
*data
)
385 client_maximize(data
->client
.c
, FALSE
, 2, TRUE
);
388 void action_toggle_maximize_vert(union ActionData
*data
)
391 client_maximize(data
->client
.c
, !data
->client
.c
->max_vert
, 2, TRUE
);
394 void action_send_to_desktop(union ActionData
*data
)
396 if (data
->sendto
.c
) {
397 if (data
->sendto
.desk
< screen_num_desktops
||
398 data
->sendto
.desk
== DESKTOP_ALL
) {
399 client_set_desktop(data
->desktop
.c
,
400 data
->sendto
.desk
, data
->sendto
.follow
);
401 if (data
->sendto
.follow
) screen_set_desktop(data
->sendto
.desk
);
406 void action_send_to_next_desktop(union ActionData
*data
)
410 if (!data
->sendtonextprev
.c
) return;
412 d
= screen_desktop
+ 1;
413 if (d
>= screen_num_desktops
) {
414 if (!data
->sendtonextprev
.wrap
) return;
417 client_set_desktop(data
->sendtonextprev
.c
, d
, data
->sendtonextprev
.follow
);
418 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
421 void action_send_to_previous_desktop(union ActionData
*data
)
425 if (!data
->sendtonextprev
.c
) return;
427 d
= screen_desktop
- 1;
428 if (d
>= screen_num_desktops
) {
429 if (!data
->sendtonextprev
.wrap
) return;
430 d
= screen_num_desktops
- 1;
432 client_set_desktop(data
->sendtonextprev
.c
, d
, data
->sendtonextprev
.follow
);
433 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
436 void action_desktop(union ActionData
*data
)
438 if (data
->desktop
.desk
< screen_num_desktops
||
439 data
->desktop
.desk
== DESKTOP_ALL
)
440 screen_set_desktop(data
->desktop
.desk
);
443 void action_next_desktop(union ActionData
*data
)
447 d
= screen_desktop
+ 1;
448 if (d
>= screen_num_desktops
) {
449 if (!data
->nextprevdesktop
.wrap
) return;
452 screen_set_desktop(d
);
455 void action_previous_desktop(union ActionData
*data
)
459 d
= screen_desktop
- 1;
460 if (d
>= screen_num_desktops
) {
461 if (!data
->nextprevdesktop
.wrap
) return;
462 d
= screen_num_desktops
- 1;
464 screen_set_desktop(d
);
467 static void cur_row_col(guint
*r
, guint
*c
)
469 switch (screen_desktop_layout
.orientation
) {
470 case Orientation_Horz
:
471 switch (screen_desktop_layout
.start_corner
) {
473 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
474 *c
= screen_desktop
% screen_desktop_layout
.columns
;
476 case Corner_BottomLeft
:
477 *r
= screen_desktop_layout
.rows
- 1 -
478 screen_desktop
/ screen_desktop_layout
.columns
;
479 *c
= screen_desktop
% screen_desktop_layout
.columns
;
481 case Corner_TopRight
:
482 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
483 *c
= screen_desktop_layout
.columns
- 1 -
484 screen_desktop
% screen_desktop_layout
.columns
;
486 case Corner_BottomRight
:
487 *r
= screen_desktop_layout
.rows
- 1 -
488 screen_desktop
/ screen_desktop_layout
.columns
;
489 *c
= screen_desktop_layout
.columns
- 1 -
490 screen_desktop
% screen_desktop_layout
.columns
;
494 case Orientation_Vert
:
495 switch (screen_desktop_layout
.start_corner
) {
497 *r
= screen_desktop
% screen_desktop_layout
.rows
;
498 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
500 case Corner_BottomLeft
:
501 *r
= screen_desktop_layout
.rows
- 1 -
502 screen_desktop
% screen_desktop_layout
.rows
;
503 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
505 case Corner_TopRight
:
506 *r
= screen_desktop
% screen_desktop_layout
.rows
;
507 *c
= screen_desktop_layout
.columns
- 1 -
508 screen_desktop
/ screen_desktop_layout
.rows
;
510 case Corner_BottomRight
:
511 *r
= screen_desktop_layout
.rows
- 1 -
512 screen_desktop
% screen_desktop_layout
.rows
;
513 *c
= screen_desktop_layout
.columns
- 1 -
514 screen_desktop
/ screen_desktop_layout
.rows
;
521 static guint
translate_row_col(guint r
, guint c
)
523 switch (screen_desktop_layout
.orientation
) {
524 case Orientation_Horz
:
525 switch (screen_desktop_layout
.start_corner
) {
527 return r
% screen_desktop_layout
.rows
*
528 screen_desktop_layout
.columns
+
529 c
% screen_desktop_layout
.columns
;
530 case Corner_BottomLeft
:
531 return (screen_desktop_layout
.rows
- 1 -
532 r
% screen_desktop_layout
.rows
) *
533 screen_desktop_layout
.columns
+
534 c
% screen_desktop_layout
.columns
;
535 case Corner_TopRight
:
536 return r
% screen_desktop_layout
.rows
*
537 screen_desktop_layout
.columns
+
538 (screen_desktop_layout
.columns
- 1 -
539 c
% screen_desktop_layout
.columns
);
540 case Corner_BottomRight
:
541 return (screen_desktop_layout
.rows
- 1 -
542 r
% screen_desktop_layout
.rows
) *
543 screen_desktop_layout
.columns
+
544 (screen_desktop_layout
.columns
- 1 -
545 c
% screen_desktop_layout
.columns
);
547 case Orientation_Vert
:
548 switch (screen_desktop_layout
.start_corner
) {
550 return c
% screen_desktop_layout
.columns
*
551 screen_desktop_layout
.rows
+
552 r
% screen_desktop_layout
.rows
;
553 case Corner_BottomLeft
:
554 return c
% screen_desktop_layout
.columns
*
555 screen_desktop_layout
.rows
+
556 (screen_desktop_layout
.rows
- 1 -
557 r
% screen_desktop_layout
.rows
);
558 case Corner_TopRight
:
559 return (screen_desktop_layout
.columns
- 1 -
560 c
% screen_desktop_layout
.columns
) *
561 screen_desktop_layout
.rows
+
562 r
% screen_desktop_layout
.rows
;
563 case Corner_BottomRight
:
564 return (screen_desktop_layout
.columns
- 1 -
565 c
% screen_desktop_layout
.columns
) *
566 screen_desktop_layout
.rows
+
567 (screen_desktop_layout
.rows
- 1 -
568 r
% screen_desktop_layout
.rows
);
571 g_assert_not_reached();
575 void action_next_desktop_column(union ActionData
*data
)
581 if (c
>= screen_desktop_layout
.columns
)
583 d
= translate_row_col(r
, c
);
584 if (d
>= screen_num_desktops
) {
585 if (!data
->nextprevdesktop
.wrap
) return;
588 d
= translate_row_col(r
, c
);
589 if (d
< screen_num_desktops
)
590 screen_set_desktop(d
);
593 void action_previous_desktop_column(union ActionData
*data
)
599 if (c
>= screen_desktop_layout
.columns
)
600 c
= screen_desktop_layout
.columns
- 1;
601 d
= translate_row_col(r
, c
);
602 if (d
>= screen_num_desktops
) {
603 if (!data
->nextprevdesktop
.wrap
) return;
606 d
= translate_row_col(r
, c
);
607 if (d
< screen_num_desktops
)
608 screen_set_desktop(d
);
611 void action_next_desktop_row(union ActionData
*data
)
617 if (r
>= screen_desktop_layout
.rows
)
619 d
= translate_row_col(r
, c
);
620 if (d
>= screen_num_desktops
) {
621 if (!data
->nextprevdesktop
.wrap
) return;
624 d
= translate_row_col(r
, c
);
625 if (d
< screen_num_desktops
)
626 screen_set_desktop(d
);
629 void action_previous_desktop_row(union ActionData
*data
)
635 if (r
>= screen_desktop_layout
.rows
)
636 r
= screen_desktop_layout
.rows
- 1;
637 d
= translate_row_col(r
, c
);
638 if (d
>= screen_num_desktops
) {
639 if (!data
->nextprevdesktop
.wrap
) return;
642 d
= translate_row_col(r
, c
);
643 if (d
< screen_num_desktops
)
644 screen_set_desktop(d
);
647 void action_toggle_decorations(union ActionData
*data
)
649 Client
*c
= data
->client
.c
;;
653 c
->disabled_decorations
= c
->disabled_decorations
? 0 : ~0;
654 client_setup_decor_and_functions(c
);
657 void action_moveresize(union ActionData
*data
)
659 Client
*c
= data
->moveresize
.c
;
661 if (!c
|| !client_normal(c
)) return;
663 moveresize_start(c
, data
->moveresize
.x
, data
->moveresize
.y
,
664 data
->moveresize
.button
, data
->moveresize
.corner
);
667 void action_restart(union ActionData
*data
)
669 ob_restart_path
= data
->execute
.path
;
670 ob_shutdown
= ob_restart
= TRUE
;
673 void action_exit(union ActionData
*data
)
678 void action_showmenu(union ActionData
*data
)
680 if (data
->showmenu
.name
) {
681 menu_show(data
->showmenu
.name
, data
->showmenu
.x
, data
->showmenu
.y
,
686 static void popup_cycle(Client
*c
, gboolean hide
)
688 XSetWindowAttributes attrib
;
689 static Window coords
= None
;
691 if (coords
== None
) {
692 attrib
.override_redirect
= TRUE
;
693 coords
= XCreateWindow(ob_display
, ob_root
,
694 0, 0, 1, 1, 0, render_depth
, InputOutput
,
695 render_visual
, CWOverrideRedirect
, &attrib
);
696 g_assert(coords
!= None
);
698 grab_pointer(TRUE
, None
);
700 XMapWindow(ob_display
, coords
);
704 XDestroyWindow(ob_display
, coords
);
707 grab_pointer(FALSE
, None
);
712 a
= screen_area(c
->desktop
);
714 framerender_size_popup_label(c
->title
, &s
);
715 XMoveResizeWindow(ob_display
, coords
,
716 a
->x
+ (a
->width
- s
.width
) / 2,
717 a
->y
+ (a
->height
- s
.height
) / 2,
719 framerender_popup_label(coords
, &s
, c
->title
);
723 void action_cycle_windows(union ActionData
*data
)
727 c
= focus_cycle(data
->cycle
.forward
, data
->cycle
.linear
, data
->cycle
.final
,
729 popup_cycle(c
, !c
|| data
->cycle
.final
|| data
->cycle
.cancel
);