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