]>
Dogcows Code - chaz/openbox/blob - openbox/action.c
dfcd8d7e0634edf8ddb500fee7d4934eece1fe3b
9 Action
*action_new(void (*func
)(union ActionData
*data
))
11 Action
*a
= g_new(Action
, 1);
14 /* deal with pointers */
15 if (func
== action_execute
)
16 a
->data
.execute
.path
= NULL
;
21 void action_free(Action
*a
)
23 /* deal with pointers */
24 if (a
->func
== action_execute
)
25 g_free(a
->data
.execute
.path
);
30 void action_execute(union ActionData
*data
)
33 if (!g_spawn_command_line_async(data
->execute
.path
, &e
)) {
34 g_warning("failed to execute '%s': %s",
35 data
->execute
.path
, e
->message
);
39 void action_focus(union ActionData
*data
)
41 client_focus(data
->client
.c
);
44 void action_unfocus (union ActionData
*data
)
46 client_unfocus(data
->client
.c
);
49 void action_iconify(union ActionData
*data
)
51 client_iconify(data
->client
.c
, TRUE
, TRUE
);
54 void action_raise(union ActionData
*data
)
56 stacking_raise(data
->client
.c
);
59 void action_lower(union ActionData
*data
)
61 stacking_lower(data
->client
.c
);
64 void action_close(union ActionData
*data
)
66 client_close(data
->client
.c
);
69 void action_shade(union ActionData
*data
)
71 client_shade(data
->client
.c
, TRUE
);
74 void action_unshade(union ActionData
*data
)
76 client_shade(data
->client
.c
, FALSE
);
79 void action_toggle_shade(union ActionData
*data
)
81 client_shade(data
->client
.c
, !data
->client
.c
->shaded
);
84 void action_toggle_omnipresent(union ActionData
*data
)
86 client_set_desktop(data
->client
.c
, data
->client
.c
->desktop
== DESKTOP_ALL
?
87 screen_desktop
: DESKTOP_ALL
);
90 void action_move_relative(union ActionData
*data
)
92 Client
*c
= data
->relative
.c
;
93 client_configure(c
, Corner_TopLeft
,
94 c
->area
.x
+ data
->relative
.dx
,
95 c
->area
.y
+ data
->relative
.dy
,
96 c
->area
.width
, c
->area
.height
, TRUE
, TRUE
);
99 void action_resize_relative(union ActionData
*data
)
101 Client
*c
= data
->relative
.c
;
102 client_configure(c
, Corner_TopLeft
, c
->area
.x
, c
->area
.y
,
103 c
->area
.width
+ data
->relative
.dx
,
104 c
->area
.height
+ data
->relative
.dy
, TRUE
, TRUE
);
107 void action_maximize_full(union ActionData
*data
)
109 client_maximize(data
->client
.c
, TRUE
, 0, TRUE
);
112 void action_unmaximize_full(union ActionData
*data
)
114 client_maximize(data
->client
.c
, FALSE
, 0, TRUE
);
117 void action_toggle_maximize_full(union ActionData
*data
)
119 client_maximize(data
->client
.c
,
120 !(data
->client
.c
->max_horz
|| data
->client
.c
->max_vert
),
124 void action_maximize_horz(union ActionData
*data
)
126 client_maximize(data
->client
.c
, TRUE
, 1, TRUE
);
129 void action_unmaximize_horz(union ActionData
*data
)
131 client_maximize(data
->client
.c
, FALSE
, 1, TRUE
);
134 void action_toggle_maximize_horz(union ActionData
*data
)
136 client_maximize(data
->client
.c
, !data
->client
.c
->max_horz
, 1, TRUE
);
139 void action_maximize_vert(union ActionData
*data
)
141 client_maximize(data
->client
.c
, TRUE
, 2, TRUE
);
144 void action_unmaximize_vert(union ActionData
*data
)
146 client_maximize(data
->client
.c
, FALSE
, 2, TRUE
);
149 void action_toggle_maximize_vert(union ActionData
*data
)
151 client_maximize(data
->client
.c
, !data
->client
.c
->max_vert
, 2, TRUE
);
154 void action_send_to_desktop(union ActionData
*data
)
156 if (data
->sendto
.desktop
< screen_num_desktops
||
157 data
->sendto
.desktop
== DESKTOP_ALL
)
158 client_set_desktop(data
->sendto
.c
, data
->sendto
.desktop
);
161 void action_send_to_next_desktop(union ActionData
*data
)
165 d
= screen_desktop
+ 1;
166 if (d
>= screen_num_desktops
) {
167 if (!data
->sendtonextprev
.wrap
) return;
170 client_set_desktop(data
->sendtonextprev
.c
, d
);
171 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
174 void action_send_to_previous_desktop(union ActionData
*data
)
178 d
= screen_desktop
- 1;
179 if (d
>= screen_num_desktops
) {
180 if (!data
->sendtonextprev
.wrap
) return;
181 d
= screen_num_desktops
- 1;
183 client_set_desktop(data
->sendtonextprev
.c
, d
);
184 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
187 void action_desktop(union ActionData
*data
)
189 if (data
->desktop
.desk
< screen_num_desktops
||
190 data
->desktop
.desk
== DESKTOP_ALL
)
191 screen_set_desktop(data
->desktop
.desk
);
194 void action_next_desktop(union ActionData
*data
)
198 d
= screen_desktop
+ 1;
199 if (d
>= screen_num_desktops
) {
200 if (!data
->nextprevdesktop
.wrap
) return;
203 screen_set_desktop(d
);
206 void action_previous_desktop(union ActionData
*data
)
210 d
= screen_desktop
- 1;
211 if (d
>= screen_num_desktops
) {
212 if (!data
->nextprevdesktop
.wrap
) return;
213 d
= screen_num_desktops
- 1;
215 screen_set_desktop(d
);
218 static void cur_row_col(guint
*r
, guint
*c
)
220 switch (screen_desktop_layout
.orientation
) {
221 case Orientation_Horz
:
222 switch (screen_desktop_layout
.start_corner
) {
224 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
225 *c
= screen_desktop
% screen_desktop_layout
.columns
;
227 case Corner_BottomLeft
:
228 *r
= screen_desktop_layout
.rows
- 1 -
229 screen_desktop
/ screen_desktop_layout
.columns
;
230 *c
= screen_desktop
% screen_desktop_layout
.columns
;
233 case Corner_TopRight
:
234 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
235 *c
= screen_desktop_layout
.columns
- 1 -
236 screen_desktop
% screen_desktop_layout
.columns
;
238 case Corner_BottomRight
:
239 *r
= screen_desktop_layout
.rows
- 1 -
240 screen_desktop
/ screen_desktop_layout
.columns
;
241 *c
= screen_desktop_layout
.columns
- 1 -
242 screen_desktop
% screen_desktop_layout
.columns
;
246 case Orientation_Vert
:
247 switch (screen_desktop_layout
.start_corner
) {
249 *r
= screen_desktop
% screen_desktop_layout
.rows
;
250 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
252 case Corner_BottomLeft
:
253 *r
= screen_desktop_layout
.rows
- 1 -
254 screen_desktop
% screen_desktop_layout
.rows
;
255 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
258 case Corner_TopRight
:
259 *r
= screen_desktop
% screen_desktop_layout
.rows
;
260 *c
= screen_desktop_layout
.columns
- 1 -
261 screen_desktop
/ screen_desktop_layout
.rows
;
263 case Corner_BottomRight
:
264 *r
= screen_desktop_layout
.rows
- 1 -
265 screen_desktop
% screen_desktop_layout
.rows
;
266 *c
= screen_desktop_layout
.columns
- 1 -
267 screen_desktop
/ screen_desktop_layout
.rows
;
275 static guint
translate_row_col(guint r
, guint c
)
277 switch (screen_desktop_layout
.orientation
) {
278 case Orientation_Horz
:
279 switch (screen_desktop_layout
.start_corner
) {
281 return r
* screen_desktop_layout
.columns
+ c
;
282 case Corner_BottomLeft
:
283 return (screen_desktop_layout
.rows
- 1 - r
) *
284 screen_desktop_layout
.columns
+ c
;
285 case Corner_TopRight
:
286 return r
* screen_desktop_layout
.columns
+
287 (screen_desktop_layout
.columns
- 1 - c
);
288 case Corner_BottomRight
:
289 return (screen_desktop_layout
.rows
- 1 - r
) *
290 screen_desktop_layout
.columns
+
291 (screen_desktop_layout
.columns
- 1 - c
);
293 case Orientation_Vert
:
294 switch (screen_desktop_layout
.start_corner
) {
296 return c
* screen_desktop_layout
.rows
+ r
;
297 case Corner_BottomLeft
:
298 return c
* screen_desktop_layout
.rows
+
299 (screen_desktop_layout
.rows
- 1 - r
);
300 case Corner_TopRight
:
301 return (screen_desktop_layout
.columns
- 1 - c
) *
302 screen_desktop_layout
.rows
+ r
;
303 case Corner_BottomRight
:
304 return (screen_desktop_layout
.columns
- 1 - c
) *
305 screen_desktop_layout
.rows
+
306 (screen_desktop_layout
.rows
- 1 - r
);
309 g_assert_not_reached();
313 void action_next_desktop_column(union ActionData
*data
)
319 d
= translate_row_col(r
, c
);
320 if (d
>= screen_num_desktops
) {
321 if (!data
->nextprevdesktop
.wrap
) return;
324 if (d
>= screen_num_desktops
)
326 d
= translate_row_col(r
, c
);
327 if (d
< screen_num_desktops
)
328 screen_set_desktop(d
);
331 void action_previous_desktop_column(union ActionData
*data
)
337 d
= translate_row_col(r
, c
);
338 if (d
>= screen_num_desktops
) {
339 if (!data
->nextprevdesktop
.wrap
) return;
340 c
= screen_desktop_layout
.columns
- 1;
342 if (d
>= screen_num_desktops
)
344 d
= translate_row_col(r
, c
);
345 if (d
< screen_num_desktops
)
346 screen_set_desktop(d
);
349 void action_next_desktop_row(union ActionData
*data
)
355 d
= translate_row_col(r
, c
);
356 if (d
>= screen_num_desktops
) {
357 if (!data
->nextprevdesktop
.wrap
) return;
360 if (d
>= screen_num_desktops
)
362 d
= translate_row_col(r
, c
);
363 if (d
< screen_num_desktops
)
364 screen_set_desktop(d
);
367 void action_previous_desktop_row(union ActionData
*data
)
373 d
= translate_row_col(r
, c
);
374 if (d
>= screen_num_desktops
) {
375 if (!data
->nextprevdesktop
.wrap
) return;
376 c
= screen_desktop_layout
.rows
- 1;
378 if (d
>= screen_num_desktops
)
380 d
= translate_row_col(r
, c
);
381 if (d
< screen_num_desktops
)
382 screen_set_desktop(d
);
385 void action_toggle_decorations(union ActionData
*data
)
387 Client
*c
= data
->client
.c
;
388 c
->disabled_decorations
= c
->disabled_decorations
? 0 : ~0;
389 client_setup_decor_and_functions(c
);
392 void action_move(union ActionData
*data
)
394 Client
*c
= data
->move
.c
;
395 int x
= data
->move
.x
;
396 int y
= data
->move
.y
;
398 client_configure(c
, Corner_TopLeft
, x
, y
, c
->area
.width
, c
->area
.height
,
399 TRUE
, data
->move
.final
);
402 void action_resize(union ActionData
*data
)
404 Client
*c
= data
->resize
.c
;
405 int w
= data
->resize
.x
- c
->frame
->size
.left
- c
->frame
->size
.right
;
406 int h
= data
->resize
.y
- c
->frame
->size
.top
- c
->frame
->size
.bottom
;
408 client_configure(c
, data
->resize
.corner
, c
->area
.x
, c
->area
.y
, w
, h
,
409 TRUE
, data
->resize
.final
);
This page took 0.050664 seconds and 4 git commands to generate.