diff --git a/src/modules/Makefile_start.mk b/src/modules/Makefile_start.mk index 1f72bf401..4d2b6fac6 100644 --- a/src/modules/Makefile_start.mk +++ b/src/modules/Makefile_start.mk @@ -12,7 +12,9 @@ startpkg_LTLIBRARIES = src/modules/start/module.la src_modules_start_module_la_LIBADD = $(MOD_LIBS) src_modules_start_module_la_CPPFLAGS = $(MOD_CPPFLAGS) src_modules_start_module_la_LDFLAGS = $(MOD_LDFLAGS) -src_modules_start_module_la_SOURCES = src/modules/start/e_mod_main.c +src_modules_start_module_la_SOURCES = \ +src/modules/start/e_mod_main.c \ +src/modules/start/start.c PHONIES += start install-start start: $(startpkg_LTLIBRARIES) $(start_DATA) diff --git a/src/modules/start/e_mod_main.c b/src/modules/start/e_mod_main.c index ba4f8e3aa..52e926830 100644 --- a/src/modules/start/e_mod_main.c +++ b/src/modules/start/e_mod_main.c @@ -320,8 +320,11 @@ E_API E_Module_Api e_modapi = E_API void * e_modapi_init(E_Module *m) { + EINTERN Evas_Object *start_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient); + start_module = m; e_gadcon_provider_register(&_gadcon_class); + e_gadget_type_add("Start", start_create, NULL); return m; } @@ -330,6 +333,7 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) { start_module = NULL; e_gadcon_provider_unregister(&_gadcon_class); + e_gadget_type_del("Start"); return 1; } diff --git a/src/modules/start/start.c b/src/modules/start/start.c new file mode 100644 index 000000000..8bdea5bf4 --- /dev/null +++ b/src/modules/start/start.c @@ -0,0 +1,220 @@ +#include "e.h" + +/* actual module specifics */ +typedef struct _Instance Instance; + +struct _Instance +{ + Evas_Object *o_button; + E_Menu *main_menu; +}; + +static void +do_orient(Instance *inst, E_Gadget_Site_Orient orient, E_Gadget_Site_Anchor anchor) +{ + char buf[4096]; + const char *s = "float"; + + if (anchor & E_GADGET_SITE_ANCHOR_LEFT) + { + if (anchor & E_GADGET_SITE_ANCHOR_TOP) + { + switch (orient) + { + case E_GADGET_SITE_ORIENT_HORIZONTAL: + s = "top_left"; + break; + case E_GADGET_SITE_ORIENT_VERTICAL: + s = "left_top"; + break; + case E_GADGET_SITE_ORIENT_NONE: + s = "left_top"; + break; + } + } + else if (anchor & E_GADGET_SITE_ANCHOR_BOTTOM) + { + switch (orient) + { + case E_GADGET_SITE_ORIENT_HORIZONTAL: + s = "bottom_left"; + break; + case E_GADGET_SITE_ORIENT_VERTICAL: + s = "left_bottom"; + break; + case E_GADGET_SITE_ORIENT_NONE: + s = "left_bottom"; + break; + } + } + else + s = "left"; + } + else if (anchor & E_GADGET_SITE_ANCHOR_RIGHT) + { + if (anchor & E_GADGET_SITE_ANCHOR_TOP) + { + switch (orient) + { + case E_GADGET_SITE_ORIENT_HORIZONTAL: + s = "top_right"; + break; + case E_GADGET_SITE_ORIENT_VERTICAL: + s = "right_top"; + break; + case E_GADGET_SITE_ORIENT_NONE: + s = "right_top"; + break; + } + } + else if (anchor & E_GADGET_SITE_ANCHOR_BOTTOM) + { + switch (orient) + { + case E_GADGET_SITE_ORIENT_HORIZONTAL: + s = "bottom_right"; + break; + case E_GADGET_SITE_ORIENT_VERTICAL: + s = "right_bottom"; + break; + case E_GADGET_SITE_ORIENT_NONE: + s = "right_bottom"; + break; + } + } + else + s = "right"; + } + else if (anchor & E_GADGET_SITE_ANCHOR_TOP) + s = "top"; + else if (anchor & E_GADGET_SITE_ANCHOR_BOTTOM) + s = "bottom"; + else + { + switch (orient) + { + case E_GADGET_SITE_ORIENT_HORIZONTAL: + s = "horizontal"; + break; + case E_GADGET_SITE_ORIENT_VERTICAL: + s = "vertical"; + break; + default: break; + } + } + snprintf(buf, sizeof(buf), "e,state,orientation,%s", s); + elm_layout_signal_emit(inst->o_button, buf, "e"); +} + +static void +_menu_cb_post(void *data, E_Menu *m) +{ + Instance *inst = data; + Eina_Bool fin; + + if (stopping || (!inst->main_menu)) return; + fin = m == inst->main_menu; + e_object_del(E_OBJECT(m)); + if (!fin) return; + elm_layout_signal_emit(inst->o_button, "e,state,unfocused", "e"); + inst->main_menu = NULL; +} + +static void +_button_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Instance *inst = data; + Evas_Event_Mouse_Down *ev = event_info; + Evas_Coord x, y, w, h; + E_Gadget_Site_Anchor an; + int dir = E_MENU_POP_DIRECTION_AUTO; + + if (ev->button != 1) return; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + + evas_object_geometry_get(inst->o_button, &x, &y, &w, &h); + if (!inst->main_menu) + inst->main_menu = e_int_menus_main_new(); + if (!inst->main_menu) return; + e_menu_post_deactivate_callback_set(inst->main_menu, + _menu_cb_post, inst); + an = e_gadget_site_anchor_get(e_gadget_site_get(inst->o_button)); + switch (e_gadget_site_orient_get(e_gadget_site_get(inst->o_button))) + { + case E_GADGET_SITE_ORIENT_HORIZONTAL: + if (an & E_GADGET_SITE_ANCHOR_TOP) + dir = E_MENU_POP_DIRECTION_DOWN; + else if (an & E_GADGET_SITE_ANCHOR_BOTTOM) + dir = E_MENU_POP_DIRECTION_UP; + break; + case E_GADGET_SITE_ORIENT_VERTICAL: + if (an & E_GADGET_SITE_ANCHOR_LEFT) + dir = E_MENU_POP_DIRECTION_RIGHT; + else if (an & E_GADGET_SITE_ANCHOR_RIGHT) + dir = E_MENU_POP_DIRECTION_LEFT; + break; + default: break; + } + e_menu_activate_mouse(inst->main_menu, + e_zone_current_get(), + x, y, w, h, dir, ev->timestamp); + evas_object_smart_callback_call(inst->o_button, "gadget_popup", + inst->main_menu->container_object); + elm_layout_signal_emit(inst->o_button, "e,state,focused", "e"); +} + +static void +start_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + + if (inst->main_menu) + { + e_menu_post_deactivate_callback_set(inst->main_menu, NULL, NULL); + e_object_del(E_OBJECT(inst->main_menu)); + } + free(inst); +} + +static void +_anchor_change(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + + do_orient(inst, e_gadget_site_orient_get(obj), e_gadget_site_anchor_get(obj)); +} + +static void +_gadget_created(void *data, Evas_Object *obj, void *event_info) +{ + Instance *inst = data; + + if (event_info == inst->o_button) + do_orient(inst, e_gadget_site_orient_get(obj), e_gadget_site_anchor_get(obj)); +} + +EINTERN Evas_Object * +start_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient orient) +{ + Evas_Object *o; + Instance *inst; + + inst = E_NEW(Instance, 1); + + o = elm_layout_add(parent); + + e_theme_edje_object_set(o, NULL, "e/gadget/start/main"); + elm_layout_signal_emit(o, "e,state,unfocused", "e"); + + inst->o_button = o; + evas_object_size_hint_aspect_set(o, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, + _button_cb_mouse_down, inst); + evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, start_del, inst); + evas_object_smart_callback_add(parent, "gadget_site_anchor", _anchor_change, inst); + evas_object_smart_callback_add(parent, "gadget_created", _gadget_created, inst); + do_orient(inst, orient, e_gadget_site_anchor_get(parent)); + + return o; +}