308 lines
7.4 KiB
C
308 lines
7.4 KiB
C
#include <e.h>
|
|
|
|
#include "gadgets.h"
|
|
#include "utils.h"
|
|
#include "elfe_config.h"
|
|
|
|
typedef struct _Elfe_Gadget Elfe_Gadget;
|
|
|
|
struct _Elfe_Gadget
|
|
{
|
|
int desktop;
|
|
Evas_Object *layout;
|
|
E_Gadcon_Location *location;
|
|
E_Gadcon *gc;
|
|
Eina_Bool in_use[4][4]; /* FIXME change gor a dynamic and use eina_array instead */
|
|
};
|
|
|
|
static Evas_Object *
|
|
_item_add(Elfe_Gadget *egad, Elfe_Desktop_Item_Type type, const char *name, Evas_Object *child, int col, int row, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
|
|
{
|
|
Elfe_Desktop_Config *dc;
|
|
Elfe_Desktop_Item_Config *dic;
|
|
Evas_Object *ly;
|
|
|
|
if (egad->in_use[col][row] == EINA_TRUE)
|
|
{
|
|
printf("ERROR : already in use\n");
|
|
return NULL;
|
|
}
|
|
|
|
ly = edje_object_add(evas_object_evas_get(egad->layout));
|
|
|
|
switch (type)
|
|
{
|
|
case ELFE_DESKTOP_ITEM_APP:
|
|
edje_object_file_set(ly, elfe_home_cfg->theme, "elfe/desktop/app/frame");
|
|
edje_object_part_text_set(ly, "elfe.text.label", name);
|
|
break;
|
|
case ELFE_DESKTOP_ITEM_GADGET:
|
|
edje_object_file_set(ly, elfe_home_cfg->theme, "elfe/desktop/gadget/frame");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
edje_object_part_swallow(ly, "elfe.swallow.content", child);
|
|
evas_object_show(child);
|
|
evas_object_show(ly);
|
|
|
|
e_layout_pack(egad->layout, ly);
|
|
//evas_object_move(ly, x, y);
|
|
//evas_object_resize(ly, w, h);
|
|
|
|
e_layout_child_move(ly, x, y);
|
|
e_layout_child_resize(ly, w, h);
|
|
|
|
egad->in_use[col][row] = EINA_TRUE;
|
|
|
|
return ly;
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
_gadget_client_add(void *data, const E_Gadcon_Client_Class *cc)
|
|
{
|
|
|
|
Elfe_Gadget *egad = data;
|
|
E_Gadcon_Client *gcc = NULL;
|
|
Evas_Coord ox, oy, ow, oh;
|
|
int i,j;
|
|
Evas_Coord x, y, w, h;
|
|
Evas_Object *ly;
|
|
|
|
/* FIXME cols/row must be a config value */
|
|
evas_object_geometry_get(egad->layout, &ox, &oy, &ow, &oh);
|
|
|
|
w = ow / 4;
|
|
h = oh / 4;
|
|
|
|
for (i = 0; i < 4; i++)
|
|
for (j = 0; j < 4; j++)
|
|
{
|
|
if (!egad->in_use[i][j])
|
|
{
|
|
x = i*w;
|
|
y = j*h;
|
|
gcc = cc->func.init(egad->gc, cc->name, "test", cc->default_style);
|
|
ly = _item_add(egad, ELFE_DESKTOP_ITEM_GADGET, cc->name, gcc->o_base, i, j, x, y, w, h);
|
|
if (ly)
|
|
{
|
|
elfe_home_config_desktop_item_add(egad->desktop, ELFE_DESKTOP_ITEM_GADGET, i, j, x, y, w, h, cc->name);
|
|
return 1;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
_gadget_client_remove(void *data, E_Gadcon_Client *gcc)
|
|
{
|
|
}
|
|
|
|
void
|
|
_gadget_populate_class(void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc)
|
|
{
|
|
|
|
}
|
|
|
|
typedef struct _App_Item App_Item;
|
|
|
|
struct _App_Item
|
|
{
|
|
Efreet_Desktop *desktop;
|
|
Elfe_Gadget *gadget;
|
|
};
|
|
|
|
static void
|
|
_app_mouse_click_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
|
|
{
|
|
App_Item *app_item = data;
|
|
|
|
ecore_exe_run(app_item->desktop->exec, NULL);
|
|
}
|
|
|
|
void
|
|
elfe_gadgets_app_add(Evas_Object *obj, Efreet_Menu *app, Evas_Coord x, Evas_Coord y)
|
|
{
|
|
Elfe_Gadget *egad = evas_object_data_get(obj, "elfe_gadget");
|
|
Evas_Object *ic;
|
|
Evas_Object *ly;
|
|
App_Item *app_item;
|
|
Evas_Coord ox, oy, ow, oh;
|
|
Evas_Coord pos_x, pos_y;
|
|
int m,n;
|
|
Evas_Coord w, h;
|
|
|
|
evas_object_geometry_get(egad->layout, &ox, &oy, &ow, &oh);
|
|
w = ow / 4;
|
|
h = oh / 4;
|
|
|
|
m = (x/w) % 4;
|
|
n = (y/h) % 4;
|
|
|
|
pos_x = m*w;
|
|
pos_y = n*h;
|
|
|
|
ic = elfe_utils_fdo_icon_add(obj, app->icon, MIN(w,h));
|
|
evas_object_show(ic);
|
|
printf("App name : %s\n", app->name);
|
|
ly = _item_add(egad, ELFE_DESKTOP_ITEM_APP, app->icon, ic, m, n, pos_x, pos_y, w, h);
|
|
if (ly)
|
|
{
|
|
elfe_home_config_desktop_item_add(egad->desktop, ELFE_DESKTOP_ITEM_APP, m, n, pos_x, pos_y, w, h, app->desktop->orig_path);
|
|
printf("Desktop path : %s\n", app->desktop->orig_path);
|
|
}
|
|
else
|
|
return;
|
|
|
|
app_item = calloc(1, sizeof(App_Item));
|
|
app_item->gadget = egad;
|
|
app_item->desktop = app->desktop;
|
|
|
|
edje_object_signal_callback_add(ly, "elfe,action,click", "", _app_mouse_click_cb, app_item);
|
|
}
|
|
|
|
void
|
|
elfe_gadgets_gadget_add(Evas_Object *obj, E_Gadcon_Client_Class *gcc)
|
|
{
|
|
Elfe_Gadget *egad = evas_object_data_get(obj, "elfe_gadget");
|
|
|
|
_gadget_client_add(egad, gcc);
|
|
}
|
|
|
|
static void
|
|
_object_resize_cb(void *data , Evas *e , Evas_Object *obj, void *event_info )
|
|
{
|
|
Elfe_Gadget *egad = data;
|
|
Evas_Coord x, y, w, h;
|
|
|
|
|
|
evas_object_geometry_get(egad->layout, &x, &y, &w, &h);
|
|
e_layout_virtual_size_set(egad->layout, w, h);
|
|
printf("%d %d %d %d\n", x, y, w, h);
|
|
|
|
|
|
|
|
evas_object_show(egad->layout);
|
|
}
|
|
|
|
|
|
Evas_Object *
|
|
elfe_gadgets_zone_add(Evas_Object *parent, int desktop, const char *desktop_name)
|
|
{
|
|
const char *location_name;
|
|
Elfe_Gadget *egad;
|
|
int i,j;
|
|
Elfe_Desktop_Config *dc;
|
|
Elfe_Desktop_Item_Config *dic;
|
|
Eina_List *l;
|
|
|
|
egad = calloc(1, sizeof(Elfe_Gadget));
|
|
if (!egad)
|
|
return NULL;
|
|
|
|
egad->layout = e_layout_add(evas_object_evas_get(parent));
|
|
evas_object_data_set(egad->layout, "elfe_gadget", egad);
|
|
evas_object_event_callback_add(egad->layout, EVAS_CALLBACK_RESIZE,
|
|
_object_resize_cb, egad);
|
|
|
|
//e_layout_virtual_size_set(egad->layout, 480, 480);
|
|
|
|
egad->gc = E_OBJECT_ALLOC(E_Gadcon, E_GADCON_TYPE, NULL);
|
|
if (!egad->gc)
|
|
{
|
|
evas_object_del(egad->layout);
|
|
free(egad);
|
|
return NULL;
|
|
}
|
|
|
|
/* FIXME already done by calloc ? */
|
|
for (i = 0; i < 4; i++)
|
|
for (j = 0; j < 4; j++)
|
|
egad->in_use[i][j] = EINA_FALSE;
|
|
|
|
|
|
location_name = eina_stringshare_printf("Elfe %s\n", desktop_name);
|
|
egad->desktop = desktop;
|
|
egad->location = e_gadcon_location_new (location_name, E_GADCON_SITE_DESKTOP,
|
|
_gadget_client_add, egad,
|
|
_gadget_client_remove, NULL);
|
|
eina_stringshare_del(location_name);
|
|
e_gadcon_location_set_icon_name(egad->location, "preferences-desktop");
|
|
e_gadcon_location_register(egad->location);
|
|
|
|
egad->gc->name = eina_stringshare_add(location_name);
|
|
egad->gc->layout_policy = E_GADCON_LAYOUT_POLICY_PANEL;
|
|
egad->gc->orient = E_GADCON_ORIENT_FLOAT;
|
|
egad->gc->location = egad->location;
|
|
egad->gc->evas = evas_object_evas_get(parent);
|
|
e_gadcon_populate_callback_set(egad->gc, _gadget_populate_class, egad->gc);
|
|
egad->gc->id = 0;
|
|
egad->gc->edje.o_parent = NULL;
|
|
egad->gc->edje.swallow_name = NULL;
|
|
egad->gc->shelf = NULL;
|
|
egad->gc->toolbar = NULL;
|
|
egad->gc->editing = 0;
|
|
egad->gc->o_container = NULL;
|
|
egad->gc->frame_request.func = NULL;
|
|
egad->gc->resize_request.func = NULL;
|
|
egad->gc->min_size_request.func = NULL;
|
|
e_gadcon_custom_new(egad->gc);
|
|
|
|
/* Fill zone with config items*/
|
|
dc = eina_list_nth(elfe_home_cfg->desktops, egad->desktop);
|
|
EINA_LIST_FOREACH(dc->items, l, dic)
|
|
{
|
|
Evas_Object *child = NULL;
|
|
Efreet_Desktop *desktop;
|
|
|
|
switch (dic->type)
|
|
{
|
|
case ELFE_DESKTOP_ITEM_APP:
|
|
{
|
|
Evas_Object *ly;
|
|
App_Item *app_item;
|
|
|
|
desktop = efreet_desktop_get(dic->name);
|
|
|
|
child = elfe_utils_fdo_icon_add(egad->layout, desktop->icon, MIN(dic->size_w,dic->size_h));
|
|
evas_object_show(child);
|
|
|
|
|
|
ly = _item_add(egad, dic->type, desktop->name,
|
|
child, dic->col, dic->row,
|
|
dic->pos_x, dic->pos_y,
|
|
dic->size_w, dic->size_h);
|
|
|
|
app_item = calloc(1, sizeof(App_Item));
|
|
app_item->gadget = egad;
|
|
app_item->desktop = desktop;
|
|
|
|
edje_object_signal_callback_add(ly, "elfe,action,click", "", _app_mouse_click_cb, app_item);
|
|
|
|
break;
|
|
}
|
|
case ELFE_DESKTOP_ITEM_GADGET:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
printf("%p %d %d %d %d %d %d\n", child, dic->col, dic->row,
|
|
dic->pos_x, dic->pos_y,
|
|
dic->size_w, dic->size_h);
|
|
|
|
|
|
}
|
|
|
|
|
|
return egad->layout;
|
|
}
|