clouseau: Initial version of supporting BMP windows This version enables user to open local copy of app window Need to cancel BMP decoding of EET Fix app-name in title-bar of BMP window Need to support the case of bmp not found HIGHLIGHT BUG: if sub-window is closed Support HIGHLIGHT on BMP Add BMP Saving in EET file + test all offline implicaitons

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

SVN revision: 72338
This commit is contained in:
Aharon Hillel 2012-06-18 07:22:25 +00:00 committed by Tom Hacohen
parent daa7640933
commit b2a538d634
6 changed files with 641 additions and 39 deletions

View File

@ -12,6 +12,14 @@ struct _app_data_st
};
typedef struct _app_data_st app_data_st;
struct _bmp_node
{
unsigned int ctr; /* Current refresh_ctr */
unsigned long long object; /* Evas ptr */
Evas_Object *bt; /* Button of BMP_REQ */
};
typedef struct _bmp_node bmp_node;
struct _gui_elements
{
Evas_Object *win;
@ -32,13 +40,15 @@ struct _gui_elements
};
typedef struct _gui_elements gui_elements;
static int _load_list(gui_elements *gui);
static int _load_list(gui_elements *g);
static void _bt_load_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info);
static void _show_gui(gui_elements *g, Eina_Bool work_offline);
/* Globals */
static gui_elements *gui = NULL;
static Eina_List *apps= NULL; /* List of (app_data_st *) */
static Eina_List *apps = NULL; /* List of (app_data_st *) */
static Eina_List *bmp_req = NULL; /* List of (bmp_node *) */
static Elm_Genlist_Item_Class itc;
static Eina_Bool list_show_clippers = EINA_TRUE, list_show_hidden = EINA_TRUE;
static Ecore_Ipc_Server *svr = NULL;
@ -227,16 +237,52 @@ _app_name_get(app_info_st *app)
return str; /* User has to free(str) */
}
static void
_close_app_views(app_info_st *app, Eina_Bool clr)
{ /* Close any open-views if this app */
Eina_List *l;
Variant_st *view;
EINA_LIST_FOREACH(app->view, l, view)
{
bmp_info_st *b = view->data;
if (b->win)
evas_object_del(b->win);
if (b->bt)
elm_object_disabled_set(b->bt, EINA_FALSE);
b->win = b->bt = NULL;
}
if (clr)
{ /* These are cleared when app data is reloaded */
EINA_LIST_FREE(app->view, view)
{ /* Free memory allocated to show any app screens */
bmp_info_st *b = view->data;
bmp_info_free(b->bmp);
variant_free(view);
}
app->view = NULL;
}
}
static void
_set_selected_app(void *data, Evas_Object *pobj,
void *event_info EINA_UNUSED)
{ /* Set hovel label */
app_data_st *st = data;
elm_progressbar_pulse(gui->pb, EINA_FALSE);
evas_object_hide(gui->pb);
if (gui->sel_app)
_close_app_views(gui->sel_app->app->data, EINA_FALSE);
if (st)
{
if (!svr)
{ /* Got TREE_DATA from file, update this immidately */
gui->sel_app = st;
gui->sel_app = st;
char *str = _app_name_get(st->app->data);
elm_object_text_set(pobj, str);
free(str);
@ -290,6 +336,45 @@ _add_app_to_dd_list(Evas_Object *dd_list, app_data_st *st)
free(str);
}
static int
_bmp_object_ptr_cmp(const void *d1, const void *d2)
{ /* Comparison according to Evas ptr of BMP struct */
const Variant_st *info = d1;
bmp_info_st *bmp = info->data;
return ((bmp->object) - (unsigned long long) (uintptr_t) d2);
}
static int
_bmp_app_ptr_cmp(const void *d1, const void *d2)
{ /* Comparison according to app ptr of BMP struct */
const Variant_st *info = d1;
bmp_info_st *bmp = info->data;
return ((bmp->app) - (unsigned long long) (uintptr_t) d2);
}
static Eina_List *
_remove_bmp(Eina_List *view, void *ptr)
{ /* Remove app bitmap from bitmaps list */
Variant_st *v = (Variant_st *)
eina_list_search_unsorted(view, _bmp_app_ptr_cmp,
(void *) (uintptr_t) ptr);
if (v)
{
bmp_info_st *st = v->data;
if (st->win)
evas_object_del(st->win);
bmp_info_free(st->bmp);
variant_free(v);
return eina_list_remove(view, v);
}
return view;
}
static app_data_st *
_add_app(gui_elements *g, Variant_st *v)
{
@ -317,6 +402,18 @@ _free_app_tree_data(Variant_st *td)
static void
_free_app(app_data_st *st)
{
Variant_st *view;
app_info_st *app = st->app->data;
EINA_LIST_FREE(app->view, view)
{ /* Free memory allocated to show any app screens */
bmp_info_st *b = view->data;
if (b->win)
evas_object_del(b->win);
bmp_info_free(b->bmp);
variant_free(view);
}
variant_free(st->app);
_free_app_tree_data(st->td);
free(st);
@ -389,6 +486,168 @@ _update_tree(gui_elements *g, Variant_st *v)
}
}
static int
_bmp_node_cmp(const void *d1, const void *d2)
{ /* Compare accoring to Evas ptr */
const bmp_node *info = d1;
return ((info->object) - (unsigned long long) (uintptr_t) d2);
}
static bmp_node *
_get_bmp_node(bmp_info_st *st, app_info_st *app)
{ /* Find the request of this bmp info, in the req list */
/* We would like to verify this bmp_info_st is still relevant */
Eina_List *req_list = bmp_req;
bmp_node *nd = NULL;
if (!app)
return NULL;
do{ /* First find according to Evas ptr, then match ctr with refresh_ctr */
req_list = eina_list_search_unsorted_list(req_list, _bmp_node_cmp,
(void *) (uintptr_t) st->object);
if (req_list)
nd = (bmp_node *) eina_list_data_get(req_list);
if (nd)
{ /* if found this object in list, compare ctr */
if (nd->ctr == app->refresh_ctr)
return nd;
/* ctr did not match, look further in list */
req_list = eina_list_next(req_list);
}
}while(req_list);
return NULL;
}
static void
_add_bmp(gui_elements *g EINA_UNUSED, Variant_st *v)
{ /* Remove bmp if exists (according to obj-ptr), then add the new one */
bmp_info_st *st = v->data;
app_data_st *app = (app_data_st *)
eina_list_search_unsorted(apps, _app_ptr_cmp,
(void *) (uintptr_t) st->app);
/* Check for relevant bmp req in the bmp_req list */
bmp_node *nd = _get_bmp_node(st, app->app->data);
if (app && nd)
{ /* Remove app bmp data if exists, then update */
elm_progressbar_pulse(g->pb, EINA_FALSE);
evas_object_hide(g->pb);
app_info_st *info = app->app->data;
info->view = _remove_bmp(info->view,
(void *) (uintptr_t) (((bmp_info_st *) v->data)->object));
info->view = eina_list_append(info->view, v);
/* Now we need to update refresh button, make it open-window */
char buf[1024];
Evas_Object *ic = elm_icon_add(g->win);
snprintf(buf, sizeof(buf), "%s/images/application-default-icon.png",
PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_object_part_content_set(nd->bt, "icon", ic);
elm_object_tooltip_text_set(nd->bt, "Show App Screenshot");
elm_object_disabled_set(nd->bt, EINA_FALSE);
evas_object_show(ic);
bmp_req = eina_list_remove(bmp_req, nd);
free(nd);
}
else
{ /* Dispose bmp info if app no longer in the list of apps */
/* or the bmp_info is no longer relevant */
bmp_info_free(((bmp_info_st *) v->data)->bmp);
variant_free(v);
}
}
static void
_app_win_del(void *data,
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{ /* when closeing view, set view ptr to NULL, and enable open button */
bmp_info_st *st = data;
elm_object_disabled_set(st->bt, EINA_FALSE);
st->win = st->bt = NULL;
}
static void
_open_app_window(bmp_info_st *st, Evas_Object *bt)
{
app_data_st *app = (app_data_st *)
eina_list_search_unsorted(apps, _app_ptr_cmp,
(void *) (uintptr_t) st->app);
st->bt = bt;
st->win = elm_win_add(NULL, "win", ELM_WIN_BASIC);
elm_win_title_set(st->win, ((app_info_st *) app->app->data)->name);
Evas_Object *o = evas_object_image_filled_add(
evas_object_evas_get(st->win));
elm_object_disabled_set(bt, EINA_TRUE);
evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
evas_object_image_alpha_set(o, EINA_FALSE);
evas_object_image_size_set(o, st->bmp->w, st->bmp->h);
evas_object_image_data_copy_set(o, st->bmp->bmp);
evas_object_image_data_update_add(o, 0, 0, st->bmp->w, st->bmp->h);
evas_object_show(o);
evas_object_smart_callback_add(st->win,
"delete,request", _app_win_del, st);
evas_object_resize(o, st->bmp->w, st->bmp->h);
evas_object_resize(st->win, st->bmp->w, st->bmp->h);
elm_win_autodel_set(st->win, EINA_TRUE);
evas_object_show(st->win);
}
static void
_show_app_window(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{ /* Open window with currnent bmp, or download it if missing */
app_info_st *st = gui->sel_app->app->data;
/* First search app->view list if already have the window bmp */
Variant_st *v = (Variant_st *)
eina_list_search_unsorted(st->view, _bmp_app_ptr_cmp,
(void *) (uintptr_t) st->ptr);
if (v)
return _open_app_window(v->data, obj);
/* Need to issue BMP_REQ */
if (svr)
{
int size = 0;
bmp_req_st t = { (unsigned long long) (uintptr_t) NULL,
(unsigned long long) (uintptr_t) st->ptr,
(unsigned long long) (uintptr_t) data, st->refresh_ctr };
void *p = packet_compose(BMP_REQ, &t, sizeof(t), &size);
if (p)
{
ecore_ipc_server_send(svr,
0,0,0,0,EINA_FALSE, p, size);
ecore_ipc_server_flush(svr);
free(p);
elm_object_disabled_set(obj, EINA_TRUE);
elm_progressbar_pulse(gui->pb, EINA_TRUE);
evas_object_show(gui->pb);
bmp_node *b_node = malloc(sizeof(*b_node));
b_node->ctr = st->refresh_ctr;
b_node->object = (unsigned long long) (uintptr_t) data;
b_node->bt = obj; /* Button of BMP_REQ */
bmp_req = eina_list_append(bmp_req, b_node);
}
}
}
Eina_Bool
_data(void *data, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data *ev)
{
@ -410,6 +669,12 @@ _data(void *data, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data *ev)
_update_tree(data, v); /* data is the gui pointer */
break; /* v->data is (tree_data_st *) */
case BMP_DATA: /* Contains a snapshot of canvas window */
{ /* v->data is (bmp_info_st *) */
_add_bmp(data, v); /* data is the gui pointer */
}
break;
default:
break;
}
@ -471,7 +736,48 @@ item_icon_get(void *data, Evas_Object *parent, const char *part)
Tree_Item *treeit = data;
if (!treeit->is_obj)
return NULL;
{ /* Add "Download" button for evas objects */
if (!strcmp(part, "elm.swallow.end"))
{
char buf[1024];
Evas_Object *bt = elm_button_add(parent);
Evas_Object *ic = elm_icon_add(parent);
app_info_st *app = NULL;
if (gui->sel_app)
app = gui->sel_app->app->data;
if (app)
{ /* match ptr with bmp->object ptr to find view */
Variant_st *v = (Variant_st *)
eina_list_search_unsorted(app->view, _bmp_object_ptr_cmp,
(void *) (uintptr_t) treeit->ptr);
if (v)
{ /* Set to "show view" if view exists */
snprintf(buf, sizeof(buf),
"%s/images/application-default-icon.png",
PACKAGE_DATA_DIR);
elm_object_tooltip_text_set(bt, "Show App Screenshot");
}
else
{ /* Set to Download */
snprintf(buf, sizeof(buf), "%s/images/gtk-refresh.png",
PACKAGE_DATA_DIR);
elm_object_tooltip_text_set(bt, "Download Screenshot");
}
}
elm_icon_file_set(ic, buf, NULL);
elm_object_part_content_set(bt, "icon", ic);
evas_object_smart_callback_add(bt, "clicked",
_show_app_window, treeit->ptr);
evas_object_show(bt);
return bt;
}
return NULL;
}
if (!strcmp(part, "elm.swallow.icon"))
{
@ -608,15 +914,13 @@ _gl_selected(void *data EINA_UNUSED, Evas_Object *pobj EINA_UNUSED,
void *event_info)
{
clouseau_obj_information_list_clear();
/* If not an object, return. */
if (!elm_genlist_item_parent_get(event_info))
return;
gui_elements *g = data;
Tree_Item *treeit = elm_object_item_data_get(event_info);
if (!elm_genlist_item_parent_get(event_info))
return;
/* START - replacing libclouseau_highlight(obj); */
int size;
gui_elements *g = data;
app_info_st *app = g->sel_app->app->data;
highlight_st st = { (unsigned long long) (uintptr_t) app->ptr,
(unsigned long long) (uintptr_t) treeit->ptr };
@ -640,34 +944,45 @@ _gl_selected(void *data EINA_UNUSED, Evas_Object *pobj EINA_UNUSED,
static int
_load_list(gui_elements *g)
{
elm_progressbar_pulse(g->pb, EINA_FALSE);
evas_object_hide(g->pb);
if (g->sel_app)
{
elm_genlist_clear(g->gl);
elm_genlist_clear(g->prop_list);
app_info_st *st = g->sel_app->app->data;
tree_data_st *td = (g->sel_app->td) ? g->sel_app->td->data: NULL;
if (!svr)
{
_update_tree_offline(g, g->sel_app->td);
return 0;
if (td)
{ /* Just show currnet tree we got */
_load_gui_with_list(g, td->tree);
}
if (eina_list_search_unsorted(apps, _app_ptr_cmp,
(void *) (uintptr_t) st->ptr))
{ /* do it only if app selected AND found in apps list */
int size;
data_req_st t = { (unsigned long long) (uintptr_t) NULL,
(unsigned long long) (uintptr_t) st->ptr };
void *p = packet_compose(DATA_REQ, &t, sizeof(t), &size);
if (p)
else
{ /* Ask for app info only if was not fetched */
if (!svr)
{
elm_progressbar_pulse(g->pb, EINA_TRUE);
evas_object_show(g->pb);
ecore_ipc_server_send(svr,
0,0,0,0,EINA_FALSE, p, size);
ecore_ipc_server_flush(svr);
free(p);
_update_tree_offline(g, g->sel_app->td);
return 0;
}
if (eina_list_search_unsorted(apps, _app_ptr_cmp,
(void *) (uintptr_t) st->ptr))
{ /* do it only if app selected AND found in apps list */
int size;
data_req_st t = { (unsigned long long) (uintptr_t) NULL,
(unsigned long long) (uintptr_t) st->ptr };
void *p = packet_compose(DATA_REQ, &t, sizeof(t), &size);
if (p)
{
elm_progressbar_pulse(g->pb, EINA_TRUE);
evas_object_show(g->pb);
ecore_ipc_server_send(svr,
0,0,0,0,EINA_FALSE, p, size);
ecore_ipc_server_flush(svr);
free(p);
}
}
}
}
@ -694,7 +1009,19 @@ _show_hidden_check_changed(void *data, Evas_Object *obj,
static void
_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
gui_elements *g = data;
/* Close all app-bmp-view windows here and clear mem */
if (g->sel_app)
{
app_info_st *st = g->sel_app->app->data;
_close_app_views(st, EINA_TRUE);
st->refresh_ctr++;
}
elm_object_text_set(obj, "Reload");
_free_app_tree_data(g->sel_app->td);
g->sel_app->td = NULL;
_load_list(data);
}
@ -1063,18 +1390,23 @@ elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
/* END - Popup to get IP, PORT from user */
elm_run();
elm_shutdown();
/* cleanup - free apps data */
void *st;
EINA_LIST_FREE(apps, st)
_free_app(st);
EINA_LIST_FREE(bmp_req, st)
free(st);
data_descriptors_shutdown();
if (gui->address)
free(gui->address);
free(gui);
elm_shutdown();
return 0;
}
ELM_MAIN()

View File

@ -117,11 +117,9 @@ _add_client(Eina_List *clients, connect_st *t, void *client)
{
if(!eina_list_search_unsorted(clients, _client_ptr_cmp, client))
{
app_info_st *st = malloc(sizeof(app_info_st));
app_info_st *st = calloc(1, sizeof(app_info_st));
st->name = strdup(t->name);
st->pid = t->pid;
st->file = NULL;
st->ptr = (unsigned long long) (uintptr_t) client;
return eina_list_append(clients, st);
@ -224,7 +222,7 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
Eina_List *l;
connect_st *t = v->data;
app_info_st m = { t->pid, (char *) t->name, NULL,
(unsigned long long) (uintptr_t) ev->client};
(unsigned long long) (uintptr_t) ev->client, NULL, 0 };
app = _add_client(app, t, ev->client);
p = packet_compose(APP_ADD, &m, sizeof(m), &size);
@ -366,6 +364,65 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Client_Data
}
break;
case BMP_REQ:
{
bmp_req_st *req = v->data;
if(eina_list_search_unsorted(app,
_client_ptr_cmp, (void *) (uintptr_t) req->app))
{ /* Do the req only of APP connected to daemon */
bmp_req_st t = {
(unsigned long long) (uintptr_t) ev->client,
req->app, req->object, req->ctr };
p = packet_compose(BMP_REQ,
&t, sizeof(t), &size);
if (p)
{ /* FWD req to app with client data */
ecore_ipc_client_send(
(void *) (uintptr_t) req->app,
0,0,0,0, EINA_FALSE, p, size);
ecore_ipc_client_flush(
(void *) (uintptr_t) req->app);
free(p);
}
}
}
break;
case BMP_DATA:
{ /* Bmp Data comes from APP, GUI client specified in msg */
bmp_info_st *st = v->data;
if (st->gui)
{ /* Sending BMP data to specific GUI client */
if(eina_list_search_unsorted(gui,
_client_ptr_cmp,
(void *) (uintptr_t) st->gui))
{ /* Do the req only of GUI connected to daemon */
ecore_ipc_client_send(
(void *) (uintptr_t) st->gui, 0,0,0,0,
EINA_FALSE, ev->data, ev->size);
ecore_ipc_client_flush(
(void *) (uintptr_t) st->gui);
}
}
else
{ /* Sending BMP data to all GUI clients */
Eina_List *l;
app_info_st *info;
EINA_LIST_FOREACH(gui, l, info)
{
ecore_ipc_client_send(
(void *) (uintptr_t) info->ptr, 0,0,0,0,
EINA_FALSE, ev->data, ev->size);
ecore_ipc_client_flush(
(void *) (uintptr_t) info->ptr);
}
}
bmp_info_free(st->bmp);
}
break;
default:
break;
}

View File

@ -49,13 +49,19 @@ static eet_message_type_mapping eet_mapping[] = {
{ DATA_REQ, DATA_REQ_STR },
{ TREE_DATA, TREE_DATA_STR },
{ APP_CLOSED, APP_CLOSED_STR },
{ HIGHLIGHT, HIGHLIGHT_STR }
{ HIGHLIGHT, HIGHLIGHT_STR },
{ BMP_REQ, BMP_REQ_STR },
{ BMP_DATA, BMP_DATA_STR },
{ UNKNOWN, NULL }
};
message_type
packet_mapping_type_get(const char *name)
{
int i;
if (!name)
return UNKNOWN;
for (i = 0; eet_mapping[i].name != NULL; ++i)
if (strcmp(name, eet_mapping[i].name) == 0)
return eet_mapping[i].t;
@ -105,6 +111,13 @@ _variant_type_set(const char *type,
return EINA_TRUE;
} /* _variant_type_set */
void
bmp_info_free(Bmp_Data *bmp)
{
free(bmp->bmp);
free(bmp);
}
void
variant_free(Variant_st *v)
{
@ -147,7 +160,7 @@ connect_desc_make(void)
Eet_Data_Descriptor *
app_add_desc_make(void)
{
{ /* view field not transferred, will be loaded on user request */
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
@ -176,6 +189,49 @@ data_req_desc_make(void)
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 *
bmp_info_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, bmp_info_st);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st,
"gui", gui, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st,
"app", app, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st,
"object", object, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_info_st, "ctr",
ctr, EET_T_UINT);
EET_DATA_DESCRIPTOR_ADD_SUB(d, bmp_info_st, "bmp",
bmp, desc->bmp_data); /* Carefull - init this first */
return d;
}
Eet_Data_Descriptor *
tree_data_desc_make(void)
{
@ -227,6 +283,27 @@ highlight_desc_make(void)
return d;
}
Eet_Data_Descriptor *
bmp_req_desc_make(void)
{
Eet_Data_Descriptor *d;
Eet_Data_Descriptor_Class eddc;
EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, bmp_req_st);
d = eet_data_descriptor_stream_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_req_st, "gui",
gui, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_req_st, "app",
app, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_req_st,
"object", object, EET_T_ULONG_LONG);
EET_DATA_DESCRIPTOR_ADD_BASIC (d, bmp_req_st, "ctr",
ctr, EET_T_UINT);
return d;
}
Eet_Data_Descriptor *
tree_item_desc_make(void)
{
@ -264,6 +341,9 @@ data_descriptors_init(void)
Eet_Data_Descriptor_Class eddc;
desc->bmp_data = bmp_data_desc_make();
desc->bmp_req = bmp_req_desc_make();
desc->bmp_info = bmp_info_desc_make();
desc->obj_info = Obj_Information_desc_make();
desc->tree = tree_item_desc_make();
desc->connect = connect_desc_make();
@ -303,6 +383,12 @@ data_descriptors_init(void)
EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor,
HIGHLIGHT_STR, desc->highlight);
EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor,
BMP_REQ_STR, desc->bmp_req);
EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor,
BMP_DATA_STR, desc->bmp_info);
EET_DATA_DESCRIPTOR_ADD_VARIANT(desc->_variant_descriptor,
Variant_st, "data", data, t, desc->_variant_unified_descriptor);
@ -326,6 +412,9 @@ data_descriptors_shutdown(void)
eet_data_descriptor_free(desc->obj_info);
eet_data_descriptor_free(desc->_variant_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_info);
free(desc);
desc = NULL;

View File

@ -21,6 +21,8 @@
#define TREE_DATA_STR "TREE_DATA"
#define APP_CLOSED_STR "APP_CLOSED"
#define HIGHLIGHT_STR "HIGHLIGHT"
#define BMP_REQ_STR "BMP_REQ"
#define BMP_DATA_STR "BMP_DATA"
enum _message_type
{ /* Add any supported types of packets here */
@ -31,7 +33,9 @@ enum _message_type
DATA_REQ, /* GUI client PTR (NULL for all),APP client PTR (NULL for all) */
TREE_DATA, /* GUI client PTR (NULL for all),APP client PTR, Tree Data */
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_DATA /* APP client PTR, object PTR, Bmp_Data */
};
typedef enum _message_type message_type;
@ -60,8 +64,10 @@ struct _app_info_st
{ /* This will be used to register new APP in GUI client */
unsigned int pid;
char *name;
char *file; /* Valid only if was read from file in offline mode */
char *file; /* Valid only if was read from file in offline mode */
unsigned long long ptr; /* (void *) client ptr of app as saved by daemon */
Eina_List *view; /* Screen views view->data is (bmp_info_st *) ptr */
unsigned int refresh_ctr; /* Counter of how many times down refresh */
};
typedef struct _app_info_st app_info_st;
@ -93,6 +99,27 @@ struct _highlight_st
};
typedef struct _highlight_st highlight_st;
struct _bmp_req_st
{ /* This will be used to send tree data to/from APP/DAEMON */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr APP */
unsigned long long object; /* (void *) object ptr of Evas */
unsigned int ctr; /* Reload counter to match */
};
typedef struct _bmp_req_st bmp_req_st;
struct _bmp_info_st
{ /* This will be used to send app window Bitmap */
unsigned long long gui; /* (void *) client ptr of GUI */
unsigned long long app; /* (void *) client ptr of APP */
unsigned long long object; /* (void *) object ptr of evas */
unsigned int ctr; /* Reload counter to match */
Evas_Object *win; /* Window of view if open */
Evas_Object *bt; /* Button opening win */
Bmp_Data *bmp;
};
typedef struct _bmp_info_st bmp_info_st;
struct _eet_message_type_mapping
{
message_type t;
@ -103,6 +130,9 @@ typedef struct _eet_message_type_mapping eet_message_type_mapping;
struct _data_desc
{
Eet_Data_Descriptor *bmp_data;
Eet_Data_Descriptor *bmp_req;
Eet_Data_Descriptor *bmp_info;
Eet_Data_Descriptor *connect;
Eet_Data_Descriptor *app_add;
Eet_Data_Descriptor *data_req;
@ -120,6 +150,9 @@ typedef struct _data_desc data_desc;
Eet_Data_Descriptor *connect_desc_make(void);
Eet_Data_Descriptor *app_add_desc_make(void);
Eet_Data_Descriptor *data_req_desc_make(void);
Eet_Data_Descriptor *bmp_req_desc_make(void);
Eet_Data_Descriptor *bmp_data_desc_make(void);
Eet_Data_Descriptor *bmp_info_desc_make(void);
Eet_Data_Descriptor *tree_data_desc_make(void);
Eet_Data_Descriptor *app_closed_desc_make(void);
Eet_Data_Descriptor *highlight_desc_make(void);
@ -132,6 +165,7 @@ void item_tree_free(Eina_List *tree);
void _item_tree_item_string(Tree_Item *parent);
data_desc *data_descriptors_init(void);
void data_descriptors_shutdown(void);
void bmp_info_free(Bmp_Data *bmp);
void variant_free(Variant_st *v);
Variant_st *variant_alloc(message_type t, size_t size, void *info);
message_type packet_mapping_type_get(const char *name);

View File

@ -3,6 +3,10 @@
#include <execinfo.h>
#include <Ecore_Ipc.h>
#include <Edje.h>
#include <Evas.h>
#include <Elementary.h>
#include <Ecore_X.h>
#include "eet_data.h"
@ -40,6 +44,56 @@ libclouseau_item_add(Evas_Object *o, Tree_Item *parent)
eina_list_free(children);
}
static Bmp_Data *
_canvas_bmp_get(Ecore_Evas *ee)
{
Bmp_Data *rt = NULL;
Ecore_X_Image *img;
Ecore_X_Window_Attributes att;
unsigned char *src;
unsigned int *dst;
int bpl = 0, rows = 0, bpp = 0;
Evas_Coord w, h;
Ecore_X_Window xwin = (Ecore_X_Window) ecore_evas_window_get(ee);
if (!xwin)
{
printf("Can't grab X window.\n");
return rt;
}
Evas *e = ecore_evas_get(ee);
evas_output_size_get(e, &w, &h);
memset(&att, 0, sizeof(Ecore_X_Window_Attributes));
ecore_x_window_attributes_get(xwin, &att);
img = ecore_x_image_new(w, h, att.visual, att.depth);
ecore_x_image_get(img, xwin, 0, 0, 0, 0, w, h);
src = ecore_x_image_data_get(img, &bpl, &rows, &bpp);
dst = malloc(w * h * sizeof(int)); /* Will be freed by the user */
if (!ecore_x_image_is_argb32_get(img))
{ /* Fill dst buffer with image convert */
ecore_x_image_to_argb_convert(src, bpp, bpl,
att.colormap, att.visual,
0, 0, w, h,
dst, (w * sizeof(int)), 0, 0);
}
else
{ /* Fill dst buffer by copy */
memcpy(dst, src, (w * h * sizeof(int)));
}
/* dst now holds window bitmap */
ecore_x_image_free(img);
rt = malloc(sizeof(*rt)); /* Will be freed by the user */
rt->bmp = (unsigned char *) dst;
rt->bmp_count = (w * h * sizeof(int));
rt->w = w;
rt->h = h;
return rt;
}
static Eina_List *
_load_list(void)
{
@ -158,6 +212,33 @@ _data(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data
}
break;
case BMP_REQ:
{ /* Bitmap req msg contains PTR of Ecore Evas */
bmp_req_st *req = v->data;
Bmp_Data *bmp = _canvas_bmp_get((Ecore_Evas *) (uintptr_t)
req->object);
/* TODO: what if win closed (bmp not found), need to send NULL */
/* and handle bmp-NULL value in client */
if (bmp)
{ /* 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);
}
}
break;
default:
break;
}

View File

@ -123,6 +123,15 @@ struct _Obj_Information
};
typedef struct _Obj_Information Obj_Information;
struct _Bmp_Data
{
unsigned char *bmp;
int bmp_count; /* is (w * h), for EET_DATA_DESCRIPTOR_ADD_BASIC_VAR_ARRAY */
Evas_Coord w;
Evas_Coord h;
};
typedef struct _Bmp_Data Bmp_Data;
struct _Tree_Item
{
Eina_List *children;
@ -135,7 +144,7 @@ struct _Tree_Item
};
typedef struct _Tree_Item Tree_Item;
Obj_Information * _obj_information_get(Tree_Item *treeit);
Obj_Information *_obj_information_get(Tree_Item *treeit);
Eet_Data_Descriptor *Obj_Information_desc_make(void);
void Obj_Information_desc_shutdown(void);
Evas_Object *clouseau_obj_information_list_add(Evas_Object *parent);