clouseau: Stable version with BMP support Canceled BMP eet encoding Need to remove bmp_req list from daemon, no longer needed

Signed-off-by: Aharon Hillel <a.hillel@samsung.com>

SVN revision: 72340
This commit is contained in:
Aharon Hillel 2012-06-18 07:22:31 +00:00 committed by Tom Hacohen
parent 998b191818
commit 5ebf435070
5 changed files with 196 additions and 112 deletions

View File

@ -106,7 +106,7 @@ _add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Add *e
if (svr) if (svr)
{ {
connect_st t = { getpid(), __FILE__ }; connect_st t = { getpid(), __FILE__ };
p = packet_compose(GUI_CLIENT_CONNECT, &t, sizeof(t), &size); p = packet_compose(GUI_CLIENT_CONNECT, &t, sizeof(t), &size, NULL, 0);
if (p) if (p)
{ {
ecore_ipc_server_send(ev->server, 0,0,0,0,EINA_FALSE, p, size); ecore_ipc_server_send(ev->server, 0,0,0,0,EINA_FALSE, p, size);
@ -259,7 +259,9 @@ _close_app_views(app_info_st *app, Eina_Bool clr)
EINA_LIST_FREE(app->view, view) EINA_LIST_FREE(app->view, view)
{ /* Free memory allocated to show any app screens */ { /* Free memory allocated to show any app screens */
bmp_info_st *b = view->data; bmp_info_st *b = view->data;
bmp_info_free(b->bmp); if (b->bmp)
free(b->bmp);
variant_free(view); variant_free(view);
} }
@ -367,7 +369,9 @@ _remove_bmp(Eina_List *view, void *ptr)
if (st->win) if (st->win)
evas_object_del(st->win); evas_object_del(st->win);
bmp_info_free(st->bmp); if (st->bmp)
free(st->bmp);
variant_free(v); variant_free(v);
return eina_list_remove(view, v); return eina_list_remove(view, v);
} }
@ -410,7 +414,9 @@ _free_app(app_data_st *st)
if (b->win) if (b->win)
evas_object_del(b->win); evas_object_del(b->win);
bmp_info_free(b->bmp); if (b->bmp)
free(b->bmp);
variant_free(view); variant_free(view);
} }
@ -528,6 +534,20 @@ static void
_add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v) _add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v)
{ /* Remove bmp if exists (according to obj-ptr), then add the new one */ { /* Remove bmp if exists (according to obj-ptr), then add the new one */
bmp_info_st *st = v->data; bmp_info_st *st = v->data;
if (!st->bmp)
{ /* We consider a case out request will be answered with empty bmp
this may happen if we have a sub-window of app
(like checks in elementary test)
if the user closed it just as we send our BMP_REQ
this Evas is no longer valid and we get NULL ptr for BMP.
This code ignores this case. */
elm_progressbar_pulse(g->pb, EINA_FALSE);
evas_object_hide(g->pb);
variant_free(v);
return;
}
app_data_st *app = (app_data_st *) app_data_st *app = (app_data_st *)
eina_list_search_unsorted(apps, _app_ptr_cmp, eina_list_search_unsorted(apps, _app_ptr_cmp,
(void *) (uintptr_t) st->app); (void *) (uintptr_t) st->app);
@ -542,7 +562,7 @@ _add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v)
app_info_st *info = app->app->data; app_info_st *info = app->app->data;
info->view = _remove_bmp(info->view, info->view = _remove_bmp(info->view,
(void *) (uintptr_t) (((bmp_info_st *) v->data)->object)); (void *) (uintptr_t) (st->object));
info->view = eina_list_append(info->view, v); info->view = eina_list_append(info->view, v);
/* Now we need to update refresh button, make it open-window */ /* Now we need to update refresh button, make it open-window */
@ -562,7 +582,9 @@ _add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v)
else else
{ /* Dispose bmp info if app no longer in the list of apps */ { /* Dispose bmp info if app no longer in the list of apps */
/* or the bmp_info is no longer relevant */ /* or the bmp_info is no longer relevant */
bmp_info_free(((bmp_info_st *) v->data)->bmp); if (st->bmp)
free(st->bmp);
variant_free(v); variant_free(v);
} }
} }
@ -588,15 +610,15 @@ _open_app_window(bmp_info_st *st, Evas_Object *bt, Tree_Item *treeit)
elm_object_disabled_set(bt, EINA_TRUE); elm_object_disabled_set(bt, EINA_TRUE);
evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888); evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
evas_object_image_alpha_set(o, EINA_FALSE); evas_object_image_alpha_set(o, EINA_FALSE);
evas_object_image_size_set(o, st->bmp->w, st->bmp->h); evas_object_image_size_set(o, st->w, st->h);
evas_object_image_data_copy_set(o, st->bmp->bmp); evas_object_image_data_copy_set(o, st->bmp);
evas_object_image_data_update_add(o, 0, 0, st->bmp->w, st->bmp->h); evas_object_image_data_update_add(o, 0, 0, st->w, st->h);
evas_object_show(o); evas_object_show(o);
evas_object_smart_callback_add(st->win, evas_object_smart_callback_add(st->win,
"delete,request", _app_win_del, st); "delete,request", _app_win_del, st);
evas_object_resize(o, st->bmp->w, st->bmp->h); evas_object_resize(o, st->w, st->h);
evas_object_resize(st->win, st->bmp->w, st->bmp->h); evas_object_resize(st->win, st->w, st->h);
elm_win_autodel_set(st->win, EINA_TRUE); elm_win_autodel_set(st->win, EINA_TRUE);
evas_object_show(st->win); evas_object_show(st->win);
@ -623,7 +645,7 @@ _show_app_window(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
(unsigned long long) (uintptr_t) st->ptr, (unsigned long long) (uintptr_t) st->ptr,
(unsigned long long) (uintptr_t) treeit->ptr, st->refresh_ctr }; (unsigned long long) (uintptr_t) treeit->ptr, st->refresh_ctr };
void *p = packet_compose(BMP_REQ, &t, sizeof(t), &size); void *p = packet_compose(BMP_REQ, &t, sizeof(t), &size, NULL, 0);
if (p) if (p)
{ {
ecore_ipc_server_send(svr, ecore_ipc_server_send(svr,
@ -923,7 +945,7 @@ _gl_selected(void *data EINA_UNUSED, Evas_Object *pobj EINA_UNUSED,
if (svr) if (svr)
{ {
void *p = packet_compose(HIGHLIGHT, &st, sizeof(st), &size); void *p = packet_compose(HIGHLIGHT, &st, sizeof(st), &size, NULL, 0);
if (p) if (p)
{ {
ecore_ipc_server_send(svr, ecore_ipc_server_send(svr,
@ -969,7 +991,8 @@ _load_list(gui_elements *g)
data_req_st t = { (unsigned long long) (uintptr_t) NULL, data_req_st t = { (unsigned long long) (uintptr_t) NULL,
(unsigned long long) (uintptr_t) st->ptr }; (unsigned long long) (uintptr_t) st->ptr };
void *p = packet_compose(DATA_REQ, &t, sizeof(t), &size); void *p = packet_compose(DATA_REQ, &t, sizeof(t), &size,
NULL, 0);
if (p) if (p)
{ {
elm_progressbar_pulse(g->pb, EINA_TRUE); elm_progressbar_pulse(g->pb, EINA_TRUE);

View File

@ -172,7 +172,7 @@ _del(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Del *e
app_closed_st t = { (unsigned long long) (uintptr_t) ev->client }; app_closed_st t = { (unsigned long long) (uintptr_t) ev->client };
Eina_List *l; Eina_List *l;
int size; int size;
void *p = packet_compose(APP_CLOSED, &t, sizeof(t), &size); void *p = packet_compose(APP_CLOSED, &t, sizeof(t), &size, NULL, 0);
if (p) if (p)
{ {
EINA_LIST_FOREACH(gui, l, i) EINA_LIST_FOREACH(gui, l, i)
@ -225,7 +225,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
(unsigned long long) (uintptr_t) ev->client, NULL, 0 }; (unsigned long long) (uintptr_t) ev->client, NULL, 0 };
app = _add_client(app, t, ev->client); app = _add_client(app, t, ev->client);
p = packet_compose(APP_ADD, &m, sizeof(m), &size); p = packet_compose(APP_ADD, &m, sizeof(m), &size, NULL, 0);
if (p) if (p)
{ {
EINA_LIST_FOREACH(gui, l, st) EINA_LIST_FOREACH(gui, l, st)
@ -250,7 +250,8 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
gui = _add_client(gui, t, ev->client); gui = _add_client(gui, t, ev->client);
EINA_LIST_FOREACH(app, l, st) EINA_LIST_FOREACH(app, l, st)
{ /* Add all registered apps to newly open GUI */ { /* Add all registered apps to newly open GUI */
p = packet_compose(APP_ADD, st, sizeof(app_info_st), &size); p = packet_compose(APP_ADD, st, sizeof(*st), &size,
NULL, 0);
if (p) if (p)
{ {
ecore_ipc_client_send(ev->client, ecore_ipc_client_send(ev->client,
@ -277,7 +278,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
(unsigned long long) (uintptr_t) req->app }; (unsigned long long) (uintptr_t) req->app };
p = packet_compose(DATA_REQ, p = packet_compose(DATA_REQ,
&t, sizeof(t), &size); &t, sizeof(t), &size, NULL, 0);
if (p) if (p)
{ {
ecore_ipc_client_send( ecore_ipc_client_send(
@ -301,7 +302,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
{ {
t.app = (unsigned long long) (uintptr_t) st->ptr; t.app = (unsigned long long) (uintptr_t) st->ptr;
p = packet_compose(DATA_REQ, p = packet_compose(DATA_REQ,
&t, sizeof(t), &size); &t, sizeof(t), &size, NULL, 0);
if (p) if (p)
{ {
ecore_ipc_client_send( ecore_ipc_client_send(
@ -375,7 +376,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
req->app, req->object, req->ctr }; req->app, req->object, req->ctr };
p = packet_compose(BMP_REQ, p = packet_compose(BMP_REQ,
&t, sizeof(t), &size); &t, sizeof(t), &size, NULL, 0);
if (p) if (p)
{ /* FWD req to app with client data */ { /* FWD req to app with client data */
ecore_ipc_client_send( ecore_ipc_client_send(
@ -419,7 +420,8 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
} }
} }
bmp_info_free(st->bmp); if (st->bmp)
free(st->bmp);
} }
break; break;

View File

@ -111,13 +111,6 @@ _variant_type_set(const char *type,
return EINA_TRUE; return EINA_TRUE;
} /* _variant_type_set */ } /* _variant_type_set */
void
bmp_info_free(Bmp_Data *bmp)
{
free(bmp->bmp);
free(bmp);
}
void void
variant_free(Variant_st *v) variant_free(Variant_st *v)
{ {
@ -189,25 +182,6 @@ data_req_desc_make(void)
return d; return d;
} }
Eet_Data_Descriptor *
bmp_data_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Bmp_Data);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC_VAR_ARRAY(d, Bmp_Data,
"bmp", bmp, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Bmp_Data,
"w", w, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, Bmp_Data,
"h", h, EET_T_INT);
return d;
}
Eet_Data_Descriptor * Eet_Data_Descriptor *
bmp_info_desc_make(void) bmp_info_desc_make(void)
{ {
@ -224,10 +198,11 @@ bmp_info_desc_make(void)
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st,
"object", object, EET_T_ULONG_LONG); "object", object, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "ctr", EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "ctr",
ctr, EET_T_UINT); ctr, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "w",
EET_DATA_DESCRIPTOR_ADD_SUB(d, bmp_info_st, "bmp", w, EET_T_ULONG_LONG);
bmp, desc->bmp_data); /* Carefull - init this first */ EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "h",
h, EET_T_ULONG_LONG);
return d; return d;
} }
@ -341,7 +316,6 @@ data_descriptors_init(void)
Eet_Data_Descriptor_Class eddc; Eet_Data_Descriptor_Class eddc;
desc->bmp_data = bmp_data_desc_make();
desc->bmp_req = bmp_req_desc_make(); desc->bmp_req = bmp_req_desc_make();
desc->bmp_info = bmp_info_desc_make(); desc->bmp_info = bmp_info_desc_make();
desc->obj_info = Obj_Information_desc_make(); desc->obj_info = Obj_Information_desc_make();
@ -412,7 +386,6 @@ data_descriptors_shutdown(void)
eet_data_descriptor_free(desc->obj_info); eet_data_descriptor_free(desc->obj_info);
eet_data_descriptor_free(desc->_variant_descriptor ); eet_data_descriptor_free(desc->_variant_descriptor );
eet_data_descriptor_free(desc->_variant_unified_descriptor); eet_data_descriptor_free(desc->_variant_unified_descriptor);
eet_data_descriptor_free(desc->bmp_data);
eet_data_descriptor_free(desc->bmp_req); eet_data_descriptor_free(desc->bmp_req);
eet_data_descriptor_free(desc->bmp_info); eet_data_descriptor_free(desc->bmp_info);
@ -421,34 +394,115 @@ data_descriptors_shutdown(void)
} }
} }
void * enum _bmp_field_idx
packet_compose(message_type t, void *data, int data_size, int *size) { /* Index for bmp_info_st fields to be stored in BLOB */
{ /* Returns packet BLOB and size in size param, NULL on failure */ gui = 0,
/* Packet is composed of message type + ptr to data */ app,
data_desc *d = data_descriptors_init(); object,
Variant_st *v = variant_alloc(t, data_size, data); ctr,
void *p = eet_data_descriptor_encode(d->_variant_descriptor , v, size); w,
variant_free(v); h,
top_idx /* Used for allocation */
};
typedef enum _bmp_field_idx bmp_field_idx;
/* printf("%s size=<%d>\n", __func__, *size); */ void *
return p; /* User has to free(p) */ packet_compose(message_type t, void *data,
int data_size, int *size,
void *blob, int blob_size)
{ /* Returns packet BLOB and size in size param, NULL on failure */
/* Packet is composed of packet type BYTE + packet data. */
void *p = NULL;
void *pb = NULL;
unsigned char p_type = VARIANT_PACKET;
switch (t)
{
case BMP_DATA:
{ /* Builed raw data without encoding */
/* Do NOT forget to update *size, allocate using p */
bmp_info_st *b = data;
*size = (top_idx * sizeof(unsigned long long)) + blob_size;
unsigned long long *longs = malloc(*size);
longs[gui] = b->gui;
longs[app] = b->app;
longs[object] = b->object;
longs[ctr] = b->ctr;
longs[w] = b->w;
longs[h] = b->h;
if (blob)
memcpy(&longs[top_idx], blob, blob_size); /* Copy BMP info */
p_type = BMP_RAW_DATA;
p = longs;
}
break;
default:
{ /* All others are variant packets with EET encoding */
/* Variant is composed of message type + ptr to data */
data_desc *d = data_descriptors_init();
Variant_st *v = variant_alloc(t, data_size, data);
p = eet_data_descriptor_encode(
d->_variant_descriptor , v, size);
variant_free(v);
}
}
pb = malloc((*size) + 1);
*((unsigned char *) pb) = p_type;
memcpy(((char *) pb) + 1, p, *size);
*size = (*size) + 1; /* Add space for packet type */
free(p);
return pb; /* User has to free(pb) */
} }
Variant_st * Variant_st *
packet_info_get(void *data, int size) packet_info_get(void *data, int size)
{ /* user has to use variant_free() to free return struct */ { /* user has to use variant_free() to free return struct */
data_desc *d = data_descriptors_init(); char *ch = data;
return eet_data_descriptor_decode(d->_variant_descriptor, data, size); switch (*ch)
{
case BMP_RAW_DATA:
{
void *bmp = NULL;
unsigned long long *longs = (unsigned long long *) (ch + 1);
/* Allocate size minus longs array and ch size for bmp */
int blob_size = size - (((char *) (&longs[top_idx])) - ch);
if (blob_size)
{ /* Allocate BMP only if was included in packet */
bmp = malloc(blob_size);
memcpy(bmp, &longs[top_idx], blob_size);
}
bmp_info_st t = { longs[gui], longs[app], longs[object],
longs[ctr], longs[w], longs[h], NULL, NULL, bmp };
/* User have to free both: variant_free(rt), free(t->bmp) */
return variant_alloc(BMP_DATA, sizeof(t), &t);
}
break;
default:
{
data_desc *d = data_descriptors_init();
return eet_data_descriptor_decode(d->_variant_descriptor,
ch + 1, size - 1);
}
}
} }
Eina_Bool eet_info_save(const char *filename, Eina_Bool eet_info_save(const char *filename,
app_info_st *app, tree_data_st *ftd) app_info_st *a, tree_data_st *ftd)
{ {
data_desc *d = data_descriptors_init(); data_desc *d = data_descriptors_init();
Eet_File *fp = eet_open(filename, EET_FILE_MODE_WRITE); Eet_File *fp = eet_open(filename, EET_FILE_MODE_WRITE);
if (fp) if (fp)
{ {
eet_data_write(fp, d->app_add, APP_ADD_ENTRY, app, EINA_TRUE); eet_data_write(fp, d->app_add, APP_ADD_ENTRY, a, EINA_TRUE);
eet_data_write(fp, d->tree_data, TREE_DATA_ENTRY, ftd, EINA_TRUE); eet_data_write(fp, d->tree_data, TREE_DATA_ENTRY, ftd, EINA_TRUE);
eet_close(fp); eet_close(fp);
@ -460,13 +514,13 @@ Eina_Bool eet_info_save(const char *filename,
} }
Eina_Bool eet_info_read(const char *filename, Eina_Bool eet_info_read(const char *filename,
app_info_st **app, tree_data_st **ftd) app_info_st **a, tree_data_st **ftd)
{ {
data_desc *d = data_descriptors_init(); data_desc *d = data_descriptors_init();
Eet_File *fp = eet_open(filename, EET_FILE_MODE_READ); Eet_File *fp = eet_open(filename, EET_FILE_MODE_READ);
if (fp) if (fp)
{ {
*app = eet_data_read(fp, d->app_add, APP_ADD_ENTRY); *a = eet_data_read(fp, d->app_add, APP_ADD_ENTRY);
*ftd = eet_data_read(fp, d->tree_data, TREE_DATA_ENTRY); *ftd = eet_data_read(fp, d->tree_data, TREE_DATA_ENTRY);
eet_close(fp); eet_close(fp);

View File

@ -10,6 +10,11 @@
#define LOCALHOST "127.0.0.1" #define LOCALHOST "127.0.0.1"
#define LISTEN_IP "0.0.0.0" /* Avail all, no mask */ #define LISTEN_IP "0.0.0.0" /* Avail all, no mask */
/* Define packet types, used by packet encode / decode */
#define VARIANT_PACKET 0
#define BMP_RAW_DATA 1
#define DESC_ADD_BASIC(desc, type, member, eet_type) \ #define DESC_ADD_BASIC(desc, type, member, eet_type) \
EET_DATA_DESCRIPTOR_ADD_BASIC \ EET_DATA_DESCRIPTOR_ADD_BASIC \
(desc, type, #member, member, eet_type) (desc, type, #member, member, eet_type)
@ -35,7 +40,7 @@ enum _message_type
APP_CLOSED, /* APP client PTR from DAEMON to GUI */ APP_CLOSED, /* APP client PTR from DAEMON to GUI */
HIGHLIGHT, /* APP client PTR, object PTR */ HIGHLIGHT, /* APP client PTR, object PTR */
BMP_REQ, /* APP client PTR, object PTR */ BMP_REQ, /* APP client PTR, object PTR */
BMP_DATA /* APP client PTR, object PTR, Bmp_Data */ BMP_DATA /* bmp_info_st header + BMP raw data */
}; };
typedef enum _message_type message_type; typedef enum _message_type message_type;
@ -109,14 +114,18 @@ struct _bmp_req_st
typedef struct _bmp_req_st bmp_req_st; typedef struct _bmp_req_st bmp_req_st;
struct _bmp_info_st struct _bmp_info_st
{ /* This will be used to send app window Bitmap */ { /* This will be used to send app window Bitmap */
unsigned long long gui; /* (void *) client ptr of GUI */ /* We are using ULONGLONG because we send this as RAW data */
unsigned long long app; /* (void *) client ptr of APP */ /* win, bt are NOT transferred. */
unsigned long long object; /* (void *) object ptr of evas */ unsigned long long gui; /* (void *) client ptr of GUI */
unsigned int ctr; /* Reload counter to match */ unsigned long long app; /* (void *) client ptr of APP */
Evas_Object *win; /* Window of view if open */ unsigned long long object; /* (void *) object ptr of evas */
Evas_Object *bt; /* Button opening win */ unsigned long long ctr; /* Reload counter to match */
Bmp_Data *bmp; unsigned long long w; /* BMP width, make Evas_Coord */
unsigned long long h; /* BMP hight, make Evas_Coord */
Evas_Object *win; /* Window of view if open */
Evas_Object *bt; /* Button opening win */
void *bmp; /* Bitmap BLOB, size (w * h * sizeof(int)) */
}; };
typedef struct _bmp_info_st bmp_info_st; typedef struct _bmp_info_st bmp_info_st;
@ -165,12 +174,11 @@ void item_tree_free(Eina_List *tree);
void _item_tree_item_string(Tree_Item *parent); void _item_tree_item_string(Tree_Item *parent);
data_desc *data_descriptors_init(void); data_desc *data_descriptors_init(void);
void data_descriptors_shutdown(void); void data_descriptors_shutdown(void);
void bmp_info_free(Bmp_Data *bmp);
void variant_free(Variant_st *v); void variant_free(Variant_st *v);
Variant_st *variant_alloc(message_type t, size_t size, void *info); Variant_st *variant_alloc(message_type t, size_t size, void *info);
message_type packet_mapping_type_get(const char *name); message_type packet_mapping_type_get(const char *name);
const char *packet_mapping_type_str_get(message_type t); const char *packet_mapping_type_str_get(message_type t);
void *packet_compose(message_type t, void *data, int data_size, int *size); void *packet_compose(message_type t, void *data, int data_size, int *size, void *blob, int blob_size);
Variant_st *packet_info_get(void *data, int size); Variant_st *packet_info_get(void *data, int size);
Eina_Bool eet_info_save(const char *filename, app_info_st *app, tree_data_st *ftd); Eina_Bool eet_info_save(const char *filename, app_info_st *app, tree_data_st *ftd);
Eina_Bool eet_info_read(const char *filename, app_info_st **app, tree_data_st **ftd); Eina_Bool eet_info_read(const char *filename, app_info_st **app, tree_data_st **ftd);

View File

@ -44,10 +44,9 @@ libclouseau_item_add(Evas_Object *o, Tree_Item *parent)
eina_list_free(children); eina_list_free(children);
} }
static Bmp_Data * static void *
_canvas_bmp_get(Ecore_Evas *ee) _canvas_bmp_get(Ecore_Evas *ee, Evas_Coord *w_out, Evas_Coord *h_out)
{ {
Bmp_Data *rt = NULL;
Ecore_X_Image *img; Ecore_X_Image *img;
Ecore_X_Window_Attributes att; Ecore_X_Window_Attributes att;
unsigned char *src; unsigned char *src;
@ -59,7 +58,8 @@ _canvas_bmp_get(Ecore_Evas *ee)
if (!xwin) if (!xwin)
{ {
printf("Can't grab X window.\n"); printf("Can't grab X window.\n");
return rt; *w_out = *h_out = 0;
return NULL;
} }
Evas *e = ecore_evas_get(ee); Evas *e = ecore_evas_get(ee);
@ -84,14 +84,9 @@ _canvas_bmp_get(Ecore_Evas *ee)
/* dst now holds window bitmap */ /* dst now holds window bitmap */
ecore_x_image_free(img); ecore_x_image_free(img);
*w_out = w;
rt = malloc(sizeof(*rt)); /* Will be freed by the user */ *h_out = h;
rt->bmp = (unsigned char *) dst; return (void *) dst;
rt->bmp_count = (w * h * sizeof(int));
rt->w = w;
rt->h = h;
return rt;
} }
static Eina_List * static Eina_List *
@ -145,7 +140,7 @@ _add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Add *e
ecore_ipc_server_data_size_max_set(ev->server, -1); ecore_ipc_server_data_size_max_set(ev->server, -1);
connect_st t = { getpid(), _my_app_name }; connect_st t = { getpid(), _my_app_name };
p = packet_compose(APP_CLIENT_CONNECT, &t, sizeof(t), &size); p = packet_compose(APP_CLIENT_CONNECT, &t, sizeof(t), &size, NULL, 0);
if (p) if (p)
{ {
ecore_ipc_server_send(ev->server, 0,0,0,0,EINA_FALSE, p, size); ecore_ipc_server_send(ev->server, 0,0,0,0,EINA_FALSE, p, size);
@ -191,7 +186,8 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data
t.tree = _load_list(); t.tree = _load_list();
if (t.tree) if (t.tree)
{ /* Reply with tree data to data request */ { /* Reply with tree data to data request */
void *p = packet_compose(TREE_DATA, &t, sizeof(t), &size); void *p = packet_compose(TREE_DATA, &t, sizeof(t), &size,
NULL, 0);
if (p) if (p)
{ {
ecore_ipc_server_send(ev->server, 0,0,0,0, ecore_ipc_server_send(ev->server, 0,0,0,0,
@ -215,27 +211,28 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data
case BMP_REQ: case BMP_REQ:
{ /* Bitmap req msg contains PTR of Ecore Evas */ { /* Bitmap req msg contains PTR of Ecore Evas */
bmp_req_st *req = v->data; bmp_req_st *req = v->data;
Bmp_Data *bmp = _canvas_bmp_get((Ecore_Evas *) (uintptr_t) Evas_Coord w, h;
req->object); int size = 0;
void *bmp = _canvas_bmp_get((Ecore_Evas *) (uintptr_t)
req->object, &w, &h);
/* TODO: what if win closed (bmp not found), need to send NULL */ bmp_info_st t = { req->gui,
/* and handle bmp-NULL value in client */ req->app, req->object , req->ctr, w, h,
if (bmp) NULL, NULL, NULL };
{ /* Send server packet with BMP info */
int size = 0;
bmp_info_st t = { req->gui,
req->app, req->object , req->ctr, NULL, NULL, bmp };
void *p = packet_compose(BMP_DATA, &t, sizeof(t), &size);
if (p)
{
ecore_ipc_server_send(ev->server, 0,0,0,0,
EINA_FALSE, p, size);
ecore_ipc_server_flush(ev->server);
free(p);
}
bmp_info_free(bmp); void *p = packet_compose(BMP_DATA, &t, sizeof(t), &size,
bmp, (w * h * sizeof(int)));
if (p)
{
ecore_ipc_server_send(ev->server, 0,0,0,0,
EINA_FALSE, p, size);
ecore_ipc_server_flush(ev->server);
free(p);
} }
if (bmp)
free(bmp);
} }
break; break;