enlightenment/src/modules/msgbus/msgbus_desktop.c

212 lines
5.8 KiB
C

/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
#include "msgbus_desktop.h"
static int _log_dom = -1;
#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__)
#define WARN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__)
#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__)
static DBusMessage *
cb_virtual_desktops(E_DBus_Object *obj, DBusMessage *msg)
{
DBusMessage* reply;
DBusMessageIter iter;
reply = dbus_message_new_method_return(msg);
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32,
&(e_config->zone_desks_x_count));
dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32,
&(e_config->zone_desks_y_count));
return reply;
}
static DBusMessage *
cb_desktop_show(E_DBus_Object *obj, DBusMessage *msg)
{
DBusError err;
int x, y;
dbus_error_init(&err);
if (!dbus_message_get_args(msg, &err,
DBUS_TYPE_INT32, &x,
DBUS_TYPE_INT32, &y,
DBUS_TYPE_INVALID))
{
ERR("could not get Show arguments: %s: %s", err.name, err.message);
dbus_error_free(&err);
}
else
{
E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
fprintf(stderr, "show desktop %d,%d from zone %p.\n", x, y, zone);
DBG("show desktop %d,%d from zone %p.", x, y, zone);
e_zone_desk_flip_to(zone, x, y);
}
return dbus_message_new_method_return(msg);
}
static DBusMessage *
cb_desktop_show_by_name(E_DBus_Object *obj, DBusMessage *msg)
{
DBusError err;
const char *name;
dbus_error_init(&err);
if (!dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID))
{
ERR("could not get Show arguments: %s: %s", err.name, err.message);
dbus_error_free(&err);
}
else if (name)
{
E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
unsigned int i, count;
DBG("show desktop %s from zone %p.", name, zone);
count = zone->desk_x_count * zone->desk_y_count;
for (i = 0; i < count; i++)
{
E_Desk *desk = zone->desks[i];
if ((desk->name) && (strcmp(desk->name, name) == 0))
{
DBG("show desktop %s (%d,%d) from zone %p.",
name, desk->x, desk->y, zone);
e_zone_desk_flip_to(zone, desk->x, desk->y);
break;
}
}
}
return dbus_message_new_method_return(msg);
}
static DBusMessage*
cb_desktop_bgadd(E_DBus_Object *obj, DBusMessage *msg)
{
DBusMessageIter iter;
int container, zone, desk_x, desk_y;
char* path;
dbus_message_iter_init(msg, &iter);
dbus_message_iter_get_basic(&iter, &container);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &zone);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &desk_x);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &desk_y);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &path);
e_bg_add(container, zone, desk_x, desk_y, path);
e_bg_update();
e_config_save_queue();
return dbus_message_new_method_return(msg);
}
static DBusMessage*
cb_desktop_bgdel(E_DBus_Object *obj, DBusMessage *msg)
{
DBusMessageIter iter;
int container, zone, desk_x, desk_y;
dbus_message_iter_init(msg, &iter);
dbus_message_iter_get_basic(&iter, &container);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &zone);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &desk_x);
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &desk_y);
e_bg_del(container, zone, desk_x, desk_y);
e_bg_update();
e_config_save_queue();
return dbus_message_new_method_return(msg);
}
static DBusMessage*
cb_desktop_bglist(E_DBus_Object *obj, DBusMessage *msg)
{
Eina_List *list;
E_Config_Desktop_Background *bg;
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, "(iiiis)", &arr);
EINA_LIST_FOREACH(e_config->desktop_backgrounds, list, bg)
{
DBusMessageIter sub;
if (bg == NULL || bg->file == NULL)
{
continue;
}
dbus_message_iter_open_container(&arr, DBUS_TYPE_STRUCT, NULL, &sub);
dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->container));
dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->zone));
dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->desk_x));
dbus_message_iter_append_basic(&sub, DBUS_TYPE_INT32, &(bg->desk_y));
dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &(bg->file));
dbus_message_iter_close_container(&arr, &sub);
}
dbus_message_iter_close_container(&iter, &arr);
return reply;
}
void msgbus_desktop_init(Eina_Array *ifaces)
{
E_DBus_Interface *iface;
if (_log_dom == -1)
{
_log_dom = eina_log_domain_register("msgbus_desktop", EINA_COLOR_BLUE);
if (_log_dom < 0)
EINA_LOG_ERR("could not register msgbus_desktop log domain!");
}
iface = e_dbus_interface_new("org.enlightenment.wm.Desktop");
if (iface)
{
e_dbus_interface_method_add(iface, "GetVirtualCount", "", "ii",
cb_virtual_desktops);
e_dbus_interface_method_add(iface, "Show", "ii", "",
cb_desktop_show);
e_dbus_interface_method_add(iface, "ShowByName", "s", "",
cb_desktop_show_by_name);
e_msgbus_interface_attach(iface);
eina_array_push(ifaces, iface);
}
iface = e_dbus_interface_new("org.enlightenment.wm.Desktop.Background");
if (iface)
{
e_dbus_interface_method_add(iface, "Add", "iiiis", "",
cb_desktop_bgadd);
e_dbus_interface_method_add(iface, "Del", "iiii", "",
cb_desktop_bgadd);
e_dbus_interface_method_add(iface, "List", "", "a(iiiis)",
cb_desktop_bglist);
e_msgbus_interface_attach(iface);
eina_array_push(ifaces, iface);
}
}