2009-05-06 07:20:45 -07:00
|
|
|
#include "e.h"
|
|
|
|
#include "e_mod_main.h"
|
|
|
|
#include "evry.h"
|
|
|
|
|
|
|
|
#define INPUTLEN 40
|
|
|
|
#define MATCH_LAG 0.33
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
|
|
|
|
typedef struct _Evry_State Evry_State;
|
|
|
|
|
|
|
|
struct _Evry_State
|
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
Eina_List *cur_items;
|
2009-06-21 03:31:38 -07:00
|
|
|
Eina_List *cur_plugins;
|
|
|
|
Eina_List *plugins;
|
|
|
|
Evry_Plugin *cur_plugin;
|
|
|
|
Evry_Item *sel_item;
|
2009-06-24 13:02:37 -07:00
|
|
|
|
|
|
|
Eina_List *cur_actions;
|
|
|
|
Evry_Action *cur_action;
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
/* Eina_List *sel_items; */
|
|
|
|
char *input;
|
2009-06-24 13:02:37 -07:00
|
|
|
const char *request_type;
|
|
|
|
|
2009-06-21 14:16:02 -07:00
|
|
|
Eina_Bool initial;
|
2009-06-21 03:31:38 -07:00
|
|
|
};
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
static int _evry_cb_key_down(void *data, int type, void *event);
|
|
|
|
static int _evry_cb_key_down(void *data, int type, void *event);
|
|
|
|
static int _evry_cb_mouse_down(void *data, int type, void *event);
|
|
|
|
static int _evry_cb_mouse_up(void *data, int type, void *event);
|
|
|
|
static int _evry_cb_mouse_move(void *data, int type, void *event);
|
|
|
|
static int _evry_cb_mouse_wheel(void *data, int type, void *event);
|
|
|
|
static void _evry_cb_item_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
|
|
static void _evry_cb_item_mouse_out(void *data, Evas *evas, Evas_Object *obj, void *event_info);
|
|
|
|
static void _evry_backspace(void);
|
|
|
|
static void _evry_update(void);
|
|
|
|
static void _evry_list_clear(void);
|
2009-06-21 03:31:38 -07:00
|
|
|
static void _evry_show_items(Evry_Plugin *plugin);
|
2009-05-06 07:20:45 -07:00
|
|
|
static int _evry_update_timer(void *data);
|
|
|
|
static void _evry_matches_update(void);
|
|
|
|
static void _evry_clear(void);
|
|
|
|
static void _evry_item_next(void);
|
|
|
|
static void _evry_item_prev(void);
|
|
|
|
static void _evry_plugin_next(void);
|
|
|
|
static void _evry_plugin_prev(void);
|
|
|
|
static void _evry_scroll_to(int i);
|
|
|
|
static void _evry_item_desel(Evry_Item *it);
|
|
|
|
static void _evry_item_sel(Evry_Item *it);
|
|
|
|
static void _evry_action(int finished);
|
2009-06-21 03:31:38 -07:00
|
|
|
static void _evry_action_select(void);
|
2009-05-06 07:20:45 -07:00
|
|
|
static void _evry_cb_plugin_sel(void *data1, void *data2);
|
2009-06-11 07:50:34 -07:00
|
|
|
static int _evry_animator(void *data);
|
|
|
|
static int _evry_scroll_timer(void *data);
|
2009-06-21 03:31:38 -07:00
|
|
|
static int _evry_push_state(void);
|
|
|
|
static int _evry_pop_state(void);
|
|
|
|
static void _evry_plugin_selector_append(Evry_Plugin *p);
|
2009-06-21 14:16:02 -07:00
|
|
|
static int _evry_cb_plugin_sort(const void *data1, const void *data2);
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
static int _evry_plug_act_select_init(void);
|
|
|
|
static int _evry_plug_act_select_actions_set(void);
|
|
|
|
static int _evry_plug_act_select_fetch(const char *input);
|
|
|
|
static int _evry_plug_act_select_action(Evry_Item *item, const char *input);
|
|
|
|
static void _evry_plug_act_select_cleanup(void);
|
|
|
|
static void _evry_plug_act_select_item_icon_get(Evry_Item *it, Evas *e);
|
|
|
|
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
/* local subsystem globals */
|
|
|
|
static E_Popup *popup = NULL;
|
2009-06-08 09:01:27 -07:00
|
|
|
static Ecore_X_Window input_window = 0;
|
2009-06-24 13:02:37 -07:00
|
|
|
static Eina_List *handlers = NULL;
|
|
|
|
static Ecore_Timer *update_timer = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
static Evas_Object *o_list = NULL;
|
|
|
|
static Evas_Object *o_main = NULL;
|
2009-06-21 03:31:38 -07:00
|
|
|
static Evas_Object *o_selector = NULL;
|
|
|
|
static Evas_Object *o_selector_frame = NULL;
|
2009-06-24 13:02:37 -07:00
|
|
|
static int ev_last_is_mouse;
|
2009-06-08 09:01:27 -07:00
|
|
|
static Evry_Item *item_mouseover = NULL;
|
2009-06-11 07:50:34 -07:00
|
|
|
static Ecore_Animator *scroll_animator = NULL;
|
|
|
|
static Ecore_Timer *scroll_timer = NULL;
|
2009-06-08 09:01:27 -07:00
|
|
|
static double scroll_align_to;
|
|
|
|
static double scroll_align;
|
2009-06-24 13:02:37 -07:00
|
|
|
static Eina_List *plugins = NULL;
|
|
|
|
static Eina_List *actions = NULL;
|
|
|
|
static Evry_State *cur_state = NULL;
|
|
|
|
static Eina_List *stack = NULL;
|
|
|
|
static Evry_Plugin *action_selector = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
/* externally accessible functions */
|
|
|
|
EAPI int
|
|
|
|
evry_init(void)
|
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
_evry_plug_act_select_init();
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI int
|
|
|
|
evry_shutdown(void)
|
|
|
|
{
|
|
|
|
evry_hide();
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2009-06-24 13:02:37 -07:00
|
|
|
evry_plugin_register(Evry_Plugin *plugin)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
plugins = eina_list_append(plugins, plugin);
|
2009-05-06 07:20:45 -07:00
|
|
|
/* TODO sorting, initialization, etc */
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2009-06-24 13:02:37 -07:00
|
|
|
evry_plugin_unregister(Evry_Plugin *plugin)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
plugins = eina_list_remove(plugins, plugin);
|
2009-05-06 07:20:45 -07:00
|
|
|
/* cleanup */
|
|
|
|
}
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
EAPI void
|
|
|
|
evry_action_register(Evry_Action *action)
|
|
|
|
{
|
|
|
|
actions = eina_list_append(actions, action);
|
|
|
|
/* TODO sorting, initialization, etc */
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
evry_action_unregister(Evry_Action *action)
|
|
|
|
{
|
|
|
|
actions = eina_list_remove(actions, action);
|
|
|
|
/* cleanup */
|
|
|
|
}
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
EAPI int
|
|
|
|
evry_show(E_Zone *zone)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
2009-06-08 09:37:40 -07:00
|
|
|
int x, y;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
E_OBJECT_CHECK_RETURN(zone, 0);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0);
|
|
|
|
|
|
|
|
if (popup) return 0;
|
|
|
|
|
|
|
|
input_window = ecore_x_window_input_new(zone->container->win, zone->x,
|
|
|
|
zone->y, zone->w, zone->h);
|
|
|
|
ecore_x_window_show(input_window);
|
|
|
|
if (!e_grabinput_get(input_window, 1, input_window))
|
|
|
|
{
|
|
|
|
ecore_x_window_free(input_window);
|
|
|
|
input_window = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-06-24 22:56:02 -07:00
|
|
|
x = (zone->w / 2) - (evry_conf->width / 2);
|
|
|
|
y = (zone->h / 2) - (evry_conf->height / 2);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-08 09:37:40 -07:00
|
|
|
popup = e_popup_new(zone, x, y, evry_conf->width, evry_conf->height);
|
2009-05-06 07:20:45 -07:00
|
|
|
if (!popup) return 0;
|
|
|
|
|
|
|
|
ecore_x_netwm_window_type_set(popup->evas_win, ECORE_X_WINDOW_TYPE_UTILITY);
|
|
|
|
|
|
|
|
e_popup_layer_set(popup, 255);
|
|
|
|
evas_event_freeze(popup->evas);
|
|
|
|
evas_event_feed_mouse_in(popup->evas, ecore_x_current_time_get(), NULL);
|
|
|
|
evas_event_feed_mouse_move(popup->evas, -1000000, -1000000, ecore_x_current_time_get(), NULL);
|
|
|
|
o = edje_object_add(popup->evas);
|
|
|
|
o_main = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/everything",
|
|
|
|
"e/widgets/everything/main");
|
|
|
|
|
|
|
|
o = e_box_add(popup->evas);
|
|
|
|
o_list = o;
|
|
|
|
e_box_orientation_set(o, 0);
|
|
|
|
e_box_homogenous_set(o, 1);
|
|
|
|
edje_object_part_swallow(o_main, "e.swallow.list", o);
|
|
|
|
evas_object_show(o);
|
|
|
|
|
|
|
|
o = o_main;
|
|
|
|
evas_object_move(o, 0, 0);
|
2009-06-08 09:37:40 -07:00
|
|
|
evas_object_resize(o, evry_conf->width, evry_conf->height);
|
2009-05-06 07:20:45 -07:00
|
|
|
evas_object_show(o);
|
|
|
|
e_popup_edje_bg_object_set(popup, o);
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
o = e_box_add(popup->evas);
|
|
|
|
e_box_orientation_set(o, 1);
|
|
|
|
e_box_homogenous_set(o, 1);
|
2009-05-06 07:20:45 -07:00
|
|
|
edje_object_part_swallow(o_main, "e.swallow.bar", o);
|
|
|
|
evas_object_show(o);
|
2009-06-21 03:31:38 -07:00
|
|
|
o_selector = o;
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
evas_event_thaw(popup->evas);
|
|
|
|
|
|
|
|
handlers = eina_list_append
|
|
|
|
(handlers, ecore_event_handler_add
|
|
|
|
(ECORE_EVENT_KEY_DOWN, _evry_cb_key_down, NULL));
|
|
|
|
handlers = eina_list_append
|
|
|
|
(handlers, ecore_event_handler_add
|
|
|
|
(ECORE_EVENT_MOUSE_BUTTON_DOWN, _evry_cb_mouse_down, NULL));
|
|
|
|
handlers = eina_list_append
|
|
|
|
(handlers, ecore_event_handler_add
|
|
|
|
(ECORE_EVENT_MOUSE_BUTTON_UP, _evry_cb_mouse_up, NULL));
|
|
|
|
handlers = eina_list_append
|
|
|
|
(handlers, ecore_event_handler_add
|
|
|
|
(ECORE_EVENT_MOUSE_MOVE, _evry_cb_mouse_move, NULL));
|
|
|
|
handlers = eina_list_append
|
|
|
|
(handlers, ecore_event_handler_add
|
|
|
|
(ECORE_EVENT_MOUSE_WHEEL, _evry_cb_mouse_wheel, NULL));
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_push_state();
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
e_popup_show(popup);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
evry_hide(void)
|
|
|
|
{
|
|
|
|
Ecore_Event *ev;
|
|
|
|
char *str;
|
|
|
|
Evry_Plugin *plugin;
|
|
|
|
Eina_List *l;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s;
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
if (!popup) return;
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
evas_event_freeze(popup->evas);
|
|
|
|
|
|
|
|
_evry_list_clear();
|
|
|
|
|
|
|
|
EINA_LIST_FREE(stack, s)
|
|
|
|
{
|
|
|
|
Evry_Plugin *p;
|
|
|
|
|
|
|
|
free(s->input);
|
|
|
|
|
|
|
|
EINA_LIST_FREE(s->plugins, p)
|
2009-06-24 13:02:37 -07:00
|
|
|
p->cleanup();
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
|
|
|
stack = NULL;
|
|
|
|
cur_state = NULL;
|
|
|
|
|
2009-06-06 19:02:54 -07:00
|
|
|
if (update_timer)
|
2009-06-08 09:01:27 -07:00
|
|
|
{
|
|
|
|
ecore_timer_del(update_timer);
|
|
|
|
update_timer = NULL;
|
|
|
|
}
|
2009-06-11 07:50:34 -07:00
|
|
|
if (scroll_timer)
|
|
|
|
{
|
|
|
|
ecore_timer_del(scroll_timer);
|
|
|
|
scroll_timer = NULL;
|
|
|
|
}
|
|
|
|
if (scroll_animator)
|
|
|
|
{
|
|
|
|
ecore_animator_del(scroll_animator);
|
|
|
|
scroll_animator = NULL;
|
|
|
|
}
|
2009-06-08 06:44:11 -07:00
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
e_popup_hide(popup);
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
evas_object_del(o_list);
|
|
|
|
o_list = NULL;
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
evas_object_del(o_selector);
|
|
|
|
o_selector = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
evas_object_del(o_main);
|
|
|
|
o_main = NULL;
|
|
|
|
|
|
|
|
evas_event_thaw(popup->evas);
|
|
|
|
e_object_del(E_OBJECT(popup));
|
|
|
|
popup = NULL;
|
|
|
|
|
|
|
|
EINA_LIST_FREE(handlers, ev)
|
|
|
|
ecore_event_handler_del(ev);
|
|
|
|
|
|
|
|
ecore_x_window_free(input_window);
|
|
|
|
e_grabinput_release(input_window, input_window);
|
|
|
|
input_window = 0;
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
|
|
|
|
EAPI void
|
2009-06-24 13:02:37 -07:00
|
|
|
evry_plugin_async_update(Evry_Plugin *p, int state)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
|
|
|
Evry_State *s;
|
|
|
|
|
|
|
|
if (!popup) return;
|
|
|
|
|
|
|
|
s = cur_state;
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
if (!eina_list_data_find(s->cur_plugins, p))
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
s->cur_plugins = eina_list_append(s->cur_plugins, p);
|
|
|
|
_evry_plugin_selector_append(p);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char buf[64];
|
|
|
|
snprintf(buf, 64, "%s (%d)", p->name, eina_list_count(p->items));
|
|
|
|
edje_object_part_text_set(p->tab, "e.text.label", buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!s->cur_plugin && s->cur_plugins)
|
|
|
|
{
|
|
|
|
_evry_list_clear();
|
|
|
|
_evry_show_items(s->cur_plugins->data);
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
2009-06-21 14:16:02 -07:00
|
|
|
static int
|
|
|
|
_evry_cb_plugin_sort(const void *data1, const void *data2)
|
|
|
|
{
|
|
|
|
const Evry_Plugin *p1 = data1;
|
|
|
|
const Evry_Plugin *p2 = data2;
|
2009-06-24 13:02:37 -07:00
|
|
|
return p1->prio - p2->prio;
|
2009-06-21 14:16:02 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
static int
|
|
|
|
_evry_push_state(void)
|
|
|
|
{
|
|
|
|
Evry_State *s;
|
|
|
|
Eina_List *l, *list = NULL;
|
2009-06-24 13:02:37 -07:00
|
|
|
const char *cur_type = "NONE";
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_Plugin *p;
|
2009-06-21 14:16:02 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
s = cur_state;
|
|
|
|
|
|
|
|
if (s)
|
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
if (!s->cur_plugin || !s->sel_item)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
cur_type = s->cur_plugin->type_out;
|
|
|
|
/* current plugin provides no candidates to act on by others */
|
|
|
|
if (!s->cur_action && !strcmp(cur_type, "NONE"))
|
2009-06-21 03:31:38 -07:00
|
|
|
return 0;
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
EINA_LIST_FOREACH(s->plugins, l, p)
|
|
|
|
if (p != s->cur_plugin)
|
|
|
|
p->cleanup();
|
|
|
|
}
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(plugins, l, p)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
if (strstr(p->type_in, cur_type))
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
/* printf("%s- in:%s out:%s\n", p->name, p->type_in, p->type_out); */
|
|
|
|
|
|
|
|
if (s && s->cur_action)
|
|
|
|
{
|
|
|
|
/* filter out plugins that dont provide the type
|
|
|
|
requested by current action */
|
|
|
|
if (strcmp(p->type_out, s->request_type))
|
|
|
|
continue;
|
|
|
|
}
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
if (p->begin)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
Evry_Item *sel_item = NULL;
|
|
|
|
|
|
|
|
if (s && (s->cur_plugin != action_selector))
|
|
|
|
sel_item = s->sel_item;
|
|
|
|
|
|
|
|
if (p->begin(sel_item))
|
2009-06-21 03:31:38 -07:00
|
|
|
list = eina_list_append(list, p);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
list = eina_list_append(list, p);
|
|
|
|
}
|
|
|
|
}
|
2009-06-21 14:16:02 -07:00
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
if (s && !s->cur_action)
|
|
|
|
{
|
|
|
|
if (_evry_plug_act_select_actions_set())
|
|
|
|
{
|
|
|
|
list = eina_list_append(list, action_selector);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
if (!list) return 0;
|
|
|
|
|
2009-06-21 14:16:02 -07:00
|
|
|
list = eina_list_sort(list, eina_list_count(list), _evry_cb_plugin_sort);
|
2009-06-24 13:02:37 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_list_clear();
|
|
|
|
|
|
|
|
if (s)
|
|
|
|
{
|
|
|
|
EINA_LIST_FOREACH(s->cur_plugins, l, p)
|
|
|
|
{
|
|
|
|
evas_object_del(p->tab);
|
|
|
|
p->tab = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s = E_NEW(Evry_State, 1);
|
|
|
|
s->input = malloc(INPUTLEN);
|
|
|
|
s->input[0] = 0;
|
|
|
|
s->plugins = list;
|
|
|
|
s->cur_plugins = NULL;
|
|
|
|
s->sel_item = NULL;
|
2009-06-24 13:02:37 -07:00
|
|
|
if (cur_state)
|
|
|
|
{
|
|
|
|
s->request_type = cur_state->request_type;
|
|
|
|
s->cur_action = cur_state->cur_action;
|
|
|
|
s->initial = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
s->initial = 1;
|
|
|
|
}
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
cur_state = s;
|
|
|
|
stack = eina_list_prepend(stack, s);
|
|
|
|
|
|
|
|
edje_object_part_text_set(o_main, "e.text.label", s->input);
|
|
|
|
|
|
|
|
ev_last_is_mouse = 0;
|
|
|
|
item_mouseover = NULL;
|
|
|
|
|
|
|
|
_evry_matches_update();
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_pop_state(void)
|
|
|
|
{
|
|
|
|
Evry_State *s = cur_state;
|
|
|
|
Evry_Plugin *p;
|
|
|
|
Eina_List *l;
|
2009-06-24 13:02:37 -07:00
|
|
|
|
|
|
|
if (!stack || !stack->next) return 0;
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_list_clear();
|
|
|
|
|
|
|
|
EINA_LIST_FREE(s->cur_plugins, p)
|
|
|
|
{
|
|
|
|
evas_object_del(p->tab);
|
|
|
|
p->tab = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
free(s->input);
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(s->plugins, l, p)
|
2009-06-24 13:02:37 -07:00
|
|
|
p->cleanup();
|
2009-06-21 03:31:38 -07:00
|
|
|
|
|
|
|
E_FREE(s);
|
|
|
|
|
|
|
|
stack = eina_list_remove_list(stack, stack);
|
|
|
|
|
|
|
|
if (stack)
|
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
Evry_Item *it = NULL;
|
|
|
|
int i = 0;
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
s = stack->data;
|
|
|
|
cur_state = s;
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
if (s->cur_plugin && s->cur_plugin == action_selector)
|
|
|
|
{
|
|
|
|
_evry_pop_state();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
edje_object_part_text_set(o_main, "e.text.label", s->input);
|
|
|
|
|
|
|
|
if (s->sel_item)
|
|
|
|
{
|
|
|
|
Evry_Item *it;
|
|
|
|
EINA_LIST_FOREACH(s->cur_plugin->items, l, it)
|
|
|
|
if (it == s->sel_item)
|
|
|
|
break;
|
|
|
|
else i++;
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (stack->next)
|
|
|
|
{
|
|
|
|
Evry_State *prev = stack->next->data;
|
|
|
|
it = prev->sel_item;
|
|
|
|
}
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(s->plugins, l, p)
|
|
|
|
if (p != s->cur_plugin && p->begin)
|
|
|
|
p->begin(it);
|
|
|
|
|
|
|
|
_evry_matches_update();
|
|
|
|
|
|
|
|
it = eina_list_nth(s->cur_plugin->items, i);
|
|
|
|
|
|
|
|
if (it)
|
|
|
|
{
|
|
|
|
_evry_item_desel(s->sel_item);
|
|
|
|
s->sel_item = it;
|
|
|
|
_evry_item_sel(s->sel_item);
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_scroll_to(i);
|
|
|
|
}
|
|
|
|
}
|
2009-06-24 13:02:37 -07:00
|
|
|
|
|
|
|
/* else
|
|
|
|
* {
|
|
|
|
* cur_state = NULL;
|
|
|
|
* evry_hide();
|
|
|
|
* } */
|
2009-06-21 03:31:38 -07:00
|
|
|
|
|
|
|
ev_last_is_mouse = 0;
|
|
|
|
item_mouseover = NULL;
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
return 1;
|
|
|
|
}
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
/* TODO config options for users preferred keys */
|
2009-05-06 07:20:45 -07:00
|
|
|
static int
|
|
|
|
_evry_cb_key_down(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Event_Key *ev;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
2009-05-06 07:20:45 -07:00
|
|
|
ev_last_is_mouse = 0;
|
2009-06-21 03:31:38 -07:00
|
|
|
item_mouseover = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
ev = event;
|
|
|
|
if (ev->event_window != input_window) return 1;
|
|
|
|
|
|
|
|
if (!strcmp(ev->key, "Up"))
|
|
|
|
_evry_item_prev();
|
|
|
|
else if (!strcmp(ev->key, "Down"))
|
|
|
|
_evry_item_next();
|
2009-06-24 13:02:37 -07:00
|
|
|
else if (!strcmp(ev->key, "Right") &&
|
|
|
|
((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) ||
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)))
|
|
|
|
{
|
|
|
|
if (s->sel_item)
|
|
|
|
{
|
|
|
|
if (!_evry_push_state())
|
|
|
|
_evry_action(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* _evry_plugin_next(); */
|
|
|
|
else if (!strcmp(ev->key, "Left") &&
|
|
|
|
((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) ||
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)))
|
|
|
|
_evry_pop_state();
|
|
|
|
/* _evry_plugin_prev(); */
|
2009-05-06 07:20:45 -07:00
|
|
|
else if (!strcmp(ev->key, "Right"))
|
|
|
|
_evry_plugin_next();
|
2009-06-24 13:02:37 -07:00
|
|
|
/* {
|
|
|
|
* if (s->sel_item)
|
|
|
|
* {
|
|
|
|
* if (!_evry_push_state())
|
|
|
|
* _evry_action(0);
|
|
|
|
* }
|
|
|
|
* } */
|
2009-05-06 07:20:45 -07:00
|
|
|
else if (!strcmp(ev->key, "Left"))
|
|
|
|
_evry_plugin_prev();
|
2009-06-24 13:02:37 -07:00
|
|
|
/* _evry_pop_state(); */
|
2009-05-06 07:20:45 -07:00
|
|
|
else if (!strcmp(ev->key, "Return") &&
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL))
|
|
|
|
_evry_action(0);
|
2009-06-08 06:44:11 -07:00
|
|
|
else if (!strcmp(ev->key, "Return"))
|
|
|
|
_evry_action(1);
|
2009-06-24 13:02:37 -07:00
|
|
|
else if (!strcmp(ev->key, "Tab") &&
|
|
|
|
((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) ||
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)))
|
|
|
|
_evry_plugin_prev();
|
2009-06-21 03:31:38 -07:00
|
|
|
else if (!strcmp(ev->key, "Tab"))
|
2009-06-21 08:20:15 -07:00
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
if (s->sel_item)
|
|
|
|
{
|
|
|
|
if (!_evry_push_state())
|
|
|
|
_evry_action(0);
|
|
|
|
}
|
2009-06-21 08:20:15 -07:00
|
|
|
}
|
2009-06-24 13:02:37 -07:00
|
|
|
/* _evry_plugin_next(); */
|
2009-05-06 07:20:45 -07:00
|
|
|
else if (!strcmp(ev->key, "u") &&
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL))
|
|
|
|
_evry_clear();
|
2009-06-21 03:31:38 -07:00
|
|
|
else if ((!strcmp(ev->key, "Escape")) ||
|
|
|
|
(!strcmp(ev->key, "g") &&
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)))
|
2009-06-24 13:02:37 -07:00
|
|
|
{
|
|
|
|
if (!_evry_pop_state())
|
|
|
|
evry_hide();
|
|
|
|
}
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
else if (!strcmp(ev->key, "BackSpace"))
|
|
|
|
_evry_backspace();
|
|
|
|
else if (!strcmp(ev->key, "Delete"))
|
|
|
|
_evry_backspace();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (ev->compose)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
if ((strlen(s->input) < (INPUTLEN - strlen(ev->compose))))
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
strcat(s->input, ev->compose);
|
2009-05-06 07:20:45 -07:00
|
|
|
_evry_update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_cb_mouse_down(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Event_Mouse_Button *ev;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s =cur_state;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
ev = event;
|
|
|
|
if (ev->event_window != input_window) return 1;
|
|
|
|
|
|
|
|
if (item_mouseover)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
if (s->sel_item != item_mouseover)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
if (s->sel_item) _evry_item_desel(s->sel_item);
|
|
|
|
s->sel_item = item_mouseover;
|
|
|
|
_evry_item_sel(s->sel_item);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_event_feed_mouse_up(popup->evas, ev->buttons, 0, ev->timestamp, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_cb_mouse_up(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Event_Mouse_Button *ev;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
if (ev->event_window != input_window) return 1;
|
|
|
|
|
|
|
|
if (item_mouseover)
|
|
|
|
{
|
|
|
|
if (ev->buttons == 1)
|
|
|
|
_evry_action(1);
|
|
|
|
else if (ev->buttons == 3)
|
|
|
|
_evry_action(0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_event_feed_mouse_up(popup->evas, ev->buttons, 0, ev->timestamp, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_cb_mouse_move(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Event_Mouse_Move *ev;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s =cur_state;
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
ev = event;
|
|
|
|
if (ev->event_window != input_window) return 1;
|
|
|
|
|
|
|
|
if (!ev_last_is_mouse)
|
|
|
|
{
|
|
|
|
ev_last_is_mouse = 1;
|
|
|
|
if (item_mouseover)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
if (s->sel_item && (s->sel_item != item_mouseover))
|
|
|
|
_evry_item_desel(s->sel_item);
|
|
|
|
if (!s->sel_item || (s->sel_item != item_mouseover))
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
s->sel_item = item_mouseover;
|
|
|
|
_evry_item_sel(s->sel_item);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
evas_event_feed_mouse_move(popup->evas, ev->x - popup->x,
|
|
|
|
ev->y - popup->y, ev->timestamp, NULL);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_cb_mouse_wheel(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Event_Mouse_Wheel *ev;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
if (ev->event_window != input_window) return 1;
|
|
|
|
|
|
|
|
ev_last_is_mouse = 0;
|
|
|
|
|
|
|
|
if (ev->z < 0) /* up */
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = ev->z; i < 0; i++) _evry_item_prev();
|
|
|
|
}
|
|
|
|
else if (ev->z > 0) /* down */
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = ev->z; i > 0; i--) _evry_item_next();
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_cb_item_mouse_in(void *data, Evas *evas, Evas_Object *obj,
|
|
|
|
void *event_info)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s =cur_state;
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
if (!ev_last_is_mouse) return;
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
item_mouseover = data;
|
|
|
|
|
|
|
|
if (s->sel_item) _evry_item_desel(s->sel_item);
|
|
|
|
if (!(s->sel_item = data)) return;
|
|
|
|
_evry_item_sel(s->sel_item);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_cb_item_mouse_out(void *data, Evas *evas, Evas_Object *obj,
|
|
|
|
void *event_info)
|
|
|
|
{
|
|
|
|
item_mouseover = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_backspace(void)
|
|
|
|
{
|
|
|
|
int len, val, pos;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
|
|
|
|
|
|
|
len = strlen(s->input);
|
2009-05-06 07:20:45 -07:00
|
|
|
if (len > 0)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
pos = evas_string_char_prev_get(s->input, len, &val);
|
2009-05-06 07:20:45 -07:00
|
|
|
if ((pos < len) && (pos >= 0))
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
s->input[pos] = 0;
|
2009-05-06 07:20:45 -07:00
|
|
|
_evry_update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_update(void)
|
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop;
|
|
|
|
Evas_Object *o;
|
2009-06-21 03:31:38 -07:00
|
|
|
|
|
|
|
edje_object_part_text_set(o_main, "e.text.label", cur_state->input);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-08 06:44:11 -07:00
|
|
|
if (update_timer) ecore_timer_del(update_timer);
|
|
|
|
update_timer = ecore_timer_add(MATCH_LAG, _evry_update_timer, NULL);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
static int
|
|
|
|
_evry_update_timer(void *data)
|
|
|
|
{
|
|
|
|
_evry_matches_update();
|
|
|
|
update_timer = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
static void
|
|
|
|
_evry_clear(void)
|
|
|
|
{
|
|
|
|
if (cur_state->input[0] != 0)
|
|
|
|
{
|
|
|
|
cur_state->input[0] = 0;
|
|
|
|
_evry_update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
static void
|
|
|
|
_evry_action(int finished)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
2009-06-21 14:16:02 -07:00
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
if (s->cur_plugin == action_selector)
|
|
|
|
{
|
|
|
|
/* set cur_action and start plugins for second parameter (if required)*/
|
|
|
|
if (s->sel_item) _evry_plug_act_select_action(s->sel_item, s->input);
|
|
|
|
|
|
|
|
finished = 0;
|
|
|
|
}
|
|
|
|
else if (s->cur_action)
|
|
|
|
{
|
|
|
|
if (s->sel_item && (!strcmp(s->cur_plugin->type_out, s->request_type)))
|
|
|
|
{
|
|
|
|
s->cur_action->thing2 = s->sel_item;
|
|
|
|
s->cur_action->action();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (s->cur_plugin && (s->sel_item || s->input))
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
if (!s->cur_plugin->action ||
|
2009-06-24 13:02:37 -07:00
|
|
|
!s->cur_plugin->action(s->sel_item, s->input))
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
|
|
|
_evry_push_state();
|
2009-06-24 13:02:37 -07:00
|
|
|
finished = 0;
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2009-06-21 14:16:02 -07:00
|
|
|
else if (s->initial)
|
|
|
|
e_exec(popup->zone, NULL, s->input, NULL, NULL /* "everything" */);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
if (finished)
|
|
|
|
evry_hide();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_show_items(Evry_Plugin *p)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
|
|
|
Evry_Item *it;
|
|
|
|
Eina_List *l;
|
|
|
|
int mw, mh, h;
|
|
|
|
Evas_Object *o;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
|
|
|
|
|
|
|
if (s->cur_plugin)
|
|
|
|
edje_object_signal_emit(s->cur_plugin->tab, "e,state,unselected", "e");
|
|
|
|
|
|
|
|
if (s->cur_plugin != p)
|
|
|
|
s->sel_item = NULL;
|
2009-06-08 06:44:11 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
s->cur_plugin = p;
|
2009-06-24 13:02:37 -07:00
|
|
|
s->cur_items = p->items;
|
2009-06-21 03:31:38 -07:00
|
|
|
|
|
|
|
edje_object_signal_emit(p->tab, "e,state,selected", "e");
|
|
|
|
|
|
|
|
evas_event_freeze(popup->evas);
|
2009-05-06 07:20:45 -07:00
|
|
|
e_box_freeze(o_list);
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
EINA_LIST_FOREACH(p->items, l, it)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
|
|
|
o = edje_object_add(popup->evas);
|
|
|
|
it->o_bg = o;
|
|
|
|
e_theme_edje_object_set(o, "base/theme/everything",
|
|
|
|
"e/widgets/everything/item");
|
|
|
|
|
|
|
|
edje_object_part_text_set(o, "e.text.title", it->label);
|
|
|
|
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN,
|
|
|
|
_evry_cb_item_mouse_in, it);
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT,
|
|
|
|
_evry_cb_item_mouse_out, it);
|
|
|
|
evas_object_show(o);
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
p->icon_get(it, popup->evas);
|
2009-05-06 07:20:45 -07:00
|
|
|
if (edje_object_part_exists(o, "e.swallow.icons") && it->o_icon)
|
|
|
|
{
|
|
|
|
edje_object_part_swallow(o, "e.swallow.icons", it->o_icon);
|
|
|
|
evas_object_show(it->o_icon);
|
|
|
|
}
|
|
|
|
edje_object_size_min_calc(o, &mw, &mh);
|
|
|
|
e_box_pack_end(o_list, o);
|
2009-06-21 03:31:38 -07:00
|
|
|
e_box_pack_options_set(o, 1, 1, 1, 0, 0.5, 0.5, mw, mh, 9999, mh);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
e_box_thaw(o_list);
|
|
|
|
|
|
|
|
e_box_min_size_get(o_list, NULL, &mh);
|
|
|
|
evas_object_geometry_get(o_list, NULL, NULL, NULL, &h);
|
|
|
|
if (mh <= h)
|
|
|
|
e_box_align_set(o_list, 0.5, 0.0);
|
|
|
|
else
|
|
|
|
e_box_align_set(o_list, 0.5, 1.0);
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
/* TODO add option */
|
2009-06-08 06:44:11 -07:00
|
|
|
|
2009-06-21 03:37:12 -07:00
|
|
|
if (!s->sel_item && p->items)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
|
|
|
s->sel_item = p->items->data;
|
|
|
|
_evry_item_sel(s->sel_item);
|
|
|
|
_evry_scroll_to(0);
|
|
|
|
}
|
2009-06-08 06:44:11 -07:00
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
evas_event_thaw(popup->evas);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_matches_update(void)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_Plugin *p;
|
2009-05-06 07:20:45 -07:00
|
|
|
Eina_List *l;
|
2009-06-21 03:31:38 -07:00
|
|
|
int items;
|
|
|
|
Evry_State *s = cur_state;
|
2009-06-11 07:50:34 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_list_clear();
|
2009-06-08 06:44:11 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
EINA_LIST_FREE(s->cur_plugins, p)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
evas_object_del(p->tab);
|
|
|
|
p->tab = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
s->cur_plugins = NULL;
|
|
|
|
s->sel_item = NULL;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(s->plugins, l, p)
|
|
|
|
{
|
|
|
|
if (strlen(s->input) == 0)
|
2009-06-24 13:02:37 -07:00
|
|
|
items = !p->need_query ? p->fetch(NULL) : 0;
|
2009-05-06 07:20:45 -07:00
|
|
|
else
|
2009-06-24 13:02:37 -07:00
|
|
|
items = p->fetch(s->input);
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2009-06-21 14:16:02 -07:00
|
|
|
if (!s->initial || (items && eina_list_count(p->items) > 0))
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
s->cur_plugins = eina_list_append(s->cur_plugins, p);
|
|
|
|
_evry_plugin_selector_append(p);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
}
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2009-06-21 14:27:33 -07:00
|
|
|
if (s->cur_plugins)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 14:27:33 -07:00
|
|
|
if (s->cur_plugin && eina_list_data_find(s->cur_plugins, s->cur_plugin))
|
2009-06-24 13:02:37 -07:00
|
|
|
_evry_show_items(s->cur_plugin);
|
2009-06-21 14:27:33 -07:00
|
|
|
else
|
2009-06-24 13:02:37 -07:00
|
|
|
_evry_show_items(s->cur_plugins->data);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
s->cur_plugin = NULL;
|
|
|
|
s->cur_items = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_list_clear(void)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
2009-06-24 13:02:37 -07:00
|
|
|
Evry_Item *it;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
if (s && s->cur_items)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
|
|
|
evas_event_freeze(popup->evas);
|
|
|
|
e_box_freeze(o_list);
|
2009-06-24 13:02:37 -07:00
|
|
|
EINA_LIST_FOREACH(s->cur_items, l, it)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
|
|
|
evas_object_del(it->o_bg);
|
|
|
|
if (it->o_icon) evas_object_del(it->o_icon);
|
|
|
|
it->o_icon = NULL;
|
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
e_box_thaw(o_list);
|
|
|
|
evas_event_thaw(popup->evas);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_scroll_to(int i)
|
|
|
|
{
|
|
|
|
int n, h, mh;
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
n = eina_list_count(cur_state->cur_plugin->items);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
e_box_min_size_get(o_list, NULL, &mh);
|
|
|
|
evas_object_geometry_get(o_list, NULL, NULL, NULL, &h);
|
|
|
|
|
|
|
|
if (mh <= h) return;
|
|
|
|
|
|
|
|
if (n > 1)
|
|
|
|
{
|
|
|
|
scroll_align_to = (double)i / (double)(n - 1);
|
2009-06-11 07:50:34 -07:00
|
|
|
if (evry_conf->scroll_animate)
|
|
|
|
{
|
|
|
|
if (!scroll_timer)
|
|
|
|
scroll_timer = ecore_timer_add(0.01, _evry_scroll_timer, NULL);
|
|
|
|
if (!scroll_animator)
|
|
|
|
scroll_animator = ecore_animator_add(_evry_animator, NULL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
scroll_align = scroll_align_to;
|
|
|
|
e_box_align_set(o_list, 0.5, 1.0 - scroll_align);
|
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
e_box_align_set(o_list, 0.5, 1.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_item_desel(Evry_Item *it)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(it->o_bg, "e,state,unselected", "e");
|
|
|
|
if (it->o_icon)
|
|
|
|
edje_object_signal_emit(it->o_icon, "e,state,unselected", "e");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_item_sel(Evry_Item *it)
|
|
|
|
{
|
|
|
|
edje_object_signal_emit(it->o_bg, "e,state,selected", "e");
|
|
|
|
if (it->o_icon)
|
|
|
|
edje_object_signal_emit(it->o_icon, "e,state,selected", "e");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_item_next(void)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
int i;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
if (s->sel_item)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
for (i = 0, l = s->cur_plugin->items; l; l = l->next, i++)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
if (l->data == s->sel_item)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
|
|
|
if (l->next)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_item_desel(s->sel_item);
|
|
|
|
s->sel_item = l->next->data;
|
|
|
|
_evry_item_sel(s->sel_item);
|
2009-05-06 07:20:45 -07:00
|
|
|
_evry_scroll_to(i + 1);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-06-21 07:28:17 -07:00
|
|
|
else if (s->cur_plugin && s->cur_plugin->items)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
s->sel_item = s->cur_plugin->items->data;
|
|
|
|
_evry_item_sel(s->sel_item);
|
2009-05-06 07:20:45 -07:00
|
|
|
_evry_scroll_to(0);
|
|
|
|
}
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
/* if (s->sel_item)
|
|
|
|
* edje_object_part_text_set(o_main, "e.text.label", s->sel_item->label); */
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_item_prev(void)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
int i;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
if (s->sel_item)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_item_desel(s->sel_item);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
for (i = 0, l = s->cur_plugin->items; l; l = l->next, i++)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
if (l->data == s->sel_item)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
|
|
|
if (l->prev)
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
s->sel_item = l->prev->data;
|
|
|
|
_evry_item_sel(s->sel_item);
|
2009-05-06 07:20:45 -07:00
|
|
|
_evry_scroll_to(i - 1);
|
|
|
|
}
|
|
|
|
else
|
2009-06-21 03:31:38 -07:00
|
|
|
s->sel_item = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-06-21 03:31:38 -07:00
|
|
|
/* if (s->sel_item)
|
|
|
|
* edje_object_part_text_set(o_main, "e.text.label", s->sel_item->label);
|
2009-05-06 07:20:45 -07:00
|
|
|
* else
|
2009-06-21 03:31:38 -07:00
|
|
|
* edje_object_part_text_set(o_main, "e.text.label", input); */
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_plugin_next(void)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evry_Plugin *plugin;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
|
|
|
|
|
|
|
if (!s->cur_plugin) return;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
l = eina_list_data_find_list(s->cur_plugins, s->cur_plugin);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
if (l && l->next)
|
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
_evry_list_clear();
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_show_items(l->next->data);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2009-06-21 03:31:38 -07:00
|
|
|
else if (s->cur_plugin != s->cur_plugins->data)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
_evry_list_clear();
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_show_items(s->cur_plugins->data);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_plugin_prev(void)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evry_Plugin *plugin;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_State *s = cur_state;
|
|
|
|
|
|
|
|
if (!s->cur_plugin) return;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
l = eina_list_data_find_list(s->cur_plugins, s->cur_plugin);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
if (l && l->prev)
|
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
_evry_list_clear();
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_show_items(l->prev->data);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2009-06-08 09:01:27 -07:00
|
|
|
else
|
|
|
|
{
|
2009-06-21 03:31:38 -07:00
|
|
|
l = eina_list_last(s->cur_plugins);
|
2009-06-08 09:01:27 -07:00
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
if (s->cur_plugin != l->data)
|
2009-06-08 09:01:27 -07:00
|
|
|
{
|
2009-06-24 13:02:37 -07:00
|
|
|
_evry_list_clear();
|
2009-06-21 03:31:38 -07:00
|
|
|
_evry_show_items(l->data);
|
2009-06-08 09:01:27 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
}
|
2009-06-08 06:44:11 -07:00
|
|
|
|
2009-06-11 07:50:34 -07:00
|
|
|
static int
|
|
|
|
_evry_scroll_timer(void *data)
|
|
|
|
{
|
|
|
|
if (scroll_animator)
|
|
|
|
{
|
|
|
|
double spd;
|
|
|
|
|
|
|
|
spd = evry_conf->scroll_speed;
|
|
|
|
scroll_align = (scroll_align * (1.0 - spd)) + (scroll_align_to * spd);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
scroll_timer = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_animator(void *data)
|
|
|
|
{
|
|
|
|
double da;
|
|
|
|
int scroll_to = 1;
|
|
|
|
|
|
|
|
da = scroll_align - scroll_align_to;
|
|
|
|
if (da < 0.0) da = -da;
|
|
|
|
if (da < 0.01)
|
|
|
|
{
|
|
|
|
scroll_align = scroll_align_to;
|
|
|
|
scroll_to = 0;
|
|
|
|
}
|
|
|
|
e_box_align_set(o_list, 0.5, 1.0 - scroll_align);
|
|
|
|
if (scroll_to) return 1;
|
|
|
|
scroll_animator = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
static void
|
|
|
|
_evry_plugin_selector_append(Evry_Plugin *p)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
|
|
|
Evas_Coord mw = 0, mh = 0;
|
2009-06-21 14:16:02 -07:00
|
|
|
char buf[64];
|
|
|
|
|
2009-06-21 03:31:38 -07:00
|
|
|
o = edje_object_add(popup->evas);
|
2009-06-21 14:16:02 -07:00
|
|
|
/* TODO move this to everything theme group !*/
|
2009-06-21 03:31:38 -07:00
|
|
|
e_theme_edje_object_set(o, "base/theme/widgets",
|
|
|
|
"e/widgets/toolbar/item");
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
snprintf(buf, 64, "%s (%d)", p->name, eina_list_count(p->items));
|
2009-06-21 14:16:02 -07:00
|
|
|
|
|
|
|
edje_object_part_text_set(o, "e.text.label", buf);
|
2009-06-21 03:31:38 -07:00
|
|
|
|
|
|
|
edje_object_size_min_calc(o, &mw, &mh);
|
2009-06-24 13:02:37 -07:00
|
|
|
e_box_freeze(o_selector);
|
2009-06-21 03:31:38 -07:00
|
|
|
e_box_pack_end(o_selector, o);
|
|
|
|
|
|
|
|
evas_object_show(o);
|
2009-06-24 13:02:37 -07:00
|
|
|
e_box_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5, mw, mh, 9999, 9999);
|
|
|
|
e_box_thaw(o_selector);
|
2009-06-21 03:31:38 -07:00
|
|
|
p->tab = o;
|
|
|
|
}
|
2009-06-21 14:16:02 -07:00
|
|
|
|
|
|
|
|
2009-06-24 13:02:37 -07:00
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_plug_act_select_init(void)
|
|
|
|
{
|
|
|
|
Evry_Plugin *p = E_NEW(Evry_Plugin, 1);
|
|
|
|
p->name = "Select Action";
|
|
|
|
p->type_in = "ANY";
|
|
|
|
p->type_out = "NONE";
|
|
|
|
p->cleanup = &_evry_plug_act_select_cleanup;
|
|
|
|
p->fetch = &_evry_plug_act_select_fetch;
|
|
|
|
p->action = &_evry_plug_act_select_action;
|
|
|
|
p->icon_get = &_evry_plug_act_select_item_icon_get;
|
|
|
|
action_selector = p;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_plug_act_select_actions_set(void)
|
|
|
|
{
|
|
|
|
Evry_Action *act;
|
|
|
|
Eina_List *l;
|
|
|
|
Evry_State *s = cur_state;
|
|
|
|
Evry_Plugin *p = action_selector;
|
|
|
|
|
|
|
|
_evry_plug_act_select_cleanup();
|
|
|
|
|
|
|
|
const char *type = s->cur_plugin->type_out;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(actions, l, act)
|
|
|
|
{
|
|
|
|
if (strstr(act->type_in1, type))
|
|
|
|
{
|
|
|
|
act->thing1 = s->sel_item;
|
|
|
|
s->cur_actions = eina_list_append(s->cur_actions, act);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (s->cur_actions) return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_plug_act_select_fetch(const char *input)
|
|
|
|
{
|
|
|
|
Evry_Plugin *p = action_selector;
|
|
|
|
Evry_Action *act;
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(actions, l, act)
|
|
|
|
{
|
|
|
|
Evry_Item *it;
|
|
|
|
|
|
|
|
it = E_NEW(Evry_Item, 1);
|
|
|
|
it->label = eina_stringshare_add(act->name);
|
|
|
|
it->data[0] = act;
|
|
|
|
|
|
|
|
p->items = eina_list_append(p->items, it);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p->items) return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_plug_act_select_action(Evry_Item *it, const char *input)
|
|
|
|
{
|
|
|
|
Evry_Action *act = it->data[0];
|
|
|
|
cur_state->cur_action = act;
|
|
|
|
|
|
|
|
cur_state->request_type = act->type_in2;
|
|
|
|
|
|
|
|
return _evry_push_state();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_plug_act_select_cleanup(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
Evry_Item *it;
|
|
|
|
Evry_Plugin *p = action_selector;
|
|
|
|
|
|
|
|
EINA_LIST_FREE(p->items, it)
|
|
|
|
{
|
|
|
|
eina_stringshare_del(it->label);
|
|
|
|
E_FREE(it);
|
|
|
|
}
|
|
|
|
|
|
|
|
eina_list_free(cur_state->cur_actions);
|
|
|
|
cur_state->cur_actions = NULL;
|
|
|
|
|
|
|
|
p->items = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_plug_act_select_item_icon_get(Evry_Item *it, Evas *e)
|
|
|
|
{
|
|
|
|
Evry_Action *act = it->data[0];
|
|
|
|
|
|
|
|
/* if (act->icon_get)
|
|
|
|
* it->o_icon = act->icon_get(act, e); */
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|