]>
Dogcows Code - chaz/openbox/blob - openbox/action.c
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_iconify(union ActionData
*data
)
41 client_iconify(data
->client
.c
, TRUE
, TRUE
);
44 void action_raise(union ActionData
*data
)
46 stacking_raise(data
->client
.c
);
49 void action_lower(union ActionData
*data
)
51 stacking_lower(data
->client
.c
);
54 void action_close(union ActionData
*data
)
56 client_close(data
->client
.c
);
59 void action_shade(union ActionData
*data
)
61 client_shade(data
->client
.c
, TRUE
);
64 void action_unshade(union ActionData
*data
)
66 client_shade(data
->client
.c
, FALSE
);
69 void action_toggle_shade(union ActionData
*data
)
71 client_shade(data
->client
.c
, !data
->client
.c
->shaded
);
74 void action_toggle_omnipresent(union ActionData
*data
)
76 client_set_desktop(data
->client
.c
, data
->client
.c
->desktop
== DESKTOP_ALL
?
77 screen_desktop
: DESKTOP_ALL
);
80 void action_move_relative(union ActionData
*data
)
82 Client
*c
= data
->relative
.c
;
83 client_configure(c
, Corner_TopLeft
,
84 c
->area
.x
+ data
->relative
.dx
,
85 c
->area
.y
+ data
->relative
.dy
,
86 c
->area
.width
, c
->area
.height
, TRUE
, TRUE
);
89 void action_resize_relative(union ActionData
*data
)
91 Client
*c
= data
->relative
.c
;
92 client_configure(c
, Corner_TopLeft
, c
->area
.x
, c
->area
.y
,
93 c
->area
.width
+ data
->relative
.dx
,
94 c
->area
.height
+ data
->relative
.dy
, TRUE
, TRUE
);
97 void action_maximize_full(union ActionData
*data
)
99 client_maximize(data
->client
.c
, TRUE
, 0, TRUE
);
102 void action_unmaximize_full(union ActionData
*data
)
104 client_maximize(data
->client
.c
, FALSE
, 0, TRUE
);
107 void action_toggle_maximize_full(union ActionData
*data
)
109 client_maximize(data
->client
.c
,
110 !(data
->client
.c
->max_horz
|| data
->client
.c
->max_vert
),
114 void action_maximize_horz(union ActionData
*data
)
116 client_maximize(data
->client
.c
, TRUE
, 1, TRUE
);
119 void action_unmaximize_horz(union ActionData
*data
)
121 client_maximize(data
->client
.c
, FALSE
, 1, TRUE
);
124 void action_toggle_maximize_horz(union ActionData
*data
)
126 client_maximize(data
->client
.c
, !data
->client
.c
->max_horz
, 1, TRUE
);
129 void action_maximize_vert(union ActionData
*data
)
131 client_maximize(data
->client
.c
, TRUE
, 2, TRUE
);
134 void action_unmaximize_vert(union ActionData
*data
)
136 client_maximize(data
->client
.c
, FALSE
, 2, TRUE
);
139 void action_toggle_maximize_vert(union ActionData
*data
)
141 client_maximize(data
->client
.c
, !data
->client
.c
->max_vert
, 2, TRUE
);
144 void action_send_to_desktop(union ActionData
*data
)
146 if (data
->sendto
.desktop
< screen_num_desktops
||
147 data
->sendto
.desktop
== DESKTOP_ALL
)
148 client_set_desktop(data
->sendto
.c
, data
->sendto
.desktop
);
151 void action_send_to_next_desktop(union ActionData
*data
)
155 d
= screen_desktop
+ 1;
156 if (d
>= screen_num_desktops
) {
157 if (!data
->sendtonextprev
.wrap
) return;
160 client_set_desktop(data
->sendtonextprev
.c
, d
);
161 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
164 void action_send_to_previous_desktop(union ActionData
*data
)
168 d
= screen_desktop
- 1;
169 if (d
>= screen_num_desktops
) {
170 if (!data
->sendtonextprev
.wrap
) return;
171 d
= screen_num_desktops
- 1;
173 client_set_desktop(data
->sendtonextprev
.c
, d
);
174 if (data
->sendtonextprev
.follow
) screen_set_desktop(d
);
177 void action_desktop(union ActionData
*data
)
179 if (data
->desktop
.desk
< screen_num_desktops
||
180 data
->desktop
.desk
== DESKTOP_ALL
)
181 screen_set_desktop(data
->desktop
.desk
);
184 void action_next_desktop(union ActionData
*data
)
188 d
= screen_desktop
+ 1;
189 if (d
>= screen_num_desktops
) {
190 if (!data
->nextprevdesktop
.wrap
) return;
193 screen_set_desktop(d
);
196 void action_previous_desktop(union ActionData
*data
)
200 d
= screen_desktop
- 1;
201 if (d
>= screen_num_desktops
) {
202 if (!data
->nextprevdesktop
.wrap
) return;
203 d
= screen_num_desktops
- 1;
205 screen_set_desktop(d
);
208 static void cur_row_col(guint
*r
, guint
*c
)
210 switch (screen_desktop_layout
.orientation
) {
211 case Orientation_Horz
:
212 switch (screen_desktop_layout
.start_corner
) {
214 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
215 *c
= screen_desktop
% screen_desktop_layout
.columns
;
217 case Corner_BottomLeft
:
218 *r
= screen_desktop_layout
.rows
- 1 -
219 screen_desktop
/ screen_desktop_layout
.columns
;
220 *c
= screen_desktop
% screen_desktop_layout
.columns
;
223 case Corner_TopRight
:
224 *r
= screen_desktop
/ screen_desktop_layout
.columns
;
225 *c
= screen_desktop_layout
.columns
- 1 -
226 screen_desktop
% screen_desktop_layout
.columns
;
228 case Corner_BottomRight
:
229 *r
= screen_desktop_layout
.rows
- 1 -
230 screen_desktop
/ screen_desktop_layout
.columns
;
231 *c
= screen_desktop_layout
.columns
- 1 -
232 screen_desktop
% screen_desktop_layout
.columns
;
236 case Orientation_Vert
:
237 switch (screen_desktop_layout
.start_corner
) {
239 *r
= screen_desktop
% screen_desktop_layout
.rows
;
240 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
242 case Corner_BottomLeft
:
243 *r
= screen_desktop_layout
.rows
- 1 -
244 screen_desktop
% screen_desktop_layout
.rows
;
245 *c
= screen_desktop
/ screen_desktop_layout
.rows
;
248 case Corner_TopRight
:
249 *r
= screen_desktop
% screen_desktop_layout
.rows
;
250 *c
= screen_desktop_layout
.columns
- 1 -
251 screen_desktop
/ screen_desktop_layout
.rows
;
253 case Corner_BottomRight
:
254 *r
= screen_desktop_layout
.rows
- 1 -
255 screen_desktop
% screen_desktop_layout
.rows
;
256 *c
= screen_desktop_layout
.columns
- 1 -
257 screen_desktop
/ screen_desktop_layout
.rows
;
265 static guint
translate_row_col(guint r
, guint c
)
267 switch (screen_desktop_layout
.orientation
) {
268 case Orientation_Horz
:
269 switch (screen_desktop_layout
.start_corner
) {
271 return r
* screen_desktop_layout
.columns
+ c
;
272 case Corner_BottomLeft
:
273 return (screen_desktop_layout
.rows
- 1 - r
) *
274 screen_desktop_layout
.columns
+ c
;
275 case Corner_TopRight
:
276 return r
* screen_desktop_layout
.columns
+
277 (screen_desktop_layout
.columns
- 1 - c
);
278 case Corner_BottomRight
:
279 return (screen_desktop_layout
.rows
- 1 - r
) *
280 screen_desktop_layout
.columns
+
281 (screen_desktop_layout
.columns
- 1 - c
);
283 case Orientation_Vert
:
284 switch (screen_desktop_layout
.start_corner
) {
286 return c
* screen_desktop_layout
.rows
+ r
;
287 case Corner_BottomLeft
:
288 return c
* screen_desktop_layout
.rows
+
289 (screen_desktop_layout
.rows
- 1 - r
);
290 case Corner_TopRight
:
291 return (screen_desktop_layout
.columns
- 1 - c
) *
292 screen_desktop_layout
.rows
+ r
;
293 case Corner_BottomRight
:
294 return (screen_desktop_layout
.columns
- 1 - c
) *
295 screen_desktop_layout
.rows
+
296 (screen_desktop_layout
.rows
- 1 - r
);
299 g_assert_not_reached();
303 void action_next_desktop_column(union ActionData
*data
)
309 d
= translate_row_col(r
, c
);
310 if (d
>= screen_num_desktops
) {
311 if (!data
->nextprevdesktop
.wrap
) return;
314 if (d
>= screen_num_desktops
)
316 d
= translate_row_col(r
, c
);
317 if (d
< screen_num_desktops
)
318 screen_set_desktop(d
);
321 void action_previous_desktop_column(union ActionData
*data
)
327 d
= translate_row_col(r
, c
);
328 if (d
>= screen_num_desktops
) {
329 if (!data
->nextprevdesktop
.wrap
) return;
330 c
= screen_desktop_layout
.columns
- 1;
332 if (d
>= screen_num_desktops
)
334 d
= translate_row_col(r
, c
);
335 if (d
< screen_num_desktops
)
336 screen_set_desktop(d
);
339 void action_next_desktop_row(union ActionData
*data
)
345 d
= translate_row_col(r
, c
);
346 if (d
>= screen_num_desktops
) {
347 if (!data
->nextprevdesktop
.wrap
) return;
350 if (d
>= screen_num_desktops
)
352 d
= translate_row_col(r
, c
);
353 if (d
< screen_num_desktops
)
354 screen_set_desktop(d
);
357 void action_previous_desktop_row(union ActionData
*data
)
363 d
= translate_row_col(r
, c
);
364 if (d
>= screen_num_desktops
) {
365 if (!data
->nextprevdesktop
.wrap
) return;
366 c
= screen_desktop_layout
.rows
- 1;
368 if (d
>= screen_num_desktops
)
370 d
= translate_row_col(r
, c
);
371 if (d
< screen_num_desktops
)
372 screen_set_desktop(d
);
375 void action_toggle_decorations(union ActionData
*data
)
377 Client
*c
= data
->client
.c
;
378 c
->disabled_decorations
= c
->disabled_decorations
? 0 : ~0;
379 client_setup_decor_and_functions(c
);
382 void action_move(union ActionData
*data
)
384 Client
*c
= data
->move
.c
;
385 int x
= data
->move
.x
;
386 int y
= data
->move
.y
;
388 client_configure(c
, Corner_TopLeft
, x
, y
, c
->area
.width
, c
->area
.height
,
389 TRUE
, data
->move
.final
);
392 void action_resize(union ActionData
*data
)
394 Client
*c
= data
->resize
.c
;
395 int w
= data
->resize
.x
- c
->frame
->size
.left
- c
->frame
->size
.right
;
396 int h
= data
->resize
.y
- c
->frame
->size
.top
- c
->frame
->size
.bottom
;
398 client_configure(c
, data
->resize
.corner
, c
->area
.x
, c
->area
.y
, w
, h
,
399 TRUE
, data
->resize
.final
);
This page took 0.057213 seconds and 4 git commands to generate.