2012-06-20 04:32:06 -07:00
|
|
|
#include <Elementary_Cursor.h>
|
2012-07-22 20:48:20 -07:00
|
|
|
#include "Clouseau.h"
|
2012-12-03 22:57:44 -08:00
|
|
|
#include <Ecore_Con_Eet.h>
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-07-22 20:48:20 -07:00
|
|
|
#include "clouseau_private.h"
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-05-17 06:57:22 -07:00
|
|
|
#define CLIENT_NAME "Clouseau Client"
|
2012-05-20 03:55:47 -07:00
|
|
|
|
2012-06-18 00:23:34 -07:00
|
|
|
#define SHOW_SCREENSHOT "/images/show-screenshot.png"
|
|
|
|
#define TAKE_SCREENSHOT "/images/take-screenshot.png"
|
|
|
|
#define SCREENSHOT_MISSING "/images/screenshot-missing.png"
|
|
|
|
|
2013-01-30 03:23:03 -08:00
|
|
|
static int _clouseau_client_log_dom = -1;
|
|
|
|
|
|
|
|
#ifdef CRITICAL
|
|
|
|
#undef CRITICAL
|
|
|
|
#endif
|
|
|
|
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_clouseau_client_log_dom, __VA_ARGS__)
|
|
|
|
|
|
|
|
#ifdef ERR
|
|
|
|
#undef ERR
|
|
|
|
#endif
|
|
|
|
#define ERR(...) EINA_LOG_DOM_ERR(_clouseau_client_log_dom, __VA_ARGS__)
|
|
|
|
|
|
|
|
#ifdef WRN
|
|
|
|
#undef WRN
|
|
|
|
#endif
|
|
|
|
#define WRN(...) EINA_LOG_DOM_WARN(_clouseau_client_log_dom, __VA_ARGS__)
|
|
|
|
|
|
|
|
#ifdef INF
|
|
|
|
#undef INF
|
|
|
|
#endif
|
|
|
|
#define INF(...) EINA_LOG_DOM_INFO(_clouseau_client_log_dom, __VA_ARGS__)
|
|
|
|
|
|
|
|
#ifdef DBG
|
|
|
|
#undef DBG
|
|
|
|
#endif
|
|
|
|
#define DBG(...) EINA_LOG_DOM_DBG(_clouseau_client_log_dom, __VA_ARGS__)
|
|
|
|
|
2013-01-30 03:13:50 -08:00
|
|
|
static Evas_Object *prop_list = NULL;
|
|
|
|
static Elm_Genlist_Item_Class _obj_info_itc;
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
struct _app_data_st
|
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *app;
|
|
|
|
tree_data_st *td;
|
2012-05-14 07:39:38 -07:00
|
|
|
};
|
|
|
|
typedef struct _app_data_st app_data_st;
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
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;
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
struct _gui_elements
|
|
|
|
{
|
2012-05-16 04:07:04 -07:00
|
|
|
Evas_Object *win;
|
|
|
|
Evas_Object *bx; /* The main box */
|
|
|
|
Evas_Object *hbx; /* The top menu box */
|
|
|
|
Evas_Object *panel; /* Button panel */
|
|
|
|
Evas_Object *bt_load;
|
|
|
|
Evas_Object *bt_save;
|
2012-05-14 07:39:38 -07:00
|
|
|
Evas_Object *dd_list;
|
|
|
|
Evas_Object *gl;
|
2012-05-14 07:41:29 -07:00
|
|
|
Evas_Object *lb; /* Label showing backtrace */
|
2012-05-14 07:39:38 -07:00
|
|
|
Evas_Object *prop_list;
|
2012-06-18 00:22:43 -07:00
|
|
|
Evas_Object *connect_inwin;
|
|
|
|
Evas_Object *save_inwin;
|
2012-05-14 07:40:11 -07:00
|
|
|
Evas_Object *en;
|
2012-05-14 07:41:19 -07:00
|
|
|
Evas_Object *pb; /* Progress wheel shown when waiting for TREE_DATA */
|
2012-05-14 07:40:11 -07:00
|
|
|
char *address;
|
2012-05-14 07:39:38 -07:00
|
|
|
app_data_st *sel_app; /* Currently selected app data */
|
2012-11-08 22:46:31 -08:00
|
|
|
Elm_Object_Item *gl_it; /* Currently selected genlist item */
|
2012-05-14 07:39:38 -07:00
|
|
|
};
|
|
|
|
typedef struct _gui_elements gui_elements;
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
static int _load_list(gui_elements *g);
|
2012-05-17 06:57:22 -07:00
|
|
|
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);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
/* Globals */
|
2012-05-14 07:39:38 -07:00
|
|
|
static gui_elements *gui = NULL;
|
2012-06-18 00:22:25 -07:00
|
|
|
static Eina_List *apps = NULL; /* List of (app_data_st *) */
|
|
|
|
static Eina_List *bmp_req = NULL; /* List of (bmp_node *) */
|
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
static Elm_Genlist_Item_Class itc;
|
|
|
|
static Eina_Bool list_show_clippers = EINA_TRUE, list_show_hidden = EINA_TRUE;
|
2012-07-19 05:36:32 -07:00
|
|
|
static Eina_Bool do_highlight = EINA_TRUE;
|
2012-12-03 22:57:44 -08:00
|
|
|
static Ecore_Con_Reply *eet_svr = NULL;
|
2012-05-20 03:55:44 -07:00
|
|
|
static Eina_Bool _add_callback_called = EINA_FALSE;
|
2012-05-20 03:55:53 -07:00
|
|
|
static void _cancel_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
|
|
|
|
static void _ofl_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
2013-01-30 03:13:50 -08:00
|
|
|
static void
|
|
|
|
_clouseau_object_dbg_string_build(Clouseau_Eo_Dbg_Info *eo,
|
|
|
|
char *buf, int buf_size)
|
|
|
|
{ /* Build a string from dbg-info in buffer, or return empty buffer */
|
|
|
|
int i;
|
|
|
|
*buf = '\0';
|
|
|
|
if (eo->type == EINA_VALUE_TYPE_STRING)
|
|
|
|
{ /* First set flags to say if got info from eo */
|
|
|
|
snprintf(buf, buf_size, "%s",
|
|
|
|
eo->un_dbg_info.text.s);
|
|
|
|
|
|
|
|
for(i = 0; buf[i]; i++)
|
|
|
|
buf[i] = tolower(buf[i]);
|
|
|
|
|
|
|
|
snprintf(buf, buf_size, "%s: %s",
|
|
|
|
eo->name, eo->un_dbg_info.text.s);
|
|
|
|
}
|
|
|
|
else if (eo->type == EINA_VALUE_TYPE_INT)
|
|
|
|
{
|
|
|
|
snprintf(buf, buf_size, "%s: %d",
|
|
|
|
eo->name, eo->un_dbg_info.intg.i);
|
|
|
|
}
|
|
|
|
else if (eo->type == EINA_VALUE_TYPE_CHAR)
|
|
|
|
{
|
|
|
|
|
|
|
|
snprintf(buf, buf_size, "%s: %s",
|
|
|
|
eo->name, (eo->un_dbg_info.bl.b) ?
|
|
|
|
"TRUE" : "FALSE");
|
|
|
|
}
|
|
|
|
else if (eo->type == EINA_VALUE_TYPE_UINT64)
|
|
|
|
|
|
|
|
{
|
|
|
|
snprintf(buf, buf_size, "%s: %llx",
|
|
|
|
eo->name, eo->un_dbg_info.ptr.p);
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (eo->type == EINA_VALUE_TYPE_DOUBLE)
|
|
|
|
{
|
|
|
|
snprintf(buf, buf_size, "%s: %.2f",
|
|
|
|
eo->name, eo->un_dbg_info.dbl.d);
|
|
|
|
}
|
|
|
|
else if (eo->type == EINA_VALUE_TYPE_LIST)
|
|
|
|
{
|
|
|
|
snprintf(buf, buf_size, "%s", eo->name);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-06-18 00:22:19 -07:00
|
|
|
static void
|
|
|
|
_titlebar_string_set(gui_elements *g, Eina_Bool online)
|
|
|
|
{
|
|
|
|
if (online)
|
|
|
|
{
|
|
|
|
char *str = malloc(strlen(CLIENT_NAME) + strlen(g->address) + 32);
|
|
|
|
sprintf(str, "%s - %s", CLIENT_NAME, g->address);
|
|
|
|
elm_win_title_set(g->win, str);
|
|
|
|
free(str);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
char *str = malloc(strlen(CLIENT_NAME) + strlen(" - Offline") + 32);
|
2012-06-18 00:22:19 -07:00
|
|
|
sprintf(str, "%s - Offline", CLIENT_NAME);
|
|
|
|
elm_win_title_set(g->win, str);
|
|
|
|
free(str);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:38:02 -07:00
|
|
|
Eina_Bool
|
2012-12-03 22:57:44 -08:00
|
|
|
_add(EINA_UNUSED void *data, Ecore_Con_Reply *reply,
|
|
|
|
EINA_UNUSED Ecore_Con_Server *conn)
|
2012-05-14 07:38:02 -07:00
|
|
|
{
|
2012-05-20 03:55:44 -07:00
|
|
|
_add_callback_called = EINA_TRUE;
|
2012-08-14 04:26:26 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
eet_svr = reply;
|
|
|
|
connect_st t = { getpid(), __FILE__ };
|
|
|
|
ecore_con_eet_send(reply, CLOUSEAU_GUI_CLIENT_CONNECT_STR, &t);
|
|
|
|
_titlebar_string_set(gui, EINA_TRUE);
|
2012-05-14 07:38:49 -07:00
|
|
|
|
2012-05-14 07:38:02 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2012-06-18 00:22:33 -07:00
|
|
|
static void
|
|
|
|
_set_button(Evas_Object *w, Evas_Object *bt,
|
|
|
|
char *ic_name, char *tip, Eina_Bool en)
|
|
|
|
{ /* Update button icon and tooltip */
|
|
|
|
char buf[1024];
|
|
|
|
Evas_Object *ic = elm_icon_add(w);
|
|
|
|
snprintf(buf, sizeof(buf), "%s%s", PACKAGE_DATA_DIR, ic_name);
|
2012-06-18 00:23:04 -07:00
|
|
|
elm_image_file_set(ic, buf, NULL);
|
2012-06-18 00:22:33 -07:00
|
|
|
elm_object_part_content_set(bt, "icon", ic);
|
|
|
|
elm_object_tooltip_text_set(bt, tip);
|
|
|
|
elm_object_disabled_set(bt, en);
|
|
|
|
evas_object_show(ic);
|
|
|
|
}
|
|
|
|
|
2012-05-20 03:55:53 -07:00
|
|
|
static void
|
|
|
|
_work_offline_popup(void)
|
|
|
|
{
|
|
|
|
Evas_Object *bxx, *lb, *bt_bx, *bt_ofl, *bt_exit;
|
|
|
|
/* START - Popup asking user to close client or work offline */
|
2012-06-18 00:22:43 -07:00
|
|
|
gui->connect_inwin = elm_win_inwin_add(gui->win);
|
|
|
|
evas_object_show(gui->connect_inwin);
|
2012-05-20 03:55:53 -07:00
|
|
|
|
2012-06-18 00:22:43 -07:00
|
|
|
bxx = elm_box_add(gui->connect_inwin);
|
|
|
|
elm_object_style_set(gui->connect_inwin, "minimal_vertical");
|
2012-05-20 03:55:53 -07:00
|
|
|
evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bxx);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
lb = elm_label_add(bxx);
|
2012-05-20 03:55:53 -07:00
|
|
|
evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
|
|
|
|
evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0);
|
|
|
|
elm_object_text_set(lb, "Connection to server failed.");
|
|
|
|
elm_box_pack_end(bxx, lb);
|
|
|
|
evas_object_show(lb);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_bx = elm_box_add(bxx);
|
2012-05-20 03:55:53 -07:00
|
|
|
elm_box_horizontal_set(bt_bx, EINA_TRUE);
|
|
|
|
elm_box_homogeneous_set(bt_bx, EINA_TRUE);
|
|
|
|
evas_object_size_hint_align_set(bt_bx, 0.5, 0.5);
|
|
|
|
evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bt_bx);
|
|
|
|
elm_box_pack_end(bxx, bt_bx);
|
|
|
|
|
|
|
|
/* Add the exit button */
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_exit = elm_button_add(bt_bx);
|
2012-05-20 03:55:53 -07:00
|
|
|
elm_object_text_set(bt_exit, "Exit");
|
|
|
|
evas_object_smart_callback_add(bt_exit, "clicked",
|
|
|
|
_cancel_bt_clicked, (void *) gui);
|
|
|
|
|
|
|
|
elm_box_pack_end(bt_bx, bt_exit);
|
|
|
|
evas_object_show(bt_exit);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_ofl = elm_button_add(bt_bx);
|
2012-05-20 03:55:53 -07:00
|
|
|
elm_object_text_set(bt_ofl, "Work Offline");
|
|
|
|
evas_object_smart_callback_add(bt_ofl, "clicked",
|
|
|
|
_ofl_bt_clicked, (void *) gui);
|
|
|
|
|
|
|
|
elm_box_pack_end(bt_bx, bt_ofl);
|
|
|
|
evas_object_show(bt_ofl);
|
|
|
|
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_win_inwin_content_set(gui->connect_inwin, bxx);
|
2012-05-20 03:55:53 -07:00
|
|
|
/* END - Popup asking user to close client or work offline */
|
|
|
|
}
|
2012-05-14 07:38:02 -07:00
|
|
|
|
|
|
|
Eina_Bool
|
2012-12-03 22:57:44 -08:00
|
|
|
_del(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
|
|
|
Ecore_Con_Server *conn)
|
2012-05-14 07:38:02 -07:00
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
if ((!_add_callback_called) || (!eet_svr))
|
2012-05-20 03:55:44 -07:00
|
|
|
{ /* if initial connection with daemon failed - exit */
|
2012-12-03 22:57:44 -08:00
|
|
|
ecore_con_server_del(conn);
|
|
|
|
eet_svr = NULL; /* Global svr var */
|
2012-05-20 03:55:53 -07:00
|
|
|
_work_offline_popup();
|
2012-05-14 07:38:02 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2013-01-30 03:23:03 -08:00
|
|
|
ERR("Lost server with ip <%s>!\n", ecore_con_server_ip_get(conn));
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
ecore_con_server_del(conn);
|
|
|
|
eet_svr = NULL; /* Global svr var */
|
2012-05-17 06:57:22 -07:00
|
|
|
_show_gui(gui, EINA_TRUE);
|
|
|
|
|
2012-05-14 07:38:02 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2012-08-14 04:26:26 -07:00
|
|
|
static void
|
|
|
|
clouseau_lines_free(bmp_info_st *st)
|
|
|
|
{ /* Free lines asociated with a bmp */
|
|
|
|
if (st->lx)
|
|
|
|
evas_object_del(st->lx);
|
|
|
|
|
|
|
|
if (st->ly)
|
|
|
|
evas_object_del(st->ly);
|
|
|
|
|
|
|
|
st->lx = st->ly = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
clouseau_bmp_blob_free(bmp_info_st *st)
|
|
|
|
{ /* We also free all lines drawn in this bmp canvas */
|
|
|
|
clouseau_lines_free(st);
|
|
|
|
|
|
|
|
if (st->bmp)
|
|
|
|
free(st->bmp);
|
|
|
|
}
|
2012-05-14 07:38:52 -07:00
|
|
|
|
|
|
|
static Eina_Bool
|
2012-05-14 07:41:19 -07:00
|
|
|
_load_gui_with_list(gui_elements *g, Eina_List *trees)
|
2012-05-14 07:38:52 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *treeit;
|
2012-05-14 07:41:29 -07:00
|
|
|
|
|
|
|
elm_object_text_set(g->lb, NULL); /* Clear backtrace label */
|
|
|
|
|
2012-05-14 07:39:35 -07:00
|
|
|
if (!trees)
|
2012-05-14 07:38:52 -07:00
|
|
|
return EINA_TRUE;
|
|
|
|
|
2012-05-14 07:41:19 -07:00
|
|
|
/* Stop progress wheel as we load tree data */
|
|
|
|
elm_progressbar_pulse(g->pb, EINA_FALSE);
|
|
|
|
evas_object_hide(g->pb);
|
|
|
|
|
2012-05-14 07:39:35 -07:00
|
|
|
EINA_LIST_FOREACH(trees, l, treeit)
|
|
|
|
{ /* Insert the base ee items */
|
|
|
|
Elm_Genlist_Item_Type glflag = (treeit->children) ?
|
|
|
|
ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
|
2012-05-14 07:41:19 -07:00
|
|
|
elm_genlist_item_append(g->gl, &itc, treeit, NULL,
|
2012-05-14 07:39:35 -07:00
|
|
|
glflag, NULL, NULL);
|
|
|
|
}
|
2012-05-14 07:39:23 -07:00
|
|
|
|
2012-05-14 07:38:52 -07:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2012-05-17 06:57:25 -07:00
|
|
|
static char *
|
|
|
|
_app_name_get(app_info_st *app)
|
|
|
|
{
|
2012-05-17 06:57:29 -07:00
|
|
|
char *str = NULL;
|
|
|
|
if (app->file)
|
|
|
|
{
|
|
|
|
char *tmp = strdup(app->file);
|
|
|
|
char *bname = basename(tmp);
|
|
|
|
str = malloc(strlen(bname) + strlen(app->name) + 32);
|
|
|
|
sprintf(str, "%s:%s [%d]", bname, app->name, app->pid);
|
|
|
|
free(tmp);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
str = malloc(strlen(app->name)+32);
|
|
|
|
sprintf(str, "%s [%d]", app->name, app->pid);
|
|
|
|
}
|
2012-05-17 06:57:25 -07:00
|
|
|
|
2012-05-20 03:55:47 -07:00
|
|
|
return str; /* User has to free(str) */
|
2012-05-17 06:57:25 -07:00
|
|
|
}
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
static void
|
|
|
|
_close_app_views(app_info_st *app, Eina_Bool clr)
|
|
|
|
{ /* Close any open-views if this app */
|
|
|
|
Eina_List *l;
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_info_st *view;
|
2012-06-18 00:22:25 -07:00
|
|
|
EINA_LIST_FOREACH(app->view, l, view)
|
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
if (view->win)
|
|
|
|
evas_object_del(view->win);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (view->bt)
|
|
|
|
elm_object_disabled_set(view->bt, EINA_FALSE);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
view->win = view->bt = NULL;
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (clr)
|
|
|
|
{ /* These are cleared when app data is reloaded */
|
|
|
|
EINA_LIST_FREE(app->view, view)
|
|
|
|
{ /* Free memory allocated to show any app screens */
|
2012-12-03 22:57:44 -08:00
|
|
|
clouseau_bmp_blob_free(view);
|
|
|
|
free(view);
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
app->view = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
static void
|
|
|
|
_set_selected_app(void *data, Evas_Object *pobj,
|
2012-05-14 07:40:38 -07:00
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-14 07:39:38 -07:00
|
|
|
{ /* Set hovel label */
|
|
|
|
app_data_st *st = data;
|
2012-06-18 00:22:25 -07:00
|
|
|
elm_progressbar_pulse(gui->pb, EINA_FALSE);
|
|
|
|
evas_object_hide(gui->pb);
|
2012-11-08 22:46:31 -08:00
|
|
|
gui->gl_it = NULL;
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
if (gui->sel_app)
|
2012-12-03 22:57:44 -08:00
|
|
|
_close_app_views(gui->sel_app->app, EINA_FALSE);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
2012-05-14 07:41:47 -07:00
|
|
|
if (st)
|
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
if (!eet_svr)
|
2012-05-16 04:07:06 -07:00
|
|
|
{ /* Got TREE_DATA from file, update this immidately */
|
2012-06-18 00:22:25 -07:00
|
|
|
gui->sel_app = st;
|
2012-12-03 22:57:44 -08:00
|
|
|
char *str = _app_name_get(st->app);
|
2012-05-16 04:07:06 -07:00
|
|
|
elm_object_text_set(pobj, str);
|
|
|
|
free(str);
|
|
|
|
_load_list(gui);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:41:47 -07:00
|
|
|
if (gui->sel_app != st)
|
|
|
|
{ /* Reload only of selected some other app */
|
|
|
|
gui->sel_app = st;
|
2012-12-03 22:57:44 -08:00
|
|
|
char *str = _app_name_get(st->app);
|
2012-05-14 07:41:47 -07:00
|
|
|
elm_object_text_set(pobj, str);
|
|
|
|
free(str);
|
|
|
|
|
|
|
|
elm_progressbar_pulse(gui->pb, EINA_FALSE);
|
|
|
|
evas_object_hide(gui->pb);
|
|
|
|
_load_list(gui);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ /* If we got a NULL ptr, reset lists and dd_list text */
|
2012-05-16 04:07:06 -07:00
|
|
|
elm_object_text_set(pobj, "SELECT APP");
|
2012-05-14 07:41:47 -07:00
|
|
|
elm_genlist_clear(gui->gl);
|
|
|
|
elm_genlist_clear(gui->prop_list);
|
|
|
|
gui->sel_app = NULL;
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
2012-05-16 04:07:04 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (eet_svr)
|
2012-06-18 00:22:43 -07:00
|
|
|
{ /* Enable/Disable buttons only if we are online */
|
2012-05-17 06:57:22 -07:00
|
|
|
elm_object_disabled_set(gui->bt_load, (gui->sel_app == NULL));
|
|
|
|
elm_object_disabled_set(gui->bt_save, (gui->sel_app == NULL));
|
|
|
|
}
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_app_ptr_cmp(const void *d1, const void *d2)
|
|
|
|
{
|
|
|
|
const app_data_st *info = d1;
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *app = info->app;
|
2012-05-14 07:39:38 -07:00
|
|
|
|
2012-05-14 07:39:49 -07:00
|
|
|
return ((app->ptr) - (unsigned long long) (uintptr_t) d2);
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_add_app_to_dd_list(Evas_Object *dd_list, app_data_st *st)
|
|
|
|
{ /* Add app to Drop Down List */
|
2012-12-03 22:57:44 -08:00
|
|
|
char *str = _app_name_get(st->app);
|
2012-05-14 07:39:38 -07:00
|
|
|
elm_hoversel_item_add(dd_list, str, NULL, ELM_ICON_NONE,
|
|
|
|
_set_selected_app, st);
|
|
|
|
|
|
|
|
free(str);
|
|
|
|
}
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
static int
|
|
|
|
_bmp_object_ptr_cmp(const void *d1, const void *d2)
|
|
|
|
{ /* Comparison according to Evas ptr of BMP struct */
|
2012-12-03 22:57:44 -08:00
|
|
|
const bmp_info_st *bmp = d1;
|
2012-06-18 00:22:25 -07:00
|
|
|
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 */
|
2012-12-03 22:57:44 -08:00
|
|
|
const bmp_info_st *bmp = d1;
|
2012-06-18 00:22:25 -07:00
|
|
|
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 */
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_info_st *st = (bmp_info_st *)
|
2012-06-18 00:22:25 -07:00
|
|
|
eina_list_search_unsorted(view, _bmp_app_ptr_cmp,
|
|
|
|
(void *) (uintptr_t) ptr);
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (st)
|
2012-06-18 00:22:25 -07:00
|
|
|
{
|
|
|
|
if (st->win)
|
|
|
|
evas_object_del(st->win);
|
|
|
|
|
2012-06-18 00:22:31 -07:00
|
|
|
if (st->bmp)
|
|
|
|
free(st->bmp);
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
free(st);
|
|
|
|
return eina_list_remove(view, st);
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return view;
|
|
|
|
}
|
|
|
|
|
2012-05-16 04:07:06 -07:00
|
|
|
static app_data_st *
|
2012-12-03 22:57:44 -08:00
|
|
|
_add_app(gui_elements *g, app_info_st *app)
|
2012-05-14 07:39:38 -07:00
|
|
|
{
|
2012-07-05 19:39:11 -07:00
|
|
|
app_data_st *st;
|
|
|
|
|
|
|
|
st = malloc(sizeof(app_data_st));
|
|
|
|
if (!st) return NULL;
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
st->app = app;
|
2012-05-14 07:39:38 -07:00
|
|
|
st->td = NULL; /* Will get this on TREE_DATA message */
|
|
|
|
apps = eina_list_append(apps, st);
|
|
|
|
|
2012-05-14 07:40:38 -07:00
|
|
|
_add_app_to_dd_list(g->dd_list, st);
|
2012-05-16 04:07:06 -07:00
|
|
|
|
|
|
|
return st;
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
|
2012-05-14 07:40:41 -07:00
|
|
|
static void
|
2012-12-03 22:57:44 -08:00
|
|
|
_free_app_tree_data(tree_data_st *ftd)
|
2012-05-14 07:40:41 -07:00
|
|
|
{
|
2012-07-05 19:39:11 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (!ftd) return;
|
2012-07-05 19:39:11 -07:00
|
|
|
|
2012-08-14 04:26:26 -07:00
|
|
|
clouseau_data_tree_free(ftd->tree);
|
2012-12-03 22:57:44 -08:00
|
|
|
free(ftd);
|
2012-05-14 07:41:16 -07:00
|
|
|
}
|
2012-05-14 07:40:41 -07:00
|
|
|
|
2012-05-14 07:41:16 -07:00
|
|
|
static void
|
|
|
|
_free_app(app_data_st *st)
|
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_info_st *view;
|
|
|
|
app_info_st *app = st->app;
|
2012-06-18 00:22:59 -07:00
|
|
|
if (app->file)
|
|
|
|
free(app->file);
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
EINA_LIST_FREE(app->view, view)
|
|
|
|
{ /* Free memory allocated to show any app screens */
|
2012-12-03 22:57:44 -08:00
|
|
|
if (view->win)
|
|
|
|
evas_object_del(view->win);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (view->bmp)
|
|
|
|
free(view->bmp);
|
2012-06-18 00:22:31 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
free(view);
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
|
2012-05-14 07:41:16 -07:00
|
|
|
_free_app_tree_data(st->td);
|
2012-12-03 22:57:44 -08:00
|
|
|
free(app);
|
2012-05-14 07:40:41 -07:00
|
|
|
free(st);
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
static void
|
2012-12-03 22:57:44 -08:00
|
|
|
_remove_app(gui_elements *g, app_closed_st *app)
|
|
|
|
{ /* Handle the case that NO app is selected, set sel_app to NULL */
|
|
|
|
app_info_st *sel_app = (g->sel_app) ? g->sel_app->app: NULL;
|
2012-05-14 07:39:38 -07:00
|
|
|
app_data_st *st = (app_data_st *)
|
2012-05-14 07:39:49 -07:00
|
|
|
eina_list_search_unsorted(apps, _app_ptr_cmp,
|
|
|
|
(void *) (uintptr_t) app->ptr);
|
2012-05-14 07:39:38 -07:00
|
|
|
|
2012-05-20 03:55:50 -07:00
|
|
|
/* if NO app selected OR closing app is the selected one, reset display */
|
|
|
|
if ((!sel_app) || (app->ptr == sel_app->ptr))
|
2012-05-14 07:41:47 -07:00
|
|
|
_set_selected_app(NULL, g->dd_list, NULL);
|
2012-05-14 07:39:38 -07:00
|
|
|
|
|
|
|
if (st)
|
2012-12-03 22:57:44 -08:00
|
|
|
{ /* Remove from list and free all app info */
|
2012-07-25 04:23:51 -07:00
|
|
|
Eina_List *l;
|
2012-05-14 07:39:38 -07:00
|
|
|
apps = eina_list_remove(apps, st);
|
2012-05-14 07:40:41 -07:00
|
|
|
_free_app(st);
|
2012-05-14 07:39:38 -07:00
|
|
|
|
2012-07-25 04:23:51 -07:00
|
|
|
if (elm_hoversel_expanded_get(g->dd_list))
|
|
|
|
elm_hoversel_hover_end(g->dd_list);
|
|
|
|
|
|
|
|
elm_hoversel_clear(g->dd_list);
|
|
|
|
EINA_LIST_FOREACH(apps, l , st)
|
|
|
|
_add_app_to_dd_list(g->dd_list, st);
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-16 04:07:06 -07:00
|
|
|
static void
|
2012-12-03 22:57:44 -08:00
|
|
|
_update_tree_offline(gui_elements *g, tree_data_st *td)
|
2012-05-16 04:07:06 -07:00
|
|
|
{
|
|
|
|
elm_genlist_clear(g->gl);
|
|
|
|
_load_gui_with_list(g, td->tree);
|
|
|
|
}
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
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;
|
|
|
|
|
2012-06-18 00:22:36 -07:00
|
|
|
do
|
|
|
|
{ /* First find according to Evas ptr, then match ctr with refresh_ctr */
|
2012-06-18 00:22:25 -07:00
|
|
|
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);
|
|
|
|
}
|
2012-06-18 00:22:36 -07:00
|
|
|
}
|
|
|
|
while(req_list);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-08-14 04:26:26 -07:00
|
|
|
static void
|
|
|
|
clouseau_make_lines(bmp_info_st *st, Evas_Coord xx, Evas_Coord yy)
|
|
|
|
{ /* and no, we are NOT talking about WHITE lines */
|
|
|
|
Evas_Coord x_rgn, y_rgn, w_rgn, h_rgn;
|
|
|
|
|
|
|
|
clouseau_lines_free(st);
|
|
|
|
|
|
|
|
elm_scroller_region_get(st->scr, &x_rgn, &y_rgn, &w_rgn, &h_rgn);
|
|
|
|
|
|
|
|
st->lx = evas_object_line_add(evas_object_evas_get(st->o));
|
|
|
|
st->ly = evas_object_line_add(evas_object_evas_get(st->o));
|
|
|
|
evas_object_repeat_events_set(st->lx, EINA_TRUE);
|
|
|
|
evas_object_repeat_events_set(st->ly, EINA_TRUE);
|
|
|
|
|
|
|
|
evas_object_line_xy_set(st->lx, 0, yy, w_rgn, yy);
|
|
|
|
evas_object_line_xy_set(st->ly, xx, 0, xx, h_rgn);
|
|
|
|
|
|
|
|
evas_object_color_set(st->lx, HIGHLIGHT_R, HIGHLIGHT_G, HIGHLIGHT_B,
|
|
|
|
HIGHLIGHT_A);
|
|
|
|
evas_object_color_set(st->ly, HIGHLIGHT_R, HIGHLIGHT_G, HIGHLIGHT_B,
|
|
|
|
HIGHLIGHT_A);
|
|
|
|
evas_object_show(st->lx);
|
|
|
|
evas_object_show(st->ly);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
clouseau_lines_cb(void *data,
|
|
|
|
Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
if (((Evas_Event_Mouse_Down *) event_info)->button == 1)
|
|
|
|
return; /* Draw line only if not left mouse button */
|
|
|
|
|
|
|
|
clouseau_make_lines(data,
|
|
|
|
(((Evas_Event_Mouse_Move *) event_info)->cur.canvas.x),
|
|
|
|
(((Evas_Event_Mouse_Move *) event_info)->cur.canvas.y));
|
|
|
|
}
|
|
|
|
|
2012-06-18 00:23:01 -07:00
|
|
|
static void
|
|
|
|
_mouse_out(void *data,
|
|
|
|
Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|
|
|
EINA_UNUSED void *event_info)
|
|
|
|
{
|
|
|
|
bmp_info_st *st = data;
|
|
|
|
elm_object_text_set(st->lb_mouse, " ");
|
2012-06-18 00:23:20 -07:00
|
|
|
elm_object_text_set(st->lb_rgba, " ");
|
2012-06-18 00:23:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_mouse_move(void *data,
|
|
|
|
Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
|
|
|
void *event_info)
|
|
|
|
{ /* Event info is label getting mouse pointer cords */
|
|
|
|
bmp_info_st *st = data;
|
|
|
|
unsigned char *pt;
|
2012-06-18 00:23:20 -07:00
|
|
|
char s_bar[64];
|
|
|
|
float dx, dy;
|
|
|
|
Evas_Coord mp_x, mp_y, xx, yy;
|
|
|
|
Evas_Coord x, y, w, h;
|
|
|
|
|
|
|
|
mp_x = (((Evas_Event_Mouse_Move *) event_info)->cur.canvas.x);
|
|
|
|
mp_y = (((Evas_Event_Mouse_Move *) event_info)->cur.canvas.y);
|
2012-06-18 00:23:17 -07:00
|
|
|
evas_object_geometry_get(st->o, &x, &y, &w, &h);
|
2012-06-18 00:23:20 -07:00
|
|
|
|
|
|
|
dx = ((float) (mp_x - x)) / ((float) w);
|
|
|
|
dy = ((float) (mp_y - y)) / ((float) h);
|
|
|
|
|
|
|
|
xx = dx * st->w;
|
|
|
|
yy = dy * st->h;
|
|
|
|
|
2012-06-18 00:23:01 -07:00
|
|
|
sprintf(s_bar, "%dx%d", xx, yy);
|
|
|
|
|
|
|
|
elm_object_text_set(st->lb_mouse, s_bar);
|
|
|
|
|
2012-06-20 07:28:56 -07:00
|
|
|
if (((Evas_Event_Mouse_Move *) event_info)->buttons > 1)
|
2012-08-14 04:26:26 -07:00
|
|
|
clouseau_make_lines(st, mp_x, mp_y);
|
2012-06-20 07:28:56 -07:00
|
|
|
|
2012-06-18 00:23:20 -07:00
|
|
|
if (((xx >= 0) && (xx < ((Evas_Coord) st->w))) &&
|
|
|
|
((yy >= 0) && (yy < ((Evas_Coord) st->h))))
|
2012-06-18 00:23:17 -07:00
|
|
|
{ /* Need to test borders, because image may be scrolled */
|
2012-06-18 00:23:41 -07:00
|
|
|
pt = ((unsigned char *) st->bmp) + (((yy * st->w) + xx) * sizeof(int));
|
2012-06-18 00:23:23 -07:00
|
|
|
sprintf(s_bar, "rgba(%d,%d,%d,%d)", pt[2], pt[1], pt[0], pt[3]);
|
2012-06-18 00:23:20 -07:00
|
|
|
elm_object_text_set(st->lb_rgba, s_bar);
|
2012-06-18 00:23:17 -07:00
|
|
|
}
|
|
|
|
else
|
2012-06-18 00:23:20 -07:00
|
|
|
elm_object_text_set(st->lb_rgba, " ");
|
2012-06-18 00:23:01 -07:00
|
|
|
}
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
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;
|
2012-12-03 22:57:44 -08:00
|
|
|
clouseau_lines_free(st);
|
2012-06-18 00:22:25 -07:00
|
|
|
elm_object_disabled_set(st->bt, EINA_FALSE);
|
2012-06-18 00:23:01 -07:00
|
|
|
evas_object_event_callback_del(st->o, EVAS_CALLBACK_MOUSE_MOVE,
|
|
|
|
_mouse_move);
|
|
|
|
evas_object_event_callback_del(st->o, EVAS_CALLBACK_MOUSE_OUT,
|
|
|
|
_mouse_out);
|
|
|
|
evas_object_event_callback_del(st->o, EVAS_CALLBACK_MOUSE_DOWN,
|
2012-08-14 04:26:26 -07:00
|
|
|
clouseau_lines_cb);
|
2012-06-18 00:23:01 -07:00
|
|
|
st->win = st->bt = st->lb_mouse = st->o = NULL;
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
|
2012-06-18 00:23:20 -07:00
|
|
|
/* START - Callbacks to handle zoom on app window (screenshot) */
|
|
|
|
static Evas_Event_Flags
|
|
|
|
reset_view(void *data , void *event_info EINA_UNUSED)
|
|
|
|
{ /* Cancel ZOOM and remove LINES on double tap */
|
|
|
|
bmp_info_st *st = data;
|
|
|
|
st->zoom_val = 1.0;
|
2012-07-05 19:39:11 -07:00
|
|
|
clouseau_lines_free(st);
|
2012-06-18 00:23:20 -07:00
|
|
|
evas_object_size_hint_min_set(st->o, st->w, st->h);
|
|
|
|
|
|
|
|
return EVAS_EVENT_FLAG_ON_HOLD;
|
|
|
|
}
|
|
|
|
|
2012-06-20 04:32:00 -07:00
|
|
|
static void
|
|
|
|
_update_zoom(Evas_Object *img, Evas_Object *scr, Evas_Coord zx,
|
|
|
|
Evas_Coord zy, double zoom, Evas_Coord origw, Evas_Coord origh)
|
|
|
|
{
|
|
|
|
Evas_Coord origrelx = 0, origrely= 0;
|
|
|
|
Evas_Coord offx = 0, offy= 0;
|
|
|
|
|
|
|
|
Evas_Coord sx, sy, sw, sh;
|
|
|
|
elm_scroller_region_get(scr, &sx, &sy, &sw, &sh);
|
|
|
|
|
|
|
|
/* Get coords on pic. */
|
|
|
|
{
|
|
|
|
Evas_Coord x, y, w, h;
|
|
|
|
evas_object_geometry_get(img, &x, &y, &w, &h);
|
|
|
|
double ratio = (((double) origw) / w) * zoom;
|
|
|
|
origrelx = ratio * (double) (zx - x);
|
|
|
|
origrely = ratio * (double) (zy - y);
|
|
|
|
|
|
|
|
/* Offset of the cursor from the first visible pixel of the
|
|
|
|
* content. */
|
|
|
|
offx = (zx - x) - sx;
|
|
|
|
offy = (zy - y) - sy;
|
|
|
|
}
|
|
|
|
|
|
|
|
Evas_Coord imw, imh;
|
|
|
|
imw = origw * zoom;
|
|
|
|
imh = origh * zoom;
|
|
|
|
evas_object_size_hint_min_set(img, imw, imh);
|
|
|
|
evas_object_size_hint_max_set(img, imw, imh);
|
|
|
|
|
|
|
|
elm_scroller_region_show(scr, origrelx - offx, origrely - offy, sw, sh);
|
|
|
|
}
|
|
|
|
|
2012-06-18 00:23:20 -07:00
|
|
|
static Evas_Event_Flags
|
2012-06-20 04:32:00 -07:00
|
|
|
zoom_start(void *data , void *event_info)
|
2012-06-18 00:23:20 -07:00
|
|
|
{
|
|
|
|
bmp_info_st *st = data;
|
2012-06-20 04:32:00 -07:00
|
|
|
Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
|
2012-07-05 19:39:11 -07:00
|
|
|
clouseau_lines_free(st);
|
2012-06-20 04:32:00 -07:00
|
|
|
_update_zoom(st->o, st->scr, p->x, p->y, st->zoom_val, st->w, st->h);
|
|
|
|
|
2012-06-18 00:23:20 -07:00
|
|
|
return EVAS_EVENT_FLAG_ON_HOLD;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Event_Flags
|
|
|
|
zoom_move(void *data , void *event_info)
|
|
|
|
{
|
|
|
|
bmp_info_st *st = data;
|
|
|
|
Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
|
2012-06-20 04:32:00 -07:00
|
|
|
_update_zoom(st->o, st->scr, p->x, p->y,
|
|
|
|
st->zoom_val * p->zoom, st->w, st->h);
|
2012-06-18 00:23:20 -07:00
|
|
|
|
2012-06-20 04:32:00 -07:00
|
|
|
return EVAS_EVENT_FLAG_ON_HOLD;
|
|
|
|
}
|
2012-06-18 00:23:20 -07:00
|
|
|
|
2012-06-20 04:32:00 -07:00
|
|
|
static Evas_Event_Flags
|
|
|
|
zoom_end(void *data , void *event_info)
|
|
|
|
{
|
|
|
|
Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
|
|
|
|
bmp_info_st *st = data;
|
|
|
|
st->zoom_val *= p->zoom;
|
2012-06-18 00:23:20 -07:00
|
|
|
|
|
|
|
return EVAS_EVENT_FLAG_ON_HOLD;
|
|
|
|
}
|
|
|
|
/* END - Callbacks to handle zoom on app window (screenshot) */
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
static void
|
2012-07-05 19:39:11 -07:00
|
|
|
_open_app_window(bmp_info_st *st, Evas_Object *bt, Clouseau_Tree_Item *treeit)
|
2012-06-18 00:22:25 -07:00
|
|
|
{
|
2012-06-18 00:23:01 -07:00
|
|
|
#define SHOT_HEADER " - Screenshot"
|
|
|
|
#define SBAR_PAD_X 4
|
|
|
|
#define SBAR_PAD_Y 2
|
|
|
|
|
2012-06-18 00:23:23 -07:00
|
|
|
Evas_Object *tb, *bg, *lb_size, *hbx, *glayer;
|
2012-06-18 00:23:01 -07:00
|
|
|
|
2012-06-18 00:23:23 -07:00
|
|
|
char s_bar[128];
|
2012-06-18 00:23:01 -07:00
|
|
|
char *win_name = malloc(strlen(treeit->name) + strlen(SHOT_HEADER) + 1);
|
2012-12-03 22:57:44 -08:00
|
|
|
st->zoom_val = 1.0; /* Init zoom value */
|
2012-06-18 00:22:25 -07:00
|
|
|
st->bt = bt;
|
|
|
|
st->win = elm_win_add(NULL, "win", ELM_WIN_BASIC);
|
2012-06-18 00:23:01 -07:00
|
|
|
sprintf(win_name, "%s%s", treeit->name, SHOT_HEADER);
|
|
|
|
elm_win_title_set(st->win, win_name);
|
|
|
|
free(win_name);
|
|
|
|
|
|
|
|
bg = elm_bg_add(st->win);
|
|
|
|
elm_win_resize_object_add(st->win, bg);
|
|
|
|
evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bg);
|
|
|
|
|
|
|
|
Evas_Object *bx = elm_box_add(st->win);
|
|
|
|
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_show(bx);
|
|
|
|
|
2012-06-18 00:23:23 -07:00
|
|
|
/* Table to holds bg and scr on top of it */
|
|
|
|
tb = elm_table_add(bx);
|
|
|
|
elm_box_pack_end(bx, tb);
|
|
|
|
evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_show(tb);
|
|
|
|
|
|
|
|
/* Set background to scr in table cell */
|
|
|
|
bg = elm_bg_add(tb);
|
|
|
|
snprintf(s_bar, sizeof(s_bar), "%s/images/background.png",
|
|
|
|
PACKAGE_DATA_DIR);
|
|
|
|
elm_bg_file_set(bg, s_bar, NULL);
|
|
|
|
elm_bg_option_set(bg, ELM_BG_OPTION_TILE);
|
|
|
|
evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_show(bg);
|
|
|
|
elm_table_pack(tb, bg, 0, 0, 1, 1);
|
|
|
|
|
|
|
|
/* Then add the scroller in same cell */
|
|
|
|
st->scr = elm_scroller_add(tb);
|
|
|
|
elm_table_pack(tb, st->scr, 0, 0, 1, 1);
|
2012-06-18 00:23:20 -07:00
|
|
|
evas_object_size_hint_weight_set(st->scr,
|
2012-06-18 00:23:01 -07:00
|
|
|
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
|
2012-06-18 00:23:20 -07:00
|
|
|
evas_object_size_hint_align_set(st->scr, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_show(st->scr);
|
2012-06-18 00:23:01 -07:00
|
|
|
|
|
|
|
st->o = evas_object_image_filled_add(
|
|
|
|
evas_object_evas_get(bx));
|
|
|
|
|
|
|
|
evas_object_size_hint_min_set(st->o, st->w, st->h);
|
2012-06-18 00:23:20 -07:00
|
|
|
elm_object_content_set(st->scr, st->o);
|
2012-06-20 04:32:06 -07:00
|
|
|
elm_object_cursor_set(st->o, ELM_CURSOR_TARGET);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
elm_object_disabled_set(bt, EINA_TRUE);
|
2012-06-18 00:23:01 -07:00
|
|
|
evas_object_image_colorspace_set(st->o, EVAS_COLORSPACE_ARGB8888);
|
|
|
|
evas_object_image_alpha_set(st->o, EINA_FALSE);
|
|
|
|
evas_object_image_size_set(st->o, st->w, st->h);
|
|
|
|
evas_object_image_data_copy_set(st->o, st->bmp);
|
|
|
|
evas_object_image_data_update_add(st->o, 0, 0, st->w, st->h);
|
|
|
|
evas_object_show(st->o);
|
2012-06-18 00:22:25 -07:00
|
|
|
evas_object_smart_callback_add(st->win,
|
|
|
|
"delete,request", _app_win_del, st);
|
|
|
|
|
2012-06-18 00:23:01 -07:00
|
|
|
/* Build status bar */
|
|
|
|
hbx = elm_box_add(bx);
|
|
|
|
elm_box_horizontal_set(hbx, EINA_TRUE);
|
|
|
|
evas_object_show(hbx);
|
|
|
|
elm_box_padding_set(hbx, SBAR_PAD_X, SBAR_PAD_Y);
|
|
|
|
evas_object_size_hint_align_set(hbx, 0.0, EVAS_HINT_FILL);
|
|
|
|
elm_box_pack_end(bx, hbx);
|
|
|
|
lb_size = elm_label_add(hbx);
|
|
|
|
sprintf(s_bar, "%llux%llu", st->w, st->h);
|
|
|
|
elm_object_text_set(lb_size, s_bar);
|
|
|
|
evas_object_show(lb_size);
|
|
|
|
elm_box_pack_end(hbx, lb_size);
|
|
|
|
|
|
|
|
st->lb_mouse = elm_label_add(hbx);
|
|
|
|
elm_object_text_set(st->lb_mouse, s_bar);
|
|
|
|
evas_object_show(st->lb_mouse);
|
|
|
|
elm_box_pack_end(hbx, st->lb_mouse);
|
|
|
|
|
2012-06-18 00:23:20 -07:00
|
|
|
st->lb_rgba = elm_label_add(hbx);
|
|
|
|
elm_object_text_set(st->lb_rgba, s_bar);
|
|
|
|
evas_object_show(st->lb_rgba);
|
|
|
|
elm_box_pack_end(hbx, st->lb_rgba);
|
2012-06-18 00:23:01 -07:00
|
|
|
|
|
|
|
evas_object_event_callback_add(st->o, EVAS_CALLBACK_MOUSE_MOVE,
|
|
|
|
_mouse_move, st);
|
|
|
|
|
|
|
|
evas_object_event_callback_add(st->o, EVAS_CALLBACK_MOUSE_OUT,
|
|
|
|
_mouse_out, st);
|
|
|
|
|
|
|
|
evas_object_event_callback_add(st->o, EVAS_CALLBACK_MOUSE_DOWN,
|
2012-08-14 04:26:26 -07:00
|
|
|
clouseau_lines_cb, st);
|
2012-06-18 00:23:01 -07:00
|
|
|
|
2012-06-18 00:23:20 -07:00
|
|
|
evas_object_resize(st->scr, st->w, st->h);
|
2012-06-18 00:23:01 -07:00
|
|
|
elm_win_resize_object_add(st->win, bx);
|
2012-06-18 00:22:31 -07:00
|
|
|
evas_object_resize(st->win, st->w, st->h);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
elm_win_autodel_set(st->win, EINA_TRUE);
|
|
|
|
evas_object_show(st->win);
|
2012-06-18 00:23:20 -07:00
|
|
|
|
|
|
|
/* Attach a gesture layer object to support ZOOM gesture */
|
|
|
|
glayer = elm_gesture_layer_add(st->scr);
|
|
|
|
elm_gesture_layer_attach(glayer, st->scr);
|
|
|
|
|
|
|
|
/* Reset zoom and remove lines on double click */
|
|
|
|
elm_gesture_layer_cb_set(glayer, ELM_GESTURE_N_DOUBLE_TAPS,
|
|
|
|
ELM_GESTURE_STATE_END, reset_view, st);
|
|
|
|
|
|
|
|
elm_gesture_layer_cb_set(glayer, ELM_GESTURE_ZOOM,
|
|
|
|
ELM_GESTURE_STATE_START, zoom_start, st);
|
|
|
|
elm_gesture_layer_cb_set(glayer, ELM_GESTURE_ZOOM,
|
|
|
|
ELM_GESTURE_STATE_MOVE, zoom_move, st);
|
2012-06-20 04:32:00 -07:00
|
|
|
elm_gesture_layer_cb_set(glayer, ELM_GESTURE_ZOOM,
|
|
|
|
ELM_GESTURE_STATE_END, zoom_end, st);
|
|
|
|
elm_gesture_layer_cb_set(glayer, ELM_GESTURE_ZOOM,
|
|
|
|
ELM_GESTURE_STATE_ABORT, zoom_end, st);
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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 */
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *st = gui->sel_app->app;
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *treeit = data;
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
/* First search app->view list if already have the window bmp */
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_info_st *bmp = (bmp_info_st *)
|
2012-06-18 00:22:28 -07:00
|
|
|
eina_list_search_unsorted(st->view, _bmp_object_ptr_cmp,
|
|
|
|
(void *) (uintptr_t) treeit->ptr);
|
2012-12-03 22:57:44 -08:00
|
|
|
if (bmp)
|
|
|
|
return _open_app_window(bmp, obj, data);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
/* Need to issue BMP_REQ */
|
2012-12-03 22:57:44 -08:00
|
|
|
if (eet_svr)
|
2012-06-18 00:22:25 -07:00
|
|
|
{
|
|
|
|
bmp_req_st t = { (unsigned long long) (uintptr_t) NULL,
|
|
|
|
(unsigned long long) (uintptr_t) st->ptr,
|
2012-06-18 00:22:28 -07:00
|
|
|
(unsigned long long) (uintptr_t) treeit->ptr, st->refresh_ctr };
|
2012-06-18 00:22:25 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
ecore_con_eet_send(eet_svr, CLOUSEAU_BMP_REQ_STR, &t);
|
|
|
|
elm_object_disabled_set(obj, EINA_TRUE);
|
|
|
|
elm_progressbar_pulse(gui->pb, EINA_TRUE);
|
|
|
|
evas_object_show(gui->pb);
|
2012-08-14 04:26:26 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_node *b_node = malloc(sizeof(*b_node));
|
|
|
|
b_node->ctr = st->refresh_ctr;
|
|
|
|
b_node->object = (unsigned long long) (uintptr_t) treeit->ptr;
|
|
|
|
b_node->bt = obj; /* Button of BMP_REQ */
|
|
|
|
bmp_req = eina_list_append(bmp_req, b_node);
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
2012-06-18 00:22:47 -07:00
|
|
|
else /* Disable button if we lost server */
|
|
|
|
_set_button(gui->win, obj,
|
2012-06-18 00:23:34 -07:00
|
|
|
SCREENSHOT_MISSING,
|
2012-06-18 00:22:47 -07:00
|
|
|
"Screenshot not available", EINA_TRUE);
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
/* START - Callbacks to handle messages from daemon */
|
|
|
|
void
|
|
|
|
_app_closed_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
|
|
|
EINA_UNUSED const char *protocol_name, void *value)
|
2012-11-29 03:09:10 -08:00
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
_remove_app(gui, value);
|
|
|
|
}
|
2012-11-29 03:09:10 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
void
|
|
|
|
_app_add_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
|
|
|
EINA_UNUSED const char *protocol_name, void *value)
|
|
|
|
{
|
|
|
|
_add_app(gui, value);
|
|
|
|
}
|
2012-11-29 03:09:10 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
void
|
|
|
|
_tree_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
|
|
|
EINA_UNUSED const char *protocol_name, void *value)
|
|
|
|
{ /* Update Tree for app, then update GUI if its displayed */
|
|
|
|
tree_data_st *td = value;
|
|
|
|
app_info_st *selected = gui->sel_app->app;
|
|
|
|
|
|
|
|
/* Update only if tree is from APP on our list */
|
|
|
|
app_data_st *st = (app_data_st *)
|
|
|
|
eina_list_search_unsorted(apps, _app_ptr_cmp,
|
|
|
|
(void *) (uintptr_t) td->app);
|
|
|
|
|
|
|
|
if (st)
|
|
|
|
{ /* Free app TREE_DATA then set ptr to new data */
|
|
|
|
_free_app_tree_data(st->td);
|
|
|
|
st->td = value;
|
|
|
|
|
|
|
|
if (selected->ptr == td->app)
|
|
|
|
{ /* Update GUI only if TREE_DATA is from SELECTED app */
|
|
|
|
elm_genlist_clear(gui->gl);
|
|
|
|
_load_gui_with_list(gui, td->tree);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ /* Happens when TREE_DATA of app that already closed has arrived */
|
|
|
|
_free_app_tree_data(value);
|
2012-11-29 03:09:10 -08:00
|
|
|
}
|
2012-12-03 22:57:44 -08:00
|
|
|
}
|
2012-11-29 03:09:10 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
void
|
|
|
|
_bmp_data_cb(EINA_UNUSED void *data, EINA_UNUSED Ecore_Con_Reply *reply,
|
|
|
|
const char *protocol_name, EINA_UNUSED const char *section,
|
|
|
|
void *value, size_t length)
|
|
|
|
{ /* Remove bmp if exists (according to obj-ptr), then add the new one */
|
|
|
|
bmp_info_st *st = clouseau_data_packet_info_get(protocol_name,
|
|
|
|
value, length);
|
2012-11-29 03:09:10 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
st->zoom_val = 1.0; /* Init zoom value */
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
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(gui->pb, EINA_FALSE);
|
|
|
|
evas_object_hide(gui->pb);
|
|
|
|
free(st);
|
|
|
|
|
|
|
|
/* Make refresh button display: screenshot NOT available */
|
|
|
|
if (nd)
|
|
|
|
_set_button(gui->win, nd->bt,
|
|
|
|
SCREENSHOT_MISSING,
|
|
|
|
"Screenshot not available", EINA_TRUE);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (app && nd)
|
|
|
|
{ /* Remove app bmp data if exists, then update */
|
|
|
|
elm_progressbar_pulse(gui->pb, EINA_FALSE);
|
|
|
|
evas_object_hide(gui->pb);
|
|
|
|
|
|
|
|
app_info_st *info = app->app;
|
|
|
|
info->view = _remove_bmp(info->view,
|
|
|
|
(void *) (uintptr_t) (st->object));
|
|
|
|
info->view = eina_list_append(info->view, st);
|
|
|
|
|
|
|
|
/* Now we need to update refresh button, make it open-window */
|
|
|
|
_set_button(gui->win, nd->bt,
|
|
|
|
SHOW_SCREENSHOT,
|
|
|
|
"Show App Screenshot", EINA_FALSE);
|
|
|
|
|
|
|
|
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 */
|
|
|
|
if (st->bmp)
|
|
|
|
free(st->bmp);
|
|
|
|
|
|
|
|
free(st);
|
|
|
|
}
|
2012-05-14 07:38:02 -07:00
|
|
|
}
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
gl_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
Evas_Object *gl = elm_object_item_widget_get(glit);
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *parent = elm_object_item_data_get(glit);
|
|
|
|
Clouseau_Tree_Item *treeit;
|
2012-05-14 07:37:49 -07:00
|
|
|
Eina_List *itr;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(parent->children, itr, treeit)
|
|
|
|
{
|
|
|
|
if ((!list_show_hidden && !treeit->is_visible) ||
|
|
|
|
(!list_show_clippers && treeit->is_clipper))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
Elm_Genlist_Item_Type iflag = (treeit->children) ?
|
|
|
|
ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
|
|
|
|
elm_genlist_item_append(gl, &itc, treeit, glit, iflag,
|
|
|
|
NULL, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
gl_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
elm_genlist_item_subitems_clear(glit);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
gl_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
elm_genlist_item_expanded_set(glit, EINA_TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
gl_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
elm_genlist_item_expanded_set(glit, EINA_FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
|
|
|
item_icon_get(void *data, Evas_Object *parent, const char *part)
|
|
|
|
{
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *treeit = data;
|
2012-06-18 00:22:33 -07:00
|
|
|
char buf[PATH_MAX];
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
if (!treeit->is_obj)
|
2012-06-18 00:22:25 -07:00
|
|
|
{ /* Add "Download" button for evas objects */
|
|
|
|
if (!strcmp(part, "elm.swallow.end"))
|
|
|
|
{
|
|
|
|
Evas_Object *bt = elm_button_add(parent);
|
|
|
|
app_info_st *app = NULL;
|
|
|
|
if (gui->sel_app)
|
2012-12-03 22:57:44 -08:00
|
|
|
app = gui->sel_app->app;
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
if (app)
|
|
|
|
{ /* match ptr with bmp->object ptr to find view */
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_info_st *bmp = (bmp_info_st *)
|
2012-06-18 00:22:25 -07:00
|
|
|
eina_list_search_unsorted(app->view, _bmp_object_ptr_cmp,
|
|
|
|
(void *) (uintptr_t) treeit->ptr);
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (bmp)
|
2012-06-18 00:22:25 -07:00
|
|
|
{ /* Set to "show view" if view exists */
|
2012-06-18 00:22:33 -07:00
|
|
|
_set_button(parent, bt,
|
2012-06-18 00:23:34 -07:00
|
|
|
SHOW_SCREENSHOT,
|
2012-06-18 00:22:33 -07:00
|
|
|
"Show App Screenshot", EINA_FALSE);
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
else
|
2012-06-18 00:22:43 -07:00
|
|
|
{ /* Set to Download or not available if offline */
|
2012-12-03 22:57:44 -08:00
|
|
|
if (eet_svr)
|
2012-06-18 00:22:43 -07:00
|
|
|
{
|
|
|
|
_set_button(parent, bt,
|
2012-06-18 00:23:34 -07:00
|
|
|
TAKE_SCREENSHOT,
|
2012-06-18 00:22:43 -07:00
|
|
|
"Download Screenshot", EINA_FALSE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{ /* Make button display: screenshot NOT available */
|
|
|
|
_set_button(parent, bt,
|
2012-06-18 00:23:34 -07:00
|
|
|
SCREENSHOT_MISSING,
|
2012-06-18 00:22:43 -07:00
|
|
|
"Screenshot not available", EINA_TRUE);
|
|
|
|
}
|
2012-06-18 00:22:25 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_object_smart_callback_add(bt, "clicked",
|
2012-06-18 00:22:28 -07:00
|
|
|
_show_app_window, treeit);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
evas_object_show(bt);
|
|
|
|
return bt;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
if (!strcmp(part, "elm.swallow.icon"))
|
|
|
|
{
|
|
|
|
if (treeit->is_clipper && !treeit->is_visible)
|
|
|
|
{
|
|
|
|
Evas_Object *ic;
|
|
|
|
Evas_Object *bx = elm_box_add(parent);
|
|
|
|
evas_object_size_hint_aspect_set(bx, EVAS_ASPECT_CONTROL_VERTICAL,
|
|
|
|
1, 1);
|
|
|
|
|
|
|
|
ic = elm_icon_add(bx);
|
|
|
|
snprintf(buf, sizeof(buf), "%s/images/clipper.png",
|
2012-05-14 07:40:26 -07:00
|
|
|
PACKAGE_DATA_DIR);
|
2012-06-07 04:41:14 -07:00
|
|
|
elm_image_file_set(ic, buf, NULL);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL,
|
|
|
|
1, 1);
|
|
|
|
evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND,
|
|
|
|
EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(ic, EVAS_HINT_FILL,
|
|
|
|
EVAS_HINT_FILL);
|
|
|
|
elm_box_pack_end(bx, ic);
|
|
|
|
|
|
|
|
ic = elm_icon_add(bx);
|
|
|
|
snprintf(buf, sizeof(buf), "%s/images/hidden.png",
|
2012-05-14 07:40:26 -07:00
|
|
|
PACKAGE_DATA_DIR);
|
2012-06-07 04:41:14 -07:00
|
|
|
elm_image_file_set(ic, buf, NULL);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL,
|
|
|
|
1, 1);
|
|
|
|
evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND,
|
|
|
|
EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(ic, EVAS_HINT_FILL,
|
|
|
|
EVAS_HINT_FILL);
|
|
|
|
elm_box_pack_end(bx, ic);
|
|
|
|
|
|
|
|
return bx;
|
|
|
|
|
|
|
|
}
|
|
|
|
else if (treeit->is_clipper)
|
|
|
|
{
|
|
|
|
Evas_Object *ic;
|
|
|
|
ic = elm_icon_add(parent);
|
|
|
|
snprintf(buf, sizeof(buf), "%s/images/clipper.png",
|
2012-05-14 07:40:26 -07:00
|
|
|
PACKAGE_DATA_DIR);
|
2012-06-07 04:41:14 -07:00
|
|
|
elm_image_file_set(ic, buf, NULL);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL,
|
|
|
|
1, 1);
|
|
|
|
return ic;
|
|
|
|
}
|
|
|
|
else if (!treeit->is_visible)
|
|
|
|
{
|
|
|
|
Evas_Object *ic;
|
|
|
|
ic = elm_icon_add(parent);
|
|
|
|
snprintf(buf, sizeof(buf), "%s/images/hidden.png",
|
2012-05-14 07:40:26 -07:00
|
|
|
PACKAGE_DATA_DIR);
|
2012-06-07 04:41:14 -07:00
|
|
|
elm_image_file_set(ic, buf, NULL);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL,
|
|
|
|
1, 1);
|
|
|
|
return ic;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
2012-05-14 07:40:26 -07:00
|
|
|
item_text_get(void *data, Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *part EINA_UNUSED)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *treeit = data;
|
2012-05-14 07:37:49 -07:00
|
|
|
char buf[256];
|
2012-07-05 19:39:11 -07:00
|
|
|
snprintf(buf, sizeof(buf), "%llx %s", treeit->ptr, treeit->name);
|
2012-05-14 07:37:49 -07:00
|
|
|
return strdup(buf);
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:38:18 -07:00
|
|
|
static void
|
2012-05-14 07:40:38 -07:00
|
|
|
client_win_del(void *data EINA_UNUSED,
|
|
|
|
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
2012-05-14 07:40:11 -07:00
|
|
|
{ /* called when client window is deleted */
|
2012-05-14 07:38:18 -07:00
|
|
|
elm_exit(); /* exit the program's main loop that runs in elm_run() */
|
|
|
|
}
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
static Eina_Bool
|
2012-05-14 07:40:38 -07:00
|
|
|
_connect_to_daemon(gui_elements *g)
|
2012-05-14 07:38:18 -07:00
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
if (eet_svr)
|
|
|
|
return EINA_TRUE;
|
2012-05-14 07:38:18 -07:00
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
int port = PORT;
|
|
|
|
char *address = LOCALHOST;
|
|
|
|
char *p_colon = NULL;
|
2012-12-03 22:57:44 -08:00
|
|
|
Ecore_Con_Server *server;
|
|
|
|
Ecore_Con_Eet *ece = NULL;
|
2012-05-14 07:40:11 -07:00
|
|
|
|
2012-05-14 07:40:38 -07:00
|
|
|
if (g->address && strlen(g->address))
|
2012-05-14 07:40:11 -07:00
|
|
|
{
|
2012-05-14 07:40:38 -07:00
|
|
|
address = g->address;
|
|
|
|
p_colon = strchr(g->address, ':');
|
2012-05-14 07:40:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (p_colon)
|
|
|
|
{
|
|
|
|
*p_colon = '\0';
|
|
|
|
if (isdigit(*(p_colon+1)))
|
|
|
|
port = atoi(p_colon+1);
|
|
|
|
}
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
server = ecore_con_server_connect(ECORE_CON_REMOTE_TCP,
|
2012-05-14 07:40:11 -07:00
|
|
|
address, port, NULL);
|
|
|
|
|
|
|
|
if (p_colon)
|
|
|
|
*p_colon = ':';
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (!server)
|
2012-05-14 07:38:18 -07:00
|
|
|
{
|
2013-01-30 03:23:03 -08:00
|
|
|
ERR("could not connect to the server: %s\n", g->address);
|
2012-12-03 22:57:44 -08:00
|
|
|
return EINA_FALSE;
|
2012-11-29 03:09:10 -08:00
|
|
|
}
|
2012-05-14 07:38:18 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
/* TODO: ecore_con_server_data_size_max_set(server, -1); */
|
2012-11-29 03:09:10 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
ece = ecore_con_eet_client_new(server);
|
|
|
|
if (!ece)
|
|
|
|
{
|
2013-01-30 03:23:03 -08:00
|
|
|
ERR("could not connect to the server: %s\n", g->address);
|
2012-12-03 22:57:44 -08:00
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
2012-11-29 03:09:10 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
clouseau_register_descs(ece);
|
|
|
|
|
|
|
|
/* Register callbacks for ecore_con_eet */
|
|
|
|
ecore_con_eet_server_connect_callback_add(ece, _add, NULL);
|
|
|
|
ecore_con_eet_server_disconnect_callback_add(ece, _del, NULL);
|
|
|
|
ecore_con_eet_data_callback_add(ece, CLOUSEAU_APP_CLOSED_STR,
|
|
|
|
_app_closed_cb, NULL);
|
|
|
|
ecore_con_eet_data_callback_add(ece, CLOUSEAU_APP_ADD_STR,
|
|
|
|
_app_add_cb, NULL);
|
|
|
|
ecore_con_eet_data_callback_add(ece, CLOUSEAU_TREE_DATA_STR,
|
|
|
|
_tree_data_cb, NULL);
|
|
|
|
|
|
|
|
/* At the moment our only raw-data packet is BMP info */
|
|
|
|
ecore_con_eet_raw_data_callback_add(ece, CLOUSEAU_BMP_DATA_STR,
|
|
|
|
_bmp_data_cb, NULL);
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
2012-05-14 07:38:18 -07:00
|
|
|
}
|
|
|
|
|
2012-05-14 07:39:42 -07:00
|
|
|
static void
|
2012-11-08 22:46:24 -08:00
|
|
|
_gl_selected(void *data, Evas_Object *pobj EINA_UNUSED, void *event_info)
|
2012-05-14 07:39:42 -07:00
|
|
|
{
|
2012-06-18 00:22:25 -07:00
|
|
|
gui_elements *g = data;
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *treeit = elm_object_item_data_get(event_info);
|
2012-06-18 00:22:36 -07:00
|
|
|
const Elm_Object_Item *parent;
|
|
|
|
const Elm_Object_Item *prt = elm_genlist_item_parent_get(event_info);
|
2012-07-19 05:47:56 -07:00
|
|
|
if (!prt)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* Populate object information, then do highlight */
|
2012-11-08 22:46:31 -08:00
|
|
|
if (g->gl_it != event_info)
|
|
|
|
{
|
2013-01-30 03:13:50 -08:00
|
|
|
elm_genlist_clear(prop_list);
|
2012-11-08 22:46:31 -08:00
|
|
|
clouseau_object_information_list_populate(treeit, g->lb);
|
|
|
|
g->gl_it = event_info;
|
2013-01-30 03:13:50 -08:00
|
|
|
|
|
|
|
{
|
|
|
|
/* Fetch properties of eo object */
|
|
|
|
Clouseau_Eo_Dbg_Info *eo;
|
|
|
|
Eina_List *expand_list = NULL, *l, *l_prev;
|
|
|
|
Elm_Object_Item *eo_it;
|
|
|
|
EINA_LIST_FOREACH(treeit->eo_info,l, eo)
|
|
|
|
{
|
|
|
|
Elm_Genlist_Item_Type iflag = (eo->type == EINA_VALUE_TYPE_LIST) ?
|
|
|
|
ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
|
|
|
|
eo_it = elm_genlist_item_append(prop_list, &_obj_info_itc, eo, NULL,
|
|
|
|
iflag, _gl_selected, NULL);
|
|
|
|
expand_list = eina_list_append(expand_list, eo_it);
|
|
|
|
}
|
|
|
|
EINA_LIST_REVERSE_FOREACH_SAFE(expand_list, l, l_prev, eo_it)
|
|
|
|
{
|
|
|
|
elm_genlist_item_expanded_set(eo_it, EINA_TRUE);
|
|
|
|
expand_list = eina_list_remove_list(expand_list, l);
|
|
|
|
}
|
|
|
|
}
|
2012-11-08 22:46:31 -08:00
|
|
|
}
|
2012-07-19 05:47:56 -07:00
|
|
|
|
|
|
|
if (!do_highlight)
|
2012-06-18 00:22:25 -07:00
|
|
|
return;
|
2012-05-14 07:39:42 -07:00
|
|
|
|
|
|
|
/* START - replacing libclouseau_highlight(obj); */
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *app = g->sel_app->app;
|
2012-05-14 07:39:49 -07:00
|
|
|
highlight_st st = { (unsigned long long) (uintptr_t) app->ptr,
|
2012-07-05 19:39:11 -07:00
|
|
|
treeit->ptr };
|
2012-05-14 07:39:49 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (eet_svr)
|
2012-05-14 07:39:42 -07:00
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
ecore_con_eet_send(eet_svr, CLOUSEAU_HIGHLIGHT_STR, &st);
|
2012-05-14 07:39:42 -07:00
|
|
|
}
|
2012-06-18 00:22:36 -07:00
|
|
|
|
|
|
|
/* We also like to HIGHLIGHT on any app views that open (for offline) */
|
|
|
|
do
|
|
|
|
{
|
|
|
|
parent = prt;
|
|
|
|
prt = elm_genlist_item_parent_get(prt);
|
|
|
|
}
|
|
|
|
while (prt);
|
|
|
|
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *t = elm_object_item_data_get(parent);
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_info_st *bmp = eina_list_search_unsorted(app->view,
|
2012-07-05 19:39:11 -07:00
|
|
|
_bmp_object_ptr_cmp,
|
|
|
|
(void*) (uintptr_t) t->ptr);
|
2012-06-18 00:22:36 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (bmp && bmp->win)
|
2012-06-18 00:22:56 -07:00
|
|
|
{ /* Third param gives evas surface when running offline */
|
2012-08-14 04:26:26 -07:00
|
|
|
clouseau_data_object_highlight((void*) (uintptr_t) treeit->ptr,
|
2012-12-03 22:57:44 -08:00
|
|
|
&treeit->info->evas_props, bmp);
|
2012-06-18 00:22:56 -07:00
|
|
|
}
|
2012-07-05 19:39:11 -07:00
|
|
|
/* END - replacing clouseau_object_highlight(obj); */
|
2012-05-14 07:39:42 -07:00
|
|
|
}
|
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
static int
|
2012-05-14 07:40:38 -07:00
|
|
|
_load_list(gui_elements *g)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
2012-06-18 00:22:25 -07:00
|
|
|
elm_progressbar_pulse(g->pb, EINA_FALSE);
|
|
|
|
evas_object_hide(g->pb);
|
|
|
|
|
2012-05-14 07:40:38 -07:00
|
|
|
if (g->sel_app)
|
2012-05-14 07:38:18 -07:00
|
|
|
{
|
2012-05-14 07:40:38 -07:00
|
|
|
elm_genlist_clear(g->gl);
|
|
|
|
elm_genlist_clear(g->prop_list);
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *st = g->sel_app->app;
|
|
|
|
tree_data_st *td = (g->sel_app->td) ? g->sel_app->td : NULL;
|
2012-05-14 07:39:38 -07:00
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
if (td)
|
|
|
|
{ /* Just show currnet tree we got */
|
|
|
|
_load_gui_with_list(g, td->tree);
|
2012-05-16 04:07:06 -07:00
|
|
|
}
|
2012-06-18 00:22:25 -07:00
|
|
|
else
|
|
|
|
{ /* Ask for app info only if was not fetched */
|
2012-12-03 22:57:44 -08:00
|
|
|
if (!eet_svr)
|
2012-05-14 07:39:38 -07:00
|
|
|
{
|
2012-06-18 00:22:25 -07:00
|
|
|
_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 */
|
|
|
|
data_req_st t = { (unsigned long long) (uintptr_t) NULL,
|
|
|
|
(unsigned long long) (uintptr_t) st->ptr };
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
ecore_con_eet_send(eet_svr, CLOUSEAU_DATA_REQ_STR, &t);
|
|
|
|
elm_progressbar_pulse(g->pb, EINA_TRUE);
|
|
|
|
evas_object_show(g->pb);
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
2012-05-14 07:37:49 -07:00
|
|
|
}
|
|
|
|
}
|
2012-05-14 07:38:49 -07:00
|
|
|
|
|
|
|
return 0;
|
2012-05-14 07:37:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_show_clippers_check_changed(void *data, Evas_Object *obj,
|
2012-05-14 07:40:26 -07:00
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
|
|
|
list_show_clippers = elm_check_state_get(obj);
|
|
|
|
_load_list(data);
|
|
|
|
}
|
|
|
|
|
2012-07-19 05:36:32 -07:00
|
|
|
static void
|
|
|
|
_highlight_check_check_changed(EINA_UNUSED void *data, Evas_Object *obj,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
do_highlight = elm_check_state_get(obj);
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
static void
|
|
|
|
_show_hidden_check_changed(void *data, Evas_Object *obj,
|
2012-05-14 07:40:26 -07:00
|
|
|
void *event_info EINA_UNUSED)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
|
|
|
list_show_hidden = elm_check_state_get(obj);
|
|
|
|
_load_list(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
2012-05-14 07:37:49 -07:00
|
|
|
{
|
2012-06-18 00:22:25 -07:00
|
|
|
gui_elements *g = data;
|
|
|
|
|
|
|
|
/* Close all app-bmp-view windows here and clear mem */
|
|
|
|
if (g->sel_app)
|
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *st = g->sel_app->app;
|
2012-06-18 00:22:25 -07:00
|
|
|
_close_app_views(st, EINA_TRUE);
|
|
|
|
st->refresh_ctr++;
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
elm_object_text_set(obj, "Reload");
|
2012-06-18 00:22:25 -07:00
|
|
|
_free_app_tree_data(g->sel_app->td);
|
|
|
|
g->sel_app->td = NULL;
|
2012-11-08 22:46:31 -08:00
|
|
|
g->gl_it = NULL;
|
2012-05-14 07:37:49 -07:00
|
|
|
_load_list(data);
|
|
|
|
}
|
|
|
|
|
2012-05-16 04:07:04 -07:00
|
|
|
static void
|
2012-05-16 04:07:06 -07:00
|
|
|
_bt_load_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2012-05-16 04:07:04 -07:00
|
|
|
{
|
2012-05-17 06:57:14 -07:00
|
|
|
if (event_info)
|
|
|
|
{
|
2012-12-05 04:41:49 -08:00
|
|
|
gui_elements *g = data;
|
|
|
|
app_info_st *app = calloc(1, sizeof(*app));
|
|
|
|
tree_data_st *td = calloc(1, sizeof(*td));
|
2012-08-14 04:26:26 -07:00
|
|
|
Eina_Bool s = clouseau_data_eet_info_read(event_info,
|
2012-12-03 22:57:44 -08:00
|
|
|
(app_info_st **) &app, (tree_data_st **) &td);
|
2012-05-17 06:57:14 -07:00
|
|
|
|
|
|
|
if (s)
|
|
|
|
{ /* Add the app to list of apps, then set this as selected app */
|
2012-12-03 22:57:44 -08:00
|
|
|
app->file = strdup(event_info);
|
2012-05-17 06:57:14 -07:00
|
|
|
app_data_st *st = _add_app(g, app);
|
|
|
|
st->td = td; /* This is the same as we got TREE_DATA message */
|
|
|
|
_set_selected_app(st, g->dd_list, NULL);
|
|
|
|
}
|
2012-05-16 04:07:06 -07:00
|
|
|
}
|
2012-05-16 04:07:04 -07:00
|
|
|
}
|
|
|
|
|
2012-06-18 00:22:43 -07:00
|
|
|
static void
|
|
|
|
_dismiss_save_dialog(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{ /* Just close save file save_inwin, do nothing */
|
|
|
|
gui_elements *g = data;
|
|
|
|
evas_object_del(g->save_inwin);
|
|
|
|
g->save_inwin = NULL;
|
|
|
|
}
|
|
|
|
|
2012-05-16 04:07:04 -07:00
|
|
|
static void
|
2012-05-16 04:07:06 -07:00
|
|
|
_bt_save_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2012-05-16 04:07:04 -07:00
|
|
|
{
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *app = gui->sel_app->app;
|
|
|
|
tree_data_st *ftd = gui->sel_app->td;
|
2012-05-17 06:57:14 -07:00
|
|
|
if (event_info)
|
|
|
|
{
|
2012-05-17 06:57:32 -07:00
|
|
|
/* FIXME: Handle failure. */
|
2012-12-23 03:58:58 -08:00
|
|
|
Eina_List *bmp_ck_list = elm_box_children_get(data);
|
|
|
|
|
|
|
|
clouseau_data_eet_info_save(event_info, app, ftd, bmp_ck_list);
|
|
|
|
eina_list_free(bmp_ck_list);
|
2012-05-17 06:57:14 -07:00
|
|
|
}
|
2012-06-18 00:22:43 -07:00
|
|
|
|
|
|
|
|
|
|
|
if (event_info) /* Dismiss save dialog after saving */
|
|
|
|
_dismiss_save_dialog(gui, NULL, NULL);
|
2012-05-16 04:07:04 -07:00
|
|
|
}
|
2012-05-16 04:06:59 -07:00
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
static void
|
|
|
|
_dismiss_inwin(gui_elements *g)
|
|
|
|
{
|
2012-05-20 03:55:53 -07:00
|
|
|
g->address = (g->en) ? strdup(elm_entry_entry_get(g->en)) : NULL;
|
2012-06-18 00:22:43 -07:00
|
|
|
evas_object_del(g->connect_inwin);
|
2012-05-14 07:40:11 -07:00
|
|
|
g->en = NULL;
|
2012-06-18 00:22:43 -07:00
|
|
|
g->connect_inwin = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_save_all(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Evas_Object *ck_bx = data;
|
|
|
|
Evas_Object *ck;
|
|
|
|
Eina_List *l;
|
|
|
|
Eina_List *ck_list = elm_box_children_get(ck_bx);
|
|
|
|
Eina_Bool val = elm_check_state_get(obj);
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(ck_list, l, ck)
|
|
|
|
{ /* Run through checkoxes, set / unset marks for all */
|
|
|
|
if (!elm_object_disabled_get(ck))
|
|
|
|
elm_check_state_set(ck, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
eina_list_free(ck_list);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_save_file_dialog(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{ /* START - Popup to save eet file */
|
|
|
|
gui_elements *g = data;
|
|
|
|
Evas_Object *scr, *bt_bx, *bx, *ck_bx,
|
|
|
|
*lb, *ck, *bt_cancel, *bt_save;
|
|
|
|
g->save_inwin = elm_win_inwin_add(g->win);
|
|
|
|
evas_object_show(g->save_inwin);
|
|
|
|
|
|
|
|
|
|
|
|
bx = elm_box_add(g->save_inwin);
|
|
|
|
evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bx);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
lb = elm_label_add(bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
|
|
|
|
evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0);
|
|
|
|
elm_object_text_set(lb, "Select Screeenshots to save:");
|
|
|
|
elm_box_pack_end(bx, lb);
|
|
|
|
evas_object_show(lb);
|
|
|
|
|
|
|
|
/* Add checkboxes to select screenshots to save */
|
|
|
|
ck_bx = elm_box_add(g->save_inwin);
|
|
|
|
|
|
|
|
Eina_List *l;
|
2012-12-03 22:57:44 -08:00
|
|
|
app_info_st *a = g->sel_app->app;
|
|
|
|
tree_data_st *td = g->sel_app->td;
|
2012-07-05 19:39:11 -07:00
|
|
|
Clouseau_Tree_Item *treeit;
|
2012-06-18 00:22:43 -07:00
|
|
|
char buf[256];
|
|
|
|
EINA_LIST_FOREACH(td->tree, l, treeit)
|
|
|
|
{ /* First search app->view list if already have the window bmp */
|
2012-12-03 22:57:44 -08:00
|
|
|
bmp_info_st *bmp = (bmp_info_st *)
|
2012-06-18 00:22:43 -07:00
|
|
|
eina_list_search_unsorted(a->view, _bmp_object_ptr_cmp,
|
|
|
|
(void *) (uintptr_t) treeit->ptr);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
ck = elm_check_add(ck_bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 1.0);
|
|
|
|
evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.0);
|
|
|
|
elm_box_pack_end(ck_bx, ck);
|
|
|
|
elm_object_disabled_set(ck, !(bmp && bmp->bmp));
|
|
|
|
evas_object_data_set(ck, BMP_FIELD, bmp); /* Associate ck with bmp */
|
2012-07-05 19:39:11 -07:00
|
|
|
snprintf(buf, sizeof(buf), "%llx %s", treeit->ptr, treeit->name);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_object_text_set(ck, buf);
|
|
|
|
|
|
|
|
evas_object_show(ck);
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_object_show(ck_bx);
|
2012-06-18 00:22:50 -07:00
|
|
|
scr = elm_scroller_add(bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_object_content_set(scr, ck_bx);
|
|
|
|
evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(scr);
|
|
|
|
elm_box_pack_end(bx, scr);
|
|
|
|
|
|
|
|
/* Add the save all checkbox */
|
2012-06-18 00:22:50 -07:00
|
|
|
ck = elm_check_add(bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_object_text_set(ck, "Save All");
|
|
|
|
evas_object_smart_callback_add(ck, "changed", _save_all, ck_bx);
|
|
|
|
evas_object_show(ck);
|
|
|
|
elm_box_pack_end(bx, ck);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_bx = elm_box_add(bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_box_horizontal_set(bt_bx, EINA_TRUE);
|
|
|
|
elm_box_homogeneous_set(bt_bx, EINA_TRUE);
|
|
|
|
evas_object_size_hint_align_set(bt_bx, 0.5, 1.0);
|
|
|
|
evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, 0.0);
|
|
|
|
evas_object_show(bt_bx);
|
|
|
|
elm_box_pack_end(bx, bt_bx);
|
|
|
|
|
|
|
|
/* Add the cancel button */
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_cancel = elm_button_add(bt_bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_object_text_set(bt_cancel, "Cancel");
|
|
|
|
evas_object_smart_callback_add(bt_cancel, "clicked",
|
|
|
|
_dismiss_save_dialog, g);
|
|
|
|
|
|
|
|
elm_box_pack_end(bt_bx, bt_cancel);
|
|
|
|
evas_object_show(bt_cancel);
|
|
|
|
|
|
|
|
/* Add the Save fileselector button */
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_save = elm_fileselector_button_add(bt_bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_fileselector_button_is_save_set(bt_save, EINA_TRUE);
|
|
|
|
elm_object_text_set(bt_save, "Save File");
|
|
|
|
elm_fileselector_button_path_set(bt_save, getenv("HOME"));
|
|
|
|
evas_object_smart_callback_add(bt_save, "file,chosen",
|
2012-12-23 03:58:58 -08:00
|
|
|
_bt_save_file, ck_bx);
|
2012-06-18 00:22:43 -07:00
|
|
|
|
|
|
|
elm_box_pack_end(bt_bx, bt_save);
|
|
|
|
evas_object_show(bt_save);
|
|
|
|
|
|
|
|
elm_win_inwin_content_set(g->save_inwin, bx);
|
|
|
|
/* END - Popup to save eet file */
|
2012-05-14 07:40:11 -07:00
|
|
|
}
|
|
|
|
|
2012-05-20 03:55:53 -07:00
|
|
|
static void
|
|
|
|
_remove_apps_with_no_tree_data(gui_elements *g)
|
|
|
|
{ /* We need to remove apps with no tree data when losing commection
|
|
|
|
* with daemon. We may have apps in our list that were added but
|
|
|
|
* tree-data was NOT loaded.
|
|
|
|
* In this case, we want to remove them if connection was lost. */
|
|
|
|
|
|
|
|
Eina_List *l, *l_next;
|
|
|
|
app_data_st *st;
|
|
|
|
app_closed_st t;
|
|
|
|
EINA_LIST_FOREACH_SAFE(apps, l, l_next, st)
|
|
|
|
{
|
|
|
|
if (!st->td)
|
|
|
|
{ /* We actually fake APP_CLOSED message, for app NO tree */
|
|
|
|
t.ptr = (unsigned long long) (uintptr_t)
|
2012-12-03 22:57:44 -08:00
|
|
|
(((app_info_st *) st->app)->ptr);
|
2012-08-14 04:26:26 -07:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
_remove_app(g, &t);
|
2012-05-20 03:55:53 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
static void
|
2012-05-17 06:57:22 -07:00
|
|
|
_show_gui(gui_elements *g, Eina_Bool work_offline)
|
2012-05-14 07:40:11 -07:00
|
|
|
{
|
2012-05-17 06:57:22 -07:00
|
|
|
if (work_offline)
|
2012-05-16 04:07:04 -07:00
|
|
|
{ /* Replace bt_load with fileselector button */
|
2012-05-20 03:55:47 -07:00
|
|
|
_titlebar_string_set(g, EINA_FALSE);
|
2012-05-16 04:07:04 -07:00
|
|
|
elm_box_unpack(g->hbx, g->bt_load);
|
|
|
|
evas_object_del(g->bt_load);
|
|
|
|
|
2012-05-20 03:55:53 -07:00
|
|
|
/* We need this in case conneciton closed and no tree data */
|
|
|
|
_remove_apps_with_no_tree_data(g);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
g->bt_load = elm_fileselector_button_add(g->hbx);
|
2012-05-16 04:07:04 -07:00
|
|
|
elm_box_pack_start(g->hbx, g->bt_load);
|
|
|
|
elm_object_text_set(g->bt_load, "Load File");
|
|
|
|
elm_fileselector_button_path_set(g->bt_load, getenv("HOME"));
|
|
|
|
evas_object_smart_callback_add(g->bt_load, "file,chosen",
|
|
|
|
_bt_load_file, g);
|
|
|
|
|
|
|
|
evas_object_show(g->bt_load);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
elm_object_text_set(g->bt_load, "Load Tree");
|
|
|
|
evas_object_smart_callback_add(g->bt_load, "clicked", _bt_clicked, g);
|
|
|
|
|
2012-06-18 00:22:43 -07:00
|
|
|
/* Add the Save button to open save dialog */
|
2012-06-18 00:22:59 -07:00
|
|
|
if (g->bt_save)
|
|
|
|
evas_object_del(g->bt_save);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
g->bt_save = elm_button_add(g->hbx);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_object_text_set(g->bt_save, "SAVE");
|
|
|
|
evas_object_smart_callback_add(g->bt_save, "clicked",
|
|
|
|
_save_file_dialog, (void *) gui);
|
2012-05-16 04:07:04 -07:00
|
|
|
|
|
|
|
elm_box_pack_end(g->hbx, g->bt_save);
|
2012-06-18 00:22:43 -07:00
|
|
|
evas_object_show(g->bt_save);
|
2012-05-16 04:07:04 -07:00
|
|
|
|
2012-05-17 06:57:22 -07:00
|
|
|
elm_object_disabled_set(g->bt_load, (g->sel_app == NULL));
|
2012-05-16 04:07:04 -07:00
|
|
|
elm_object_disabled_set(g->bt_save, (g->sel_app == NULL));
|
|
|
|
evas_object_show(g->bt_save);
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
if (!_connect_to_daemon(g))
|
2012-05-16 04:57:46 -07:00
|
|
|
{
|
2013-01-30 03:23:03 -08:00
|
|
|
ERR("Failed to connect to server.\n");
|
2012-05-16 04:57:46 -07:00
|
|
|
elm_exit(); /* exit the program's main loop,runs in elm_run() */
|
|
|
|
}
|
2012-05-16 04:07:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
evas_object_show(g->bx);
|
|
|
|
evas_object_show(g->panel);
|
2012-05-17 06:57:22 -07:00
|
|
|
}
|
2012-05-14 07:40:11 -07:00
|
|
|
|
2012-05-17 06:57:22 -07:00
|
|
|
static void
|
|
|
|
_cancel_bt_clicked(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
_dismiss_inwin(data);
|
|
|
|
elm_exit(); /* exit the program's main loop that runs in elm_run() */
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ok_bt_clicked(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{ /* Set the IP, PORT, then connect to server */
|
|
|
|
_dismiss_inwin(data);
|
|
|
|
_show_gui(data, EINA_FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_ofl_bt_clicked(void *data,
|
|
|
|
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
|
|
|
{ /* Disbale entry when working offline */
|
|
|
|
_dismiss_inwin(data);
|
|
|
|
_show_gui(data, EINA_TRUE);
|
2012-05-14 07:40:11 -07:00
|
|
|
}
|
|
|
|
|
2012-11-08 22:46:33 -08:00
|
|
|
static void
|
2012-12-03 22:57:44 -08:00
|
|
|
_control_buttons_create(gui_elements *g, Evas_Object *win)
|
2012-11-08 22:46:33 -08:00
|
|
|
{
|
|
|
|
Evas_Object *show_hidden_check, *show_clippers_check, *highlight_check;
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
g->hbx = elm_box_add(g->bx);
|
|
|
|
evas_object_size_hint_align_set(g->hbx, 0.0, 0.5);
|
|
|
|
elm_box_horizontal_set(g->hbx, EINA_TRUE);
|
|
|
|
elm_box_pack_end(g->bx, g->hbx);
|
|
|
|
elm_box_padding_set(g->hbx, 10, 0);
|
|
|
|
evas_object_show(g->hbx);
|
2012-11-08 22:46:33 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
g->bt_load = elm_button_add(g->hbx);
|
|
|
|
evas_object_size_hint_align_set(g->bt_load, 0.0, 0.3);
|
|
|
|
elm_box_pack_end(g->hbx, g->bt_load);
|
|
|
|
evas_object_show(g->bt_load);
|
2012-11-08 22:46:33 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
g->dd_list = elm_hoversel_add(g->hbx);
|
|
|
|
elm_hoversel_hover_parent_set(g->dd_list, win);
|
|
|
|
elm_object_text_set(g->dd_list, "SELECT APP");
|
2012-11-08 22:46:33 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
evas_object_size_hint_align_set(g->dd_list, 0.0, 0.3);
|
|
|
|
elm_box_pack_end(g->hbx, g->dd_list);
|
|
|
|
evas_object_show(g->dd_list);
|
2012-11-08 22:46:33 -08:00
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
show_hidden_check = elm_check_add(g->hbx);
|
2012-11-08 22:46:33 -08:00
|
|
|
elm_object_text_set(show_hidden_check, "Show Hidden");
|
|
|
|
elm_check_state_set(show_hidden_check, list_show_hidden);
|
2012-12-03 22:57:44 -08:00
|
|
|
elm_box_pack_end(g->hbx, show_hidden_check);
|
2012-11-08 22:46:33 -08:00
|
|
|
evas_object_show(show_hidden_check);
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
show_clippers_check = elm_check_add(g->hbx);
|
2012-11-08 22:46:33 -08:00
|
|
|
elm_object_text_set(show_clippers_check, "Show Clippers");
|
|
|
|
elm_check_state_set(show_clippers_check, list_show_clippers);
|
2012-12-03 22:57:44 -08:00
|
|
|
elm_box_pack_end(g->hbx, show_clippers_check);
|
2012-11-08 22:46:33 -08:00
|
|
|
evas_object_show(show_clippers_check);
|
|
|
|
|
2012-12-03 22:57:44 -08:00
|
|
|
highlight_check = elm_check_add(g->hbx);
|
2012-11-08 22:46:33 -08:00
|
|
|
elm_object_text_set(highlight_check , "Highlight");
|
|
|
|
elm_check_state_set(highlight_check , do_highlight);
|
2012-12-03 22:57:44 -08:00
|
|
|
elm_box_pack_end(g->hbx, highlight_check);
|
2012-11-08 22:46:33 -08:00
|
|
|
evas_object_show(highlight_check);
|
|
|
|
|
|
|
|
evas_object_smart_callback_add(show_hidden_check, "changed",
|
2012-12-03 22:57:44 -08:00
|
|
|
_show_hidden_check_changed, g);
|
2012-11-08 22:46:33 -08:00
|
|
|
evas_object_smart_callback_add(show_clippers_check, "changed",
|
2012-12-03 22:57:44 -08:00
|
|
|
_show_clippers_check_changed, g);
|
2012-11-08 22:46:33 -08:00
|
|
|
evas_object_smart_callback_add(highlight_check, "changed",
|
2012-12-03 22:57:44 -08:00
|
|
|
_highlight_check_check_changed, g);
|
2012-11-08 22:46:33 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_main_list_create(Evas_Object *panes)
|
|
|
|
{
|
|
|
|
gui->gl = elm_genlist_add(panes);
|
|
|
|
elm_genlist_select_mode_set(gui->gl, ELM_OBJECT_SELECT_MODE_ALWAYS);
|
|
|
|
evas_object_size_hint_align_set(gui->gl,
|
|
|
|
EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_size_hint_weight_set(gui->gl,
|
|
|
|
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
elm_object_part_content_set(panes, "left", gui->gl);
|
|
|
|
evas_object_show(gui->gl);
|
|
|
|
|
|
|
|
itc.item_style = "default";
|
|
|
|
itc.func.text_get = item_text_get;
|
|
|
|
itc.func.content_get = item_icon_get;
|
|
|
|
itc.func.state_get = NULL;
|
|
|
|
itc.func.del = NULL;
|
|
|
|
|
|
|
|
evas_object_smart_callback_add(gui->gl,
|
|
|
|
"expand,request", gl_exp_req, gui->gl);
|
|
|
|
evas_object_smart_callback_add(gui->gl,
|
|
|
|
"contract,request", gl_con_req, gui->gl);
|
|
|
|
evas_object_smart_callback_add(gui->gl,
|
|
|
|
"expanded", gl_exp, gui->gl);
|
|
|
|
evas_object_smart_callback_add(gui->gl,
|
|
|
|
"contracted", gl_con, gui->gl);
|
|
|
|
evas_object_smart_callback_add(gui->gl,
|
|
|
|
"selected", _gl_selected, gui);
|
|
|
|
}
|
|
|
|
|
2013-01-30 03:13:50 -08:00
|
|
|
static void
|
|
|
|
_obj_info_gl_selected(void *data EINA_UNUSED, Evas_Object *pobj EINA_UNUSED,
|
|
|
|
void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
/* Currently do nothing */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_obj_info_gl_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
Eina_List *itr;
|
|
|
|
|
|
|
|
Clouseau_Eo_Dbg_Info *eo = elm_object_item_data_get(glit);
|
|
|
|
Clouseau_Eo_Dbg_Info *child;
|
|
|
|
EINA_LIST_FOREACH(eo->un_dbg_info.dbg.list, itr, child)
|
|
|
|
{
|
|
|
|
Elm_Genlist_Item_Type iflag = (child->type == EINA_VALUE_TYPE_LIST) ?
|
|
|
|
ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
|
|
|
|
elm_genlist_item_append(prop_list, &_obj_info_itc, child, glit,
|
|
|
|
iflag, _obj_info_gl_selected, NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_obj_info_gl_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
elm_genlist_item_subitems_clear(glit);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_obj_info_gl_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
elm_genlist_item_expanded_set(glit, EINA_TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_obj_info_gl_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
|
|
|
{
|
|
|
|
Elm_Object_Item *glit = event_info;
|
|
|
|
elm_genlist_item_expanded_set(glit, EINA_FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
|
|
|
_obj_info_gl_item_icon_get(void *data EINA_UNUSED, Evas_Object *parent EINA_UNUSED,
|
|
|
|
const char *part EINA_UNUSED)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
_obj_info_gl_item_text_get(void *data, Evas_Object *obj EINA_UNUSED,
|
|
|
|
const char *part EINA_UNUSED)
|
|
|
|
{
|
|
|
|
Clouseau_Eo_Dbg_Info *eo = data;
|
|
|
|
char buf[1024];
|
|
|
|
_clouseau_object_dbg_string_build(eo, (char*)buf, 1024);
|
|
|
|
return strdup(buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
|
|
|
_clouseau_object_information_list_add(Evas_Object *parent)
|
|
|
|
{
|
|
|
|
prop_list = elm_genlist_add(parent);
|
|
|
|
_obj_info_itc.item_style = "default";
|
|
|
|
_obj_info_itc.func.text_get = _obj_info_gl_item_text_get;
|
|
|
|
_obj_info_itc.func.content_get = _obj_info_gl_item_icon_get;
|
|
|
|
_obj_info_itc.func.state_get = NULL;
|
|
|
|
_obj_info_itc.func.del = NULL;
|
|
|
|
|
|
|
|
evas_object_smart_callback_add(prop_list, "expand,request", _obj_info_gl_exp_req,
|
|
|
|
prop_list);
|
|
|
|
evas_object_smart_callback_add(prop_list, "contract,request", _obj_info_gl_con_req,
|
|
|
|
prop_list);
|
|
|
|
evas_object_smart_callback_add(prop_list, "expanded", _obj_info_gl_exp, prop_list);
|
|
|
|
evas_object_smart_callback_add(prop_list, "contracted", _obj_info_gl_con, prop_list);
|
|
|
|
evas_object_smart_callback_add(prop_list, "selected", _obj_info_gl_selected, NULL);
|
|
|
|
|
|
|
|
return prop_list;
|
|
|
|
}
|
|
|
|
|
2012-11-08 22:46:33 -08:00
|
|
|
static void
|
|
|
|
_property_list_create(Evas_Object *panes)
|
|
|
|
{
|
|
|
|
Evas_Object *o= NULL;
|
2013-01-30 03:13:50 -08:00
|
|
|
gui->prop_list = o = _clouseau_object_information_list_add(panes);
|
2012-11-08 22:46:33 -08:00
|
|
|
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
|
|
|
|
elm_object_part_content_set(panes, "right", o);
|
|
|
|
evas_object_show(o);
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
#ifndef ELM_LIB_QUICKLAUNCH
|
|
|
|
EAPI int
|
2012-05-14 07:40:38 -07:00
|
|
|
elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
|
2012-05-14 07:37:49 -07:00
|
|
|
{ /* Create Client Window */
|
2013-01-30 03:23:03 -08:00
|
|
|
const char *log_dom = "clouseau_client";
|
|
|
|
_clouseau_client_log_dom = eina_log_domain_register(log_dom, EINA_COLOR_LIGHTBLUE);
|
|
|
|
if (_clouseau_client_log_dom < 0)
|
|
|
|
{
|
|
|
|
EINA_LOG_ERR("Could not register log domain: %s", log_dom);
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
2012-11-08 22:46:33 -08:00
|
|
|
Evas_Object *win, *panes;
|
2012-05-14 07:39:38 -07:00
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
/* For inwin popup */
|
|
|
|
Evas_Object *lb, *bxx, *bt_bx, *bt_ok, *bt_cancel;
|
2012-05-17 06:57:22 -07:00
|
|
|
Evas_Object *bt_ofl; /* work_offline button */
|
2012-07-05 19:39:11 -07:00
|
|
|
void *st;
|
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
gui = calloc(1, sizeof(gui_elements));
|
2012-05-14 07:37:49 -07:00
|
|
|
|
2012-11-08 22:46:28 -08:00
|
|
|
gui->win = win = elm_win_util_standard_add("client", CLIENT_NAME);
|
2012-05-14 07:37:49 -07:00
|
|
|
elm_win_autodel_set(win, EINA_TRUE);
|
2012-05-20 03:55:47 -07:00
|
|
|
_titlebar_string_set(gui, EINA_FALSE);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
2012-05-16 04:07:04 -07:00
|
|
|
gui->bx = elm_box_add(win);
|
|
|
|
evas_object_size_hint_weight_set(gui->bx,
|
|
|
|
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(gui->bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
elm_win_resize_object_add(win, gui->bx);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
2012-11-08 22:46:33 -08:00
|
|
|
_control_buttons_create(gui, win);
|
2012-06-18 00:22:50 -07:00
|
|
|
panes = elm_panes_add(gui->bx);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(panes, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
2012-05-16 04:07:04 -07:00
|
|
|
elm_box_pack_end(gui->bx, panes);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_show(panes);
|
|
|
|
|
2012-11-08 22:46:33 -08:00
|
|
|
_main_list_create(panes);
|
|
|
|
_property_list_create(panes);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
2012-05-14 07:41:29 -07:00
|
|
|
/* START Add buttom panel */
|
2012-05-16 04:07:04 -07:00
|
|
|
gui->panel = elm_panel_add(win);
|
|
|
|
elm_panel_orient_set(gui->panel, ELM_PANEL_ORIENT_BOTTOM);
|
|
|
|
evas_object_size_hint_weight_set(gui->panel,
|
|
|
|
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(gui->panel, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
elm_panel_hidden_set(gui->panel, EINA_TRUE);
|
|
|
|
elm_win_resize_object_add(win, gui->panel);
|
2012-05-14 07:41:29 -07:00
|
|
|
|
|
|
|
gui->lb = elm_label_add(win);
|
|
|
|
evas_object_size_hint_weight_set(gui->lb, EVAS_HINT_EXPAND, 0);
|
|
|
|
evas_object_size_hint_align_set(gui->lb, EVAS_HINT_FILL, 0);
|
|
|
|
evas_object_show(gui->lb);
|
|
|
|
|
2012-05-16 04:07:04 -07:00
|
|
|
elm_object_content_set(gui->panel, gui->lb);
|
2012-05-14 07:41:29 -07:00
|
|
|
/* END Add buttom panel */
|
|
|
|
|
2012-05-14 07:41:19 -07:00
|
|
|
/* Add progress wheel */
|
|
|
|
gui->pb = elm_progressbar_add(win);
|
|
|
|
elm_object_style_set(gui->pb, "wheel");
|
|
|
|
elm_object_text_set(gui->pb, "Style: wheel");
|
|
|
|
elm_progressbar_pulse(gui->pb, EINA_FALSE);
|
|
|
|
evas_object_size_hint_align_set(gui->pb, 0.5, 0.0);
|
|
|
|
evas_object_size_hint_weight_set(gui->pb,
|
|
|
|
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
2012-05-14 07:41:29 -07:00
|
|
|
elm_win_resize_object_add(win, gui->pb);
|
2012-05-14 07:41:19 -07:00
|
|
|
|
|
|
|
/* Resize and show main window */
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_resize(win, 500, 500);
|
|
|
|
evas_object_show(win);
|
|
|
|
|
|
|
|
evas_object_smart_callback_add(win, "delete,request", client_win_del, NULL);
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-05-14 07:38:18 -07:00
|
|
|
eina_init();
|
|
|
|
ecore_init();
|
2012-12-03 22:57:44 -08:00
|
|
|
ecore_con_init();
|
2012-08-14 04:26:26 -07:00
|
|
|
clouseau_data_init();
|
2012-05-14 07:38:18 -07:00
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
/* START - Popup to get IP, PORT from user */
|
2012-06-18 00:22:43 -07:00
|
|
|
gui->connect_inwin = elm_win_inwin_add(win);
|
|
|
|
evas_object_show(gui->connect_inwin);
|
2012-05-14 07:40:11 -07:00
|
|
|
|
2012-06-18 00:22:43 -07:00
|
|
|
bxx = elm_box_add(gui->connect_inwin);
|
2012-05-14 07:40:11 -07:00
|
|
|
evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bxx);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
lb = elm_label_add(bxx);
|
2012-05-14 07:40:11 -07:00
|
|
|
evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
|
|
|
|
evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0);
|
2012-05-14 07:41:44 -07:00
|
|
|
elm_object_text_set(lb, "Enter remote address[:port]");
|
2012-05-14 07:40:11 -07:00
|
|
|
elm_box_pack_end(bxx, lb);
|
|
|
|
evas_object_show(lb);
|
|
|
|
|
|
|
|
/* Single line selected entry */
|
2012-06-18 00:22:50 -07:00
|
|
|
gui->en = elm_entry_add(bxx);
|
2012-05-14 07:40:11 -07:00
|
|
|
elm_entry_scrollable_set(gui->en, EINA_TRUE);
|
|
|
|
evas_object_size_hint_weight_set(gui->en,
|
|
|
|
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_size_hint_align_set(gui->en, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_object_style_set(gui->connect_inwin, "minimal_vertical");
|
2012-09-09 18:36:12 -07:00
|
|
|
elm_scroller_policy_set(gui->en, ELM_SCROLLER_POLICY_OFF,
|
|
|
|
ELM_SCROLLER_POLICY_OFF);
|
2012-05-14 07:41:44 -07:00
|
|
|
elm_object_text_set(gui->en, LOCALHOST);
|
2012-05-14 07:40:11 -07:00
|
|
|
elm_entry_single_line_set(gui->en, EINA_TRUE);
|
|
|
|
elm_entry_select_all(gui->en);
|
2012-12-26 08:34:13 -08:00
|
|
|
evas_object_smart_callback_add(gui->en, "activated", _ok_bt_clicked, (void *)gui);
|
2012-05-14 07:40:11 -07:00
|
|
|
elm_box_pack_end(bxx, gui->en);
|
|
|
|
evas_object_show(gui->en);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_bx = elm_box_add(bxx);
|
2012-05-14 07:40:11 -07:00
|
|
|
elm_box_horizontal_set(bt_bx, EINA_TRUE);
|
|
|
|
elm_box_homogeneous_set(bt_bx, EINA_TRUE);
|
|
|
|
evas_object_size_hint_align_set(bt_bx, 0.5, 0.5);
|
|
|
|
evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bt_bx);
|
|
|
|
elm_box_pack_end(bxx, bt_bx);
|
|
|
|
|
|
|
|
/* Add the cancel button */
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_cancel = elm_button_add(bt_bx);
|
2012-05-14 07:40:11 -07:00
|
|
|
elm_object_text_set(bt_cancel, "Cancel");
|
|
|
|
evas_object_smart_callback_add(bt_cancel, "clicked",
|
|
|
|
_cancel_bt_clicked, (void *) gui);
|
|
|
|
|
|
|
|
elm_box_pack_end(bt_bx, bt_cancel);
|
|
|
|
evas_object_show(bt_cancel);
|
|
|
|
|
|
|
|
/* Add the OK button */
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_ok = elm_button_add(bt_bx);
|
2012-05-14 07:40:11 -07:00
|
|
|
elm_object_text_set(bt_ok, "OK");
|
|
|
|
evas_object_smart_callback_add(bt_ok, "clicked",
|
|
|
|
_ok_bt_clicked, (void *) gui);
|
|
|
|
|
|
|
|
elm_box_pack_end(bt_bx, bt_ok);
|
|
|
|
evas_object_show(bt_ok);
|
|
|
|
|
2012-06-18 00:22:50 -07:00
|
|
|
bt_ofl = elm_button_add(bt_bx);
|
2012-05-17 06:57:22 -07:00
|
|
|
elm_object_text_set(bt_ofl, "Work Offline");
|
|
|
|
evas_object_smart_callback_add(bt_ofl, "clicked",
|
|
|
|
_ofl_bt_clicked, (void *) gui);
|
|
|
|
|
|
|
|
elm_box_pack_end(bt_bx, bt_ofl);
|
|
|
|
evas_object_show(bt_ofl);
|
|
|
|
|
2012-06-18 00:22:43 -07:00
|
|
|
elm_win_inwin_content_set(gui->connect_inwin, bxx);
|
2012-05-14 07:40:11 -07:00
|
|
|
/* END - Popup to get IP, PORT from user */
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
elm_run();
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-05-14 07:40:41 -07:00
|
|
|
/* cleanup - free apps data */
|
|
|
|
EINA_LIST_FREE(apps, st)
|
|
|
|
_free_app(st);
|
|
|
|
|
2012-06-18 00:22:25 -07:00
|
|
|
EINA_LIST_FREE(bmp_req, st)
|
|
|
|
free(st);
|
|
|
|
|
2012-08-14 04:26:26 -07:00
|
|
|
clouseau_data_shutdown();
|
2012-05-14 07:40:11 -07:00
|
|
|
if (gui->address)
|
|
|
|
free(gui->address);
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
free(gui);
|
2012-06-18 00:22:25 -07:00
|
|
|
|
|
|
|
elm_shutdown();
|
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
ELM_MAIN()
|
|
|
|
#endif
|