411 lines
11 KiB
C
411 lines
11 KiB
C
#include <e.h>
|
|
#include <Elementary.h>
|
|
|
|
#include "gadgets.h"
|
|
#include "elfe_config.h"
|
|
|
|
#define ELFE_DESKTOP_NUM 5
|
|
#define ELFE_DESKTOP_PADDING_W 10
|
|
#define ELFE_DESKTOP_PADDING_H 10
|
|
|
|
typedef struct _Elfe_Desktop Elfe_Desktop;
|
|
|
|
struct _Elfe_Desktop
|
|
{
|
|
Evas_Object *layout;
|
|
Evas_Object *sc;
|
|
Eina_List *pads;
|
|
Eina_List *gadgets;
|
|
Evas_Object *selector;
|
|
Eina_List *selector_objs;
|
|
int current_desktop;
|
|
Ecore_Timer *longpress_timer;
|
|
Eina_Bool on_hold;
|
|
Eina_Bool edit_mode;
|
|
Eina_List *overs;
|
|
};
|
|
|
|
|
|
static Elfe_Desktop *desk;
|
|
|
|
static void
|
|
_scroller_edge_left_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
|
|
}
|
|
|
|
static void
|
|
_scroller_edge_right_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
|
|
}
|
|
|
|
|
|
static void
|
|
_scroller_scroll_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
|
|
}
|
|
|
|
|
|
static void
|
|
_scroller_scroll_anim_start_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
|
|
}
|
|
|
|
static void
|
|
_scroller_scroll_anim_stop_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
Elfe_Desktop *desk = data;
|
|
Evas_Coord x, y, w, h;
|
|
int num;
|
|
int i;
|
|
|
|
|
|
elm_scroller_region_get(desk->sc, &x, &y, &w, &h);
|
|
|
|
|
|
for (i = 0; i < ELFE_DESKTOP_NUM; i++)
|
|
{
|
|
Evas_Object *o_edje = elm_layout_edje_get(eina_list_nth(desk->selector_objs, i));
|
|
if ( (x < ((i+1) * w)) && (x >= ( i * w)))
|
|
{
|
|
desk->current_desktop = i;
|
|
edje_object_signal_emit(o_edje, "select", "elfe");
|
|
}
|
|
else
|
|
{
|
|
edje_object_signal_emit(o_edje, "unselect", "elfe");
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
_scroller_scroll_drag_start_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
|
|
}
|
|
|
|
static void
|
|
_scroller_scroll_drag_stop_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
|
|
}
|
|
|
|
static Eina_Bool
|
|
_longpress_timer_cb(void *data)
|
|
{
|
|
Elfe_Desktop *desk = data;
|
|
|
|
/* Logpress action */
|
|
|
|
evas_object_smart_callback_call(desk->layout,
|
|
"longpressed", NULL);
|
|
|
|
desk->longpress_timer = NULL;
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
}
|
|
|
|
static void
|
|
_scroller_mouse_move_cb(void *data,Evas *evas, Evas_Object *obj, void *event_info)
|
|
{
|
|
Elfe_Desktop *desk = data;
|
|
Evas_Event_Mouse_Move *ev = event_info;
|
|
|
|
if (!desk->on_hold)
|
|
{
|
|
desk->on_hold = EINA_FALSE;
|
|
}
|
|
if (desk->longpress_timer)
|
|
{
|
|
ecore_timer_del(desk->longpress_timer);
|
|
desk->longpress_timer = NULL;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
static void
|
|
_scroller_mouse_up_cb(void *data,Evas *evas, Evas_Object *obj, void *event_info)
|
|
{
|
|
Elfe_Desktop *desk = data;
|
|
|
|
desk->on_hold = EINA_FALSE;
|
|
if (desk->longpress_timer)
|
|
{
|
|
ecore_timer_del(desk->longpress_timer);
|
|
desk->longpress_timer = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
_scroller_mouse_down_cb(void *data,Evas *evas, Evas_Object *obj, void *event_info)
|
|
{
|
|
Elfe_Desktop *desk = data;
|
|
Evas_Event_Mouse_Down *ev = event_info;
|
|
|
|
desk->on_hold = EINA_TRUE;
|
|
if (desk->longpress_timer)
|
|
ecore_timer_del(desk->longpress_timer);
|
|
desk->longpress_timer = ecore_timer_add(1.0, _longpress_timer_cb, desk);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
_cb_object_resize(void *data , Evas *e , Evas_Object *obj, void *event_info )
|
|
{
|
|
Elfe_Desktop *desk = data;
|
|
Evas_Coord x, y, w, h;
|
|
Eina_Array *pad;
|
|
Eina_List *l;
|
|
Evas_Object *gad;
|
|
|
|
evas_object_geometry_get(obj, &x, &y, &w, &h);
|
|
EINA_LIST_FOREACH(desk->pads, l, pad)
|
|
{
|
|
evas_object_size_hint_min_set(eina_array_data_get(pad, 0), w - 2 * ELFE_DESKTOP_PADDING_W , ELFE_DESKTOP_PADDING_H);
|
|
evas_object_size_hint_min_set(eina_array_data_get(pad, 1), w - 2 * ELFE_DESKTOP_PADDING_W , ELFE_DESKTOP_PADDING_H);
|
|
evas_object_size_hint_min_set(eina_array_data_get(pad, 2), ELFE_DESKTOP_PADDING_W , h - 2 * ELFE_DESKTOP_PADDING_H);
|
|
evas_object_size_hint_min_set(eina_array_data_get(pad, 3), ELFE_DESKTOP_PADDING_W ,h - 2 * ELFE_DESKTOP_PADDING_H);
|
|
|
|
}
|
|
EINA_LIST_FOREACH(desk->gadgets, l, gad)
|
|
{
|
|
evas_object_size_hint_min_set(gad, w - 2 * ELFE_DESKTOP_PADDING_W, h - 2 * ELFE_DESKTOP_PADDING_H);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
static void
|
|
_gadget_selected_cb(void *data , Evas_Object *obj, void *event_info )
|
|
{
|
|
E_Gadcon_Client_Class *gcc = data;
|
|
Evas_Object *gad;
|
|
|
|
gad = eina_list_nth(desk->gadgets, desk->current_desktop);
|
|
elfe_gadgets_gadget_add(gad, gcc);
|
|
evas_object_smart_callback_call(desk->layout,
|
|
"gadget,added", NULL);
|
|
}
|
|
|
|
void
|
|
elfe_desktop_app_add(Evas_Object *obj, Efreet_Menu *menu, Evas_Coord x, Evas_Coord y)
|
|
{
|
|
Elfe_Desktop *desk = evas_object_data_get(obj, "elfe_desktop");
|
|
Evas_Object *gad;
|
|
gad = eina_list_nth(desk->gadgets, desk->current_desktop);
|
|
elfe_gadgets_app_add(gad, menu, x, y);
|
|
}
|
|
|
|
Evas_Object *
|
|
elfe_desktop_gadget_list(Evas_Object *obj)
|
|
{
|
|
Elfe_Desktop *desk = evas_object_data_get(obj, "elfe_desktop");
|
|
Evas_Object *list;
|
|
E_Gadcon_Client_Class *gcc = NULL;
|
|
Eina_List *l;
|
|
Evas_Object *icon = NULL, *end;
|
|
const char *lbl = NULL;
|
|
|
|
list = elm_list_add(obj);
|
|
EINA_LIST_FOREACH(e_gadcon_provider_list(), l, gcc)
|
|
{
|
|
if (gcc->func.label) lbl = gcc->func.label(gcc);
|
|
if (!lbl) lbl = gcc->name;
|
|
if (gcc->func.icon) icon = gcc->func.icon(gcc, evas_object_evas_get(obj));
|
|
evas_object_size_hint_min_set(icon, 48, 48);
|
|
elm_list_item_append(list, lbl, icon, NULL, _gadget_selected_cb, gcc);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
Evas_Object *
|
|
elfe_desktop_add(Evas_Object *parent, E_Zone *zone)
|
|
{
|
|
Evas_Object *tb, *pad, *bx, *ly;
|
|
|
|
int i;
|
|
Evas_Coord x, y, w, h;
|
|
const char *desktop_name;
|
|
Evas_Object *gad;
|
|
char buf[4096];
|
|
|
|
snprintf(buf, sizeof(buf), "%s/default.edj",
|
|
elfe_home_cfg->mod_dir);
|
|
|
|
desk = calloc(1, sizeof(Elfe_Desktop));
|
|
|
|
desk->layout = elm_layout_add(parent);
|
|
elm_layout_file_set(desk->layout, buf, "elfe/desktop/layout");
|
|
|
|
desk->sc = elm_scroller_add(parent);
|
|
elm_scroller_bounce_set(desk->sc, EINA_TRUE, EINA_FALSE);
|
|
elm_scroller_policy_set(desk->sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
|
|
elm_scroller_page_relative_set(desk->sc, 1.0, 1.0);
|
|
|
|
bx = elm_box_add(desk->sc);
|
|
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_box_homogenous_set(bx, EINA_TRUE);
|
|
elm_box_horizontal_set(bx, EINA_TRUE);
|
|
|
|
desk->selector = elm_box_add(desk->layout);
|
|
elm_box_homogenous_set(desk->selector, EINA_TRUE);
|
|
elm_box_horizontal_set(desk->selector, EINA_TRUE);
|
|
evas_object_show(desk->selector);
|
|
|
|
for (i = 0; i < ELFE_DESKTOP_NUM; i++)
|
|
{
|
|
Eina_Array *pad_arr = eina_array_new(4);;
|
|
Evas_Object *sel;
|
|
|
|
tb = elm_table_add(bx);
|
|
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);
|
|
|
|
pad = evas_object_rectangle_add(evas_object_evas_get(bx));
|
|
evas_object_size_hint_min_set(pad, 460, ELFE_DESKTOP_PADDING_H);
|
|
elm_table_pack(tb, pad, 1, 0, 1, 1);
|
|
//evas_object_show(pad);
|
|
eina_array_push(pad_arr, pad);
|
|
|
|
|
|
pad = evas_object_rectangle_add(evas_object_evas_get(bx));
|
|
evas_object_size_hint_min_set(pad, 460, ELFE_DESKTOP_PADDING_H);
|
|
elm_table_pack(tb, pad, 1, 2, 1, 1);
|
|
//evas_object_show(pad);
|
|
eina_array_push(pad_arr, pad);
|
|
|
|
pad = evas_object_rectangle_add(evas_object_evas_get(bx));
|
|
evas_object_size_hint_min_set(pad, ELFE_DESKTOP_PADDING_W, 480);
|
|
elm_table_pack(tb, pad, 0, 1, 1, 1);
|
|
//evas_object_show(pad);
|
|
eina_array_push(pad_arr, pad);
|
|
|
|
pad = evas_object_rectangle_add(evas_object_evas_get(bx));
|
|
evas_object_size_hint_min_set(pad, ELFE_DESKTOP_PADDING_W, 480);
|
|
elm_table_pack(tb, pad, 2, 1, 1, 1);
|
|
//evas_object_show(pad);
|
|
eina_array_push(pad_arr, pad);
|
|
|
|
desk->pads = eina_list_append(desk->pads, pad_arr);
|
|
|
|
evas_object_show(tb);
|
|
|
|
elm_box_pack_end(bx, tb);
|
|
|
|
desktop_name = eina_stringshare_printf("Elfe Desktop %d", i);
|
|
gad = elfe_gadgets_zone_add(tb, zone, i, desktop_name);
|
|
evas_object_show(gad);
|
|
|
|
desk->gadgets = eina_list_append(desk->gadgets, gad);
|
|
eina_stringshare_del(desktop_name);
|
|
elm_table_pack(tb, gad, 1, 1, 1, 1);
|
|
|
|
sel = elm_layout_add(bx);
|
|
elm_layout_file_set(sel, buf, "elfe/desktop/selector");
|
|
evas_object_show(sel);
|
|
evas_object_size_hint_min_set(sel, 32, 32);
|
|
if (!i)
|
|
{
|
|
Evas_Object *o_edje;
|
|
o_edje = elm_layout_edje_get(sel);
|
|
edje_object_signal_emit(o_edje, "select", "elfe");
|
|
}
|
|
elm_box_pack_end(desk->selector, sel);
|
|
|
|
desk->selector_objs = eina_list_append(desk->selector_objs, sel);
|
|
|
|
|
|
}
|
|
|
|
elm_scroller_content_set(desk->sc, bx);
|
|
evas_object_show(bx);
|
|
|
|
evas_object_smart_callback_add(desk->sc, "edge,left", _scroller_edge_left_cb, desk);
|
|
evas_object_smart_callback_add(desk->sc, "edge,right", _scroller_edge_right_cb, desk);
|
|
evas_object_smart_callback_add(desk->sc, "scroll", _scroller_scroll_cb, desk);
|
|
evas_object_smart_callback_add(desk->sc, "scroll,anim,start", _scroller_scroll_anim_start_cb, desk);
|
|
evas_object_smart_callback_add(desk->sc, "scroll,anim,stop", _scroller_scroll_anim_stop_cb, desk);
|
|
evas_object_smart_callback_add(desk->sc, "scroll,drag,start", _scroller_scroll_drag_start_cb, desk);
|
|
evas_object_smart_callback_add(desk->sc, "scroll,drag,stop", _scroller_scroll_drag_stop_cb, desk);
|
|
|
|
evas_object_event_callback_add(desk->sc, EVAS_CALLBACK_MOUSE_MOVE, _scroller_mouse_move_cb, desk);
|
|
evas_object_event_callback_add(desk->sc, EVAS_CALLBACK_MOUSE_UP, _scroller_mouse_up_cb, desk);
|
|
evas_object_event_callback_add(desk->sc, EVAS_CALLBACK_MOUSE_DOWN, _scroller_mouse_down_cb, desk);
|
|
|
|
|
|
evas_object_event_callback_add(desk->sc, EVAS_CALLBACK_RESIZE,
|
|
_cb_object_resize, desk);
|
|
|
|
evas_object_data_set(desk->layout, "elfe_desktop", desk);
|
|
|
|
elm_layout_content_set(desk->layout, "elfe.swallow.content", desk->sc);
|
|
elm_layout_content_set(desk->layout, "elfe.swallow.selector", desk->selector);
|
|
|
|
return desk->layout;
|
|
|
|
}
|
|
|
|
void
|
|
elfe_desktop_edit_mode_set(Evas_Object *obj, Eina_Bool mode)
|
|
{
|
|
Elfe_Desktop *desk = evas_object_data_get(obj, "elfe_desktop");
|
|
Evas_Object *gad;
|
|
int m,n;
|
|
int i,j;
|
|
char buf[PATH_MAX];
|
|
Evas_Object *over;
|
|
|
|
if (desk->edit_mode == mode)
|
|
return;
|
|
|
|
desk->edit_mode = mode;
|
|
|
|
snprintf(buf, sizeof(buf), "%s/default.edj",
|
|
elfe_home_cfg->mod_dir);
|
|
|
|
if (mode)
|
|
{
|
|
Evas_Coord x, y, w, h;
|
|
gad = eina_list_nth(desk->gadgets, desk->current_desktop);
|
|
evas_object_geometry_get(gad, &x, &y, &w, &h);
|
|
m = w / 4;
|
|
n = h / 4;
|
|
|
|
for (i = 0; i < 4; i++)
|
|
for (j = 0; j < 4; j++)
|
|
{
|
|
Evas_Object *o_edje;
|
|
|
|
const char* part;
|
|
over = elm_layout_add(desk->sc);
|
|
elm_layout_file_set(over, buf, "elfe/gadget/places/over");
|
|
o_edje = elm_layout_edje_get(over);
|
|
edje_object_signal_emit(o_edje, "place,free", "elfe");
|
|
evas_object_resize(o_edje, m, n);
|
|
evas_object_move(o_edje, x + i*m, y + j*n);
|
|
evas_object_show(over);
|
|
part = eina_stringshare_printf("edje %d-%d", i, j);
|
|
desk->overs = eina_list_append(desk->overs, over);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
EINA_LIST_FREE(desk->overs, over)
|
|
{
|
|
evas_object_del(over);
|
|
}
|
|
desk->overs = NULL;
|
|
}
|
|
|
|
}
|