]> Dogcows Code - chaz/openbox/blob - openbox/actions/addremovedesktop.c
Merge branch 'backport' into work
[chaz/openbox] / openbox / actions / addremovedesktop.c
1 #include "openbox/actions.h"
2 #include "openbox/screen.h"
3 #include <glib.h>
4
5 typedef struct {
6 gboolean current;
7 gboolean add;
8 } Options;
9
10 static gpointer setup_func(xmlNodePtr node);
11 static gpointer setup_add_func(xmlNodePtr node);
12 static gpointer setup_remove_func(xmlNodePtr node);
13 static gboolean run_func(ObActionsData *data, gpointer options);
14 /* 3.4-compatibility */
15 static gpointer setup_addcurrent_func(xmlNodePtr node);
16 static gpointer setup_addlast_func(xmlNodePtr node);
17 static gpointer setup_removecurrent_func(xmlNodePtr node);
18 static gpointer setup_removelast_func(xmlNodePtr node);
19
20 void action_addremovedesktop_startup(void)
21 {
22 actions_register("AddDesktop", setup_add_func, g_free, run_func,
23 NULL, NULL);
24 actions_register("RemoveDesktop", setup_remove_func, g_free, run_func,
25 NULL, NULL);
26
27 /* 3.4-compatibility */
28 actions_register("AddDesktopLast", setup_addlast_func, g_free, run_func,
29 NULL, NULL);
30 actions_register("RemoveDesktopLast", setup_removelast_func, g_free, run_func,
31 NULL, NULL);
32 actions_register("AddDesktopCurrent", setup_addcurrent_func, g_free, run_func,
33 NULL, NULL);
34 actions_register("RemoveDesktopCurrent", setup_removecurrent_func, g_free, run_func,
35 NULL, NULL);
36 }
37
38 static gpointer setup_func(xmlNodePtr node)
39 {
40 xmlNodePtr n;
41 Options *o;
42
43 o = g_new0(Options, 1);
44
45 if ((n = obt_parse_find_node(node, "where"))) {
46 gchar *s = obt_parse_node_string(n);
47 if (!g_ascii_strcasecmp(s, "last"))
48 o->current = FALSE;
49 else if (!g_ascii_strcasecmp(s, "current"))
50 o->current = TRUE;
51 g_free(s);
52 }
53
54 return o;
55 }
56
57 static gpointer setup_add_func(xmlNodePtr node)
58 {
59 Options *o = setup_func(node);
60 o->add = TRUE;
61 return o;
62 }
63
64 static gpointer setup_remove_func(xmlNodePtr node)
65 {
66 Options *o = setup_func(node);
67 o->add = FALSE;
68 return o;
69 }
70
71 /* Always return FALSE because its not interactive */
72 static gboolean run_func(ObActionsData *data, gpointer options)
73 {
74 Options *o = options;
75
76 actions_client_move(data, TRUE);
77
78 if (o->add)
79 screen_add_desktop(o->current);
80 else
81 screen_remove_desktop(o->current);
82
83 actions_client_move(data, FALSE);
84
85 return FALSE;
86 }
87
88 /* 3.4-compatibility */
89 static gpointer setup_addcurrent_func(xmlNodePtr node)
90 {
91 Options *o = setup_add_func(node);
92 o->current = TRUE;
93 return o;
94 }
95
96 static gpointer setup_addlast_func(xmlNodePtr node)
97 {
98 Options *o = setup_add_func(node);
99 o->current = FALSE;
100 return o;
101 }
102
103 static gpointer setup_removecurrent_func(xmlNodePtr node)
104 {
105 Options *o = setup_remove_func(node);
106 o->current = TRUE;
107 return o;
108 }
109
110 static gpointer setup_removelast_func(xmlNodePtr node)
111 {
112 Options *o = setup_remove_func(node);
113 o->current = FALSE;
114 return o;
115 }
This page took 0.04067 seconds and 5 git commands to generate.