enlightenment/src/bin/e_ipc.c

212 lines
4.9 KiB
C

#include "e.h"
/* local subsystem functions */
static int _e_ipc_cb_client_add(void *data, int type, void *event);
static int _e_ipc_cb_client_del(void *data, int type, void *event);
static int _e_ipc_cb_client_data(void *data, int type, void *event);
/* local subsystem globals */
static Ecore_Ipc_Server *_e_ipc_server = NULL;
/* externally accessible functions */
int
e_ipc_init(void)
{
char buf[1024];
char *disp;
disp = getenv("DISPLAY");
if (!disp) disp = ":0";
snprintf(buf, sizeof(buf), "enlightenment-(%s)", disp);
_e_ipc_server = ecore_ipc_server_add(ECORE_IPC_LOCAL_USER, buf, 0, NULL);
if (!_e_ipc_server) return 0;
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, _e_ipc_cb_client_add, NULL);
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, _e_ipc_cb_client_del, NULL);
ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, _e_ipc_cb_client_data, NULL);
return 1;
}
void
e_ipc_shutdown(void)
{
if (_e_ipc_server)
{
ecore_ipc_server_del(_e_ipc_server);
_e_ipc_server = NULL;
}
}
/* local subsystem globals */
static int
_e_ipc_cb_client_add(void *data, int type, void *event)
{
Ecore_Ipc_Event_Client_Add *e;
e = event;
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server) return 1;
printf("E-IPC: client %p connected to server!\n", e->client);
return 1;
}
static int
_e_ipc_cb_client_del(void *data, int type, void *event)
{
Ecore_Ipc_Event_Client_Del *e;
e = event;
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server) return 1;
printf("E-IPC: client %p disconnected from server!\n", e->client);
/* delete client sruct */
ecore_ipc_client_del(e->client);
return 1;
}
static int
_e_ipc_cb_client_data(void *data, int type, void *event)
{
Ecore_Ipc_Event_Client_Data *e;
e = event;
if (ecore_ipc_client_server_get(e->client) != _e_ipc_server) return 1;
switch (e->minor)
{
case E_IPC_OP_MODULE_LOAD:
if (e->data)
{
char *name;
name = malloc(e->size + 1);
name[e->size] = 0;
memcpy(name, e->data, e->size);
if (!e_module_find(name))
{
e_module_new(name);
}
free(name);
}
break;
case E_IPC_OP_MODULE_UNLOAD:
if (e->data)
{
char *name;
E_Module *m;
name = malloc(e->size + 1);
name[e->size] = 0;
memcpy(name, e->data, e->size);
if ((m = e_module_find(name)))
{
if (e_module_enabled_get(m))
e_module_disable(m);
e_object_del(E_OBJECT(m));
}
free(name);
}
break;
case E_IPC_OP_MODULE_ENABLE:
{
char *name;
E_Module *m;
name = malloc(e->size + 1);
name[e->size] = 0;
memcpy(name, e->data, e->size);
if ((m = e_module_find(name)))
{
if (!e_module_enabled_get(m))
e_module_enable(m);
}
free(name);
}
break;
case E_IPC_OP_MODULE_DISABLE:
{
char *name;
E_Module *m;
name = malloc(e->size + 1);
name[e->size] = 0;
memcpy(name, e->data, e->size);
if ((m = e_module_find(name)))
{
if (e_module_enabled_get(m))
e_module_disable(m);
}
free(name);
}
break;
case E_IPC_OP_MODULE_LIST:
{
Evas_List *modules, *l;
int bytes;
E_Module *m;
char *data, *p;
bytes = 0;
modules = e_module_list();
for (l = modules; l; l = l->next)
{
m = l->data;
bytes += strlen(m->name) + 1 + 1;
}
data = malloc(bytes);
p = data;
for (l = modules; l; l = l->next)
{
m = l->data;
strcpy(p, m->name);
p += strlen(m->name);
*p = 0;
p++;
*p = e_module_enabled_get(m);
p++;
}
ecore_ipc_client_send(e->client,
E_IPC_DOMAIN_REPLY,
E_IPC_OP_MODULE_LIST_REPLY,
0/*ref*/, 0/*ref_to*/, 0/*response*/,
data, bytes);
free(data);
}
break;
case E_IPC_OP_BG_SET:
{
char *file;
char *valstr;
Evas_List *cl;
int cont;
file = malloc(e->size + 1);
file[e->size] = 0;
memcpy(file, e->data, e->size);
valstr=strdup("desktop/background");
cl=edje_file_collection_list(file);
cont=1;
while(cl && cont)
{
if(!strcmp(cl->data,valstr))
{
cont=0;
ecore_config_string_set("e.desktop.default.background", file);
}
else
cl++;
}
edje_file_collection_list_free(cl);
free(valstr);
free(file);
}
default:
break;
}
printf("E-IPC: client sent: [%i] [%i] (%i) \"%p\"\n", e->major, e->minor, e->size, e->data);
/* ecore_ipc_client_send(e->client, 1, 2, 7, 77, 0, "ABC", 4); */
/* we can disconnect a client like this: */
/* ecore_ipc_client_del(e->client); */
/* or we can end a server by: */
/* ecore_ipc_server_del(ecore_ipc_client_server_get(e->client)); */
return 1;
}