3 /* local subsystem functions */
4 static void _e_msgbus_request_name_cb(void *data, DBusMessage *msg, DBusError *err);
6 static DBusMessage* _e_msgbus_core_restart_cb(E_DBus_Object *obj, DBusMessage *msg);
7 static DBusMessage* _e_msgbus_core_shutdown_cb(E_DBus_Object *obj, DBusMessage *msg);
9 static DBusMessage* _e_msgbus_module_load_cb(E_DBus_Object *obj, DBusMessage *msg);
10 static DBusMessage* _e_msgbus_module_unload_cb(E_DBus_Object *obj, DBusMessage *msg);
11 static DBusMessage* _e_msgbus_module_enable_cb(E_DBus_Object *obj, DBusMessage *msg);
12 static DBusMessage* _e_msgbus_module_disable_cb(E_DBus_Object *obj, DBusMessage *msg);
13 static DBusMessage* _e_msgbus_module_list_cb(E_DBus_Object *obj, DBusMessage *msg);
15 static DBusMessage* _e_msgbus_profile_set_cb(E_DBus_Object *obj, DBusMessage *msg);
16 static DBusMessage* _e_msgbus_profile_get_cb(E_DBus_Object *obj, DBusMessage *msg);
17 static DBusMessage* _e_msgbus_profile_list_cb(E_DBus_Object *obj, DBusMessage *msg);
18 static DBusMessage* _e_msgbus_profile_add_cb(E_DBus_Object *obj, DBusMessage *msg);
19 static DBusMessage* _e_msgbus_profile_delete_cb(E_DBus_Object *obj, DBusMessage *msg);
21 /* local subsystem globals */
22 static E_Msgbus_Data *_e_msgbus_data = NULL;
24 /* externally accessible functions */
28 E_DBus_Interface *iface;
30 _e_msgbus_data = E_NEW(E_Msgbus_Data, 1);
37 _e_msgbus_data->conn = e_dbus_bus_get(DBUS_BUS_SESSION);
38 if (!_e_msgbus_data->conn)
40 printf("WARNING: Cannot get DBUS_BUS_SESSION\n");
43 e_dbus_request_name(_e_msgbus_data->conn, "org.enlightenment.wm.service", 0, _e_msgbus_request_name_cb, NULL);
44 _e_msgbus_data->obj = e_dbus_object_add(_e_msgbus_data->conn, "/org/enlightenment/wm/RemoteObject", NULL);
46 iface = e_dbus_interface_new("org.enlightenment.wm.Core");
49 printf("WARNING: Cannot add org.enlightenment.wm.Core interface\n");
52 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
53 e_dbus_interface_unref(iface);
55 /* Hardcore methods */
56 e_dbus_interface_method_add(iface, "Restart", "", "", _e_msgbus_core_restart_cb);
57 e_dbus_interface_method_add(iface, "Shutdown", "", "", _e_msgbus_core_shutdown_cb);
59 iface = e_dbus_interface_new("org.enlightenment.wm.Module");
62 printf("WARNING: Cannot add org.enlightenment.wm.Module interface\n");
65 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
66 e_dbus_interface_unref(iface);
69 e_dbus_interface_method_add(iface, "Load", "s", "", _e_msgbus_module_load_cb);
70 e_dbus_interface_method_add(iface, "Unload", "s", "", _e_msgbus_module_unload_cb);
71 e_dbus_interface_method_add(iface, "Enable", "s", "", _e_msgbus_module_enable_cb);
72 e_dbus_interface_method_add(iface, "Disable", "s", "", _e_msgbus_module_disable_cb);
73 e_dbus_interface_method_add(iface, "List", "", "a(si)", _e_msgbus_module_list_cb);
75 iface = e_dbus_interface_new("org.enlightenment.wm.Profile");
78 printf("WARNING: Cannot add org.enlightenment.wm.Profile interface\n");
81 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
82 e_dbus_interface_unref(iface);
85 e_dbus_interface_method_add(iface, "Set", "s", "", _e_msgbus_profile_set_cb);
86 e_dbus_interface_method_add(iface, "Get", "", "s", _e_msgbus_profile_get_cb);
87 e_dbus_interface_method_add(iface, "List", "", "as", _e_msgbus_profile_list_cb);
88 e_dbus_interface_method_add(iface, "Add", "s", "", _e_msgbus_profile_add_cb);
89 e_dbus_interface_method_add(iface, "Delete", "s", "", _e_msgbus_profile_delete_cb);
95 e_msgbus_shutdown(void)
97 if (_e_msgbus_data->obj)
99 e_dbus_object_free(_e_msgbus_data->obj);
101 if (_e_msgbus_data->conn)
103 e_dbus_connection_close(_e_msgbus_data->conn);
110 E_FREE(_e_msgbus_data);
111 _e_msgbus_data = NULL;
116 e_msgbus_interface_attach(E_DBus_Interface *iface)
118 if (!_e_msgbus_data->obj) return;
119 e_dbus_object_interface_attach(_e_msgbus_data->obj, iface);
123 e_msgbus_interface_detach(E_DBus_Interface *iface)
125 if (!_e_msgbus_data->obj) return;
126 e_dbus_object_interface_detach(_e_msgbus_data->obj, iface);
130 _e_msgbus_request_name_cb(void *data __UNUSED__, DBusMessage *msg __UNUSED__, DBusError *err __UNUSED__)
137 _e_msgbus_core_restart_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
139 e_sys_action_do(E_SYS_RESTART, NULL);
140 return dbus_message_new_method_return(msg);
144 _e_msgbus_core_shutdown_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
146 e_sys_action_do(E_SYS_EXIT, NULL);
147 return dbus_message_new_method_return(msg);
150 /* Modules Handlers */
152 _e_msgbus_module_load_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
154 DBusMessageIter iter;
157 dbus_message_iter_init(msg, &iter);
158 dbus_message_iter_get_basic(&iter, &module);
160 if (!e_module_find(module))
162 e_module_new(module);
163 e_config_save_queue();
166 return dbus_message_new_method_return(msg);
170 _e_msgbus_module_unload_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
172 DBusMessageIter iter;
176 dbus_message_iter_init(msg, &iter);
177 dbus_message_iter_get_basic(&iter, &module);
179 if ((m = e_module_find(module)))
182 e_object_del(E_OBJECT(m));
183 e_config_save_queue();
186 return dbus_message_new_method_return(msg);
190 _e_msgbus_module_enable_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
192 DBusMessageIter iter;
196 dbus_message_iter_init(msg, &iter);
197 dbus_message_iter_get_basic(&iter, &module);
199 if ((m = e_module_find(module))) {
201 e_config_save_queue();
204 return dbus_message_new_method_return(msg);
208 _e_msgbus_module_disable_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
210 DBusMessageIter iter;
214 dbus_message_iter_init(msg, &iter);
215 dbus_message_iter_get_basic(&iter, &module);
217 if ((m = e_module_find(module))) {
219 e_config_save_queue();
222 return dbus_message_new_method_return(msg);
226 _e_msgbus_module_list_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
231 DBusMessageIter iter;
234 reply = dbus_message_new_method_return(msg);
235 dbus_message_iter_init_append(reply, &iter);
236 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(si)", &arr);
238 EINA_LIST_FOREACH(e_module_list(), l, mod)
245 enabled = mod->enabled;
246 dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub);
247 dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &(name));
248 dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(enabled));
249 dbus_message_iter_close_container(&arr, &sub);
251 dbus_message_iter_close_container(&iter, &arr);
256 /* Profile Handlers */
258 _e_msgbus_profile_set_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
260 DBusMessageIter iter;
263 dbus_message_iter_init(msg, &iter);
264 dbus_message_iter_get_basic(&iter, &profile);
266 e_config_save_flush();
267 e_config_profile_set(profile);
268 e_config_profile_save();
269 e_config_save_block_set(1);
270 e_sys_action_do(E_SYS_RESTART, NULL);
272 return dbus_message_new_method_return(msg);
276 _e_msgbus_profile_get_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
278 DBusMessageIter iter;
282 profile = e_config_profile_get();
284 reply = dbus_message_new_method_return(msg);
285 dbus_message_iter_init_append(reply, &iter);
286 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &profile);
292 _e_msgbus_profile_list_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
297 DBusMessageIter iter;
300 reply = dbus_message_new_method_return(msg);
301 dbus_message_iter_init_append(reply, &iter);
302 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &arr);
304 EINA_LIST_FOREACH(e_config_profile_list(), l, name)
306 dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &name);
308 dbus_message_iter_close_container(&iter, &arr);
314 _e_msgbus_profile_add_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
316 DBusMessageIter iter;
319 dbus_message_iter_init(msg, &iter);
320 dbus_message_iter_get_basic(&iter, &profile);
322 e_config_profile_add(profile);
324 return dbus_message_new_method_return(msg);
329 _e_msgbus_profile_delete_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg)
331 DBusMessageIter iter;
334 dbus_message_iter_init(msg, &iter);
335 dbus_message_iter_get_basic(&iter, &profile);
336 if (!strcmp(e_config_profile_get(), profile))
340 ret = dbus_message_new_error(msg, "org.enlightenment.DBus.InvalidArgument",
341 "Can't delete active profile");
344 e_config_profile_del(profile);
346 return dbus_message_new_method_return(msg);