2012-05-14 07:37:49 -07:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <Ecore.h>
|
2012-05-14 07:38:31 -07:00
|
|
|
#include <Ecore_Ipc.h>
|
2012-05-14 07:38:02 -07:00
|
|
|
#include <Eina.h>
|
2012-05-14 07:37:49 -07:00
|
|
|
#include <Edje.h>
|
|
|
|
#include <Evas.h>
|
|
|
|
#include <Elementary.h>
|
2012-05-14 07:39:49 -07:00
|
|
|
#include <stdint.h>
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
#include "libclouseau.h"
|
2012-05-14 07:38:02 -07:00
|
|
|
#include "helper.h" /* Our own helper functions */
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
struct _app_data_st
|
|
|
|
{
|
|
|
|
Variant_st *app; /* app->data is (app_info_st *) */
|
|
|
|
Variant_st *td; /* tree->data is (tree_data_st *) */
|
|
|
|
};
|
|
|
|
typedef struct _app_data_st app_data_st;
|
|
|
|
|
|
|
|
struct _gui_elements
|
|
|
|
{
|
|
|
|
Evas_Object *dd_list;
|
|
|
|
Evas_Object *gl;
|
|
|
|
Evas_Object *prop_list;
|
2012-05-14 07:40:11 -07:00
|
|
|
Evas_Object *inwin;
|
|
|
|
Evas_Object *en;
|
|
|
|
char *address;
|
2012-05-14 07:39:38 -07:00
|
|
|
app_data_st *sel_app; /* Currently selected app data */
|
|
|
|
};
|
|
|
|
typedef struct _gui_elements gui_elements;
|
|
|
|
|
|
|
|
static int _load_list(gui_elements *gui);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
/* Globals */
|
2012-05-14 07:39:38 -07:00
|
|
|
static gui_elements *gui = NULL;
|
|
|
|
static Eina_List *apps= NULL; /* List of (app_data_st *) */
|
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-05-14 07:38:02 -07:00
|
|
|
Eina_Bool
|
2012-05-14 07:40:26 -07:00
|
|
|
_add(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Add *ev)
|
2012-05-14 07:38:02 -07:00
|
|
|
{
|
2012-05-14 07:38:35 -07:00
|
|
|
void *p;
|
|
|
|
int size = 0;
|
|
|
|
|
2012-05-14 07:38:39 -07:00
|
|
|
ecore_ipc_server_data_size_max_set(ev->server, -1);
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
connect_st t = { getpid(), __FILE__ };
|
|
|
|
p = packet_compose(GUI_CLIENT_CONNECT, &t, sizeof(t), &size);
|
2012-05-14 07:38:49 -07:00
|
|
|
if (p)
|
|
|
|
{
|
|
|
|
ecore_ipc_server_send(ev->server, 0,0,0,0,EINA_FALSE, p, size);
|
|
|
|
ecore_ipc_server_flush(ev->server);
|
|
|
|
free(p);
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:38:02 -07:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Eina_Bool
|
2012-05-14 07:40:26 -07:00
|
|
|
_del(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Del *ev)
|
2012-05-14 07:38:02 -07:00
|
|
|
{
|
|
|
|
if (!ev->server)
|
|
|
|
{
|
|
|
|
printf("Failed to establish connection to the server.\nExiting.\n");
|
|
|
|
ecore_main_loop_quit();
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:38:31 -07:00
|
|
|
printf("Lost server with ip %s!\n", ecore_ipc_server_ip_get(ev->server));
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-05-14 07:38:31 -07:00
|
|
|
ecore_ipc_server_del(ev->server);
|
2012-05-14 07:38:02 -07:00
|
|
|
|
|
|
|
ecore_main_loop_quit();
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:38:52 -07:00
|
|
|
|
|
|
|
static Eina_Bool
|
2012-05-14 07:39:35 -07:00
|
|
|
_load_gui_with_list(Evas_Object *gl, Eina_List *trees)
|
2012-05-14 07:38:52 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Tree_Item *treeit;
|
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: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;
|
|
|
|
elm_genlist_item_append(gl, &itc, treeit, NULL,
|
|
|
|
glflag, NULL, NULL);
|
|
|
|
}
|
2012-05-14 07:39:23 -07:00
|
|
|
|
2012-05-14 07:38:52 -07:00
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
app_info_st *app = st->app->data;
|
|
|
|
if (gui->sel_app != st)
|
|
|
|
{ /* Reload only of selected some other app */
|
|
|
|
gui->sel_app = st;
|
|
|
|
|
|
|
|
char *str = malloc(strlen(app->name)+32);
|
|
|
|
sprintf(str, "%s [%d]", app->name, app->pid);
|
|
|
|
elm_object_text_set(pobj, str);
|
|
|
|
free(str);
|
|
|
|
|
|
|
|
_load_list(gui);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_app_ptr_cmp(const void *d1, const void *d2)
|
|
|
|
{
|
|
|
|
const app_data_st *info = d1;
|
|
|
|
app_info_st *app = info->app->data;
|
|
|
|
|
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 */
|
|
|
|
app_info_st *app = st->app->data;
|
|
|
|
|
|
|
|
char *str = malloc(strlen(app->name)+32);
|
|
|
|
sprintf(str, "%s [%d]", app->name, app->pid);
|
|
|
|
elm_hoversel_item_add(dd_list, str, NULL, ELM_ICON_NONE,
|
|
|
|
_set_selected_app, st);
|
|
|
|
|
|
|
|
free(str);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:38 -07:00
|
|
|
_add_app(gui_elements *g, Variant_st *v)
|
2012-05-14 07:39:38 -07:00
|
|
|
{
|
|
|
|
app_data_st *st = malloc(sizeof(app_data_st));
|
|
|
|
st->app = v;
|
|
|
|
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-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:38 -07:00
|
|
|
_remove_app(gui_elements *g, Variant_st *v)
|
2012-05-14 07:39:38 -07:00
|
|
|
{
|
|
|
|
app_closed_st *app = v->data;
|
2012-05-14 07:40:38 -07:00
|
|
|
app_info_st *sel_app = g->sel_app->app->data;
|
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
|
|
|
|
|
|
|
if (app->ptr == sel_app->ptr)
|
|
|
|
{
|
2012-05-14 07:40:38 -07:00
|
|
|
elm_object_text_set(g->dd_list, "SELECT APP");
|
|
|
|
elm_genlist_clear(g->gl);
|
|
|
|
elm_genlist_clear(g->prop_list);
|
|
|
|
g->sel_app = NULL;
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (st)
|
|
|
|
{ /* Remove from list and free all variants */
|
|
|
|
/* TODO: Remove app from Drop Down List */
|
|
|
|
apps = eina_list_remove(apps, st);
|
|
|
|
free(st->app);
|
|
|
|
if (st->td)
|
|
|
|
free(st->td);
|
|
|
|
|
|
|
|
free(st);
|
|
|
|
|
2012-05-14 07:40:38 -07:00
|
|
|
if (!elm_hoversel_expanded_get(g->dd_list))
|
2012-05-14 07:39:38 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
2012-05-14 07:40:38 -07:00
|
|
|
elm_hoversel_clear(g->dd_list);
|
2012-05-14 07:39:38 -07:00
|
|
|
EINA_LIST_FOREACH(apps, l , st)
|
2012-05-14 07:40:38 -07:00
|
|
|
_add_app_to_dd_list(g->dd_list, st);
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
free(v);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:38 -07:00
|
|
|
_update_tree(gui_elements *g, Variant_st *v)
|
2012-05-14 07:39:38 -07:00
|
|
|
{ /* Update Tree for app, then update GUI if its displayed */
|
|
|
|
tree_data_st *td = v->data;
|
|
|
|
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) td->app);
|
2012-05-14 07:39:38 -07:00
|
|
|
|
|
|
|
if (st)
|
|
|
|
{
|
|
|
|
if (st->td)
|
|
|
|
free(st->td);
|
|
|
|
|
|
|
|
st->td = v;
|
|
|
|
|
2012-05-14 07:40:38 -07:00
|
|
|
elm_genlist_clear(g->gl);
|
|
|
|
_load_gui_with_list(g->gl, td->tree);
|
2012-05-14 07:39:38 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:38:02 -07:00
|
|
|
Eina_Bool
|
2012-05-14 07:40:26 -07:00
|
|
|
_data(void *data, int type EINA_UNUSED, Ecore_Ipc_Event_Server_Data *ev)
|
2012-05-14 07:38:02 -07:00
|
|
|
{
|
2012-05-14 07:38:49 -07:00
|
|
|
Variant_st *v = packet_info_get(ev->data, ev->size);
|
2012-05-14 07:40:02 -07:00
|
|
|
|
2012-05-14 07:38:42 -07:00
|
|
|
if (v)
|
|
|
|
{
|
|
|
|
switch(packet_mapping_type_get(v->t.type))
|
|
|
|
{
|
2012-05-14 07:39:38 -07:00
|
|
|
case APP_ADD: /* Add info to list of APPs */
|
|
|
|
_add_app(data, v); /* v->data is (app_info_st *) */
|
|
|
|
break;
|
|
|
|
|
|
|
|
case APP_CLOSED: /* Remove and free APP info */
|
|
|
|
_remove_app(data, v); /* v->data is (app_closed_st *) */
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TREE_DATA: /* Update genlist with APP TREE info */
|
|
|
|
_update_tree(data, v); /* data is the gui pointer */
|
|
|
|
break; /* v->data is (tree_data_st *) */
|
2012-05-14 07:40:38 -07:00
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
2012-05-14 07:38:42 -07:00
|
|
|
}
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
/* free(v) - freed when removed from app list */
|
2012-05-14 07:38:35 -07:00
|
|
|
}
|
2012-05-14 07:38:02 -07:00
|
|
|
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
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);
|
|
|
|
Tree_Item *parent = elm_object_item_data_get(glit);
|
|
|
|
Tree_Item *treeit;
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
Tree_Item *treeit = data;
|
|
|
|
|
|
|
|
if (!treeit->is_obj)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!strcmp(part, "elm.swallow.icon"))
|
|
|
|
{
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
|
|
|
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-05-14 07:37:49 -07:00
|
|
|
elm_icon_file_set(ic, buf, NULL);
|
|
|
|
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-05-14 07:37:49 -07:00
|
|
|
elm_icon_file_set(ic, buf, NULL);
|
|
|
|
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-05-14 07:37:49 -07:00
|
|
|
elm_icon_file_set(ic, buf, NULL);
|
|
|
|
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-05-14 07:37:49 -07:00
|
|
|
elm_icon_file_set(ic, buf, NULL);
|
|
|
|
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
|
|
|
{
|
|
|
|
Tree_Item *treeit = data;
|
|
|
|
char buf[256];
|
|
|
|
snprintf(buf, sizeof(buf), "%p %s", treeit->ptr, treeit->name);
|
|
|
|
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-05-14 07:38:31 -07:00
|
|
|
static Ecore_Ipc_Server *
|
2012-05-14 07:40:38 -07:00
|
|
|
_connect_to_daemon(gui_elements *g)
|
2012-05-14 07:38:18 -07:00
|
|
|
{
|
2012-05-14 07:38:31 -07:00
|
|
|
static Ecore_Ipc_Server *svr = NULL;
|
|
|
|
if (svr && ecore_ipc_server_connected_get(svr))
|
2012-05-14 07:38:18 -07:00
|
|
|
return svr; /* Already connected */
|
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
int port = PORT;
|
|
|
|
char *address = LOCALHOST;
|
|
|
|
char *p_colon = NULL;
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
svr = ecore_ipc_server_connect(ECORE_IPC_REMOTE_SYSTEM,
|
|
|
|
address, port, NULL);
|
|
|
|
|
|
|
|
if (p_colon)
|
|
|
|
*p_colon = ':';
|
|
|
|
|
2012-05-14 07:40:15 -07:00
|
|
|
if ((!svr) || (!ecore_ipc_server_connected_get(svr)))
|
2012-05-14 07:38:18 -07:00
|
|
|
{
|
2012-05-14 07:40:38 -07:00
|
|
|
printf("could not connect to the server: %s\n", g->address);
|
2012-05-14 07:38:18 -07:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
|
2012-05-14 07:38:39 -07:00
|
|
|
ecore_ipc_server_data_size_max_set(svr, -1);
|
|
|
|
|
2012-05-14 07:38:18 -07:00
|
|
|
/* set event handler for server connect */
|
2012-05-14 07:40:38 -07:00
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb)_add, g);
|
2012-05-14 07:38:18 -07:00
|
|
|
/* set event handler for server disconnect */
|
2012-05-14 07:40:38 -07:00
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, (Ecore_Event_Handler_Cb)_del, g);
|
2012-05-14 07:38:18 -07:00
|
|
|
/* set event handler for receiving server data */
|
2012-05-14 07:40:38 -07:00
|
|
|
ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA, (Ecore_Event_Handler_Cb)_data, g);
|
2012-05-14 07:38:18 -07:00
|
|
|
|
|
|
|
return svr;
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:39:42 -07:00
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
_gl_selected(void *data EINA_UNUSED, Evas_Object *pobj EINA_UNUSED,
|
2012-05-14 07:39:42 -07:00
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
// clouseau_obj_information_list_clear();
|
|
|
|
/* If not an object, return. */
|
|
|
|
if (!elm_genlist_item_parent_get(event_info))
|
|
|
|
return;
|
|
|
|
|
|
|
|
Tree_Item *treeit = elm_object_item_data_get(event_info);
|
|
|
|
|
|
|
|
/* START - replacing libclouseau_highlight(obj); */
|
|
|
|
int size;
|
|
|
|
gui_elements *g = data;
|
|
|
|
app_info_st *app = g->sel_app->app->data;
|
2012-05-14 07:39:49 -07:00
|
|
|
highlight_st st = { (unsigned long long) (uintptr_t) app->ptr,
|
|
|
|
(unsigned long long) (uintptr_t) treeit->ptr };
|
|
|
|
|
2012-05-14 07:39:42 -07:00
|
|
|
Ecore_Ipc_Server *svr = _connect_to_daemon(g);
|
|
|
|
void *p = packet_compose(HIGHLIGHT, &st, sizeof(st), &size);
|
|
|
|
if (p)
|
|
|
|
{
|
|
|
|
ecore_ipc_server_send(svr,
|
|
|
|
0,0,0,0,EINA_FALSE, p, size);
|
|
|
|
ecore_ipc_server_flush(svr);
|
|
|
|
free(p);
|
|
|
|
}
|
|
|
|
/* END - replacing libclouseau_highlight(obj); */
|
|
|
|
|
|
|
|
clouseau_obj_information_list_populate(treeit);
|
|
|
|
}
|
|
|
|
|
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-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);
|
|
|
|
app_info_st *st = g->sel_app->app->data;
|
2012-05-14 07:39:38 -07:00
|
|
|
|
2012-05-14 07:39:49 -07:00
|
|
|
if (eina_list_search_unsorted(apps, _app_ptr_cmp,
|
|
|
|
(void *) (uintptr_t) st->ptr))
|
2012-05-14 07:39:38 -07:00
|
|
|
{ /* do it only if app selected AND found in apps list */
|
|
|
|
int size;
|
2012-05-14 07:40:38 -07:00
|
|
|
Ecore_Ipc_Server *svr = _connect_to_daemon(g);
|
2012-05-14 07:39:49 -07:00
|
|
|
data_req_st t = { (unsigned long long) (uintptr_t) NULL,
|
|
|
|
(unsigned long long) (uintptr_t) st->ptr };
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
void *p = packet_compose(DATA_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);
|
|
|
|
}
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
{
|
|
|
|
elm_object_text_set(obj, "Reload");
|
|
|
|
_load_list(data);
|
|
|
|
}
|
|
|
|
|
2012-05-14 07:40:11 -07:00
|
|
|
static void
|
|
|
|
_dismiss_inwin(gui_elements *g)
|
|
|
|
{
|
|
|
|
g->address = strdup(elm_entry_entry_get(g->en));
|
|
|
|
evas_object_del(g->inwin);
|
|
|
|
g->en = NULL;
|
|
|
|
g->inwin = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
_cancel_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
2012-05-14 07:40:11 -07:00
|
|
|
{
|
|
|
|
_dismiss_inwin(data);
|
|
|
|
elm_exit(); /* exit the program's main loop that runs in elm_run() */
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-05-14 07:40:26 -07:00
|
|
|
_ok_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
2012-05-14 07:40:11 -07:00
|
|
|
{ /* Set the IP, PORT, then connect to server */
|
|
|
|
_dismiss_inwin(data);
|
|
|
|
|
|
|
|
if(!_connect_to_daemon(gui))
|
|
|
|
{
|
|
|
|
printf("Failed to connect to server.\n");
|
|
|
|
elm_exit(); /* exit the program's main loop that runs in elm_run() */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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 */
|
2012-05-14 07:40:11 -07:00
|
|
|
Evas_Object *win, *bg, *panes, *bx, *bt,
|
|
|
|
*show_hidden_check, *show_clippers_check;
|
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;
|
|
|
|
|
|
|
|
gui = calloc(1, sizeof(gui_elements));
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
win = elm_win_add(NULL, "client", ELM_WIN_BASIC);
|
|
|
|
elm_win_autodel_set(win, EINA_TRUE);
|
|
|
|
elm_win_title_set(win, "client");
|
|
|
|
|
|
|
|
bg = elm_bg_add(win);
|
|
|
|
elm_win_resize_object_add(win, bg);
|
|
|
|
evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bg);
|
|
|
|
|
|
|
|
bx = elm_box_add(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);
|
|
|
|
elm_win_resize_object_add(win, bx);
|
|
|
|
evas_object_show(bx);
|
|
|
|
|
|
|
|
/* Control buttons */
|
|
|
|
{
|
|
|
|
Evas_Object *hbx;
|
|
|
|
|
|
|
|
hbx = elm_box_add(bx);
|
|
|
|
evas_object_size_hint_align_set(hbx, 0.0, 0.5);
|
|
|
|
elm_box_horizontal_set(hbx, EINA_TRUE);
|
|
|
|
elm_box_pack_end(bx, hbx);
|
|
|
|
elm_box_padding_set(hbx, 10, 0);
|
|
|
|
evas_object_show(hbx);
|
|
|
|
|
|
|
|
bt = elm_button_add(hbx);
|
2012-05-14 07:37:56 -07:00
|
|
|
evas_object_size_hint_align_set(bt, 0.0, 0.3);
|
2012-05-14 07:37:49 -07:00
|
|
|
elm_object_text_set(bt, "Load");
|
|
|
|
elm_box_pack_end(hbx, bt);
|
|
|
|
evas_object_show(bt);
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
gui->dd_list = elm_hoversel_add(win);
|
|
|
|
elm_hoversel_hover_parent_set(gui->dd_list, win);
|
|
|
|
elm_object_text_set(gui->dd_list, "SELECT APP");
|
2012-05-14 07:37:56 -07:00
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
evas_object_size_hint_align_set(gui->dd_list, 0.0, 0.3);
|
|
|
|
elm_box_pack_end(hbx, gui->dd_list);
|
|
|
|
evas_object_show(gui->dd_list);
|
2012-05-14 07:37:56 -07:00
|
|
|
|
2012-05-14 07:37:49 -07:00
|
|
|
show_hidden_check = elm_check_add(hbx);
|
|
|
|
elm_object_text_set(show_hidden_check, "Show Hidden");
|
|
|
|
elm_check_state_set(show_hidden_check, list_show_hidden);
|
|
|
|
elm_box_pack_end(hbx, show_hidden_check);
|
|
|
|
evas_object_show(show_hidden_check);
|
|
|
|
|
|
|
|
show_clippers_check = elm_check_add(hbx);
|
|
|
|
elm_object_text_set(show_clippers_check, "Show Clippers");
|
|
|
|
elm_check_state_set(show_clippers_check, list_show_clippers);
|
|
|
|
elm_box_pack_end(hbx, show_clippers_check);
|
|
|
|
evas_object_show(show_clippers_check);
|
|
|
|
}
|
|
|
|
|
|
|
|
panes = elm_panes_add(win);
|
|
|
|
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);
|
|
|
|
elm_box_pack_end(bx, panes);
|
|
|
|
evas_object_show(panes);
|
|
|
|
|
|
|
|
/* The main list */
|
|
|
|
{
|
2012-05-14 07:39:38 -07:00
|
|
|
gui->gl = elm_genlist_add(panes);
|
|
|
|
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);
|
|
|
|
|
|
|
|
evas_object_smart_callback_add(bt, "clicked", _bt_clicked, gui);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_smart_callback_add(show_hidden_check, "changed",
|
2012-05-14 07:39:38 -07:00
|
|
|
_show_hidden_check_changed, gui);
|
2012-05-14 07:37:49 -07:00
|
|
|
evas_object_smart_callback_add(show_clippers_check, "changed",
|
2012-05-14 07:39:38 -07:00
|
|
|
_show_clippers_check_changed, gui);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2012-05-14 07:39:38 -07:00
|
|
|
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,
|
2012-05-14 07:39:42 -07:00
|
|
|
"selected", _gl_selected, gui);
|
2012-05-14 07:37:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Properties list */
|
|
|
|
{
|
|
|
|
Evas_Object *prop_list = NULL;
|
2012-05-14 07:38:55 -07:00
|
|
|
prop_list = clouseau_obj_information_list_add(panes);
|
2012-05-14 07:39:38 -07:00
|
|
|
gui->prop_list = prop_list;
|
|
|
|
evas_object_size_hint_align_set(prop_list,
|
|
|
|
EVAS_HINT_FILL, EVAS_HINT_FILL);
|
|
|
|
evas_object_size_hint_weight_set(prop_list,
|
|
|
|
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
2012-05-14 07:37:49 -07:00
|
|
|
|
|
|
|
elm_object_part_content_set(panes, "right", prop_list);
|
|
|
|
evas_object_show(prop_list);
|
|
|
|
}
|
|
|
|
|
|
|
|
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-05-14 07:38:31 -07:00
|
|
|
ecore_ipc_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 */
|
|
|
|
gui->inwin = elm_win_inwin_add(win);
|
|
|
|
evas_object_show(gui->inwin);
|
|
|
|
|
|
|
|
bxx = elm_box_add(gui->inwin);
|
|
|
|
evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
|
|
|
|
evas_object_show(bxx);
|
|
|
|
|
|
|
|
lb = elm_label_add(gui->inwin);
|
|
|
|
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, "Enter host IP:PORT");
|
|
|
|
elm_box_pack_end(bxx, lb);
|
|
|
|
evas_object_show(lb);
|
|
|
|
|
|
|
|
/* Single line selected entry */
|
|
|
|
char buf[32];
|
|
|
|
gui->en = elm_entry_add(gui->inwin);
|
|
|
|
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);
|
|
|
|
elm_object_style_set(gui->inwin, "minimal_vertical");
|
|
|
|
elm_entry_scrollbar_policy_set(gui->en, ELM_SCROLLER_POLICY_OFF,
|
|
|
|
ELM_SCROLLER_POLICY_OFF);
|
|
|
|
sprintf(buf, "%s:%d", LOCALHOST, PORT);
|
|
|
|
elm_object_text_set(gui->en, buf);
|
|
|
|
elm_entry_single_line_set(gui->en, EINA_TRUE);
|
|
|
|
elm_entry_select_all(gui->en);
|
|
|
|
elm_box_pack_end(bxx, gui->en);
|
|
|
|
evas_object_show(gui->en);
|
|
|
|
|
|
|
|
bt_bx = elm_box_add(gui->inwin);
|
|
|
|
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 */
|
|
|
|
bt_cancel = elm_button_add(gui->inwin);
|
|
|
|
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 */
|
|
|
|
bt_ok = elm_button_add(gui->inwin);
|
|
|
|
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);
|
|
|
|
|
|
|
|
elm_win_inwin_content_set(gui->inwin, bxx);
|
|
|
|
/* 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();
|
|
|
|
elm_shutdown();
|
2012-05-14 07:38:02 -07:00
|
|
|
|
2012-05-14 07:39:26 -07:00
|
|
|
data_descriptors_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-05-14 07:37:49 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
ELM_MAIN()
|
|
|
|
#endif
|