3 /* local subsystem functions */
4 static void _e_msgbus_request_name_cb(void *data,
8 static DBusMessage *_e_msgbus_core_restart_cb(E_DBus_Object *obj,
10 static DBusMessage *_e_msgbus_core_shutdown_cb(E_DBus_Object *obj,
13 static DBusMessage *_e_msgbus_module_load_cb(E_DBus_Object *obj,
15 static DBusMessage *_e_msgbus_module_unload_cb(E_DBus_Object *obj,
17 static DBusMessage *_e_msgbus_module_enable_cb(E_DBus_Object *obj,
19 static DBusMessage *_e_msgbus_module_disable_cb(E_DBus_Object *obj,
21 static DBusMessage *_e_msgbus_module_list_cb(E_DBus_Object *obj,
24 static DBusMessage *_e_msgbus_profile_set_cb(E_DBus_Object *obj,
26 static DBusMessage *_e_msgbus_profile_get_cb(E_DBus_Object *obj,
28 static DBusMessage *_e_msgbus_profile_list_cb(E_DBus_Object *obj,
30 static DBusMessage *_e_msgbus_profile_add_cb(E_DBus_Object *obj,
32 static DBusMessage *_e_msgbus_profile_delete_cb(E_DBus_Object *obj,
35 #define E_MSGBUS_WIN_ACTION_CB_PROTO(NAME) \
36 static DBusMessage *_e_msgbus_window_##NAME##_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
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);
47 #ifdef _F_ZONE_WINDOW_ROTATION_
48 static DBusMessage *_e_msgbus_zone_rotation_cb(E_DBus_Object *obj,
52 /* local subsystem globals */
53 static E_Msgbus_Data *_e_msgbus_data = NULL;
55 /* externally accessible functions */
59 E_DBus_Interface *iface;
61 _e_msgbus_data = E_NEW(E_Msgbus_Data, 1);
68 _e_msgbus_data->conn = e_dbus_bus_get(DBUS_BUS_SESSION);
69 if (!_e_msgbus_data->conn)
71 WRN("Cannot get DBUS_BUS_SESSION");
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);
77 iface = e_dbus_interface_new("org.enlightenment.wm.Core");
80 WRN("Cannot add org.enlightenment.wm.Core interface");
83 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
84 e_dbus_interface_unref(iface);
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);
90 iface = e_dbus_interface_new("org.enlightenment.wm.Module");
93 WRN("Cannot add org.enlightenment.wm.Module interface");
96 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
97 e_dbus_interface_unref(iface);
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);
106 iface = e_dbus_interface_new("org.enlightenment.wm.Profile");
109 WRN("Cannot add org.enlightenment.wm.Profile interface");
112 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
113 e_dbus_interface_unref(iface);
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);
122 iface = e_dbus_interface_new("org.enlightenment.wm.Window");
125 WRN("Cannot add org.enlightenment.wm.Window interface");
128 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
129 e_dbus_interface_unref(iface);
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);
141 #ifdef _F_ZONE_WINDOW_ROTATION_
142 iface = e_dbus_interface_new("org.enlightenment.wm.Zone");
145 WRN("Cannot add org.enlightenment.wm.Zone interface");
148 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
149 e_dbus_interface_unref(iface);
152 e_dbus_interface_method_add(iface, "Rotation", "ii", "", _e_msgbus_zone_rotation_cb);
159 e_msgbus_shutdown(void)
161 if (_e_msgbus_data->obj)
163 e_dbus_object_free(_e_msgbus_data->obj);
165 if (_e_msgbus_data->conn)
167 e_dbus_connection_close(_e_msgbus_data->conn);
174 E_FREE(_e_msgbus_data);
175 _e_msgbus_data = NULL;
180 e_msgbus_interface_attach(E_DBus_Interface *iface)
182 if (!_e_msgbus_data->obj) return;
183 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
187 e_msgbus_interface_detach(E_DBus_Interface *iface)
189 if (!_e_msgbus_data->obj) return;
190 e_dbus_object_interface_detach(_e_msgbus_data->obj, iface);
194 _e_msgbus_request_name_cb(void *data __UNUSED__,
195 DBusMessage *msg __UNUSED__,
196 DBusError *err __UNUSED__)
203 _e_msgbus_core_restart_cb(E_DBus_Object *obj __UNUSED__,
206 e_sys_action_do(E_SYS_RESTART, NULL);
207 return dbus_message_new_method_return(msg);
211 _e_msgbus_core_shutdown_cb(E_DBus_Object *obj __UNUSED__,
214 e_sys_action_do(E_SYS_EXIT, NULL);
215 return dbus_message_new_method_return(msg);
218 /* Modules Handlers */
220 _e_msgbus_module_load_cb(E_DBus_Object *obj __UNUSED__,
223 DBusMessageIter iter;
226 dbus_message_iter_init(msg, &iter);
227 dbus_message_iter_get_basic(&iter, &module);
229 if (!e_module_find(module))
231 e_module_new(module);
232 e_config_save_queue();
235 return dbus_message_new_method_return(msg);
239 _e_msgbus_module_unload_cb(E_DBus_Object *obj __UNUSED__,
242 DBusMessageIter iter;
246 dbus_message_iter_init(msg, &iter);
247 dbus_message_iter_get_basic(&iter, &module);
249 if ((m = e_module_find(module)))
252 e_object_del(E_OBJECT(m));
253 e_config_save_queue();
256 return dbus_message_new_method_return(msg);
260 _e_msgbus_module_enable_cb(E_DBus_Object *obj __UNUSED__,
263 DBusMessageIter iter;
267 dbus_message_iter_init(msg, &iter);
268 dbus_message_iter_get_basic(&iter, &module);
270 if ((m = e_module_find(module)))
273 e_config_save_queue();
276 return dbus_message_new_method_return(msg);
280 _e_msgbus_module_disable_cb(E_DBus_Object *obj __UNUSED__,
283 DBusMessageIter iter;
287 dbus_message_iter_init(msg, &iter);
288 dbus_message_iter_get_basic(&iter, &module);
290 if ((m = e_module_find(module)))
293 e_config_save_queue();
296 return dbus_message_new_method_return(msg);
300 _e_msgbus_module_list_cb(E_DBus_Object *obj __UNUSED__,
306 DBusMessageIter iter;
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);
313 EINA_LIST_FOREACH(e_module_list(), l, mod)
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);
326 dbus_message_iter_close_container(&iter, &arr);
331 /* Profile Handlers */
333 _e_msgbus_profile_set_cb(E_DBus_Object *obj __UNUSED__,
336 DBusMessageIter iter;
339 dbus_message_iter_init(msg, &iter);
340 dbus_message_iter_get_basic(&iter, &profile);
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);
348 return dbus_message_new_method_return(msg);
352 _e_msgbus_profile_get_cb(E_DBus_Object *obj __UNUSED__,
355 DBusMessageIter iter;
359 profile = e_config_profile_get();
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);
369 _e_msgbus_profile_list_cb(E_DBus_Object *obj __UNUSED__,
375 DBusMessageIter iter;
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);
382 EINA_LIST_FOREACH(e_config_profile_list(), l, name)
384 dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &name);
386 dbus_message_iter_close_container(&iter, &arr);
392 _e_msgbus_profile_add_cb(E_DBus_Object *obj __UNUSED__,
395 DBusMessageIter iter;
398 dbus_message_iter_init(msg, &iter);
399 dbus_message_iter_get_basic(&iter, &profile);
401 e_config_profile_add(profile);
403 return dbus_message_new_method_return(msg);
407 _e_msgbus_profile_delete_cb(E_DBus_Object *obj __UNUSED__,
410 DBusMessageIter iter;
413 dbus_message_iter_init(msg, &iter);
414 dbus_message_iter_get_basic(&iter, &profile);
415 if (!strcmp(e_config_profile_get(), profile))
419 ret = dbus_message_new_error(msg, "org.enlightenment.DBus.InvalidArgument",
420 "Can't delete active profile");
423 e_config_profile_del(profile);
425 return dbus_message_new_method_return(msg);
428 /* Window handlers */
430 _e_msgbus_window_list_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
435 DBusMessageIter iter;
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);
442 EINA_LIST_FOREACH(e_border_client_list(), l, bd)
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);
450 dbus_message_iter_close_container(&iter, &arr);
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) \
461 DBusMessageIter iter;\
463 dbus_message_iter_init(msg, &iter);\
464 dbus_message_iter_get_basic(&iter, &xwin);\
465 bd = e_border_find_by_client_window(xwin);\
469 #define E_MSGBUS_WIN_ACTION_CB_END \
472 return dbus_message_new_method_return(msg);\
475 E_MSGBUS_WIN_ACTION_CB_BEGIN(close)
476 e_border_act_close_begin(bd);
477 E_MSGBUS_WIN_ACTION_CB_END
479 E_MSGBUS_WIN_ACTION_CB_BEGIN(kill)
480 e_border_act_kill_begin(bd);
481 E_MSGBUS_WIN_ACTION_CB_END
483 E_MSGBUS_WIN_ACTION_CB_BEGIN(focus)
484 e_border_focus_set(bd, 1, 1);
485 if (!bd->lock_user_stacking)
487 if (e_config->border_raise_on_focus)
490 E_MSGBUS_WIN_ACTION_CB_END
492 E_MSGBUS_WIN_ACTION_CB_BEGIN(iconify)
493 e_border_iconify(bd);
494 E_MSGBUS_WIN_ACTION_CB_END
496 E_MSGBUS_WIN_ACTION_CB_BEGIN(uniconify)
497 e_border_uniconify(bd);
498 E_MSGBUS_WIN_ACTION_CB_END
500 E_MSGBUS_WIN_ACTION_CB_BEGIN(maximize)
501 e_border_maximize(bd, e_config->maximize_policy);
502 E_MSGBUS_WIN_ACTION_CB_END
504 E_MSGBUS_WIN_ACTION_CB_BEGIN(unmaximize)
505 e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
506 E_MSGBUS_WIN_ACTION_CB_END
508 #ifdef _F_ZONE_WINDOW_ROTATION_
510 _e_msgbus_zone_rotation_cb(E_DBus_Object *obj __UNUSED__,
517 dbus_error_init(&err);
518 if (!dbus_message_get_args(msg, &err,
519 DBUS_TYPE_INT32, &zone_id,
520 DBUS_TYPE_INT32, &rot,
523 fprintf(stderr, "could not get Rotation arguments: %s: %s\n", err.name, err.message);
524 dbus_error_free(&err);
528 zone = e_util_container_zone_id_get(0, zone_id);
529 fprintf(stdout, "Rotate zone %d,%d\n", zone_id, rot);
531 e_zone_rotation_set(zone, rot);
533 return dbus_message_new_method_return(msg);