]> icculus.org git repositories - mikachu/openbox.git/blob - openbox/actions/desktop.c
changes for the 3.4 branch from master (svn trunk)
[mikachu/openbox.git] / openbox / actions / desktop.c
1 #include "openbox/actions.h"
2 #include "openbox/screen.h"
3 #include "openbox/client.h"
4 #include <glib.h>
5
6 typedef struct {
7     gboolean last;
8     guint desktop;
9     gboolean send;
10     gboolean follow;
11 } Options;
12
13 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
14 static gpointer setup_send_func(ObParseInst *i, xmlDocPtr doc,xmlNodePtr node);
15 static gpointer setup_last_func(ObParseInst *i, xmlDocPtr doc,xmlNodePtr node);
16 static void     free_func(gpointer options);
17 static gboolean run_func(ObActionsData *data, gpointer options);
18
19 void action_desktop_startup()
20 {
21     actions_register("Desktop",
22                      setup_func,
23                      free_func,
24                      run_func,
25                      NULL, NULL);
26     actions_register("DesktopLast",
27                      setup_last_func,
28                      free_func,
29                      run_func,
30                      NULL, NULL);
31     actions_register("SendToDesktop",
32                      setup_send_func,
33                      free_func,
34                      run_func,
35                      NULL, NULL);
36 }
37
38 static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
39 {
40     xmlNodePtr n;
41     Options *o;
42
43     o = g_new0(Options, 1);
44     o->follow = TRUE;
45
46     if ((n = parse_find_node("desktop", node))) {
47         gchar *s = parse_string(doc, n);
48         if (!g_ascii_strcasecmp(s, "last"))
49             o->last = TRUE;
50         else
51             o->desktop = parse_int(doc, n) - 1;
52         g_free(s);
53     }
54     if ((n = parse_find_node("send", node)))
55         o->send = parse_bool(doc, n);
56     if ((n = parse_find_node("follow", node)))
57         o->follow = parse_bool(doc, n);
58
59     return o;
60 }
61
62 static gpointer setup_send_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
63 {
64     Options *o = setup_func(i, doc, node);
65     o->send = TRUE;
66     return o;
67 }
68
69 static gpointer setup_last_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
70 {
71     Options *o = setup_func(i, doc, node);
72     o->last = TRUE;
73     return o;
74 }
75
76 static void free_func(gpointer options)
77 {
78     Options *o = options;
79
80     g_free(o);
81 }
82
83 /* Always return FALSE because its not interactive */
84 static gboolean run_func(ObActionsData *data, gpointer options)
85 {
86     Options *o = options;
87     guint d;
88
89     if (o->last)
90         d = screen_last_desktop;
91     else
92         d = o->desktop;
93
94     if (d < screen_num_desktops && d != screen_desktop) {
95         gboolean go = !o->send;
96         if (o->send) {
97             if (data->client && client_normal(data->client)) {
98                 client_set_desktop(data->client, d, o->follow, FALSE);
99                 go = TRUE;
100             }
101         }
102         if (go)
103             screen_set_desktop(d, TRUE);
104     }
105     return FALSE;
106 }