eebbd7f38f2eea8ec12763a8b79a19dc882d8945
[framework/uifw/e17.git] / src / modules / msgbus / msgbus_desktop.c
1 #include "e_mod_main.h"
2
3 static int _log_dom = -1;
4 #define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__)
5 #define WARN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__)
6 #define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
7 #define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__)
8
9 static DBusMessage *
10 cb_virtual_desktops(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
11 {
12    DBusMessage *reply = dbus_message_new_method_return(msg);
13    dbus_message_append_args(reply,
14                             DBUS_TYPE_INT32, &(e_config->zone_desks_x_count),
15                             DBUS_TYPE_INT32, &(e_config->zone_desks_y_count),
16                             DBUS_TYPE_INVALID);
17    DBG("GetVirtualCount: %d %d",
18        e_config->zone_desks_x_count, e_config->zone_desks_y_count);
19
20    return reply;
21 }
22
23 static DBusMessage *
24 cb_desktop_show(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
25 {
26    DBusError err;
27    int x, y;
28
29    dbus_error_init(&err);
30    if (!dbus_message_get_args(msg, &err,
31                               DBUS_TYPE_INT32, &x,
32                               DBUS_TYPE_INT32, &y,
33                               DBUS_TYPE_INVALID))
34      {
35         ERR("could not get Show arguments: %s: %s", err.name, err.message);
36         dbus_error_free(&err);
37      }
38    else
39      {
40         E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
41         DBG("show desktop %d,%d from zone %p.", x, y, zone);
42         e_zone_desk_flip_to(zone, x, y);
43      }
44
45    return dbus_message_new_method_return(msg);
46 }
47
48 static DBusMessage *
49 cb_desktop_show_by_name(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
50 {
51    DBusError err;
52    const char *name;
53
54    dbus_error_init(&err);
55    if (!dbus_message_get_args(msg, &err,
56                               DBUS_TYPE_STRING, &name,
57                               DBUS_TYPE_INVALID))
58      {
59         ERR("could not get Show arguments: %s: %s", err.name, err.message);
60         dbus_error_free(&err);
61      }
62    else if (name)
63      {
64         E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
65         unsigned int i, count;
66
67         DBG("show desktop %s from zone %p.", name, zone);
68         count = zone->desk_x_count * zone->desk_y_count;
69         for (i = 0; i < count; i++)
70           {
71              E_Desk *desk = zone->desks[i];
72              if ((desk->name) && (strcmp(desk->name, name) == 0))
73                {
74                   DBG("show desktop %s (%d,%d) from zone %p.",
75                       name, desk->x, desk->y, zone);
76                   e_zone_desk_flip_to(zone, desk->x, desk->y);
77                   break;
78                }
79           }
80      }
81
82    return dbus_message_new_method_return(msg);
83 }
84
85 static DBusMessage *
86 cb_desktop_lock(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
87 {
88    DBG("desklock requested");
89    e_desklock_show();
90
91    return dbus_message_new_method_return(msg);
92 }
93
94 static DBusMessage*
95 cb_desktop_bgadd(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
96 {
97    DBusError err;
98    int container, zone, desk_x, desk_y;
99    const char *path;
100
101    dbus_error_init(&err);
102    if (!dbus_message_get_args(msg, &err,
103                               DBUS_TYPE_INT32, &container,
104                               DBUS_TYPE_INT32, &zone,
105                               DBUS_TYPE_INT32, &desk_x,
106                               DBUS_TYPE_INT32, &desk_y,
107                               DBUS_TYPE_STRING, &path,
108                               DBUS_TYPE_INVALID))
109      {
110         ERR("could not get Add arguments: %s: %s", err.name, err.message);
111         dbus_error_free(&err);
112      }
113    else if (path)
114      {
115         DBG("add bg container=%d, zone=%d, pos=%d,%d path=%s",
116             container, zone, desk_x, desk_y, path);
117         e_bg_add(container, zone, desk_x, desk_y, path);
118         e_bg_update();
119         e_config_save_queue();
120      }
121
122    return dbus_message_new_method_return(msg);
123 }
124
125 static DBusMessage*
126 cb_desktop_bgdel(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
127 {
128    DBusError err;
129    int container, zone, desk_x, desk_y;
130
131    dbus_error_init(&err);
132    if (!dbus_message_get_args(msg, &err,
133                               DBUS_TYPE_INT32, &container,
134                               DBUS_TYPE_INT32, &zone,
135                               DBUS_TYPE_INT32, &desk_x,
136                               DBUS_TYPE_INT32, &desk_y,
137                               DBUS_TYPE_INVALID))
138      {
139         ERR("could not get Del arguments: %s: %s", err.name, err.message);
140         dbus_error_free(&err);
141      }
142    else
143      {
144         DBG("del bg container=%d, zone=%d, pos=%d,%d",
145             container, zone, desk_x, desk_y);
146
147         e_bg_del(container, zone, desk_x, desk_y);
148         e_bg_update();
149         e_config_save_queue();
150      }
151
152    return dbus_message_new_method_return(msg);
153 }
154
155 static DBusMessage*
156 cb_desktop_bglist(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
157 {
158    Eina_List *list;
159    E_Config_Desktop_Background *bg;
160    DBusMessage *reply;
161    DBusMessageIter iter;
162    DBusMessageIter arr;
163
164    reply = dbus_message_new_method_return(msg);
165    dbus_message_iter_init_append(reply, &iter);
166    dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(iiiis)", &arr);
167
168    EINA_LIST_FOREACH(e_config->desktop_backgrounds, list, bg)
169      {
170         DBusMessageIter sub;
171
172         if (!bg || !bg->file)
173         {
174            continue;
175         }
176
177         DBG("Background container=%d zone=%d pos=%d,%d path=%s",
178             bg->container, bg->zone, bg->desk_x, bg->desk_y, bg->file);
179
180         dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub);
181         dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->container));
182         dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->zone));
183         dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->desk_x));
184         dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->desk_y));
185         dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &(bg->file));
186         dbus_message_iter_close_container(&arr, &sub);
187      }
188    dbus_message_iter_close_container(&iter, &arr);
189
190    return reply;
191 }
192
193 void msgbus_desktop_init(Eina_Array *ifaces)
194 {
195    E_DBus_Interface *iface;
196
197    if (_log_dom == -1)
198      {
199         _log_dom = eina_log_domain_register("msgbus_desktop", EINA_COLOR_BLUE);
200         if (_log_dom < 0)
201           EINA_LOG_ERR("could not register msgbus_desktop log domain!");
202      }
203
204    iface = e_dbus_interface_new("org.enlightenment.wm.Desktop");
205    if (iface)
206      {
207         e_dbus_interface_method_add(iface, "GetVirtualCount", "", "ii",
208                                     cb_virtual_desktops);
209         e_dbus_interface_method_add(iface, "Show", "ii", "",
210                                     cb_desktop_show);
211         e_dbus_interface_method_add(iface, "ShowByName", "s", "",
212                                     cb_desktop_show_by_name);
213         e_dbus_interface_method_add(iface, "Lock", "", "",
214                                     cb_desktop_lock);
215         e_msgbus_interface_attach(iface);
216         eina_array_push(ifaces, iface);
217      }
218
219    iface = e_dbus_interface_new("org.enlightenment.wm.Desktop.Background");
220    if (iface)
221      {
222         e_dbus_interface_method_add(iface, "Add", "iiiis", "",
223                                     cb_desktop_bgadd);
224         e_dbus_interface_method_add(iface, "Del", "iiii", "",
225                                     cb_desktop_bgdel);
226         e_dbus_interface_method_add(iface, "List", "", "a(iiiis)",
227                                     cb_desktop_bglist);
228         e_msgbus_interface_attach(iface);
229         eina_array_push(ifaces, iface);
230      }
231 }