]>
Dogcows Code - chaz/openbox/blob - openbox/action.c
11 Action
*action_new(void (*func
)(union ActionData
*data
))
13 Action
*a
= g_new(Action
, 1);
16 /* deal with pointers */
17 if (func
== action_execute
)
18 a
->data
.execute
.path
= NULL
;
23 void action_free(Action
*a
)
25 /* deal with pointers */
26 if (a
->func
== action_execute
)
27 g_free(a
->data
.execute
.path
);
32 void action_execute(union ActionData
*data
)
35 if (!g_spawn_command_line_async(data
->execute
.path
, &e
)) {
36 g_warning("failed to execute '%s': %s",
37 data
->execute
.path
, e
->message
);
41 void action_focus(union ActionData
*data
)
43 client_focus(data
->client
.c
);
46 void action_unfocus (union ActionData
*data
)
48 client_unfocus(data
->client
.c
);
51 void action_iconify(union ActionData
*data
)
53 client_iconify(data
->client
.c
, TRUE
, TRUE
);
56 void action_focusraise(union ActionData
*data
)
58 client_focus(data
->client
.c
);
59 stacking_raise(data
->client
.c
);
62 void action_raise(union ActionData
*data
)
64 stacking_raise(data
->client
.c
);
67 void action_lower(union ActionData
*data
)
69 stacking_lower(data
->client
.c
);
72 void action_close(union ActionData
*data
)
74 client_close(data
->client
.c
);
77 void action_kill(union ActionData
*data
)
79 client_kill(data
->client
.c
);
82 void action_shade(union ActionData
*data
)
84 client_shade(data
->client
.c
, TRUE
);
87 void action_unshade(union ActionData
*data
)
89 client_shade(data
->client
.c
, FALSE
);
92 void action_toggle_shade(union ActionData
*data
)
94 client_shade(data
->client
.c
, !data
->client
.c
->shaded
);
97 void action_toggle_omnipresent(union ActionData
*data
)
99 client_set_desktop(data
->client
.c
, data
->client
.c
->desktop
== DESKTOP_ALL
?
100 screen_desktop
: DESKTOP_ALL
);
103 void action_move_relative(union ActionData
*data
)
105 Client
*c
= data
->relative
.c
;
106 client_configure(c
, Corner_TopLeft
,
107 c
->area
.x
+ data
->relative
.dx
,
108 c
->area
.y
+ data
->relative
.dy
,
109 c
->area
.width
, c
->area
.height
, TRUE
, TRUE
);
112 void action_resize_relative(union ActionData
*data
)
114 Client
*c
= data
->relative
.c
;
115 client_configure(c
, Corner_TopLeft
, c
->area
.x
, c
->area
.y
,
116 c
->area
.width
+ data
->relative
.dx
,
117 c
->area
.height
+ data
->relative
.dy
, TRUE
, TRUE
);
120 void action_maximize_full(union ActionData
*data
)
122 client_maximize(data
->client
.c
, TRUE
, 0, TRUE
);
125 void action_unmaximize_full(union ActionData
*data
)
127 client_maximize(data
->client
.c
, FALSE
, 0, TRUE
);
130 void action_toggle_maximize_full(union ActionData
*data
)
132 client_maximize(data
->client
.c
,
133 !(data
->client
.c
->max_horz
|| data
->client
.c
->max_vert
),
137 void action_maximize_horz(union ActionData
*data
)
139 client_maximize(data
->client
.c
, TRUE
, 1, TRUE
);
142 void action_unmaximize_horz(union ActionData
*data
)
144 client_maximize(data
->client
.c
, FALSE
, 1, TRUE
);
147 void action_toggle_maximize_horz(union ActionData
*data
)
149 client_maximize(data
->client
.c
, !data
->client
.c
->max_horz
, 1, TRUE
);
152 void action_maximize_vert(union ActionData
*data
)
154 client_maximize(data
->client
.c
, TRUE
, 2, TRUE
);
157 void action_unmaximize_vert(union ActionData
*data
)
159 client_maximize(data
->client
.c
, FALSE
, 2, TRUE
);
162 void action_toggle_maximize_vert(union ActionData
*data
)
164 client_maximize(data
->client
.c
, !data
->client
.c
->max_vert
, 2, TRUE
);
167 void action_send_to_desktop(union ActionData
*data
)
169 if (data
->sendto
.desktop
< screen_num_desktops
||
170 data
->sendto
.desktop
== DESKTOP_ALL
)
171 client_set_desktop(data
->sendto
.c
, data
->sendto
.desktop
);
174 void action_send_to_next_desktop(union ActionData
*data
)
178 d
= screen_desktop
+ 1;
179 if (d
>= screen_num_desktops
) {
180 if (!data
->sendtonextprev
.wrap
) return;
183 client_set_desktop(data
->sendtonextprev
.c
, d
);
184 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
187 void action_send_to_previous_desktop(union ActionData
*data
)
191 d
= screen_desktop
- 1;
192 if (d
>= screen_num_desktops
) {
193 if (!data
->sendtonextprev
.wrap
) return;
194 d
= screen_num_desktops
- 1;
196 client_set_desktop(data
->sendtonextprev
.c
, d
);
197 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
200 void action_desktop(union ActionData
*data
)
202 if (data
->desktop
.desk
< screen_num_desktops
||
203 data
->desktop
.desk
== DESKTOP_ALL
)
204 screen_set_desktop(data
->desktop
.desk
);
207 void action_next_desktop(union ActionData
*data
)
211 d
= screen_desktop
+ 1;
212 if (d
>= screen_num_desktops
) {
213 if (!data
->nextprevdesktop
.wrap
) return;
216 screen_set_desktop(d
);
219 void action_previous_desktop(union ActionData
*data
)
223 d
= screen_desktop
- 1;
224 if (d
>= screen_num_desktops
) {
225 if (!data
->nextprevdesktop
.wrap
) return;
226 d
= screen_num_desktops
- 1;
228 screen_set_desktop(d
);
231 static void cur_row_col(guint
*r
, guint
*c
)
233 switch (screen_desktop_layout
.orientation
) {
234 case Orientation_Horz
:
235 switch (screen_desktop_layout
.start_corner
) {
237 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
238 *c
= screen_desktop
% screen_desktop_layout
.columns
;
240 case Corner_BottomLeft
:
241 *r
= screen_desktop_layout
.rows
- 1 -
242 screen_desktop
/ screen_desktop_layout
.columns
;
243 *c
= screen_desktop
% screen_desktop_layout
.columns
;
246 case Corner_TopRight
:
247 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
248 *c
= screen_desktop_layout
.columns
- 1 -
249 screen_desktop
% screen_desktop_layout
.columns
;
251 case Corner_BottomRight
:
252 *r
= screen_desktop_layout
.rows
- 1 -
253 screen_desktop
/ screen_desktop_layout
.columns
;
254 *c
= screen_desktop_layout
.columns
- 1 -
255 screen_desktop
% screen_desktop_layout
.columns
;
259 case Orientation_Vert
:
260 switch (screen_desktop_layout
.start_corner
) {
262 *r
= screen_desktop
% screen_desktop_layout
.rows
;
263 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
265 case Corner_BottomLeft
:
266 *r
= screen_desktop_layout
.rows
- 1 -
267 screen_desktop
% screen_desktop_layout
.rows
;
268 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
271 case Corner_TopRight
:
272 *r
= screen_desktop
% screen_desktop_layout
.rows
;
273 *c
= screen_desktop_layout
.columns
- 1 -
274 screen_desktop
/ screen_desktop_layout
.rows
;
276 case Corner_BottomRight
:
277 *r
= screen_desktop_layout
.rows
- 1 -
278 screen_desktop
% screen_desktop_layout
.rows
;
279 *c
= screen_desktop_layout
.columns
- 1 -
280 screen_desktop
/ screen_desktop_layout
.rows
;
288 static guint
translate_row_col(guint r
, guint c
)
290 switch (screen_desktop_layout
.orientation
) {
291 case Orientation_Horz
:
292 switch (screen_desktop_layout
.start_corner
) {
294 return r
* screen_desktop_layout
.columns
+ c
;
295 case Corner_BottomLeft
:
296 return (screen_desktop_layout
.rows
- 1 - r
) *
297 screen_desktop_layout
.columns
+ c
;
298 case Corner_TopRight
:
299 return r
* screen_desktop_layout
.columns
+
300 (screen_desktop_layout
.columns
- 1 - c
);
301 case Corner_BottomRight
:
302 return (screen_desktop_layout
.rows
- 1 - r
) *
303 screen_desktop_layout
.columns
+
304 (screen_desktop_layout
.columns
- 1 - c
);
306 case Orientation_Vert
:
307 switch (screen_desktop_layout
.start_corner
) {
309 return c
* screen_desktop_layout
.rows
+ r
;
310 case Corner_BottomLeft
:
311 return c
* screen_desktop_layout
.rows
+
312 (screen_desktop_layout
.rows
- 1 - r
);
313 case Corner_TopRight
:
314 return (screen_desktop_layout
.columns
- 1 - c
) *
315 screen_desktop_layout
.rows
+ r
;
316 case Corner_BottomRight
:
317 return (screen_desktop_layout
.columns
- 1 - c
) *
318 screen_desktop_layout
.rows
+
319 (screen_desktop_layout
.rows
- 1 - r
);
322 g_assert_not_reached();
326 void action_next_desktop_column(union ActionData
*data
)
332 d
= translate_row_col(r
, c
);
333 if (d
>= screen_num_desktops
) {
334 if (!data
->nextprevdesktop
.wrap
) return;
337 if (d
>= screen_num_desktops
)
339 d
= translate_row_col(r
, c
);
340 if (d
< screen_num_desktops
)
341 screen_set_desktop(d
);
344 void action_previous_desktop_column(union ActionData
*data
)
350 d
= translate_row_col(r
, c
);
351 if (d
>= screen_num_desktops
) {
352 if (!data
->nextprevdesktop
.wrap
) return;
353 c
= screen_desktop_layout
.columns
- 1;
355 if (d
>= screen_num_desktops
)
357 d
= translate_row_col(r
, c
);
358 if (d
< screen_num_desktops
)
359 screen_set_desktop(d
);
362 void action_next_desktop_row(union ActionData
*data
)
368 d
= translate_row_col(r
, c
);
369 if (d
>= screen_num_desktops
) {
370 if (!data
->nextprevdesktop
.wrap
) return;
373 if (d
>= screen_num_desktops
)
375 d
= translate_row_col(r
, c
);
376 if (d
< screen_num_desktops
)
377 screen_set_desktop(d
);
380 void action_previous_desktop_row(union ActionData
*data
)
386 d
= translate_row_col(r
, c
);
387 if (d
>= screen_num_desktops
) {
388 if (!data
->nextprevdesktop
.wrap
) return;
389 c
= screen_desktop_layout
.rows
- 1;
391 if (d
>= screen_num_desktops
)
393 d
= translate_row_col(r
, c
);
394 if (d
< screen_num_desktops
)
395 screen_set_desktop(d
);
398 void action_toggle_decorations(union ActionData
*data
)
400 Client
*c
= data
->client
.c
;
401 c
->disabled_decorations
= c
->disabled_decorations
? 0 : ~0;
402 client_setup_decor_and_functions(c
);
405 void action_move(union ActionData
*data
)
407 Client
*c
= data
->move
.c
;
408 int x
= data
->move
.x
;
409 int y
= data
->move
.y
;
411 if (!client_normal(c
)) return;
413 dispatch_move(c
, &x
, &y
);
415 frame_frame_gravity(c
->frame
, &x
, &y
); /* get where the client should be */
416 client_configure(c
, Corner_TopLeft
, x
, y
, c
->area
.width
, c
->area
.height
,
417 TRUE
, data
->move
.final
);
420 void action_resize(union ActionData
*data
)
422 Client
*c
= data
->resize
.c
;
423 int w
= data
->resize
.x
- c
->frame
->size
.left
- c
->frame
->size
.right
;
424 int h
= data
->resize
.y
- c
->frame
->size
.top
- c
->frame
->size
.bottom
;
426 if (!client_normal(c
)) return;
428 /* XXX window snapping/struts */
430 client_configure(c
, data
->resize
.corner
, c
->area
.x
, c
->area
.y
, w
, h
,
431 TRUE
, data
->resize
.final
);
434 void action_restart(union ActionData
*data
)
436 ob_restart_path
= data
->execute
.path
;
437 ob_shutdown
= ob_restart
= TRUE
;
440 void action_exit(union ActionData
*data
)
This page took 0.057968 seconds and 4 git commands to generate.