2008-05-18 21:37:34 -07:00
|
|
|
#include "e_mod_gadman.h"
|
|
|
|
|
|
|
|
/* local protos */
|
2012-07-02 03:13:27 -07:00
|
|
|
static void _attach_menu(void *data, E_Gadcon_Client *gcc, E_Menu *menu);
|
|
|
|
static void _save_widget_position(E_Gadcon_Client *gcc);
|
|
|
|
static void _apply_widget_position(E_Gadcon_Client *gcc);
|
2011-01-11 00:44:19 -08:00
|
|
|
static E_Gadcon_Client *_gadman_gadget_add(const E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer, E_Config_Gadcon_Client *src_cf);
|
2012-10-26 05:13:53 -07:00
|
|
|
static Eina_Bool _gadman_module_init_end_cb(void *d __UNUSED__, int type __UNUSED__, void *event __UNUSED__);
|
2012-07-02 03:13:27 -07:00
|
|
|
static Evas_Object *_create_mover(E_Gadcon *gc);
|
|
|
|
static Evas_Object *_get_mover(E_Gadcon_Client *gcc);
|
|
|
|
static E_Gadcon *_gadman_gadcon_new(const char *name, Gadman_Layer_Type layer, E_Zone *zone, E_Gadcon_Location *loc);
|
2013-06-19 01:33:29 -07:00
|
|
|
static void _gadman_overlay_create(void);
|
2012-07-02 03:13:27 -07:00
|
|
|
static void on_top(void *data, Evas_Object *o, const char *em, const char *src);
|
|
|
|
static void on_right(void *data, Evas_Object *o, const char *em, const char *src);
|
|
|
|
static void on_down(void *data, Evas_Object *o, const char *em, const char *src);
|
|
|
|
static void on_left(void *data, Evas_Object *o, const char *em, const char *src);
|
|
|
|
static void on_move(void *data, Evas_Object *o, const char *em, const char *src);
|
|
|
|
|
|
|
|
static void on_frame_click(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
|
|
|
static void on_bg_click(void *data, Evas_Object *o, const char *em, const char *src);
|
|
|
|
static void on_hide_stop(void *data __UNUSED__, Evas_Object *o __UNUSED__,
|
|
|
|
const char *em __UNUSED__, const char *src __UNUSED__);
|
|
|
|
|
|
|
|
static void on_menu_style_plain(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void on_menu_style_inset(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void on_menu_style_float(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void on_menu_style_horiz(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void on_menu_style_vert(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void on_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void on_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
static void on_menu_add(void *data, E_Menu *m, E_Menu_Item *mi);
|
|
|
|
|
2012-07-02 06:28:13 -07:00
|
|
|
static Eina_Bool _gadman_module_cb(void *d __UNUSED__, int type __UNUSED__, E_Event_Module_Update *ev);
|
2012-10-05 02:57:34 -07:00
|
|
|
static int _e_gadman_client_add(void *data __UNUSED__, E_Gadcon_Client *, const E_Gadcon_Client_Class *cc);
|
2012-07-02 03:13:27 -07:00
|
|
|
static void _e_gadman_client_remove(void *data __UNUSED__, E_Gadcon_Client *gcc);
|
|
|
|
|
|
|
|
static void _e_gadman_handlers_add(void);
|
|
|
|
static void _e_gadman_handler_del(void);
|
2013-06-11 23:41:31 -07:00
|
|
|
static Eina_Bool _e_gadman_cb_zone_change(void *data __UNUSED__, int type __UNUSED__, void *event);
|
2012-07-27 03:52:53 -07:00
|
|
|
static E_Gadcon_Client *gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone);
|
2012-09-06 11:28:02 -07:00
|
|
|
|
2012-07-27 00:22:57 -07:00
|
|
|
static E_Gadcon *gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer);
|
2012-10-26 05:13:53 -07:00
|
|
|
static Eina_Bool gadman_locked;
|
2009-01-13 15:21:49 -08:00
|
|
|
Manager *Man = NULL;
|
2012-06-13 02:37:22 -07:00
|
|
|
static Eina_List *_gadman_hdls = NULL;
|
2012-07-02 06:28:13 -07:00
|
|
|
static Eina_Hash *_gadman_gadgets = NULL;
|
2008-05-18 21:37:34 -07:00
|
|
|
|
2013-08-13 02:22:24 -07:00
|
|
|
/* for locking geometry during our own move/resize */
|
|
|
|
static Eina_Bool mover_lock = EINA_FALSE;
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Implementation */
|
2012-08-24 01:53:48 -07:00
|
|
|
void
|
|
|
|
gadman_reset(void)
|
|
|
|
{
|
|
|
|
E_Gadcon *gc;
|
|
|
|
unsigned int layer;
|
|
|
|
const Eina_List *l;
|
|
|
|
E_Zone *zone;
|
2012-09-17 07:49:48 -07:00
|
|
|
|
2012-10-26 05:13:53 -07:00
|
|
|
if (gadman_locked) return;
|
2013-06-19 00:52:19 -07:00
|
|
|
evas_event_freeze(e_comp_get(Man->container)->evas);
|
2012-08-24 01:53:48 -07:00
|
|
|
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
|
|
|
{
|
2013-06-11 23:41:31 -07:00
|
|
|
E_FREE_LIST(Man->gadcons[layer], e_object_del);
|
2012-08-28 06:44:17 -07:00
|
|
|
Man->gadgets[layer] = eina_list_free(Man->gadgets[layer]);
|
2013-06-11 23:41:31 -07:00
|
|
|
E_FREE_FUNC(Man->movers[layer], evas_object_del);
|
2012-08-24 01:53:48 -07:00
|
|
|
}
|
2013-06-11 23:41:31 -07:00
|
|
|
E_FREE_FUNC(Man->overlay, e_object_del);
|
|
|
|
E_FREE_FUNC(Man->full_bg, evas_object_del);
|
|
|
|
E_FREE_FUNC(Man->overlay_layer, evas_object_del);
|
2012-08-24 01:53:48 -07:00
|
|
|
if (_gadman_gadgets)
|
|
|
|
{
|
|
|
|
eina_hash_free_cb_set(_gadman_gadgets, EINA_FREE_CB(eina_list_free));
|
|
|
|
eina_hash_free(_gadman_gadgets);
|
|
|
|
}
|
|
|
|
/* iterating through zones - and making gadmans on each */
|
|
|
|
EINA_LIST_FOREACH(Man->container->zones, l, zone)
|
|
|
|
{
|
|
|
|
const char *layer_name[] = {"gadman", "gadman_top"};
|
|
|
|
|
|
|
|
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
|
|
|
{
|
2012-10-05 03:36:11 -07:00
|
|
|
gc = _gadman_gadcon_new(layer_name[layer], layer, zone, Man->location[layer]);
|
2012-08-24 01:53:48 -07:00
|
|
|
Man->gadcons[layer] = eina_list_append(Man->gadcons[layer], gc);
|
|
|
|
}
|
|
|
|
}
|
2013-06-19 01:33:29 -07:00
|
|
|
_gadman_overlay_create();
|
2012-08-24 01:53:48 -07:00
|
|
|
|
|
|
|
_gadman_gadgets = eina_hash_string_superfast_new(NULL);
|
2012-09-11 00:56:00 -07:00
|
|
|
gadman_update_bg();
|
2013-06-19 00:52:19 -07:00
|
|
|
Man->visible = !Man->visible;
|
|
|
|
{
|
|
|
|
int prev = Man->conf->anim_bg;
|
|
|
|
Man->conf->anim_bg = 0;
|
|
|
|
gadman_gadgets_toggle();
|
|
|
|
Man->conf->anim_bg = prev;
|
|
|
|
}
|
|
|
|
edje_object_message_signal_process(Man->full_bg);
|
|
|
|
evas_event_thaw(e_comp_get(Man->container)->evas);
|
2012-08-24 01:53:48 -07:00
|
|
|
}
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
void
|
|
|
|
gadman_init(E_Module *m)
|
|
|
|
{
|
2012-10-05 03:36:11 -07:00
|
|
|
E_Gadcon_Location *location;
|
2009-07-11 13:46:55 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Create Manager */
|
|
|
|
Man = calloc(1, sizeof(Manager));
|
|
|
|
if (!Man) return;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
Man->module = m;
|
2012-12-11 02:49:17 -08:00
|
|
|
gadman_locked = e_module_loading_get();
|
2008-05-18 21:37:34 -07:00
|
|
|
Man->container = e_container_current_get(e_manager_current_get());
|
|
|
|
Man->width = Man->container->w;
|
|
|
|
Man->height = Man->container->h;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-08-31 04:23:03 -07:00
|
|
|
/* create and register "desktop" location */
|
2013-05-11 14:46:47 -07:00
|
|
|
location = Man->location[GADMAN_LAYER_BG] = e_gadcon_location_new(_("Desktop"), E_GADCON_SITE_DESKTOP,
|
2013-05-23 01:16:30 -07:00
|
|
|
_e_gadman_client_add, (intptr_t*)(long)GADMAN_LAYER_BG,
|
2012-10-05 03:36:11 -07:00
|
|
|
_e_gadman_client_remove, NULL);
|
|
|
|
e_gadcon_location_set_icon_name(location, "preferences-desktop");
|
|
|
|
e_gadcon_location_register(location);
|
|
|
|
|
|
|
|
/* create and register "desktop hover" location */
|
2013-06-11 22:26:25 -07:00
|
|
|
location = Man->location[GADMAN_LAYER_TOP] = e_gadcon_location_new(_("Desktop Overlay"), E_GADCON_SITE_DESKTOP,
|
2013-05-23 01:16:30 -07:00
|
|
|
_e_gadman_client_add, (intptr_t*)(long)GADMAN_LAYER_TOP,
|
2012-07-02 03:13:27 -07:00
|
|
|
_e_gadman_client_remove, NULL);
|
2009-08-31 04:23:03 -07:00
|
|
|
e_gadcon_location_set_icon_name(location, "preferences-desktop");
|
|
|
|
e_gadcon_location_register(location);
|
|
|
|
|
2012-06-13 02:37:22 -07:00
|
|
|
_e_gadman_handlers_add();
|
2013-06-19 01:33:29 -07:00
|
|
|
if (!gadman_locked) gadman_reset();
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gadman_shutdown(void)
|
|
|
|
{
|
2009-07-11 13:46:55 -07:00
|
|
|
unsigned int layer;
|
|
|
|
|
2012-06-13 02:37:22 -07:00
|
|
|
_e_gadman_handler_del();
|
2012-07-02 03:13:27 -07:00
|
|
|
|
2012-10-01 03:28:38 -07:00
|
|
|
gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
|
2008-08-03 14:20:09 -07:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
|
|
|
{
|
2012-10-05 03:36:11 -07:00
|
|
|
e_gadcon_location_unregister(Man->location[layer]);
|
|
|
|
E_FREE_LIST(Man->gadcons[layer], e_object_del);
|
2012-07-02 03:13:27 -07:00
|
|
|
evas_object_del(Man->movers[layer]);
|
2012-08-28 06:44:17 -07:00
|
|
|
Man->gadgets[layer] = eina_list_free(Man->gadgets[layer]);
|
2012-11-29 08:03:54 -08:00
|
|
|
e_gadcon_location_free(Man->location[layer]);
|
2009-07-11 13:46:55 -07:00
|
|
|
}
|
2008-11-10 07:47:25 -08:00
|
|
|
|
2012-10-01 03:28:38 -07:00
|
|
|
eina_stringshare_del(Man->icon_name);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* free manager */
|
2013-06-11 23:41:31 -07:00
|
|
|
E_FREE_FUNC(Man->overlay, e_object_del);
|
|
|
|
E_FREE_FUNC(Man->overlay_layer, evas_object_del);
|
2012-07-02 06:28:13 -07:00
|
|
|
if (_gadman_gadgets)
|
|
|
|
{
|
|
|
|
eina_hash_free_cb_set(_gadman_gadgets, EINA_FREE_CB(eina_list_free));
|
|
|
|
eina_hash_free(_gadman_gadgets);
|
|
|
|
}
|
|
|
|
_gadman_gadgets = NULL;
|
2012-11-13 01:51:28 -08:00
|
|
|
free(Man);
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
2008-11-11 17:14:18 -08:00
|
|
|
void
|
|
|
|
gadman_populate_class(void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc)
|
|
|
|
{
|
2009-07-11 13:46:55 -07:00
|
|
|
Gadman_Layer_Type layer = (Gadman_Layer_Type)(long)data;
|
2012-07-27 03:52:53 -07:00
|
|
|
const Eina_List *l, *ll;
|
2009-07-11 13:46:55 -07:00
|
|
|
E_Config_Gadcon_Client *cf_gcc;
|
2009-09-06 05:21:27 -07:00
|
|
|
E_Gadcon_Client *gcc = NULL;
|
2008-11-11 17:14:18 -08:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
EINA_LIST_FOREACH(gc->cf->clients, l, cf_gcc)
|
2008-11-11 17:14:18 -08:00
|
|
|
{
|
2012-07-27 08:49:51 -07:00
|
|
|
if ((!strcmp(cf_gcc->name, cc->name)) && (gc->cf->zone == gc->zone->num))
|
2012-07-02 03:13:27 -07:00
|
|
|
{
|
2012-07-27 09:10:06 -07:00
|
|
|
gcc = e_gadcon_client_find(gc, cf_gcc);
|
2012-07-27 03:52:53 -07:00
|
|
|
ll = eina_hash_find(_gadman_gadgets, cc->name);
|
|
|
|
if ((!gcc) || (ll && (!eina_list_data_find(ll, cf_gcc))))
|
2012-07-27 09:02:44 -07:00
|
|
|
gadman_gadget_place(gcc, cc, cf_gcc, layer, gc->zone);
|
2012-07-02 03:13:27 -07:00
|
|
|
}
|
2008-11-11 17:14:18 -08:00
|
|
|
}
|
2012-09-06 06:50:58 -07:00
|
|
|
gc->populated_classes = eina_list_append(gc->populated_classes, cc);
|
2008-11-11 17:14:18 -08:00
|
|
|
}
|
|
|
|
|
2012-07-27 00:22:57 -07:00
|
|
|
static E_Gadcon *
|
2009-07-11 13:46:55 -07:00
|
|
|
gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer)
|
|
|
|
{
|
|
|
|
const Eina_List *l;
|
|
|
|
E_Gadcon *gc;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
|
|
|
|
if (gc->zone == zone) return gc;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-09-06 11:28:02 -07:00
|
|
|
static void
|
|
|
|
gadman_gadcon_place_job(E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
_apply_widget_position(gcc);
|
2012-09-17 06:06:06 -07:00
|
|
|
if (gcc == gcc->gadcon->drag_gcc)
|
2012-09-06 11:28:02 -07:00
|
|
|
gadman_gadget_edit_start(gcc);
|
2013-06-19 01:33:29 -07:00
|
|
|
if (Man->visible || (!eina_list_data_find(Man->gadcons[GADMAN_LAYER_TOP], gcc->gadcon)))
|
2013-06-11 23:41:31 -07:00
|
|
|
e_gadcon_client_show(gcc);
|
|
|
|
else
|
|
|
|
e_gadcon_client_hide(gcc);
|
2012-09-06 11:28:02 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_gadman_gadget_free(void *data __UNUSED__, void *obj)
|
|
|
|
{
|
|
|
|
E_Gadcon_Client *gcc = obj;
|
|
|
|
Eina_List *l;
|
|
|
|
int layer;
|
|
|
|
Eina_Bool edit;
|
|
|
|
|
|
|
|
layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE;
|
|
|
|
// edje_object_part_unswallow(gcc->o_frame, gcc->o_base);
|
|
|
|
if (gcc->cf)
|
|
|
|
{
|
|
|
|
Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc->cf);
|
|
|
|
l = eina_hash_find(_gadman_gadgets, gcc->name);
|
|
|
|
if (l)
|
|
|
|
{
|
|
|
|
eina_hash_set(_gadman_gadgets, gcc->name, eina_list_remove(l, gcc->cf));
|
|
|
|
}
|
|
|
|
gcc->cf = NULL;
|
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
edit = (gcc == gcc->gadcon->drag_gcc) || (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] == gcc);
|
2012-12-01 08:08:39 -08:00
|
|
|
if (!edit) return;
|
|
|
|
gcc->gadcon->editing = 1; // may get unset from a dialog, force here to prevent crash
|
|
|
|
gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
|
2012-09-06 11:28:02 -07:00
|
|
|
}
|
|
|
|
|
2013-08-13 02:22:24 -07:00
|
|
|
static void
|
|
|
|
_gadman_gadget_size_hints_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
E_Gadcon_Client *gcc = data;
|
|
|
|
int w, h;
|
|
|
|
|
|
|
|
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
|
2013-08-13 03:28:02 -07:00
|
|
|
/* size hints change for either min or aspect */
|
|
|
|
if (gcc->min.w || gcc->min.h)
|
|
|
|
{
|
|
|
|
w = MAX(w, gcc->min.w);
|
|
|
|
h = MAX(h, gcc->min.h);
|
|
|
|
}
|
|
|
|
if (gcc->aspect.w && gcc->aspect.h)
|
|
|
|
{
|
|
|
|
w = MAX(w, gcc->aspect.w);
|
|
|
|
h = MAX(h, gcc->aspect.h);
|
|
|
|
}
|
2013-08-13 02:22:24 -07:00
|
|
|
evas_object_resize(gcc->o_frame, w, h);
|
|
|
|
_save_widget_position(gcc);
|
|
|
|
}
|
|
|
|
|
2012-07-27 00:22:57 -07:00
|
|
|
static E_Gadcon_Client *
|
2012-07-27 03:52:53 -07:00
|
|
|
gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
E_Gadcon *gc;
|
2012-07-27 05:08:52 -07:00
|
|
|
Eina_List *l;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
if (!cf->name) return NULL;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
gc = gadman_gadcon_get(zone, layer);
|
2012-07-27 05:08:52 -07:00
|
|
|
if (!cc)
|
|
|
|
{
|
|
|
|
EINA_LIST_FOREACH(gc->populated_classes, l, cc)
|
|
|
|
{
|
|
|
|
if (!strcmp(cc->name, cf->name))
|
|
|
|
break;
|
|
|
|
else
|
|
|
|
cc = NULL;
|
|
|
|
}
|
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Find provider */
|
2012-07-27 01:19:01 -07:00
|
|
|
if (!cc)
|
|
|
|
{
|
2012-07-27 05:26:41 -07:00
|
|
|
e_gadcon_client_queue(gc, cf);
|
2012-07-27 01:19:01 -07:00
|
|
|
e_gadcon_custom_populate_request(gc);
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* init Gadcon_Client */
|
2012-07-27 01:19:01 -07:00
|
|
|
if (!gcc)
|
|
|
|
{
|
|
|
|
gcc = cc->func.init(gc, cf->name, cf->id, cc->default_style);
|
|
|
|
if (!gcc) return NULL;
|
2012-09-06 11:28:02 -07:00
|
|
|
e_object_delfn_add(E_OBJECT(gcc), _gadman_gadget_free, NULL);
|
2012-07-27 01:19:01 -07:00
|
|
|
gcc->cf = cf;
|
|
|
|
gcc->client_class = cc;
|
|
|
|
|
|
|
|
/* Call the client orientation function */
|
|
|
|
if (cc->func.orient)
|
|
|
|
cc->func.orient(gcc, gcc->cf->orient);
|
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-07-26 05:48:11 -07:00
|
|
|
Man->gadgets[layer] = eina_list_append(Man->gadgets[layer], cf);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
//printf("Place Gadget %s (style: %s id: %s) (gadcon: %s)\n", gcc->name, cf->style, cf->id, gc->name);
|
|
|
|
|
|
|
|
/* create frame */
|
|
|
|
gcc->o_frame = edje_object_add(gc->evas);
|
|
|
|
e_theme_edje_object_set(gcc->o_frame, "base/theme/gadman", "e/gadman/frame");
|
2008-05-19 02:21:44 -07:00
|
|
|
|
|
|
|
if ((cf->style) && (!strcmp(cf->style, E_GADCON_CLIENT_STYLE_INSET)))
|
|
|
|
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e");
|
2008-05-18 21:37:34 -07:00
|
|
|
else
|
2008-05-19 02:21:44 -07:00
|
|
|
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e");
|
2008-10-10 17:59:21 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* swallow the client inside the frame */
|
|
|
|
edje_object_part_swallow(gcc->o_frame, "e.swallow.content", gcc->o_base);
|
2012-07-02 03:13:27 -07:00
|
|
|
evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN,
|
2008-05-18 21:37:34 -07:00
|
|
|
on_frame_click, gcc);
|
2013-08-13 02:22:24 -07:00
|
|
|
evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
|
|
|
|
_gadman_gadget_size_hints_cb, gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-06-11 23:41:31 -07:00
|
|
|
gcc->hidden = 1;
|
2009-07-11 13:46:55 -07:00
|
|
|
if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
|
2013-06-11 23:41:31 -07:00
|
|
|
{
|
|
|
|
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e");
|
|
|
|
evas_object_layer_set(gcc->o_base, E_COMP_CANVAS_LAYER_POPUP);
|
|
|
|
evas_object_layer_set(gcc->o_frame, E_COMP_CANVAS_LAYER_POPUP);
|
|
|
|
}
|
2013-02-07 05:20:07 -08:00
|
|
|
else
|
|
|
|
{
|
2013-02-18 05:43:47 -08:00
|
|
|
evas_object_layer_set(gcc->o_base, E_COMP_CANVAS_LAYER_DESKTOP);
|
|
|
|
evas_object_layer_set(gcc->o_frame, E_COMP_CANVAS_LAYER_DESKTOP);
|
2013-02-07 05:20:07 -08:00
|
|
|
}
|
2012-07-02 06:28:13 -07:00
|
|
|
if (cc->name)
|
|
|
|
{
|
|
|
|
l = eina_hash_find(_gadman_gadgets, cc->name);
|
2012-07-26 07:00:20 -07:00
|
|
|
eina_hash_set(_gadman_gadgets, cc->name, eina_list_append(l, gcc->cf));
|
2012-07-02 06:28:13 -07:00
|
|
|
}
|
2012-09-06 11:28:02 -07:00
|
|
|
ecore_job_add((Ecore_Cb)gadman_gadcon_place_job, gcc);
|
2008-05-18 21:37:34 -07:00
|
|
|
|
|
|
|
return gcc;
|
|
|
|
}
|
|
|
|
|
|
|
|
E_Gadcon_Client *
|
2012-10-05 02:57:34 -07:00
|
|
|
gadman_gadget_add(const E_Gadcon_Client_Class *cc, E_Gadcon_Client *gcc, Gadman_Layer_Type layer)
|
2011-01-11 00:44:19 -08:00
|
|
|
{
|
2012-10-05 02:57:34 -07:00
|
|
|
return _gadman_gadget_add(cc, layer, gcc->cf);
|
2011-01-11 00:44:19 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static E_Gadcon_Client *
|
|
|
|
_gadman_gadget_add(const E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer, E_Config_Gadcon_Client *src_cf)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
E_Config_Gadcon_Client *cf = NULL;
|
2010-08-19 12:18:43 -07:00
|
|
|
E_Gadcon_Client *gcc = NULL;
|
2008-05-18 21:37:34 -07:00
|
|
|
E_Gadcon *gc;
|
2008-11-04 16:47:28 -08:00
|
|
|
int w, h;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-07-02 03:13:27 -07:00
|
|
|
gc = gadman_gadcon_get(e_util_zone_current_get(e_manager_current_get()),
|
|
|
|
layer);
|
2008-05-18 21:37:34 -07:00
|
|
|
|
|
|
|
/* Create Config_Gadcon_Client */
|
|
|
|
cf = e_gadcon_client_config_new(gc, cc->name);
|
2012-07-02 03:13:27 -07:00
|
|
|
if (cf)
|
2010-05-23 14:38:29 -07:00
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
if (!src_cf)
|
|
|
|
{
|
|
|
|
cf->style = eina_stringshare_add(cc->default_style);
|
|
|
|
cf->geom.pos_x = DEFAULT_POS_X;
|
|
|
|
cf->geom.pos_y = DEFAULT_POS_Y;
|
|
|
|
cf->geom.size_w = DEFAULT_SIZE_W;
|
|
|
|
cf->geom.size_h = DEFAULT_SIZE_H;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
cf->style = eina_stringshare_add(src_cf->style);
|
|
|
|
cf->geom.pos_x = src_cf->geom.pos_x;
|
|
|
|
cf->geom.pos_y = src_cf->geom.pos_y;
|
|
|
|
cf->geom.size_w = src_cf->geom.size_w;
|
|
|
|
cf->geom.size_h = src_cf->geom.size_h;
|
|
|
|
}
|
2010-05-23 14:38:29 -07:00
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Place the new gadget */
|
2010-05-23 14:38:29 -07:00
|
|
|
if (cf)
|
2012-07-27 03:52:53 -07:00
|
|
|
gcc = gadman_gadget_place(NULL, cc, cf, layer, gc->zone);
|
2010-05-23 14:38:29 -07:00
|
|
|
if (!gcc) return NULL;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-11-04 16:47:28 -08:00
|
|
|
/* Respect Aspect */
|
|
|
|
evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
|
|
|
|
if (gcc->aspect.w && gcc->aspect.h)
|
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
if (gcc->aspect.w > gcc->aspect.h)
|
|
|
|
w = ((float)h / (float)gcc->aspect.h) * (gcc->aspect.w);
|
|
|
|
else
|
|
|
|
h = ((float)w / (float)gcc->aspect.w) * (gcc->aspect.h);
|
|
|
|
if (h < gcc->min.h) h = gcc->min.h;
|
|
|
|
if (w < gcc->min.w) w = gcc->min.w;
|
|
|
|
evas_object_resize(gcc->o_frame, w, h);
|
2008-11-04 16:47:28 -08:00
|
|
|
}
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
return gcc;
|
|
|
|
}
|
|
|
|
|
2012-07-27 00:22:57 -07:00
|
|
|
static void
|
2012-09-06 11:28:02 -07:00
|
|
|
gadman_edit(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2012-09-06 11:28:02 -07:00
|
|
|
_apply_widget_position(data);
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
2013-08-13 02:22:24 -07:00
|
|
|
static void
|
|
|
|
_gadman_gadget_edit_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
int w, h;
|
|
|
|
if (mover_lock) return;
|
|
|
|
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
|
|
|
|
evas_object_resize(_get_mover(data), w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_gadman_gadget_edit_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
int x, y;
|
|
|
|
if (mover_lock) return;
|
|
|
|
evas_object_geometry_get(obj, &x, &y, NULL, NULL);
|
|
|
|
evas_object_move(_get_mover(data), x, y);
|
|
|
|
}
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
void
|
|
|
|
gadman_gadget_edit_start(E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
E_Gadcon *gc;
|
2008-05-19 02:21:44 -07:00
|
|
|
Evas_Object *mover;
|
2012-10-01 07:02:24 -07:00
|
|
|
Eina_List *l;
|
2008-05-19 02:21:44 -07:00
|
|
|
int x, y, w, h;
|
|
|
|
|
2012-11-29 08:03:54 -08:00
|
|
|
if (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] == gcc) return;
|
|
|
|
else if (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE])
|
2012-11-30 00:52:57 -08:00
|
|
|
e_object_unref(E_OBJECT(Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE]));
|
2012-11-29 08:03:54 -08:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
EINA_LIST_FOREACH(Man->gadcons[gcc->gadcon->id - ID_GADMAN_LAYER_BASE], l, gc)
|
|
|
|
gc->editing = 1;
|
2008-05-18 21:37:34 -07:00
|
|
|
gc = gcc->gadcon;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-09-20 05:27:00 -07:00
|
|
|
e_object_ref(E_OBJECT(gcc));
|
2012-11-30 00:52:57 -08:00
|
|
|
//INF("START: %u", e_object_ref_get((void*)gcc));
|
2012-09-20 05:27:00 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Move/resize the correct mover */
|
|
|
|
mover = _get_mover(gcc);
|
2012-09-06 11:28:02 -07:00
|
|
|
if (!mover) return;
|
|
|
|
evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
|
2013-08-13 02:22:24 -07:00
|
|
|
evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_RESIZE, _gadman_gadget_edit_resize_cb, gcc);
|
|
|
|
evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOVE, _gadman_gadget_edit_move_cb, gcc);
|
2012-10-01 07:02:24 -07:00
|
|
|
Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] = gcc;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
evas_object_move(mover, x, y);
|
|
|
|
evas_object_resize(mover, w, h);
|
|
|
|
evas_object_raise(mover);
|
2013-06-19 01:33:29 -07:00
|
|
|
if (Man->visible || (!eina_list_data_find(Man->gadcons[GADMAN_LAYER_TOP], gc)))
|
2013-06-11 23:41:31 -07:00
|
|
|
evas_object_show(mover);
|
2012-09-06 11:28:02 -07:00
|
|
|
evas_object_event_callback_del(mover, EVAS_CALLBACK_HIDE, gadman_edit);
|
|
|
|
evas_object_event_callback_add(mover, EVAS_CALLBACK_HIDE, gadman_edit, gcc);
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2010-08-19 12:18:43 -07:00
|
|
|
gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2009-07-11 13:46:55 -07:00
|
|
|
unsigned int layer;
|
2012-09-18 04:31:11 -07:00
|
|
|
E_Gadcon_Client *drag_gcc = NULL;
|
2009-07-11 13:46:55 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
for (layer = GADMAN_LAYER_COUNT - 1; layer < UINT_MAX; layer--)
|
2009-07-11 13:46:55 -07:00
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
const Eina_List *l;
|
|
|
|
E_Gadcon *gc;
|
2009-07-11 13:46:55 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
gc = eina_list_data_get(Man->gadcons[layer]);
|
2012-12-11 02:49:17 -08:00
|
|
|
if (!gc) continue;
|
2012-10-01 07:02:24 -07:00
|
|
|
if (!gc->editing) continue;
|
|
|
|
|
2012-09-06 11:28:02 -07:00
|
|
|
evas_object_event_callback_del(Man->movers[layer], EVAS_CALLBACK_HIDE, gadman_edit);
|
2012-07-02 03:13:27 -07:00
|
|
|
evas_object_hide(Man->movers[layer]);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-07-02 03:13:27 -07:00
|
|
|
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
|
2012-10-01 07:02:24 -07:00
|
|
|
gc->editing = 0;
|
|
|
|
drag_gcc = Man->drag_gcc[layer];
|
2013-08-13 02:22:24 -07:00
|
|
|
if (drag_gcc)
|
|
|
|
{
|
|
|
|
evas_object_event_callback_del_full(drag_gcc->o_frame, EVAS_CALLBACK_RESIZE, _gadman_gadget_edit_resize_cb, drag_gcc);
|
|
|
|
evas_object_event_callback_del_full(drag_gcc->o_frame, EVAS_CALLBACK_MOVE, _gadman_gadget_edit_move_cb, drag_gcc);
|
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
Man->drag_gcc[layer] = NULL;
|
|
|
|
break;
|
2012-10-01 03:01:04 -07:00
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
if (!drag_gcc) return;
|
2012-11-29 08:03:54 -08:00
|
|
|
drag_gcc->gadcon->drag_gcc = NULL;
|
2012-10-01 07:02:24 -07:00
|
|
|
_save_widget_position(drag_gcc);
|
2012-11-29 08:03:54 -08:00
|
|
|
if (!e_object_is_del(E_OBJECT(drag_gcc)))
|
|
|
|
e_object_unref(E_OBJECT(drag_gcc));
|
2012-11-30 00:52:57 -08:00
|
|
|
//INF("END: %d:%u", e_object_is_del(E_OBJECT(drag_gcc)), e_object_ref_get((void*)drag_gcc));
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
gadman_gadgets_show(void)
|
|
|
|
{
|
2013-06-19 01:33:29 -07:00
|
|
|
Eina_List *l, *ll;
|
|
|
|
E_Gadcon *gc;
|
2009-07-11 13:46:55 -07:00
|
|
|
E_Gadcon_Client *gcc;
|
2013-06-19 01:33:29 -07:00
|
|
|
Eina_Bool editing = EINA_FALSE;
|
2008-05-18 21:37:34 -07:00
|
|
|
|
|
|
|
Man->visible = 1;
|
2013-06-11 23:41:31 -07:00
|
|
|
e_popup_show(Man->overlay);
|
2012-07-02 03:13:27 -07:00
|
|
|
|
2008-10-10 17:59:21 -07:00
|
|
|
if (Man->conf->bg_type == BG_STD)
|
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
if (Man->conf->anim_bg)
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
|
|
|
"e,state,visibility,show", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
|
|
|
"e,state,visibility,show,now", "e");
|
2008-10-10 17:59:21 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
if (Man->conf->anim_bg)
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
|
|
|
"e,state,visibility,show,custom", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
|
|
|
"e,state,visibility,show,custom,now", "e");
|
2008-10-10 17:59:21 -07:00
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
/* Showing top gadgets */
|
2013-06-19 01:33:29 -07:00
|
|
|
EINA_LIST_FOREACH(Man->gadcons[GADMAN_LAYER_TOP], l, gc)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2013-06-19 01:33:29 -07:00
|
|
|
EINA_LIST_FOREACH(gc->clients, ll, gcc)
|
|
|
|
{
|
|
|
|
if (Man->conf->anim_gad)
|
|
|
|
edje_object_signal_emit(gcc->o_frame,
|
|
|
|
"e,state,visibility,show", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(gcc->o_frame,
|
|
|
|
"e,state,visibility,show,now", "e");
|
|
|
|
e_gadcon_client_show(gcc);
|
|
|
|
}
|
|
|
|
gc->drop_handler->hidden = 0;
|
|
|
|
editing = gc->editing;
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2013-06-19 01:33:29 -07:00
|
|
|
if (editing && gcc) evas_object_show(_get_mover(gcc));
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
gadman_gadgets_hide(void)
|
|
|
|
{
|
2013-06-19 01:33:29 -07:00
|
|
|
Eina_List *l, *ll;
|
|
|
|
E_Gadcon *gc;
|
2009-07-11 13:46:55 -07:00
|
|
|
E_Gadcon_Client *gcc;
|
2012-10-01 07:02:24 -07:00
|
|
|
Eina_Bool editing = EINA_FALSE;
|
2008-05-18 21:37:34 -07:00
|
|
|
|
|
|
|
Man->visible = 0;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-09-13 13:11:25 -07:00
|
|
|
if (Man->conf->bg_type == BG_STD)
|
2008-10-10 17:59:21 -07:00
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
if (Man->conf->anim_bg)
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
|
|
|
"e,state,visibility,hide", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
2012-10-04 16:27:07 -07:00
|
|
|
"e,state,visibility,hide,now", "e");
|
2008-10-10 17:59:21 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
if (Man->conf->anim_bg)
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
|
|
|
"e,state,visibility,hide,custom", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(Man->full_bg,
|
|
|
|
"e,state,visibility,hide,custom,now", "e");
|
2008-10-10 17:59:21 -07:00
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
/* Hiding top gadgets */
|
2013-06-19 01:33:29 -07:00
|
|
|
EINA_LIST_FOREACH(Man->gadcons[GADMAN_LAYER_TOP], l, gc)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2013-06-19 01:33:29 -07:00
|
|
|
gc->drop_handler->hidden = 1;
|
|
|
|
editing = gc->editing;
|
|
|
|
EINA_LIST_FOREACH(gc->clients, ll, gcc)
|
|
|
|
{
|
|
|
|
if (Man->conf->anim_gad)
|
|
|
|
edje_object_signal_emit(gcc->o_frame,
|
|
|
|
"e,state,visibility,hide", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(gcc->o_frame,
|
|
|
|
"e,state,visibility,hide,now", "e");
|
|
|
|
e_gadcon_client_hide(gcc);
|
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
if (editing)
|
|
|
|
gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
|
|
|
|
void
|
|
|
|
gadman_gadgets_toggle(void)
|
|
|
|
{
|
|
|
|
if (Man->visible)
|
2008-05-19 02:21:44 -07:00
|
|
|
gadman_gadgets_hide();
|
2008-05-18 21:37:34 -07:00
|
|
|
else
|
2008-05-19 02:21:44 -07:00
|
|
|
gadman_gadgets_show();
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
2008-10-10 17:59:21 -07:00
|
|
|
void
|
|
|
|
gadman_update_bg(void)
|
|
|
|
{
|
|
|
|
Evas_Object *obj;
|
|
|
|
const char *ext;
|
|
|
|
|
2013-06-19 01:33:29 -07:00
|
|
|
if (!Man->gadcons[GADMAN_LAYER_TOP]) return;
|
2008-10-10 17:59:21 -07:00
|
|
|
obj = edje_object_part_swallow_get(Man->full_bg, "e.swallow.bg");
|
|
|
|
if (obj)
|
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
edje_object_part_unswallow(Man->full_bg, obj);
|
|
|
|
evas_object_del(obj);
|
2008-10-10 17:59:21 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (Man->conf->bg_type)
|
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
case BG_STD:
|
|
|
|
case BG_TRANS:
|
|
|
|
break;
|
|
|
|
|
|
|
|
case BG_COLOR:
|
2012-09-11 00:38:52 -07:00
|
|
|
{
|
|
|
|
double r, g, b;
|
|
|
|
|
|
|
|
r = (double)Man->conf->color_r * (200. / 255.);
|
|
|
|
g = (double)Man->conf->color_g * (200. / 255.);
|
|
|
|
b = (double)Man->conf->color_b * (200. / 255.);
|
2013-06-19 01:33:29 -07:00
|
|
|
obj = evas_object_rectangle_add(e_comp_get(Man->container)->evas);
|
2012-09-11 00:38:52 -07:00
|
|
|
evas_object_color_set(obj, lround(r), lround(g), lround(b), 200);
|
|
|
|
edje_object_part_swallow(Man->full_bg, "e.swallow.bg", obj);
|
|
|
|
}
|
2012-07-02 03:13:27 -07:00
|
|
|
break;
|
|
|
|
|
|
|
|
case BG_CUSTOM:
|
|
|
|
ext = strrchr(Man->conf->custom_bg, '.');
|
|
|
|
if (!strcmp(ext, ".edj") || !strcmp(ext, ".EDJ"))
|
|
|
|
{
|
2013-06-19 01:33:29 -07:00
|
|
|
//THIS IS FOR E18 backgrounds
|
|
|
|
obj = edje_object_add(e_comp_get(Man->container)->evas);
|
2012-07-02 03:13:27 -07:00
|
|
|
edje_object_file_set(obj, Man->conf->custom_bg,
|
|
|
|
"e/desktop/background");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//THIS IS FOR A NORMAL IMAGE
|
2013-06-19 01:33:29 -07:00
|
|
|
obj = evas_object_image_add(e_comp_get(Man->container)->evas);
|
2012-07-02 03:13:27 -07:00
|
|
|
evas_object_image_file_set(obj, Man->conf->custom_bg, NULL);
|
|
|
|
evas_object_image_fill_set(obj, 0, 0, Man->container->w,
|
|
|
|
Man->container->h);
|
|
|
|
}
|
|
|
|
edje_object_part_swallow(Man->full_bg, "e.swallow.bg", obj);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
2008-10-10 17:59:21 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-05 09:50:05 -07:00
|
|
|
static void
|
|
|
|
_gadman_gadcon_free(E_Gadcon *gc)
|
|
|
|
{
|
|
|
|
e_gadcon_unpopulate(gc);
|
|
|
|
e_gadcon_custom_del(gc);
|
|
|
|
|
|
|
|
/* free gadcons */
|
|
|
|
e_config->gadcons = eina_list_remove(e_config->gadcons, gc);
|
|
|
|
eina_stringshare_del(gc->name);
|
|
|
|
|
|
|
|
if (gc->config_dialog) e_object_del(E_OBJECT(gc->config_dialog));
|
2012-09-06 11:28:02 -07:00
|
|
|
eina_list_free(gc->populated_classes);
|
2012-09-19 05:40:37 -07:00
|
|
|
if (gc->drop_handler) e_drop_handler_del(gc->drop_handler);
|
2012-09-05 09:50:05 -07:00
|
|
|
free(gc);
|
|
|
|
}
|
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
static void
|
|
|
|
_gadman_gadcon_dnd_enter_cb(E_Gadcon *gc, E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
|
|
|
|
/* only use this for dragging gadcons around the desktop */
|
2013-05-23 01:40:02 -07:00
|
|
|
if ((!eina_list_data_find(Man->gadcons[GADMAN_LAYER_BG], gc)) &&
|
|
|
|
(!eina_list_data_find(Man->gadcons[GADMAN_LAYER_TOP], gc)))
|
|
|
|
return;
|
2013-07-26 05:54:53 -07:00
|
|
|
if (gc != gcc->gadcon) return;
|
2012-11-30 00:52:57 -08:00
|
|
|
//INF("ENTER: %u", e_object_ref_get((void*)gcc));
|
|
|
|
gadman_gadget_edit_start(gcc);
|
2012-10-01 07:02:24 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_gadman_gadcon_dnd_leave_cb(E_Gadcon *gc, E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
unsigned int layer;
|
|
|
|
E_Gadcon_Client *drag_gcc = NULL;
|
|
|
|
|
|
|
|
/* only use this for dragging gadcons around the desktop */
|
2013-05-23 01:40:02 -07:00
|
|
|
if ((!eina_list_data_find(Man->gadcons[GADMAN_LAYER_BG], gc)) &&
|
|
|
|
(!eina_list_data_find(Man->gadcons[GADMAN_LAYER_TOP], gc)))
|
|
|
|
return;
|
2013-07-26 05:54:53 -07:00
|
|
|
if (gc != gcc->gadcon) return;
|
2012-11-30 00:52:57 -08:00
|
|
|
//INF("LEAVE: %u", e_object_ref_get((void*)gcc));
|
|
|
|
Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] = NULL;
|
2012-10-01 07:02:24 -07:00
|
|
|
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
|
|
|
{
|
|
|
|
const Eina_List *l;
|
|
|
|
|
|
|
|
evas_object_event_callback_del(Man->movers[layer], EVAS_CALLBACK_HIDE, gadman_edit);
|
|
|
|
evas_object_hide(Man->movers[layer]);
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
|
|
|
|
{
|
|
|
|
gc->editing = 0;
|
|
|
|
drag_gcc = gc->drag_gcc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* this is slightly different from edit_end because we don't save the position or unset the drag gcc */
|
|
|
|
if (!drag_gcc) return;
|
|
|
|
e_object_unref(E_OBJECT(drag_gcc));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_gadman_gadcon_dnd_move_cb(E_Gadcon *gc, E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
Evas_Object *mover;
|
2013-02-25 00:18:06 -08:00
|
|
|
E_Zone *zone;
|
|
|
|
int x, y, mx, my;
|
2012-10-01 07:02:24 -07:00
|
|
|
int ox, oy, ow, oh;
|
|
|
|
|
2013-07-26 05:54:53 -07:00
|
|
|
if (gc != gcc->gadcon) return;
|
2012-10-01 07:02:24 -07:00
|
|
|
/* only use this for dragging gadcons around the desktop */
|
2013-05-23 01:40:02 -07:00
|
|
|
if ((!eina_list_data_find(Man->gadcons[GADMAN_LAYER_BG], gc)) &&
|
|
|
|
(!eina_list_data_find(Man->gadcons[GADMAN_LAYER_TOP], gc)))
|
|
|
|
return;
|
2012-10-01 07:02:24 -07:00
|
|
|
|
|
|
|
mover = _get_mover(gcc);
|
|
|
|
evas_object_geometry_get(gcc->o_frame, &x, &y, NULL, NULL);
|
|
|
|
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
|
|
|
|
|
|
|
/* don't go out of the screen */
|
2013-01-22 01:39:04 -08:00
|
|
|
x = MAX(x, gcc->dx), y = MAX(y, gcc->dy);
|
2013-02-25 00:18:06 -08:00
|
|
|
|
|
|
|
/* adjust in case one screen is larger than another */
|
|
|
|
zone = e_gadcon_zone_get(gc);
|
|
|
|
mx = MIN(Man->width, zone->x + zone->w), my = MIN(Man->height, zone->y + zone->h);
|
|
|
|
x = MIN(x, mx - ow + gcc->dx), y = MIN(y, my - oh + gcc->dy);
|
2012-10-01 07:02:24 -07:00
|
|
|
|
|
|
|
evas_object_move(gcc->o_frame, x - gcc->dx, y - gcc->dy);
|
|
|
|
evas_object_move(mover, x - gcc->dx, y - gcc->dy);
|
|
|
|
evas_object_raise(gcc->o_frame);
|
|
|
|
evas_object_raise(mover);
|
2013-02-25 01:24:24 -08:00
|
|
|
_save_widget_position(gcc);
|
2012-10-01 07:02:24 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_gadman_gadcon_dnd_drop_cb(E_Gadcon *gc, E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
E_Config_Gadcon_Client *cf;
|
|
|
|
E_Zone *dst_zone = NULL;
|
|
|
|
E_Gadcon *dst_gadcon;
|
|
|
|
Evas_Object *mover;
|
|
|
|
int gx, gy;
|
|
|
|
|
2013-07-26 05:54:53 -07:00
|
|
|
if (gc != gcc->gadcon) return;
|
2012-10-01 07:02:24 -07:00
|
|
|
/* only use this for dragging gadcons around the desktop */
|
2013-05-23 01:40:02 -07:00
|
|
|
if ((!eina_list_data_find(Man->gadcons[GADMAN_LAYER_BG], gc)) &&
|
|
|
|
(!eina_list_data_find(Man->gadcons[GADMAN_LAYER_TOP], gc)))
|
|
|
|
return;
|
2012-10-01 07:02:24 -07:00
|
|
|
|
|
|
|
gcc->moving = 0;
|
|
|
|
gcc->dx = gcc->dy = 0;
|
|
|
|
|
|
|
|
/* checking if zone was changed for dragged gadget */
|
|
|
|
mover = _get_mover(gcc);
|
|
|
|
evas_object_geometry_get(mover, &gx, &gy, NULL, NULL);
|
|
|
|
dst_zone = e_container_zone_at_point_get(e_container_current_get(e_manager_current_get()), gx, gy);
|
|
|
|
if (dst_zone && (gcc->gadcon->zone != dst_zone))
|
|
|
|
{
|
|
|
|
unsigned int layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE;
|
|
|
|
cf = gcc->cf;
|
|
|
|
gcc->gadcon->cf->clients = eina_list_remove(gcc->gadcon->cf->clients, cf);
|
|
|
|
dst_gadcon = gadman_gadcon_get(dst_zone, layer);
|
|
|
|
if (dst_gadcon)
|
|
|
|
{
|
|
|
|
dst_gadcon->cf->clients = eina_list_append(dst_gadcon->cf->clients, cf);
|
|
|
|
}
|
|
|
|
}
|
2013-02-25 01:24:24 -08:00
|
|
|
_save_widget_position(gcc);
|
|
|
|
e_config_save_queue();
|
2012-10-01 07:02:24 -07:00
|
|
|
}
|
|
|
|
|
2013-06-19 01:33:29 -07:00
|
|
|
static void
|
|
|
|
_gadman_overlay_create(void)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
E_Gadcon *gc;
|
|
|
|
|
|
|
|
Man->overlay = e_popup_new(eina_list_data_get(Man->container->zones), 0, 0, Man->container->w, Man->container->h);
|
|
|
|
e_popup_name_set(Man->overlay, "noshadow_gadman");
|
|
|
|
e_popup_layer_set(Man->overlay, E_COMP_CANVAS_LAYER_LAYOUT, E_LAYER_FULLSCREEN);
|
|
|
|
|
|
|
|
/* create full background object */
|
|
|
|
Man->full_bg = edje_object_add(e_comp_get(Man->container)->evas);
|
|
|
|
e_theme_edje_object_set(Man->full_bg, "base/theme/gadman",
|
|
|
|
"e/gadman/full_bg");
|
|
|
|
edje_object_signal_callback_add(Man->full_bg, "mouse,down,*",
|
|
|
|
"grabber", on_bg_click, NULL);
|
|
|
|
edje_object_signal_callback_add(Man->full_bg, "e,action,hide,stop",
|
|
|
|
"", on_hide_stop, NULL);
|
|
|
|
|
|
|
|
e_popup_content_set(Man->overlay, Man->full_bg);
|
|
|
|
|
|
|
|
/* create placeholder rect to maintain our dnd stacking layer */
|
|
|
|
Man->overlay_layer = evas_object_rectangle_add(e_comp_get(Man->container)->evas);
|
|
|
|
evas_object_layer_set(Man->overlay_layer, E_COMP_CANVAS_LAYER_LAYOUT + E_LAYER_FULLSCREEN);
|
|
|
|
EINA_LIST_FOREACH(Man->gadcons[GADMAN_LAYER_TOP], l, gc)
|
|
|
|
{
|
|
|
|
gc->drop_handler->base = Man->overlay_layer;
|
|
|
|
gc->drop_handler->hidden = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-02 03:13:27 -07:00
|
|
|
static E_Gadcon *
|
|
|
|
_gadman_gadcon_new(const char *name, Gadman_Layer_Type layer, E_Zone *zone, E_Gadcon_Location *loc)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2009-07-11 13:46:55 -07:00
|
|
|
const Eina_List *l;
|
2008-05-18 21:37:34 -07:00
|
|
|
E_Gadcon *gc;
|
2009-07-11 13:46:55 -07:00
|
|
|
E_Config_Gadcon *cg;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Create Gadcon */
|
2012-09-05 09:50:05 -07:00
|
|
|
gc = E_OBJECT_ALLOC(E_Gadcon, E_GADCON_TYPE, _gadman_gadcon_free);
|
2008-05-18 21:37:34 -07:00
|
|
|
if (!gc) return NULL;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-10-15 08:12:56 -07:00
|
|
|
gc->name = eina_stringshare_add(name);
|
2008-05-18 21:37:34 -07:00
|
|
|
gc->layout_policy = E_GADCON_LAYOUT_POLICY_PANEL;
|
|
|
|
gc->orient = E_GADCON_ORIENT_FLOAT;
|
2009-08-31 04:23:03 -07:00
|
|
|
gc->location = loc;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-06-11 23:41:31 -07:00
|
|
|
gc->evas = e_comp_get(Man->container)->evas;
|
|
|
|
e_gadcon_ecore_evas_set(gc, e_comp_get(Man->container)->ee);
|
|
|
|
e_gadcon_xdnd_window_set(gc, e_comp_get(Man->container)->ee_win);
|
|
|
|
e_gadcon_dnd_window_set(gc, e_comp_get(Man->container)->ee_win);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-06-11 23:41:31 -07:00
|
|
|
e_gadcon_drop_handler_add(gc, _gadman_gadcon_dnd_enter_cb, _gadman_gadcon_dnd_leave_cb,
|
|
|
|
_gadman_gadcon_dnd_move_cb, _gadman_gadcon_dnd_drop_cb,
|
|
|
|
zone->x, zone->y, zone->w, zone->h);
|
|
|
|
e_gadcon_zone_set(gc, zone);
|
|
|
|
e_gadcon_util_menu_attach_func_set(gc, _attach_menu, NULL);
|
|
|
|
e_gadcon_populate_callback_set(gc, gadman_populate_class, (void *)layer);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
gc->id = ID_GADMAN_LAYER_BASE + layer;
|
2008-05-18 21:37:34 -07:00
|
|
|
gc->edje.o_parent = NULL;
|
|
|
|
gc->edje.swallow_name = NULL;
|
|
|
|
gc->shelf = NULL;
|
|
|
|
gc->toolbar = NULL;
|
|
|
|
gc->editing = 0;
|
|
|
|
gc->o_container = NULL;
|
|
|
|
gc->frame_request.func = NULL;
|
|
|
|
gc->resize_request.func = NULL;
|
|
|
|
gc->min_size_request.func = NULL;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Search for existing gadcon config */
|
|
|
|
gc->cf = NULL;
|
2009-07-11 13:46:55 -07:00
|
|
|
EINA_LIST_FOREACH(e_config->gadcons, l, cg)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-02-14 20:35:18 -08:00
|
|
|
if ((!strcmp(cg->name, name)) && (cg->zone == zone->num))
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
|
|
|
gc->cf = cg;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* ... or create a new one */
|
|
|
|
if (!gc->cf)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
|
|
|
gc->cf = E_NEW(E_Config_Gadcon, 1);
|
2008-10-15 08:12:56 -07:00
|
|
|
gc->cf->name = eina_stringshare_add(name);
|
2008-05-19 02:21:44 -07:00
|
|
|
gc->cf->id = gc->id;
|
2012-02-14 20:35:18 -08:00
|
|
|
gc->cf->zone = zone->num;
|
2008-05-19 02:21:44 -07:00
|
|
|
gc->cf->clients = NULL;
|
2008-10-22 04:49:33 -07:00
|
|
|
e_config->gadcons = eina_list_append(e_config->gadcons, gc->cf);
|
2008-05-19 02:21:44 -07:00
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
|
2008-11-10 07:47:25 -08:00
|
|
|
e_gadcon_custom_new(gc);
|
2012-12-11 02:49:17 -08:00
|
|
|
e_gadcon_custom_populate_request(gc);
|
2008-11-10 07:47:25 -08:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
if (!Man->movers[layer])
|
|
|
|
Man->movers[layer] = _create_mover(gc);
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
return gc;
|
|
|
|
}
|
|
|
|
|
2013-02-07 05:20:07 -08:00
|
|
|
static void
|
|
|
|
_mover_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
|
|
|
|
{
|
|
|
|
unsigned int layer;
|
|
|
|
|
|
|
|
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
|
|
|
{
|
|
|
|
if (Man->movers[layer] != obj) continue;
|
|
|
|
Man->movers[layer] = NULL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-05-19 02:21:44 -07:00
|
|
|
static Evas_Object *
|
2008-05-18 21:37:34 -07:00
|
|
|
_create_mover(E_Gadcon *gc)
|
|
|
|
{
|
|
|
|
Evas_Object *mover;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* create mover object */
|
|
|
|
mover = edje_object_add(gc->evas);
|
2013-02-07 05:20:07 -08:00
|
|
|
if (gc->id == ID_GADMAN_LAYER_BG)
|
|
|
|
{
|
2013-02-18 05:43:47 -08:00
|
|
|
evas_object_layer_set(mover, E_COMP_CANVAS_LAYER_DESKTOP);
|
2013-02-07 05:20:07 -08:00
|
|
|
evas_object_event_callback_add(mover, EVAS_CALLBACK_DEL, _mover_del, NULL);
|
|
|
|
}
|
2013-06-11 23:41:31 -07:00
|
|
|
else
|
|
|
|
evas_object_layer_set(mover, E_COMP_CANVAS_LAYER_MENU);
|
2008-05-18 21:37:34 -07:00
|
|
|
e_theme_edje_object_set(mover, "base/theme/gadman", "e/gadman/control");
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-11-02 01:46:45 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,move,start", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_move, (void *)DRAG_START);
|
2012-11-26 02:06:50 -08:00
|
|
|
edje_object_signal_callback_add(mover, "mouse,down,3", "*",
|
2008-05-18 21:37:34 -07:00
|
|
|
gadman_gadget_edit_end, NULL);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,left,start", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_left, (void *)DRAG_START);
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,left,stop", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_left, (void *)DRAG_STOP);
|
2008-11-02 07:32:13 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,left,go", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_left, (void *)DRAG_MOVE);
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,down,start", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_down, (void *)DRAG_START);
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,down,stop", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_down, (void *)DRAG_STOP);
|
2008-11-02 07:32:13 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,down,go", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_down, (void *)DRAG_MOVE);
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,right,start", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_right, (void *)DRAG_START);
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,right,stop", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_right, (void *)DRAG_STOP);
|
2008-11-02 07:32:13 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,right,go", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_right, (void *)DRAG_MOVE);
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,up,start", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_top, (void *)DRAG_START);
|
2008-11-02 02:24:42 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,up,stop", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_top, (void *)DRAG_STOP);
|
2008-11-02 07:32:13 -08:00
|
|
|
edje_object_signal_callback_add(mover, "e,action,resize,up,go", "",
|
2012-07-02 03:13:27 -07:00
|
|
|
on_top, (void *)DRAG_MOVE);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
return mover;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_Object *
|
|
|
|
_get_mover(E_Gadcon_Client *gcc)
|
|
|
|
{
|
2009-07-11 13:46:55 -07:00
|
|
|
return Man->movers[gcc->gadcon->id - ID_GADMAN_LAYER_BASE];
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_save_widget_position(E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
int x, y, w, h;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
|
2013-02-25 01:24:24 -08:00
|
|
|
x -= gcc->gadcon->zone->x, y -= gcc->gadcon->zone->y;
|
|
|
|
gcc->config.pos_x = (double)x / (double)gcc->gadcon->zone->w;
|
|
|
|
gcc->config.pos_y = (double)y / (double)gcc->gadcon->zone->h;
|
|
|
|
gcc->config.size_w = (double)w / (double)gcc->gadcon->zone->w;
|
|
|
|
gcc->config.size_h = (double)h / (double)gcc->gadcon->zone->h;
|
|
|
|
if (gcc->cf)
|
|
|
|
{
|
|
|
|
gcc->cf->geom.pos_x = gcc->config.pos_x;
|
|
|
|
gcc->cf->geom.pos_y = gcc->config.pos_y;
|
|
|
|
gcc->cf->geom.size_w = gcc->config.size_w;
|
|
|
|
gcc->cf->geom.size_h = gcc->config.size_h;
|
|
|
|
e_config_save_queue();
|
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_apply_widget_position(E_Gadcon_Client *gcc)
|
|
|
|
{
|
|
|
|
int x, y, w, h;
|
2009-07-11 13:46:55 -07:00
|
|
|
E_Zone *zone;
|
2012-10-05 02:05:34 -07:00
|
|
|
Evas_Object *mover;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
/* Obtain zone from parent gadcon */
|
|
|
|
zone = gcc->gadcon->zone;
|
|
|
|
|
2012-10-30 01:04:52 -07:00
|
|
|
x = gcc->cf->geom.pos_x * zone->w + zone->x;
|
|
|
|
y = gcc->cf->geom.pos_y * zone->h + zone->y;
|
2012-07-30 03:38:31 -07:00
|
|
|
w = gcc->cf->geom.size_w * zone->w;
|
|
|
|
h = gcc->cf->geom.size_h * zone->h;
|
|
|
|
|
2012-07-27 00:02:47 -07:00
|
|
|
/* something broke the config's geom, make it visible so it can be
|
|
|
|
* resized/deleted
|
|
|
|
*/
|
2013-02-25 01:25:03 -08:00
|
|
|
if ((gcc->cf->geom.pos_x < 0) || (gcc->cf->geom.pos_y < 0) || (!gcc->cf->geom.size_w) || (!gcc->cf->geom.size_h))
|
2012-07-27 00:02:47 -07:00
|
|
|
{
|
2012-11-29 08:03:54 -08:00
|
|
|
gcc->cf->style = eina_stringshare_add(gcc->client_class->default_style ?: E_GADCON_CLIENT_STYLE_INSET);
|
|
|
|
gcc->style = eina_stringshare_ref(gcc->cf->style);
|
2012-10-05 01:23:00 -07:00
|
|
|
gcc->cf->geom.pos_x = DEFAULT_POS_X;
|
|
|
|
gcc->cf->geom.pos_y = DEFAULT_POS_Y;
|
|
|
|
gcc->cf->geom.size_w = DEFAULT_SIZE_W;
|
|
|
|
gcc->cf->geom.size_h = DEFAULT_SIZE_H;
|
2012-11-29 08:03:54 -08:00
|
|
|
if (!strcmp(gcc->style, E_GADCON_CLIENT_STYLE_INSET))
|
|
|
|
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e");
|
2012-10-05 01:23:00 -07:00
|
|
|
_apply_widget_position(gcc);
|
|
|
|
gadman_gadget_edit_start(gcc);
|
|
|
|
return;
|
2012-07-27 00:02:47 -07:00
|
|
|
}
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Respect min sizes */
|
|
|
|
if (h < gcc->min.h) h = gcc->min.h;
|
|
|
|
if (w < gcc->min.w) w = gcc->min.w;
|
|
|
|
if (h < 1) h = 100;
|
|
|
|
if (w < 1) w = 100;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2009-07-11 13:46:55 -07:00
|
|
|
/* Respect zone marigin */
|
|
|
|
if (x < zone->x) x = zone->x;
|
|
|
|
if (y < zone->y) y = zone->y;
|
|
|
|
if (x > (zone->x + zone->w)) x = zone->x;
|
|
|
|
if (y > (zone->y + zone->h)) y = zone->y;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-07-02 03:13:27 -07:00
|
|
|
if ((y + h) > (zone->y + zone->h + MIN_VISIBLE_MARIGIN))
|
2010-05-23 14:38:29 -07:00
|
|
|
h = ((zone->y + zone->h + MIN_VISIBLE_MARIGIN) - y);
|
2012-07-02 03:13:27 -07:00
|
|
|
if ((x + w) > (zone->x + zone->w + MIN_VISIBLE_MARIGIN))
|
2010-05-23 14:38:29 -07:00
|
|
|
w = ((zone->x + zone->w + MIN_VISIBLE_MARIGIN) - x);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
evas_object_move(gcc->o_frame, x, y);
|
|
|
|
evas_object_resize(gcc->o_frame, w, h);
|
2012-10-05 02:05:34 -07:00
|
|
|
|
|
|
|
if (Man->drag_gcc[gcc->gadcon->id - ID_GADMAN_LAYER_BASE] != gcc) return;
|
|
|
|
/* Move/resize the correct mover */
|
|
|
|
mover = _get_mover(gcc);
|
|
|
|
if (!mover) return;
|
|
|
|
evas_object_move(mover, x, y);
|
|
|
|
evas_object_resize(mover, w, h);
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
_attach_menu(void *data __UNUSED__, E_Gadcon_Client *gcc, E_Menu *menu)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
E_Menu *mn;
|
|
|
|
E_Menu_Item *mi;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
//printf("Attach menu (gcc: %x id: %s) [%s]\n", gcc, gcc->cf->id, gcc->cf->style);
|
|
|
|
if (!gcc) return;
|
|
|
|
|
2010-12-30 05:44:39 -08:00
|
|
|
if (e_menu_item_nth(menu, 0))
|
|
|
|
{
|
|
|
|
mi = e_menu_item_new(menu);
|
|
|
|
e_menu_item_separator_set(mi, 1);
|
|
|
|
}
|
2010-09-09 07:44:21 -07:00
|
|
|
|
|
|
|
/* Move / resize*/
|
|
|
|
mi = e_menu_item_new(menu);
|
|
|
|
e_menu_item_label_set(mi, _("Begin move/resize"));
|
|
|
|
e_util_menu_item_theme_icon_set(mi, "transform-scale");
|
|
|
|
e_menu_item_callback_set(mi, on_menu_edit, gcc);
|
|
|
|
|
|
|
|
/* plain / inset */
|
2013-02-25 01:25:03 -08:00
|
|
|
if (gcc->cf)
|
|
|
|
{
|
|
|
|
if (!gcc->cf->style)
|
|
|
|
gcc->cf->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_INSET);
|
|
|
|
|
|
|
|
mn = e_menu_new();
|
|
|
|
mi = e_menu_item_new(mn);
|
|
|
|
e_menu_item_label_set(mi, _("Plain"));
|
|
|
|
e_menu_item_radio_set(mi, 1);
|
|
|
|
e_menu_item_radio_group_set(mi, 1);
|
|
|
|
if (!strcmp(gcc->cf->style, E_GADCON_CLIENT_STYLE_PLAIN))
|
|
|
|
e_menu_item_toggle_set(mi, 1);
|
|
|
|
e_menu_item_callback_set(mi, on_menu_style_plain, gcc);
|
|
|
|
|
|
|
|
mi = e_menu_item_new(mn);
|
|
|
|
e_menu_item_label_set(mi, _("Inset"));
|
|
|
|
e_menu_item_radio_set(mi, 1);
|
|
|
|
e_menu_item_radio_group_set(mi, 1);
|
|
|
|
if (!strcmp(gcc->cf->style, E_GADCON_CLIENT_STYLE_INSET))
|
|
|
|
e_menu_item_toggle_set(mi, 1);
|
|
|
|
e_menu_item_callback_set(mi, on_menu_style_inset, gcc);
|
|
|
|
|
|
|
|
mi = e_menu_item_new(mn);
|
|
|
|
e_menu_item_separator_set(mi, 1);
|
2008-11-04 19:12:45 -08:00
|
|
|
|
2013-02-25 01:25:03 -08:00
|
|
|
/* orient */
|
|
|
|
mi = e_menu_item_new(mn);
|
|
|
|
e_menu_item_label_set(mi, _("Free"));
|
|
|
|
e_menu_item_radio_set(mi, 1);
|
|
|
|
e_menu_item_radio_group_set(mi, 2);
|
|
|
|
if (gcc->cf->orient == E_GADCON_ORIENT_FLOAT)
|
|
|
|
e_menu_item_toggle_set(mi, 1);
|
2013-08-13 03:20:15 -07:00
|
|
|
if (!mi->toggle)
|
|
|
|
e_menu_item_callback_set(mi, on_menu_style_float, gcc);
|
2013-02-25 01:25:03 -08:00
|
|
|
|
|
|
|
mi = e_menu_item_new(mn);
|
|
|
|
e_menu_item_label_set(mi, _("Horizontal"));
|
|
|
|
e_menu_item_radio_set(mi, 1);
|
|
|
|
e_menu_item_radio_group_set(mi, 2);
|
|
|
|
if (gcc->cf->orient == E_GADCON_ORIENT_HORIZ)
|
|
|
|
e_menu_item_toggle_set(mi, 1);
|
2013-08-13 03:20:15 -07:00
|
|
|
if (!mi->toggle)
|
|
|
|
e_menu_item_callback_set(mi, on_menu_style_horiz, gcc);
|
2013-02-25 01:25:03 -08:00
|
|
|
|
|
|
|
mi = e_menu_item_new(mn);
|
|
|
|
e_menu_item_label_set(mi, _("Vertical"));
|
|
|
|
e_menu_item_radio_set(mi, 1);
|
|
|
|
e_menu_item_radio_group_set(mi, 2);
|
|
|
|
if (gcc->cf->orient == E_GADCON_ORIENT_VERT)
|
|
|
|
e_menu_item_toggle_set(mi, 1);
|
2013-08-13 03:20:15 -07:00
|
|
|
if (!mi->toggle)
|
|
|
|
e_menu_item_callback_set(mi, on_menu_style_vert, gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-02-25 01:25:03 -08:00
|
|
|
mi = e_menu_item_new(menu);
|
|
|
|
e_menu_item_label_set(mi, _("Appearance"));
|
|
|
|
e_util_menu_item_theme_icon_set(mi, "preferences-look");
|
|
|
|
e_menu_item_submenu_set(mi, mn);
|
|
|
|
e_object_unref(E_OBJECT(mn));
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-02-25 01:25:03 -08:00
|
|
|
mi = e_menu_item_new(menu);
|
|
|
|
e_menu_item_separator_set(mi, 1);
|
|
|
|
|
|
|
|
e_gadcon_client_add_location_menu(gcc, menu);
|
|
|
|
}
|
2009-08-31 04:23:03 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Remove this gadgets */
|
|
|
|
mi = e_menu_item_new(menu);
|
2010-09-09 07:44:21 -07:00
|
|
|
e_menu_item_label_set(mi, _("Remove"));
|
2009-03-06 11:17:12 -08:00
|
|
|
e_util_menu_item_theme_icon_set(mi, "list-remove");
|
2008-05-18 21:37:34 -07:00
|
|
|
e_menu_item_callback_set(mi, on_menu_delete, gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
/* Add other gadgets */
|
2010-09-09 07:44:21 -07:00
|
|
|
mi = e_menu_item_new(menu);
|
|
|
|
e_menu_item_separator_set(mi, 1);
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
mi = e_menu_item_new(menu);
|
|
|
|
e_menu_item_label_set(mi, _("Add other gadgets"));
|
2009-03-06 11:17:12 -08:00
|
|
|
e_util_menu_item_theme_icon_set(mi, "list-add");
|
2008-05-18 21:37:34 -07:00
|
|
|
e_menu_item_callback_set(mi, on_menu_add, gcc);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-09-17 06:06:06 -07:00
|
|
|
on_menu_style_plain(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2012-09-17 06:06:06 -07:00
|
|
|
E_Gadcon_Client *gcc = data;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-09-17 06:06:06 -07:00
|
|
|
eina_stringshare_replace(&gcc->style, E_GADCON_CLIENT_STYLE_PLAIN);
|
|
|
|
eina_stringshare_replace(&gcc->cf->style, E_GADCON_CLIENT_STYLE_PLAIN);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e");
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-09-17 06:06:06 -07:00
|
|
|
on_menu_style_inset(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2012-09-17 06:06:06 -07:00
|
|
|
E_Gadcon_Client *gcc = data;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-09-17 06:06:06 -07:00
|
|
|
eina_stringshare_replace(&gcc->style, E_GADCON_CLIENT_STYLE_INSET);
|
|
|
|
eina_stringshare_replace(&gcc->cf->style, E_GADCON_CLIENT_STYLE_INSET);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e");
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
|
2008-11-04 19:12:45 -08:00
|
|
|
static void
|
2008-12-06 13:01:15 -08:00
|
|
|
_menu_style_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient)
|
2008-11-04 19:12:45 -08:00
|
|
|
{
|
2013-08-13 03:20:39 -07:00
|
|
|
int ow, oh, w, h;
|
|
|
|
Eina_Bool same;
|
|
|
|
|
|
|
|
same = (((orient == E_GADCON_ORIENT_LEFT) && (gcc->cf->orient == E_GADCON_ORIENT_FLOAT)) ||
|
|
|
|
((orient == E_GADCON_ORIENT_FLOAT) && (gcc->cf->orient == E_GADCON_ORIENT_LEFT)));
|
2008-12-06 13:01:15 -08:00
|
|
|
gcc->cf->orient = orient;
|
2013-08-13 03:20:39 -07:00
|
|
|
evas_object_geometry_get(gcc->o_frame, NULL, NULL, &ow, &oh);
|
2008-11-04 19:12:45 -08:00
|
|
|
|
|
|
|
if (gcc->client_class->func.orient)
|
2012-07-02 03:13:27 -07:00
|
|
|
gcc->client_class->func.orient(gcc, orient);
|
2008-12-06 13:01:15 -08:00
|
|
|
|
2013-08-13 03:20:39 -07:00
|
|
|
if (same)
|
2012-07-02 03:13:27 -07:00
|
|
|
{
|
2013-08-13 03:20:39 -07:00
|
|
|
w = ow, h = oh;
|
2012-07-02 03:13:27 -07:00
|
|
|
}
|
2013-08-13 03:20:39 -07:00
|
|
|
else
|
2012-07-02 03:13:27 -07:00
|
|
|
{
|
2013-08-13 03:20:39 -07:00
|
|
|
/* just flip aspect */
|
|
|
|
w = oh;
|
|
|
|
h = ow;
|
2012-07-02 03:13:27 -07:00
|
|
|
}
|
2008-12-06 13:02:27 -08:00
|
|
|
|
2013-08-13 03:20:39 -07:00
|
|
|
gcc->max.w = w;
|
|
|
|
gcc->max.h = h;
|
2008-12-06 13:01:15 -08:00
|
|
|
evas_object_resize(gcc->o_frame, w, h);
|
|
|
|
_save_widget_position(gcc);
|
|
|
|
}
|
2008-11-04 19:12:45 -08:00
|
|
|
|
2008-12-06 13:01:15 -08:00
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_menu_style_float(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
|
2008-12-06 13:01:15 -08:00
|
|
|
{
|
|
|
|
_menu_style_orient(data, E_GADCON_ORIENT_FLOAT);
|
2008-11-04 19:12:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_menu_style_horiz(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
|
2008-11-04 19:12:45 -08:00
|
|
|
{
|
2008-12-06 13:01:15 -08:00
|
|
|
_menu_style_orient(data, E_GADCON_ORIENT_HORIZ);
|
2008-11-04 19:12:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_menu_style_vert(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
|
2008-11-04 19:12:45 -08:00
|
|
|
{
|
2008-12-06 13:01:15 -08:00
|
|
|
_menu_style_orient(data, E_GADCON_ORIENT_VERT);
|
2008-11-04 19:12:45 -08:00
|
|
|
}
|
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_menu_edit(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
gadman_gadget_edit_start(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_menu_add(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
if (Man->visible)
|
2008-05-19 02:21:44 -07:00
|
|
|
gadman_gadgets_hide();
|
2008-05-18 21:37:34 -07:00
|
|
|
e_configure_registry_call("extensions/gadman", m->zone->container, NULL);
|
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_menu_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2012-09-06 11:28:02 -07:00
|
|
|
E_Gadcon_Client *gcc = data;
|
|
|
|
e_gadcon_client_config_del(gcc->gadcon->cf, gcc->cf);
|
|
|
|
e_object_del(data);
|
2008-05-18 21:37:34 -07:00
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_frame_click(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Down *ev;
|
|
|
|
E_Gadcon_Client *gcc;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
ev = event_info;
|
|
|
|
|
|
|
|
gcc = data;
|
2009-07-11 13:46:55 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
if (ev->button == 5)
|
|
|
|
{
|
2012-07-02 03:13:27 -07:00
|
|
|
E_Menu *m;
|
|
|
|
int cx, cy, cw, ch;
|
|
|
|
|
|
|
|
m = e_menu_new();
|
|
|
|
m = e_gadcon_client_util_menu_items_append(gcc, m, 0);
|
|
|
|
gcc->menu = m;
|
|
|
|
e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, &cw, &ch);
|
|
|
|
e_menu_activate_mouse(m,
|
|
|
|
e_util_zone_current_get(e_manager_current_get()),
|
|
|
|
cx + ev->output.x, cy + ev->output.y, 1, 1,
|
|
|
|
E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
|
2012-08-15 00:22:04 -07:00
|
|
|
evas_event_feed_mouse_up(gcc->gadcon->evas, ev->button,
|
|
|
|
EVAS_BUTTON_NONE, ev->timestamp, NULL);
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_top(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
static int ox, oy, ow, oh; //Object coord
|
2012-07-02 03:13:27 -07:00
|
|
|
int mx, my; //Mouse coord
|
2008-10-10 17:59:21 -07:00
|
|
|
int action = (int)(long)data;
|
2008-05-18 21:37:34 -07:00
|
|
|
Evas_Object *mover;
|
2012-10-01 07:02:24 -07:00
|
|
|
E_Gadcon_Client *drag_gcc;
|
|
|
|
int layer = Man->visible;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc = Man->drag_gcc[layer];
|
2012-09-17 06:06:06 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
mover = _get_mover(drag_gcc);
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_TRUE;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
if (action == DRAG_START)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 1;
|
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->dy = my - oy;
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
else if (action == DRAG_STOP)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 0;
|
|
|
|
drag_gcc->dy = 0;
|
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2008-06-19 05:56:07 -07:00
|
|
|
int h;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
h = oy + oh + drag_gcc->dy - my;
|
2008-11-02 07:32:13 -08:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
if (h < drag_gcc->min.h)
|
2012-07-02 03:13:27 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
my -= drag_gcc->min.h - h;
|
|
|
|
h = drag_gcc->min.h;
|
2012-07-02 03:13:27 -07:00
|
|
|
}
|
2008-11-02 07:32:13 -08:00
|
|
|
/* don't go out of the screen */
|
2012-10-01 07:02:24 -07:00
|
|
|
if (my < drag_gcc->dy)
|
2012-07-02 03:13:27 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
h += my - drag_gcc->dy;
|
|
|
|
my = drag_gcc->dy;
|
2012-07-02 03:13:27 -07:00
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-08-13 03:04:36 -07:00
|
|
|
if (drag_gcc->aspect.w && drag_gcc->aspect.h)
|
|
|
|
{
|
|
|
|
ow = h * drag_gcc->aspect.w / drag_gcc->aspect.h;
|
|
|
|
}
|
|
|
|
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_resize(mover, ow, h);
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_object_move(mover, ox, my - drag_gcc->dy);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-08-13 03:04:36 -07:00
|
|
|
drag_gcc->max.w = ow, drag_gcc->max.h = h;
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_object_resize(drag_gcc->o_frame, ow, h);
|
|
|
|
evas_object_move(drag_gcc->o_frame, ox, my - drag_gcc->dy);
|
2013-02-25 01:26:06 -08:00
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_FALSE;
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_right(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2008-05-19 02:21:44 -07:00
|
|
|
Evas_Object *mover;
|
2008-05-18 21:37:34 -07:00
|
|
|
static int ox, oy, ow, oh; //Object coord
|
2012-07-02 03:13:27 -07:00
|
|
|
int mx, my; //Mouse coord
|
2008-05-19 02:21:44 -07:00
|
|
|
int action;
|
2012-10-01 07:02:24 -07:00
|
|
|
E_Gadcon_Client *drag_gcc;
|
|
|
|
int layer = Man->visible;
|
2012-09-17 06:06:06 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc = Man->drag_gcc[layer];
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
mover = _get_mover(drag_gcc);
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_TRUE;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-10-10 17:59:21 -07:00
|
|
|
action = (int)(long)data;
|
2008-05-18 21:37:34 -07:00
|
|
|
if (action == DRAG_START)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 1;
|
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->dx = mx - ow;
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
else if (action == DRAG_STOP)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 0;
|
|
|
|
drag_gcc->dx = 0;
|
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2008-06-19 05:56:07 -07:00
|
|
|
int w;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
|
|
|
w = mx - drag_gcc->dx;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
if (w < drag_gcc->min.w) w = drag_gcc->min.w;
|
2008-11-02 07:32:13 -08:00
|
|
|
/* don't go out of the screen */
|
2012-07-02 03:13:27 -07:00
|
|
|
if (w > (Man->width - ox)) w = Man->width - ox;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-08-13 03:04:36 -07:00
|
|
|
if (drag_gcc->aspect.w && drag_gcc->aspect.h)
|
|
|
|
{
|
|
|
|
oh = w * drag_gcc->aspect.h / drag_gcc->aspect.w;
|
|
|
|
}
|
|
|
|
drag_gcc->max.w = w, drag_gcc->max.h = oh;
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_resize(mover, w, oh);
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_object_resize(drag_gcc->o_frame, w, oh);
|
2013-02-25 01:26:06 -08:00
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_FALSE;
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_down(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2008-05-19 02:21:44 -07:00
|
|
|
Evas_Object *mover;
|
2008-05-18 21:37:34 -07:00
|
|
|
static int ox, oy, ow, oh; //Object coord
|
2012-07-02 03:13:27 -07:00
|
|
|
int mx, my; //Mouse coord
|
2012-09-17 06:06:06 -07:00
|
|
|
int action = (int)(long)data;
|
2012-10-01 07:02:24 -07:00
|
|
|
E_Gadcon_Client *drag_gcc;
|
|
|
|
int layer = Man->visible;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc = Man->drag_gcc[layer];
|
2012-09-17 06:06:06 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
mover = _get_mover(drag_gcc);
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_TRUE;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2008-05-18 21:37:34 -07:00
|
|
|
if (action == DRAG_START)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 1;
|
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->dy = my - oh;
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
else if (action == DRAG_STOP)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 0;
|
|
|
|
drag_gcc->dy = 0;
|
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2008-06-19 05:56:07 -07:00
|
|
|
int h;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
|
|
|
h = my - drag_gcc->dy;
|
2008-11-02 07:32:13 -08:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
if (h < drag_gcc->min.h) h = drag_gcc->min.h;
|
2008-11-02 07:32:13 -08:00
|
|
|
/* don't go out of the screen */
|
2012-07-02 03:13:27 -07:00
|
|
|
if (h > (Man->height - oy)) h = Man->height - oy;
|
2013-08-13 03:04:36 -07:00
|
|
|
if (drag_gcc->aspect.w && drag_gcc->aspect.h)
|
|
|
|
{
|
|
|
|
ow = h * drag_gcc->aspect.w / drag_gcc->aspect.h;
|
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_resize(mover, ow, h);
|
2013-08-13 03:04:36 -07:00
|
|
|
drag_gcc->max.w = ow, drag_gcc->max.h = h;
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_object_resize(drag_gcc->o_frame, ow, h);
|
2013-02-25 01:26:06 -08:00
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_FALSE;
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_left(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2008-05-19 02:21:44 -07:00
|
|
|
Evas_Object *mover;
|
2008-05-18 21:37:34 -07:00
|
|
|
static int ox, oy, ow, oh; //Object coord
|
2012-07-02 03:13:27 -07:00
|
|
|
int mx, my; //Mouse coord
|
2012-09-17 06:06:06 -07:00
|
|
|
int action = (int)(long)data;
|
2012-10-01 07:02:24 -07:00
|
|
|
E_Gadcon_Client *drag_gcc;
|
|
|
|
int layer = Man->visible;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc = Man->drag_gcc[layer];
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
mover = _get_mover(drag_gcc);
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_TRUE;
|
2008-05-18 21:37:34 -07:00
|
|
|
if (action == DRAG_START)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 1;
|
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->dx = mx - ox;
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
else if (action == DRAG_STOP)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->resizing = 0;
|
|
|
|
drag_gcc->dx = 0;
|
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
else if ((action == DRAG_MOVE) && drag_gcc->resizing)
|
2008-05-19 02:21:44 -07:00
|
|
|
{
|
2008-06-19 05:56:07 -07:00
|
|
|
int w;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_pointer_output_xy_get(drag_gcc->gadcon->evas, &mx, &my);
|
2008-05-18 21:37:34 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
w = ox + ow + drag_gcc->dx - mx;
|
2008-11-02 07:32:13 -08:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
if (w < drag_gcc->min.w)
|
2012-07-02 03:13:27 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
mx -= drag_gcc->min.w - w;
|
|
|
|
w = drag_gcc->min.w;
|
2012-07-02 03:13:27 -07:00
|
|
|
}
|
2008-11-02 07:32:13 -08:00
|
|
|
/* don't go out of the screen */
|
2012-10-01 07:02:24 -07:00
|
|
|
if (mx < drag_gcc->dx)
|
2012-07-02 03:13:27 -07:00
|
|
|
{
|
2012-10-01 07:02:24 -07:00
|
|
|
w += mx - drag_gcc->dx;
|
|
|
|
mx = drag_gcc->dx;
|
2012-07-02 03:13:27 -07:00
|
|
|
}
|
2013-08-13 03:04:36 -07:00
|
|
|
if (drag_gcc->aspect.w && drag_gcc->aspect.h)
|
|
|
|
{
|
|
|
|
oh = w * drag_gcc->aspect.h / drag_gcc->aspect.w;
|
|
|
|
}
|
2008-05-19 02:21:44 -07:00
|
|
|
evas_object_resize(mover, w, oh);
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_object_move(mover, mx - drag_gcc->dx, oy);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2013-08-13 03:04:36 -07:00
|
|
|
drag_gcc->max.w = w, drag_gcc->max.h = oh;
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_object_resize(drag_gcc->o_frame, w, oh);
|
|
|
|
evas_object_move(drag_gcc->o_frame, mx - drag_gcc->dx, oy);
|
2013-02-25 01:26:06 -08:00
|
|
|
_save_widget_position(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2013-08-13 02:22:24 -07:00
|
|
|
mover_lock = EINA_FALSE;
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2008-05-18 21:37:34 -07:00
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_move(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
2008-05-19 02:21:44 -07:00
|
|
|
Evas_Object *mover;
|
2008-05-18 21:37:34 -07:00
|
|
|
static int ox, oy; //Starting object position
|
|
|
|
static int ow, oh; //Starting object size
|
2012-07-02 03:13:27 -07:00
|
|
|
int mx, my; //Mouse coord
|
2012-09-17 06:06:06 -07:00
|
|
|
int action = (int)(long)data;
|
|
|
|
E_Gadcon *gc;
|
2012-10-01 07:02:24 -07:00
|
|
|
E_Gadcon_Client *drag_gcc;
|
|
|
|
E_Drag *drag;
|
|
|
|
const char *drag_types[] = { "enlightenment/gadcon_client" };
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-11-29 08:03:54 -08:00
|
|
|
/* DRAG_START */
|
|
|
|
if (action != DRAG_START) return;
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc = Man->drag_gcc[Man->visible];
|
|
|
|
if (!drag_gcc) return;
|
2012-11-29 08:03:54 -08:00
|
|
|
gc = drag_gcc->gadcon;
|
2012-10-01 07:02:24 -07:00
|
|
|
mover = _get_mover(drag_gcc);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->moving = 1;
|
|
|
|
gc->cf->clients = eina_list_remove(gc->cf->clients, drag_gcc->cf);
|
|
|
|
e_gadcon_client_drag_set(drag_gcc);
|
2012-11-29 08:03:54 -08:00
|
|
|
e_object_ref(E_OBJECT(drag_gcc));
|
2012-10-01 07:02:24 -07:00
|
|
|
evas_pointer_output_xy_get(gc->evas, &mx, &my);
|
|
|
|
evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->dx = mx - ox;
|
|
|
|
drag_gcc->dy = my - oy;
|
2008-05-19 02:21:44 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
drag_gcc->drag.drag = drag = e_drag_new(gc->zone->container, mx, my,
|
|
|
|
drag_types, 1, drag_gcc, -1, NULL,
|
|
|
|
e_gadcon_drag_finished_cb);
|
|
|
|
if (!drag) return;
|
2012-09-17 07:49:48 -07:00
|
|
|
|
2012-10-01 07:02:24 -07:00
|
|
|
o = drag_gcc->client_class->func.icon((E_Gadcon_Client_Class *)drag_gcc->client_class,
|
|
|
|
e_drag_evas_get(drag));
|
|
|
|
if (!o)
|
|
|
|
{
|
|
|
|
/* FIXME: fallback icon for drag */
|
|
|
|
o = evas_object_rectangle_add(e_drag_evas_get(drag));
|
|
|
|
evas_object_color_set(o, 255, 255, 255, 100);
|
2008-05-19 02:21:44 -07:00
|
|
|
}
|
2012-10-01 07:02:24 -07:00
|
|
|
|
|
|
|
e_drag_object_set(drag, o);
|
|
|
|
e_drag_resize(drag, ow, oh);
|
|
|
|
e_drag_start(drag, mx, my);
|
2013-02-21 04:55:22 -08:00
|
|
|
e_drag_hide(drag);
|
2008-05-18 21:37:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-19 12:18:43 -07:00
|
|
|
on_bg_click(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
2008-05-18 21:37:34 -07:00
|
|
|
{
|
|
|
|
gadman_gadgets_hide();
|
|
|
|
}
|
2008-10-23 00:15:44 -07:00
|
|
|
|
|
|
|
static void
|
2010-05-23 14:38:29 -07:00
|
|
|
on_hide_stop(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
|
2008-10-23 00:15:44 -07:00
|
|
|
{
|
2013-06-11 23:41:31 -07:00
|
|
|
e_popup_hide(Man->overlay);
|
2008-10-23 00:15:44 -07:00
|
|
|
}
|
2009-08-31 04:23:03 -07:00
|
|
|
|
2012-07-02 03:13:27 -07:00
|
|
|
static int
|
2013-05-23 01:16:30 -07:00
|
|
|
_e_gadman_client_add(void *data, E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc)
|
2009-08-31 04:23:03 -07:00
|
|
|
{
|
2013-05-23 01:16:30 -07:00
|
|
|
return !!gadman_gadget_add(cc, gcc, (intptr_t)data);
|
2009-08-31 04:23:03 -07:00
|
|
|
}
|
|
|
|
|
2012-07-02 03:13:27 -07:00
|
|
|
static void
|
2010-05-23 14:38:29 -07:00
|
|
|
_e_gadman_client_remove(void *data __UNUSED__, E_Gadcon_Client *gcc)
|
2009-08-31 04:23:03 -07:00
|
|
|
{
|
2012-10-05 02:57:34 -07:00
|
|
|
if (gcc->cf)
|
|
|
|
gcc->gadcon->cf->clients = eina_list_remove(gcc->gadcon->cf->clients, gcc->cf);
|
2012-09-06 11:28:02 -07:00
|
|
|
e_object_del(E_OBJECT(gcc));
|
2009-08-31 04:23:03 -07:00
|
|
|
}
|
2012-06-13 02:37:22 -07:00
|
|
|
|
2012-07-02 03:13:27 -07:00
|
|
|
static void
|
|
|
|
_e_gadman_handlers_add(void)
|
2012-06-13 02:37:22 -07:00
|
|
|
{
|
2013-06-11 23:41:31 -07:00
|
|
|
E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_ADD, _e_gadman_cb_zone_change, NULL);
|
|
|
|
E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_MOVE_RESIZE, _e_gadman_cb_zone_change, NULL);
|
|
|
|
E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_DEL, _e_gadman_cb_zone_change, NULL);
|
2012-10-05 03:23:52 -07:00
|
|
|
E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_MODULE_UPDATE, _gadman_module_cb, NULL);
|
2012-10-26 05:13:53 -07:00
|
|
|
E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_MODULE_INIT_END, _gadman_module_init_end_cb, NULL);
|
2012-06-13 02:37:22 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_gadman_handler_del(void)
|
|
|
|
{
|
2012-10-05 03:22:57 -07:00
|
|
|
E_FREE_LIST(_gadman_hdls, ecore_event_handler_del);
|
2012-06-13 02:37:22 -07:00
|
|
|
}
|
|
|
|
|
2012-10-26 05:13:53 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_gadman_module_init_end_cb(void *d __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
|
|
|
|
{
|
|
|
|
gadman_locked = EINA_FALSE;
|
|
|
|
gadman_reset();
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2012-07-02 06:28:13 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_gadman_module_cb(void *d __UNUSED__, int type __UNUSED__, E_Event_Module_Update *ev)
|
|
|
|
{
|
2012-07-03 00:39:44 -07:00
|
|
|
if (!ev->enabled)
|
2012-07-02 06:28:13 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
2012-07-26 07:00:20 -07:00
|
|
|
E_Config_Gadcon_Client *cf_gcc;
|
2012-07-02 06:28:13 -07:00
|
|
|
E_Gadcon_Client *gcc;
|
|
|
|
l = eina_hash_set(_gadman_gadgets, ev->name, NULL);
|
|
|
|
if (!l) return ECORE_CALLBACK_RENEW;
|
2012-07-26 07:00:20 -07:00
|
|
|
EINA_LIST_FREE(l, cf_gcc)
|
2012-07-02 06:28:13 -07:00
|
|
|
{
|
2012-07-27 09:10:06 -07:00
|
|
|
gcc = e_gadcon_client_find(NULL, cf_gcc);
|
2012-07-26 07:00:20 -07:00
|
|
|
if (!gcc) continue;
|
2012-07-02 06:28:13 -07:00
|
|
|
gcc->cf = NULL;
|
2012-09-06 11:28:02 -07:00
|
|
|
e_object_del(E_OBJECT(gcc));
|
2012-07-02 06:28:13 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2012-06-13 02:37:22 -07:00
|
|
|
static Eina_Bool
|
2013-06-19 01:33:29 -07:00
|
|
|
_e_gadman_cb_zone_change(void *data __UNUSED__, int type, void *event)
|
2012-06-13 02:37:22 -07:00
|
|
|
{
|
2013-06-19 01:33:29 -07:00
|
|
|
E_Gadcon *gc;
|
2013-10-06 20:16:24 -07:00
|
|
|
Eina_List *l, *ll;
|
2013-06-19 01:33:29 -07:00
|
|
|
E_Event_Zone_Move_Resize *ev = event;
|
|
|
|
const char *layer_name[] = {"gadman", "gadman_top"};
|
|
|
|
int layer;
|
|
|
|
E_Gadcon_Client *gcc;
|
2012-06-13 02:37:22 -07:00
|
|
|
|
2012-11-13 01:51:28 -08:00
|
|
|
if (!Man) return ECORE_CALLBACK_RENEW;
|
2013-06-19 01:33:29 -07:00
|
|
|
if (type == E_EVENT_ZONE_MOVE_RESIZE)
|
|
|
|
{
|
|
|
|
/* probably zone dirty being set */
|
|
|
|
EINA_LIST_FOREACH(Man->gadcons[GADMAN_LAYER_BG], l, gc)
|
|
|
|
{
|
|
|
|
if (e_gadcon_zone_get(gc) != ev->zone) continue;
|
|
|
|
EINA_LIST_FOREACH(gc->clients, ll, gcc)
|
|
|
|
_apply_widget_position(gcc);
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (type == E_EVENT_ZONE_DEL)
|
|
|
|
{
|
|
|
|
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
|
|
|
{
|
|
|
|
EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
|
|
|
|
{
|
|
|
|
if (e_gadcon_zone_get(gc) != ev->zone) continue;
|
|
|
|
e_object_del(E_OBJECT(gc));
|
2013-10-06 20:18:26 -07:00
|
|
|
Man->gadcons[layer] = eina_list_remove_list(Man->gadcons[layer], l);
|
|
|
|
E_FREE_FUNC(Man->movers[layer], evas_object_del);
|
2013-06-19 01:33:29 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ev->zone == Man->overlay->zone)
|
|
|
|
{
|
|
|
|
E_FREE_FUNC(Man->overlay, e_object_del);
|
|
|
|
E_FREE_FUNC(Man->overlay_layer, evas_object_del);
|
|
|
|
_gadman_overlay_create();
|
|
|
|
}
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
|
|
|
|
{
|
|
|
|
Eina_Bool found = EINA_FALSE;
|
|
|
|
EINA_LIST_FOREACH(Man->gadcons[GADMAN_LAYER_BG], l, gc)
|
|
|
|
if (e_gadcon_zone_get(gc) == ev->zone)
|
|
|
|
{
|
|
|
|
found = EINA_TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (found) continue;
|
|
|
|
gc = _gadman_gadcon_new(layer_name[layer], layer, ev->zone, Man->location[layer]);
|
|
|
|
Man->gadcons[layer] = eina_list_append(Man->gadcons[layer], gc);
|
|
|
|
gc->drop_handler->base = Man->overlay_layer;
|
|
|
|
gc->drop_handler->hidden = 1;
|
|
|
|
}
|
2012-06-13 02:37:22 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|