#include "e.h" /* local subsystem functions */ static void _e_msgbus_request_name_cb(void *data, DBusMessage *msg, DBusError *err); static DBusMessage *_e_msgbus_core_restart_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_core_shutdown_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_module_load_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_module_unload_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_module_enable_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_module_disable_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_module_list_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_profile_set_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_profile_get_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_profile_list_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_profile_add_cb(E_DBus_Object *obj, DBusMessage *msg); static DBusMessage *_e_msgbus_profile_delete_cb(E_DBus_Object *obj, DBusMessage *msg); #define E_MSGBUS_WIN_ACTION_CB_PROTO(NAME) \ static DBusMessage *_e_msgbus_window_##NAME##_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) E_MSGBUS_WIN_ACTION_CB_PROTO(list); E_MSGBUS_WIN_ACTION_CB_PROTO(close); E_MSGBUS_WIN_ACTION_CB_PROTO(kill); E_MSGBUS_WIN_ACTION_CB_PROTO(focus); E_MSGBUS_WIN_ACTION_CB_PROTO(iconify); E_MSGBUS_WIN_ACTION_CB_PROTO(uniconify); E_MSGBUS_WIN_ACTION_CB_PROTO(maximize); E_MSGBUS_WIN_ACTION_CB_PROTO(unmaximize); /* local subsystem globals */ static E_Msgbus_Data *_e_msgbus_data = NULL; /* externally accessible functions */ EINTERN int e_msgbus_init(void) { E_DBus_Interface *iface; _e_msgbus_data = E_NEW(E_Msgbus_Data, 1); e_dbus_init(); #ifdef HAVE_HAL e_hal_init(); #endif _e_msgbus_data->conn = e_dbus_bus_get(DBUS_BUS_SESSION); if (!_e_msgbus_data->conn) { WRN("Cannot get DBUS_BUS_SESSION"); return 0; } e_dbus_request_name(_e_msgbus_data->conn, "org.enlightenment.wm.service", 0, _e_msgbus_request_name_cb, NULL); _e_msgbus_data->obj = e_dbus_object_add(_e_msgbus_data->conn, "/org/enlightenment/wm/RemoteObject", NULL); iface = e_dbus_interface_new("org.enlightenment.wm.Core"); if (!iface) { WRN("Cannot add org.enlightenment.wm.Core interface"); return 0; } e_dbus_object_interface_attach(_e_msgbus_data->obj, iface); e_dbus_interface_unref(iface); /* Hardcore methods */ e_dbus_interface_method_add(iface, "Restart", "", "", _e_msgbus_core_restart_cb); e_dbus_interface_method_add(iface, "Shutdown", "", "", _e_msgbus_core_shutdown_cb); iface = e_dbus_interface_new("org.enlightenment.wm.Module"); if (!iface) { WRN("Cannot add org.enlightenment.wm.Module interface"); return 0; } e_dbus_object_interface_attach(_e_msgbus_data->obj, iface); e_dbus_interface_unref(iface); /* Module methods */ e_dbus_interface_method_add(iface, "Load", "s", "", _e_msgbus_module_load_cb); e_dbus_interface_method_add(iface, "Unload", "s", "", _e_msgbus_module_unload_cb); e_dbus_interface_method_add(iface, "Enable", "s", "", _e_msgbus_module_enable_cb); e_dbus_interface_method_add(iface, "Disable", "s", "", _e_msgbus_module_disable_cb); e_dbus_interface_method_add(iface, "List", "", "a(si)", _e_msgbus_module_list_cb); iface = e_dbus_interface_new("org.enlightenment.wm.Profile"); if (!iface) { WRN("Cannot add org.enlightenment.wm.Profile interface"); return 0; } e_dbus_object_interface_attach(_e_msgbus_data->obj, iface); e_dbus_interface_unref(iface); /* Profile methods */ e_dbus_interface_method_add(iface, "Set", "s", "", _e_msgbus_profile_set_cb); e_dbus_interface_method_add(iface, "Get", "", "s", _e_msgbus_profile_get_cb); e_dbus_interface_method_add(iface, "List", "", "as", _e_msgbus_profile_list_cb); e_dbus_interface_method_add(iface, "Add", "s", "", _e_msgbus_profile_add_cb); e_dbus_interface_method_add(iface, "Delete", "s", "", _e_msgbus_profile_delete_cb); iface = e_dbus_interface_new("org.enlightenment.wm.Window"); if (!iface) { WRN("Cannot add org.enlightenment.wm.Window interface"); return 0; } e_dbus_object_interface_attach(_e_msgbus_data->obj, iface); e_dbus_interface_unref(iface); /* Profile methods */ e_dbus_interface_method_add(iface, "List", "", "a(si)", _e_msgbus_window_list_cb); e_dbus_interface_method_add(iface, "Close", "i", "", _e_msgbus_window_close_cb); e_dbus_interface_method_add(iface, "Kill", "i", "", _e_msgbus_window_kill_cb); e_dbus_interface_method_add(iface, "Focus", "i", "", _e_msgbus_window_focus_cb); e_dbus_interface_method_add(iface, "Iconify", "i", "", _e_msgbus_window_iconify_cb); e_dbus_interface_method_add(iface, "Uniconify", "i", "", _e_msgbus_window_uniconify_cb); e_dbus_interface_method_add(iface, "Maximize", "i", "", _e_msgbus_window_maximize_cb); e_dbus_interface_method_add(iface, "Unmaximize", "i", "", _e_msgbus_window_unmaximize_cb); return 1; } EINTERN int e_msgbus_shutdown(void) { if (_e_msgbus_data->obj) { e_dbus_object_free(_e_msgbus_data->obj); } if (_e_msgbus_data->conn) { e_dbus_connection_close(_e_msgbus_data->conn); } #ifdef HAVE_HAL e_hal_shutdown(); #endif e_dbus_shutdown(); E_FREE(_e_msgbus_data); _e_msgbus_data = NULL; return 1; } EAPI void e_msgbus_interface_attach(E_DBus_Interface *iface) { if (!_e_msgbus_data->obj) return; e_dbus_object_interface_attach(_e_msgbus_data->obj, iface); } EAPI void e_msgbus_interface_detach(E_DBus_Interface *iface) { if (!_e_msgbus_data->obj) return; e_dbus_object_interface_detach(_e_msgbus_data->obj, iface); } static void _e_msgbus_request_name_cb(void *data __UNUSED__, DBusMessage *msg __UNUSED__, DBusError *err __UNUSED__) { //TODO Handle Errors } /* Core Handlers */ static DBusMessage * _e_msgbus_core_restart_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { e_sys_action_do(E_SYS_RESTART, NULL); return dbus_message_new_method_return(msg); } static DBusMessage * _e_msgbus_core_shutdown_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { e_sys_action_do(E_SYS_EXIT, NULL); return dbus_message_new_method_return(msg); } /* Modules Handlers */ static DBusMessage * _e_msgbus_module_load_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; char *module; dbus_message_iter_init(msg, &iter); dbus_message_iter_get_basic(&iter, &module); if (!e_module_find(module)) { e_module_new(module); e_config_save_queue(); } return dbus_message_new_method_return(msg); } static DBusMessage * _e_msgbus_module_unload_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; char *module; E_Module *m; dbus_message_iter_init(msg, &iter); dbus_message_iter_get_basic(&iter, &module); if ((m = e_module_find(module))) { e_module_disable(m); e_object_del(E_OBJECT(m)); e_config_save_queue(); } return dbus_message_new_method_return(msg); } static DBusMessage * _e_msgbus_module_enable_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; char *module; E_Module *m; dbus_message_iter_init(msg, &iter); dbus_message_iter_get_basic(&iter, &module); if ((m = e_module_find(module))) { e_module_enable(m); e_config_save_queue(); } return dbus_message_new_method_return(msg); } static DBusMessage * _e_msgbus_module_disable_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; char *module; E_Module *m; dbus_message_iter_init(msg, &iter); dbus_message_iter_get_basic(&iter, &module); if ((m = e_module_find(module))) { e_module_disable(m); e_config_save_queue(); } return dbus_message_new_method_return(msg); } static DBusMessage * _e_msgbus_module_list_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { Eina_List *l; E_Module *mod; DBusMessage *reply; DBusMessageIter iter; DBusMessageIter arr; reply = dbus_message_new_method_return(msg); dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(si)", &arr); EINA_LIST_FOREACH(e_module_list(), l, mod) { DBusMessageIter sub; const char *name; int enabled; name = mod->name; enabled = mod->enabled; dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub); dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &(name)); dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(enabled)); dbus_message_iter_close_container(&arr, &sub); } dbus_message_iter_close_container(&iter, &arr); return reply; } /* Profile Handlers */ static DBusMessage * _e_msgbus_profile_set_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; char *profile; dbus_message_iter_init(msg, &iter); dbus_message_iter_get_basic(&iter, &profile); e_config_save_flush(); e_config_profile_set(profile); e_config_profile_save(); e_config_save_block_set(1); e_sys_action_do(E_SYS_RESTART, NULL); return dbus_message_new_method_return(msg); } static DBusMessage * _e_msgbus_profile_get_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; DBusMessage *reply; const char *profile; profile = e_config_profile_get(); reply = dbus_message_new_method_return(msg); dbus_message_iter_init_append(reply, &iter); dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &profile); return reply; } static DBusMessage * _e_msgbus_profile_list_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { Eina_List *l; const char *name; DBusMessage *reply; DBusMessageIter iter; DBusMessageIter arr; reply = dbus_message_new_method_return(msg); dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &arr); EINA_LIST_FOREACH(e_config_profile_list(), l, name) { dbus_message_iter_append_basic(&arr, DBUS_TYPE_STRING, &name); } dbus_message_iter_close_container(&iter, &arr); return reply; } static DBusMessage * _e_msgbus_profile_add_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; char *profile; dbus_message_iter_init(msg, &iter); dbus_message_iter_get_basic(&iter, &profile); e_config_profile_add(profile); return dbus_message_new_method_return(msg); } static DBusMessage * _e_msgbus_profile_delete_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { DBusMessageIter iter; char *profile; dbus_message_iter_init(msg, &iter); dbus_message_iter_get_basic(&iter, &profile); if (!strcmp(e_config_profile_get(), profile)) { DBusMessage *ret; ret = dbus_message_new_error(msg, "org.enlightenment.DBus.InvalidArgument", "Can't delete active profile"); return ret; } e_config_profile_del(profile); return dbus_message_new_method_return(msg); } /* Window handlers */ static DBusMessage * _e_msgbus_window_list_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) { Eina_List *l; E_Border *bd; DBusMessage *reply; DBusMessageIter iter; DBusMessageIter arr; reply = dbus_message_new_method_return(msg); dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(si)", &arr); EINA_LIST_FOREACH(e_border_client_list(), l, bd) { DBusMessageIter sub; dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub); dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &bd->client.icccm.name); dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &bd->client.win); dbus_message_iter_close_container(&arr, &sub); } dbus_message_iter_close_container(&iter, &arr); return reply; } #define E_MSGBUS_WIN_ACTION_CB_BEGIN(NAME) \ static DBusMessage * \ _e_msgbus_window_##NAME##_cb(E_DBus_Object *obj __UNUSED__, DBusMessage *msg) \ { \ E_Border *bd; \ int xwin;\ DBusMessageIter iter;\ \ dbus_message_iter_init(msg, &iter);\ dbus_message_iter_get_basic(&iter, &xwin);\ bd = e_border_find_by_client_window(xwin);\ if (bd)\ { #define E_MSGBUS_WIN_ACTION_CB_END \ }\ \ return dbus_message_new_method_return(msg);\ } E_MSGBUS_WIN_ACTION_CB_BEGIN(close) e_border_act_close_begin(bd); E_MSGBUS_WIN_ACTION_CB_END E_MSGBUS_WIN_ACTION_CB_BEGIN(kill) e_border_act_kill_begin(bd); E_MSGBUS_WIN_ACTION_CB_END E_MSGBUS_WIN_ACTION_CB_BEGIN(focus) e_border_focus_set(bd, 1, 1); E_MSGBUS_WIN_ACTION_CB_END E_MSGBUS_WIN_ACTION_CB_BEGIN(iconify) e_border_iconify(bd); E_MSGBUS_WIN_ACTION_CB_END E_MSGBUS_WIN_ACTION_CB_BEGIN(uniconify) e_border_uniconify(bd); E_MSGBUS_WIN_ACTION_CB_END E_MSGBUS_WIN_ACTION_CB_BEGIN(maximize) e_border_maximize(bd, e_config->maximize_policy); E_MSGBUS_WIN_ACTION_CB_END E_MSGBUS_WIN_ACTION_CB_BEGIN(unmaximize) e_border_unmaximize(bd, E_MAXIMIZE_BOTH); E_MSGBUS_WIN_ACTION_CB_END