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:
parent
daa7640933
commit
b2a538d634
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue