Add a task to copy configuration files to user's HOME dir from data dir for multi...
[platform/core/uifw/e17.git] / src / bin / e_msgbus.c
1 #include "e.h"
2
3 /* local subsystem functions */
4 static void _e_msgbus_request_name_cb(void        *data,
5                                       DBusMessage *msg,
6                                       DBusError   *err);
7
8 static DBusMessage *_e_msgbus_core_restart_cb(E_DBus_Object *obj,
9                                               DBusMessage   *msg);
10 static DBusMessage *_e_msgbus_core_shutdown_cb(E_DBus_Object *obj,
11                                                DBusMessage   *msg);
12
13 static DBusMessage *_e_msgbus_module_load_cb(E_DBus_Object *obj,
14                                              DBusMessage   *msg);
15 static DBusMessage *_e_msgbus_module_unload_cb(E_DBus_Object *obj,
16                                                DBusMessage   *msg);
17 static DBusMessage *_e_msgbus_module_enable_cb(E_DBus_Object *obj,
18                                                DBusMessage   *msg);
19 static DBusMessage *_e_msgbus_module_disable_cb(E_DBus_Object *obj,
20                                                 DBusMessage   *msg);
21 static DBusMessage *_e_msgbus_module_list_cb(E_DBus_Object *obj,
22                                              DBusMessage   *msg);
23
24 static DBusMessage *_e_msgbus_profile_set_cb(E_DBus_Object *obj,
25                                              DBusMessage   *msg);
26 static DBusMessage *_e_msgbus_profile_get_cb(E_DBus_Object *obj,
27                                              DBusMessage   *msg);
28 static DBusMessage *_e_msgbus_profile_list_cb(E_DBus_Object *obj,
29                                               DBusMessage   *msg);
30 static DBusMessage *_e_msgbus_profile_add_cb(E_DBus_Object *obj,
31                                              DBusMessage   *msg);
32 static DBusMessage *_e_msgbus_profile_delete_cb(E_DBus_Object *obj,
33                                                 DBusMessage   *msg);
34
35 #define E_MSGBUS_WIN_ACTION_CB_PROTO(NAME) \
36 static DBusMessage *_e_msgbus_window_##NAME##_cb(E_DBus_Object *obj __UNUSED__, DBusMessage   *msg)
37
38 E_MSGBUS_WIN_ACTION_CB_PROTO(list);
39 E_MSGBUS_WIN_ACTION_CB_PROTO(close);
40 E_MSGBUS_WIN_ACTION_CB_PROTO(kill);
41 E_MSGBUS_WIN_ACTION_CB_PROTO(focus);
42 E_MSGBUS_WIN_ACTION_CB_PROTO(iconify);
43 E_MSGBUS_WIN_ACTION_CB_PROTO(uniconify);
44 E_MSGBUS_WIN_ACTION_CB_PROTO(maximize);
45 E_MSGBUS_WIN_ACTION_CB_PROTO(unmaximize);
46
47 #ifdef _F_ZONE_WINDOW_ROTATION_
48 static DBusMessage *_e_msgbus_zone_rotation_cb(E_DBus_Object *obj,
49                                                DBusMessage   *msg);
50 #endif
51
52 /* local subsystem globals */
53 static E_Msgbus_Data *_e_msgbus_data = NULL;
54
55 /* externally accessible functions */
56 EINTERN int
57 e_msgbus_init(void)
58 {
59    E_DBus_Interface *iface;
60
61    _e_msgbus_data = E_NEW(E_Msgbus_Data, 1);
62
63    e_dbus_init();
64 #ifdef HAVE_HAL
65    e_hal_init();
66 #endif
67
68    _e_msgbus_data->conn = e_dbus_bus_get(DBUS_BUS_SESSION);
69    if (!_e_msgbus_data->conn)
70      {
71         WRN("Cannot get DBUS_BUS_SESSION");
72         return 0;
73      }
74    e_dbus_request_name(_e_msgbus_data->conn, "org.enlightenment.wm.service", 0, _e_msgbus_request_name_cb, NULL);
75    _e_msgbus_data->obj = e_dbus_object_add(_e_msgbus_data->conn, "/org/enlightenment/wm/RemoteObject", NULL);
76
77    iface = e_dbus_interface_new("org.enlightenment.wm.Core");
78    if (!iface)
79      {
80         WRN("Cannot add org.enlightenment.wm.Core interface");
81         return 0;
82      }
83    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
84    e_dbus_interface_unref(iface);
85
86    /* Hardcore methods */
87    e_dbus_interface_method_add(iface, "Restart", "", "", _e_msgbus_core_restart_cb);
88    e_dbus_interface_method_add(iface, "Shutdown", "", "", _e_msgbus_core_shutdown_cb);
89
90    iface = e_dbus_interface_new("org.enlightenment.wm.Module");
91    if (!iface)
92      {
93         WRN("Cannot add org.enlightenment.wm.Module interface");
94         return 0;
95      }
96    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
97    e_dbus_interface_unref(iface);
98
99    /* Module methods */
100    e_dbus_interface_method_add(iface, "Load", "s", "", _e_msgbus_module_load_cb);
101    e_dbus_interface_method_add(iface, "Unload", "s", "", _e_msgbus_module_unload_cb);
102    e_dbus_interface_method_add(iface, "Enable", "s", "", _e_msgbus_module_enable_cb);
103    e_dbus_interface_method_add(iface, "Disable", "s", "", _e_msgbus_module_disable_cb);
104    e_dbus_interface_method_add(iface, "List", "", "a(si)", _e_msgbus_module_list_cb);
105
106    iface = e_dbus_interface_new("org.enlightenment.wm.Profile");
107    if (!iface)
108      {
109         WRN("Cannot add org.enlightenment.wm.Profile interface");
110         return 0;
111      }
112    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
113    e_dbus_interface_unref(iface);
114
115    /* Profile methods */
116    e_dbus_interface_method_add(iface, "Set", "s", "", _e_msgbus_profile_set_cb);
117    e_dbus_interface_method_add(iface, "Get", "", "s", _e_msgbus_profile_get_cb);
118    e_dbus_interface_method_add(iface, "List", "", "as", _e_msgbus_profile_list_cb);
119    e_dbus_interface_method_add(iface, "Add", "s", "", _e_msgbus_profile_add_cb);
120    e_dbus_interface_method_add(iface, "Delete", "s", "", _e_msgbus_profile_delete_cb);
121
122    iface = e_dbus_interface_new("org.enlightenment.wm.Window");
123    if (!iface)
124      {
125         WRN("Cannot add org.enlightenment.wm.Window interface");
126         return 0;
127      }
128    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
129    e_dbus_interface_unref(iface);
130
131    /* Profile methods */
132    e_dbus_interface_method_add(iface, "List", "", "a(si)", _e_msgbus_window_list_cb);
133    e_dbus_interface_method_add(iface, "Close", "i", "", _e_msgbus_window_close_cb);
134    e_dbus_interface_method_add(iface, "Kill", "i", "", _e_msgbus_window_kill_cb);
135    e_dbus_interface_method_add(iface, "Focus", "i", "", _e_msgbus_window_focus_cb);
136    e_dbus_interface_method_add(iface, "Iconify", "i", "", _e_msgbus_window_iconify_cb);
137    e_dbus_interface_method_add(iface, "Uniconify", "i", "", _e_msgbus_window_uniconify_cb);
138    e_dbus_interface_method_add(iface, "Maximize", "i", "", _e_msgbus_window_maximize_cb);
139    e_dbus_interface_method_add(iface, "Unmaximize", "i", "", _e_msgbus_window_unmaximize_cb);
140
141 #ifdef _F_ZONE_WINDOW_ROTATION_
142    iface = e_dbus_interface_new("org.enlightenment.wm.Zone");
143    if (!iface)
144      {
145         WRN("Cannot add org.enlightenment.wm.Zone interface");
146         return 0;
147      }
148    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
149    e_dbus_interface_unref(iface);
150
151    /* Zone methods */
152    e_dbus_interface_method_add(iface, "Rotation", "ii", "", _e_msgbus_zone_rotation_cb);
153 #endif
154
155    return 1;
156 }
157
158 EINTERN int
159 e_msgbus_shutdown(void)
160 {
161    if (_e_msgbus_data->obj)
162      {
163         e_dbus_object_free(_e_msgbus_data->obj);
164      }
165    if (_e_msgbus_data->conn)
166      {
167         e_dbus_connection_close(_e_msgbus_data->conn);
168      }
169 #ifdef HAVE_HAL
170    e_hal_shutdown();
171 #endif
172    e_dbus_shutdown();
173
174    E_FREE(_e_msgbus_data);
175    _e_msgbus_data = NULL;
176    return 1;
177 }
178
179 EAPI void
180 e_msgbus_interface_attach(E_DBus_Interface *iface)
181 {
182    if (!_e_msgbus_data->obj) return;
183    e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
184 }
185
186 EAPI void
187 e_msgbus_interface_detach(E_DBus_Interface *iface)
188 {
189    if (!_e_msgbus_data->obj) return;
190    e_dbus_object_interface_detach(_e_msgbus_data->obj, iface);
191 }
192
193 static void
194 _e_msgbus_request_name_cb(void        *data __UNUSED__,
195                           DBusMessage *msg __UNUSED__,
196                           DBusError   *err __UNUSED__)
197 {
198 //TODO Handle Errors
199 }
200
201 /* Core Handlers */
202 static DBusMessage *
203 _e_msgbus_core_restart_cb(E_DBus_Object *obj __UNUSED__,
204                           DBusMessage   *msg)
205 {
206    e_sys_action_do(E_SYS_RESTART, NULL);
207    return dbus_message_new_method_return(msg);
208 }
209
210 static DBusMessage *
211 _e_msgbus_core_shutdown_cb(E_DBus_Object *obj __UNUSED__,
212                            DBusMessage   *msg)
213 {
214    e_sys_action_do(E_SYS_EXIT, NULL);
215    return dbus_message_new_method_return(msg);
216 }
217
218 /* Modules Handlers */
219 static DBusMessage *
220 _e_msgbus_module_load_cb(E_DBus_Object *obj __UNUSED__,
221                          DBusMessage   *msg)
222 {
223    DBusMessageIter iter;
224    char *module;
225
226    dbus_message_iter_init(msg, &iter);
227    dbus_message_iter_get_basic(&iter, &module);
228
229    if (!e_module_find(module))
230      {
231         e_module_new(module);
232         e_config_save_queue();
233      }
234
235    return dbus_message_new_method_return(msg);
236 }
237
238 static DBusMessage *
239 _e_msgbus_module_unload_cb(E_DBus_Object *obj __UNUSED__,
240                            DBusMessage   *msg)
241 {
242    DBusMessageIter iter;
243    char *module;
244    E_Module *m;
245
246    dbus_message_iter_init(msg, &iter);
247    dbus_message_iter_get_basic(&iter, &module);
248
249    if ((m = e_module_find(module)))
250      {
251         e_module_disable(m);
252         e_object_del(E_OBJECT(m));
253         e_config_save_queue();
254      }
255
256    return dbus_message_new_method_return(msg);
257 }
258
259 static DBusMessage *
260 _e_msgbus_module_enable_cb(E_DBus_Object *obj __UNUSED__,
261                            DBusMessage   *msg)
262 {
263    DBusMessageIter iter;
264    char *module;
265    E_Module *m;
266
267    dbus_message_iter_init(msg, &iter);
268    dbus_message_iter_get_basic(&iter, &module);
269
270    if ((m = e_module_find(module)))
271      {
272         e_module_enable(m);
273         e_config_save_queue();
274      }
275
276    return dbus_message_new_method_return(msg);
277 }
278
279 static DBusMessage *
280 _e_msgbus_module_disable_cb(E_DBus_Object *obj __UNUSED__,
281                             DBusMessage   *msg)
282 {
283    DBusMessageIter iter;
284    char *module;
285    E_Module *m;
286
287    dbus_message_iter_init(msg, &iter);
288    dbus_message_iter_get_basic(&iter, &module);
289
290    if ((m = e_module_find(module)))
291      {
292         e_module_disable(m);
293         e_config_save_queue();
294      }
295
296    return dbus_message_new_method_return(msg);
297 }
298
299 static DBusMessage *
300 _e_msgbus_module_list_cb(E_DBus_Object *obj __UNUSED__,
301                          DBusMessage   *msg)
302 {
303    Eina_List *l;
304    E_Module *mod;
305    DBusMessage *reply;
306    DBusMessageIter iter;
307    DBusMessageIter arr;
308
309    reply = dbus_message_new_method_return(msg);
310    dbus_message_iter_init_append(reply, &iter);
311    dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(si)", &arr);
312
313    EINA_LIST_FOREACH(e_module_list(), l, mod)
314      {
315         DBusMessageIter sub;
316         const char *name;
317         int enabled;
318
319         name = mod->name;
320         enabled = mod->enabled;
321         dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub);
322         dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &(name));
323         dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(enabled));
324         dbus_message_iter_close_container(&arr, &sub);
325      }
326    dbus_message_iter_close_container(&iter, &arr);
327
328    return reply;
329 }
330
331 /* Profile Handlers */
332 static DBusMessage *
333 _e_msgbus_profile_set_cb(E_DBus_Object *obj __UNUSED__,
334                          DBusMessage   *msg)
335 {
336    DBusMessageIter iter;
337    char *profile;
338
339    dbus_message_iter_init(msg, &iter);
340    dbus_message_iter_get_basic(&iter, &profile);
341
342    e_config_save_flush();
343    e_config_profile_set(profile);
344    e_config_profile_save();
345    e_config_save_block_set(1);
346    e_sys_action_do(E_SYS_RESTART, NULL);
347
348    return dbus_message_new_method_return(msg);
349 }
350
351 static DBusMessage *
352 _e_msgbus_profile_get_cb(E_DBus_Object *obj __UNUSED__,
353                          DBusMessage   *msg)
354 {
355    DBusMessageIter iter;
356    DBusMessage *reply;
357    const char *profile;
358
359    profile = e_config_profile_get();
360
361    reply = dbus_message_new_method_return(msg);
362    dbus_message_iter_init_append(reply, &iter);
363    dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &profile);
364
365    return reply;
366 }
367
368 static DBusMessage *
369 _e_msgbus_profile_list_cb(E_DBus_Object *obj __UNUSED__,
370                           DBusMessage   *msg)
371 {
372    Eina_List *l;
373    const char *name;
374    DBusMessage *reply;
375    DBusMessageIter iter;
376    DBusMessageIter arr;
377
378    reply = dbus_message_new_method_return(msg);
379    dbus_message_iter_init_append(reply, &iter);
380    dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &arr);
381
382    EINA_LIST_FOREACH(e_config_profile_list(), l, name)
383      {
384         dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &name);
385      }
386    dbus_message_iter_close_container(&iter, &arr);
387
388    return reply;
389 }
390
391 static DBusMessage *
392 _e_msgbus_profile_add_cb(E_DBus_Object *obj __UNUSED__,
393                          DBusMessage   *msg)
394 {
395    DBusMessageIter iter;
396    char *profile;
397
398    dbus_message_iter_init(msg, &iter);
399    dbus_message_iter_get_basic(&iter, &profile);
400
401    e_config_profile_add(profile);
402
403    return dbus_message_new_method_return(msg);
404 }
405
406 static DBusMessage *
407 _e_msgbus_profile_delete_cb(E_DBus_Object *obj __UNUSED__,
408                             DBusMessage   *msg)
409 {
410    DBusMessageIter iter;
411    char *profile;
412
413    dbus_message_iter_init(msg, &iter);
414    dbus_message_iter_get_basic(&iter, &profile);
415    if (!strcmp(e_config_profile_get(), profile))
416      {
417         DBusMessage *ret;
418
419         ret = dbus_message_new_error(msg, "org.enlightenment.DBus.InvalidArgument",
420                                      "Can't delete active profile");
421         return ret;
422      }
423    e_config_profile_del(profile);
424
425    return dbus_message_new_method_return(msg);
426 }
427
428 /* Window handlers */
429 static DBusMessage *
430 _e_msgbus_window_list_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
431 {
432    Eina_List *l;
433    E_Border *bd;
434    DBusMessage *reply;
435    DBusMessageIter iter;
436    DBusMessageIter arr;
437
438    reply = dbus_message_new_method_return(msg);
439    dbus_message_iter_init_append(reply, &iter);
440    dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(si)", &arr);
441
442    EINA_LIST_FOREACH(e_border_client_list(), l, bd)
443      {
444         DBusMessageIter sub;
445         dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub);
446         dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &bd->client.icccm.name);
447         dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &bd->client.win);
448         dbus_message_iter_close_container(&arr, &sub);
449      }
450    dbus_message_iter_close_container(&iter, &arr);
451
452    return reply;
453 }
454
455 #define E_MSGBUS_WIN_ACTION_CB_BEGIN(NAME) \
456 static DBusMessage * \
457 _e_msgbus_window_##NAME##_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) \
458 { \
459    E_Border *bd; \
460    int xwin;\
461    DBusMessageIter iter;\
462 \
463    dbus_message_iter_init(msg, &iter);\
464    dbus_message_iter_get_basic(&iter, &xwin);\
465    bd = e_border_find_by_client_window(xwin);\
466    if (bd)\
467      {
468
469 #define E_MSGBUS_WIN_ACTION_CB_END \
470      }\
471 \
472    return dbus_message_new_method_return(msg);\
473 }
474
475 E_MSGBUS_WIN_ACTION_CB_BEGIN(close)
476 e_border_act_close_begin(bd);
477 E_MSGBUS_WIN_ACTION_CB_END
478
479 E_MSGBUS_WIN_ACTION_CB_BEGIN(kill)
480 e_border_act_kill_begin(bd);
481 E_MSGBUS_WIN_ACTION_CB_END
482
483 E_MSGBUS_WIN_ACTION_CB_BEGIN(focus)
484 e_border_focus_set(bd, 1, 1);
485 if (!bd->lock_user_stacking)
486   {
487      if (e_config->border_raise_on_focus)
488        e_border_raise(bd);
489   }
490 E_MSGBUS_WIN_ACTION_CB_END
491
492 E_MSGBUS_WIN_ACTION_CB_BEGIN(iconify)
493 e_border_iconify(bd);
494 E_MSGBUS_WIN_ACTION_CB_END
495
496 E_MSGBUS_WIN_ACTION_CB_BEGIN(uniconify)
497 e_border_uniconify(bd);
498 E_MSGBUS_WIN_ACTION_CB_END
499
500 E_MSGBUS_WIN_ACTION_CB_BEGIN(maximize)
501 e_border_maximize(bd, e_config->maximize_policy);
502 E_MSGBUS_WIN_ACTION_CB_END
503
504 E_MSGBUS_WIN_ACTION_CB_BEGIN(unmaximize)
505 e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
506 E_MSGBUS_WIN_ACTION_CB_END
507
508 #ifdef _F_ZONE_WINDOW_ROTATION_
509 static DBusMessage *
510 _e_msgbus_zone_rotation_cb(E_DBus_Object *obj __UNUSED__,
511                            DBusMessage   *msg)
512 {
513    DBusError err;
514    E_Zone *zone = NULL;
515    int zone_id, rot;
516
517    dbus_error_init(&err);
518    if (!dbus_message_get_args(msg, &err,
519                               DBUS_TYPE_INT32, &zone_id,
520                               DBUS_TYPE_INT32, &rot,
521                               DBUS_TYPE_INVALID))
522      {
523         fprintf(stderr, "could not get Rotation arguments: %s: %s\n", err.name, err.message);
524         dbus_error_free(&err);
525      }
526    else
527      {
528         zone = e_util_container_zone_id_get(0, zone_id);
529         fprintf(stdout, "Rotate zone %d,%d\n", zone_id, rot);
530         if (zone)
531           e_zone_rotation_set(zone, rot);
532      }
533    return dbus_message_new_method_return(msg);
534 }
535 #endif
536