]>
Dogcows Code - chaz/openbox/blob - openbox/actions/desktop.c
1 #include "openbox/actions.h"
2 #include "openbox/screen.h"
3 #include "openbox/client.h"
29 static gpointer
setup_go_func(ObParseInst
*i
, xmlDocPtr doc
,
31 static gpointer
setup_send_func(ObParseInst
*i
, xmlDocPtr doc
,
33 static gboolean
run_func(ObActionsData
*data
, gpointer options
);
35 void action_desktop_startup(void)
37 actions_register("GoToDesktop", setup_go_func
, g_free
, run_func
,
39 actions_register("SendToDesktop", setup_send_func
, g_free
, run_func
,
43 static gpointer
setup_go_func(ObParseInst
*i
, xmlDocPtr doc
,
49 o
= g_new0(Options
, 1);
50 /* don't go anywhere if theres no options given */
52 o
->abs
.desktop
= screen_desktop
;
53 /* wrap by default - it's handy! */
56 if ((n
= parse_find_node("to", node
))) {
57 gchar
*s
= parse_string(doc
, n
);
58 if (!g_ascii_strcasecmp(s
, "last"))
60 else if (!g_ascii_strcasecmp(s
, "next")) {
63 o
->rel
.dir
= OB_DIRECTION_EAST
;
65 else if (!g_ascii_strcasecmp(s
, "previous")) {
68 o
->rel
.dir
= OB_DIRECTION_WEST
;
70 else if (!g_ascii_strcasecmp(s
, "north") ||
71 !g_ascii_strcasecmp(s
, "up")) {
73 o
->rel
.dir
= OB_DIRECTION_NORTH
;
75 else if (!g_ascii_strcasecmp(s
, "south") ||
76 !g_ascii_strcasecmp(s
, "down")) {
78 o
->rel
.dir
= OB_DIRECTION_SOUTH
;
80 else if (!g_ascii_strcasecmp(s
, "west") ||
81 !g_ascii_strcasecmp(s
, "left")) {
83 o
->rel
.dir
= OB_DIRECTION_WEST
;
85 else if (!g_ascii_strcasecmp(s
, "east") ||
86 !g_ascii_strcasecmp(s
, "right")) {
88 o
->rel
.dir
= OB_DIRECTION_EAST
;
92 o
->abs
.desktop
= parse_int(doc
, n
) - 1;
97 if ((n
= parse_find_node("wrap", node
)))
98 o
->rel
.wrap
= parse_bool(doc
, n
);
103 static gpointer
setup_send_func(ObParseInst
*i
, xmlDocPtr doc
,
109 o
= setup_go_func(i
, doc
, node
);
113 if ((n
= parse_find_node("follow", node
)))
114 o
->follow
= parse_bool(doc
, n
);
119 /* Always return FALSE because its not interactive */
120 static gboolean
run_func(ObActionsData
*data
, gpointer options
)
122 Options
*o
= options
;
129 d
= screen_last_desktop
;
135 d
= screen_find_desktop(screen_desktop
,
136 o
->rel
.dir
, o
->rel
.wrap
, o
->rel
.linear
);
140 if (d
< screen_num_desktops
&& d
!= screen_desktop
) {
143 if (o
->send
&& data
->client
&& client_normal(data
->client
)) {
144 client_set_desktop(data
->client
, d
, o
->follow
, FALSE
);
148 if (go
) screen_set_desktop(d
, TRUE
);
This page took 0.041397 seconds and 4 git commands to generate.