2009-05-06 07:20:45 -07:00
|
|
|
#include "e.h"
|
|
|
|
#include "e_mod_main.h"
|
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
/* TODO
|
2009-08-10 04:36:37 -07:00
|
|
|
* - keybinding configuration
|
|
|
|
*/
|
2010-05-06 06:09:14 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
#define DRAG_OFF_WINDOW
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
#define INPUTLEN 256
|
|
|
|
#define MATCH_LAG 0.15
|
2010-05-19 23:14:04 -07:00
|
|
|
#define INITIAL_MATCH_LAG 0.3
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2011-02-23 19:48:41 -08:00
|
|
|
#if defined (CHECK_TIME) || defined (CHECK_REFS)
|
2011-02-09 06:59:44 -08:00
|
|
|
#undef DBG
|
|
|
|
#define DBG(...) ERR(__VA_ARGS__)
|
|
|
|
#else
|
2011-01-23 14:34:28 -08:00
|
|
|
#undef DBG
|
|
|
|
#define DBG(...)
|
2011-02-09 06:59:44 -08:00
|
|
|
#endif
|
2011-01-23 14:34:28 -08:00
|
|
|
|
2012-12-03 01:43:51 -08:00
|
|
|
static Eina_Bool _evry_cb_desklock(Evry_Window *win, int type __UNUSED__, E_Event_Desklock *ev);
|
2011-11-29 19:32:54 -08:00
|
|
|
static void _evry_matches_update(Evry_Selector *sel, int async);
|
|
|
|
static void _evry_plugin_action(Evry_Selector *sel, int finished);
|
|
|
|
static void _evry_plugin_select(Evry_State *s, Evry_Plugin *p);
|
|
|
|
static void _evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p);
|
|
|
|
static int _evry_backspace(Evry_Selector *sel);
|
|
|
|
static void _evry_update(Evry_Selector *sel, int fetch);
|
|
|
|
static void _evry_update_text_label(Evry_State *s);
|
|
|
|
static int _evry_clear(Evry_Selector *sel);
|
|
|
|
static Eina_Bool _evry_cb_update_timer(void *data);
|
|
|
|
|
|
|
|
static Evry_State *_evry_state_new(Evry_Selector *sel, Eina_List *plugins);
|
|
|
|
static void _evry_state_pop(Evry_Selector *sel, int immediate);
|
|
|
|
static void _evry_state_clear(Evry_Window *win);
|
|
|
|
static void _evry_hide_func(Evry_Window *win, int finished);
|
2009-08-10 04:36:37 -07:00
|
|
|
|
2010-05-14 15:06:06 -07:00
|
|
|
static Evry_Selector *_evry_selector_new(Evry_Window *win, int type);
|
2011-11-29 19:32:54 -08:00
|
|
|
static void _evry_selector_free(Evry_Selector *sel);
|
|
|
|
static void _evry_selector_activate(Evry_Selector *sel, int slide);
|
|
|
|
static void _evry_selector_update(Evry_Selector *sel);
|
|
|
|
static int _evry_selector_plugins_get(Evry_Selector *sel, Evry_Item *it, const char *plugin_name);
|
|
|
|
static void _evry_selector_update_actions(Evry_Selector *sel);
|
|
|
|
static void _evry_selector_item_update(Evry_Selector *sel);
|
|
|
|
static void _evry_selector_item_clear(Evry_Selector *sel);
|
|
|
|
static void _evry_selector_label_set(Evry_Selector *sel, const char *part, const char *label);
|
|
|
|
static void _evry_selector_signal_emit(Evry_Selector *sel, const char *msg);
|
|
|
|
static int _evry_selectors_shift(Evry_Window *win, int dir);
|
|
|
|
static int _evry_selectors_switch(Evry_Window *win, int dir);
|
|
|
|
|
|
|
|
static Evry_Window *_evry_window_new(E_Zone *zone, E_Zone_Edge edge);
|
2014-11-02 18:35:13 -08:00
|
|
|
static void _evry_cb_win_delete(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
|
2011-11-29 19:32:54 -08:00
|
|
|
static void _evry_window_free(Evry_Window *win);
|
|
|
|
static void _evry_list_win_show(Evry_Window *win);
|
|
|
|
static void _evry_list_win_hide(Evry_Window *win);
|
|
|
|
static void _evry_list_win_update(Evry_State *s);
|
|
|
|
|
|
|
|
static int _evry_view_create(Evry_State *s);
|
|
|
|
static void _evry_view_clear(Evry_State *s);
|
|
|
|
static int _evry_view_update(Evry_Window *win, Evry_State *s);
|
|
|
|
static int _evry_view_key_press(Evry_State *s, Ecore_Event_Key *ev);
|
|
|
|
static void _evry_view_show(Evry_Window *win, Evry_View *v, int slide);
|
|
|
|
static void _evry_view_hide(Evry_Window *win, Evry_View *v, int slide);
|
|
|
|
|
|
|
|
static void _evry_item_desel(Evry_State *s);
|
|
|
|
static void _evry_item_sel(Evry_State *s, Evry_Item *it);
|
|
|
|
|
2014-03-18 13:14:04 -07:00
|
|
|
static void _evry_cb_show(Evry_Window *win, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
|
2011-11-29 19:32:54 -08:00
|
|
|
static Eina_Bool _evry_cb_key_down(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _evry_cb_selection_notify(void *data, int type, void *event);
|
|
|
|
static Eina_Bool _evry_cb_mouse(void *data, int type, void *event);
|
2009-08-13 15:42:40 -07:00
|
|
|
|
2012-12-20 01:37:37 -08:00
|
|
|
static Eina_Bool _evry_delay_hide_timer(void *data);
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
static Eina_List *windows = NULL;
|
2010-05-21 23:35:46 -07:00
|
|
|
|
2011-01-23 14:34:28 -08:00
|
|
|
#ifdef CHECK_TIME
|
|
|
|
double _evry_time;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef CHECK_REFS
|
|
|
|
static int _item_cnt = 0;
|
|
|
|
Eina_List *_refd = NULL;
|
|
|
|
#endif
|
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
#define SUBJ_SEL win->selectors[0]
|
|
|
|
#define ACTN_SEL win->selectors[1]
|
|
|
|
#define OBJ_SEL win->selectors[2]
|
|
|
|
#define CUR_SEL win->selector
|
|
|
|
|
|
|
|
int
|
|
|
|
evry_init(void)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
evry_shutdown(void)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
while (windows)
|
2010-06-04 13:01:30 -07:00
|
|
|
evry_hide(windows->data, 0);
|
2010-05-21 23:35:46 -07:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
static int
|
2010-05-30 12:16:33 -07:00
|
|
|
_evry_aggregator_fetch(Evry_State *s)
|
2010-05-19 07:44:36 -07:00
|
|
|
{
|
2010-05-30 12:48:03 -07:00
|
|
|
Eina_List *l;
|
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
if (!s)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ERR("no state");
|
|
|
|
return 0;
|
2010-05-19 07:44:36 -07:00
|
|
|
}
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-05-30 12:48:03 -07:00
|
|
|
if (s->aggregator->fetch(s->aggregator, s->input))
|
2010-05-24 05:27:10 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
l = eina_list_data_find_list(s->cur_plugins, s->aggregator);
|
2010-05-31 14:15:32 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!l)
|
|
|
|
s->cur_plugins = eina_list_prepend(s->cur_plugins, s->aggregator);
|
|
|
|
else
|
|
|
|
s->cur_plugins = eina_list_promote_list(s->cur_plugins, l);
|
2011-08-21 08:41:37 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
return 1;
|
2010-05-24 05:27:10 -07:00
|
|
|
}
|
2010-05-24 15:08:15 -07:00
|
|
|
|
2011-08-21 08:41:37 -07:00
|
|
|
s->cur_plugins = eina_list_remove(s->cur_plugins, s->aggregator);
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
return 1;
|
|
|
|
}
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
|
|
|
_evry_cb_item_changed(__UNUSED__ void *data, __UNUSED__ int type, void *event)
|
2010-04-07 08:03:27 -07:00
|
|
|
{
|
|
|
|
Evry_Event_Item_Changed *ev = event;
|
|
|
|
Evry_Selector *sel;
|
2010-05-27 14:10:20 -07:00
|
|
|
Evry_Item *it = ev->item;
|
2010-04-07 08:03:27 -07:00
|
|
|
|
2010-05-27 14:10:20 -07:00
|
|
|
if (!it || !it->plugin || !it->plugin->state)
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-04-07 08:03:27 -07:00
|
|
|
|
2010-05-27 14:10:20 -07:00
|
|
|
sel = it->plugin->state->selector;
|
|
|
|
|
|
|
|
if (sel->state && sel->state->cur_item == it)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_update(sel);
|
2010-04-07 08:03:27 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-04-07 08:03:27 -07:00
|
|
|
}
|
|
|
|
|
2010-06-01 07:26:09 -07:00
|
|
|
Evry_Window *
|
2011-08-16 16:26:07 -07:00
|
|
|
evry_show(E_Zone *zone, E_Zone_Edge edge, const char *params, Eina_Bool popup)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win;
|
2010-10-26 16:21:20 -07:00
|
|
|
Evry_Selector *sel;
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-01-23 14:34:28 -08:00
|
|
|
#ifdef CHECK_TIME
|
|
|
|
_evry_time = ecore_time_get();
|
|
|
|
DBG("_____evry_show______");
|
|
|
|
#endif
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2010-05-13 23:35:06 -07:00
|
|
|
E_OBJECT_CHECK_RETURN(zone, 0);
|
|
|
|
E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0);
|
|
|
|
|
2012-12-20 01:37:37 -08:00
|
|
|
if (popup)
|
|
|
|
{
|
|
|
|
// only one popup please
|
|
|
|
Eina_List *l;
|
|
|
|
EINA_LIST_FOREACH(windows, l, win)
|
|
|
|
if (win->grab)
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (!(win = _evry_window_new(zone, edge)))
|
|
|
|
return NULL;
|
2010-05-15 19:37:07 -07:00
|
|
|
|
2011-08-16 16:26:07 -07:00
|
|
|
if (popup)
|
|
|
|
{
|
2014-11-02 18:35:13 -08:00
|
|
|
E_Client *ec;
|
|
|
|
|
|
|
|
ecore_evas_name_class_set(e_win_ee_get(win->ewin), "E", "everything");
|
|
|
|
|
|
|
|
evas_object_show(win->ewin);
|
|
|
|
ec = e_win_client_get(win->ewin);
|
|
|
|
if (ec)
|
|
|
|
{
|
2014-03-18 13:14:04 -07:00
|
|
|
#ifndef HAVE_WAYLAND_ONLY
|
2014-11-02 18:35:13 -08:00
|
|
|
if (ec->comp->comp_type == E_PIXMAP_TYPE_X)
|
|
|
|
ecore_x_netwm_window_type_set(elm_win_window_id_get(win->ewin),
|
|
|
|
ECORE_X_WINDOW_TYPE_UTILITY);
|
2014-03-18 13:14:04 -07:00
|
|
|
#endif
|
2014-11-02 18:35:13 -08:00
|
|
|
ec->netwm.state.skip_taskbar = 1;
|
|
|
|
EC_CHANGED(ec);
|
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2013-02-25 06:04:12 -08:00
|
|
|
win->grab = 1;
|
2011-08-16 16:26:07 -07:00
|
|
|
}
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2009-08-30 05:01:50 -07:00
|
|
|
evry_history_load();
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-04-25 18:04:43 -07:00
|
|
|
if (params)
|
|
|
|
win->plugin_dedicated = EINA_TRUE;
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->sel_list = E_NEW(Evry_Selector *, 4);
|
2010-05-15 19:37:07 -07:00
|
|
|
win->sel_list[3] = NULL;
|
|
|
|
win->selectors = win->sel_list;
|
2010-05-14 15:06:06 -07:00
|
|
|
_evry_selector_new(win, EVRY_PLUGIN_SUBJECT);
|
|
|
|
_evry_selector_new(win, EVRY_PLUGIN_ACTION);
|
|
|
|
_evry_selector_new(win, EVRY_PLUGIN_OBJECT);
|
2009-08-10 04:36:37 -07:00
|
|
|
|
2013-02-25 06:04:12 -08:00
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_KEY_DOWN, _evry_cb_key_down, win);
|
2014-03-18 13:14:04 -07:00
|
|
|
#ifndef HAVE_WAYLAND_ONLY
|
2014-11-02 18:35:13 -08:00
|
|
|
if (e_comp_get(NULL)->comp_type == E_PIXMAP_TYPE_X)
|
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_X_EVENT_SELECTION_NOTIFY, _evry_cb_selection_notify, win);
|
2014-03-18 13:14:04 -07:00
|
|
|
#endif
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_event_callback_add(e_win_client_get(win->ewin)->frame, EVAS_CALLBACK_SHOW, (Evas_Object_Event_Cb)_evry_cb_show, win);
|
2013-02-25 06:04:12 -08:00
|
|
|
|
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, EVRY_EVENT_ITEM_CHANGED, _evry_cb_item_changed, win);
|
|
|
|
|
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN, _evry_cb_mouse, win);
|
|
|
|
|
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_BUTTON_UP, _evry_cb_mouse, win);
|
2012-12-03 01:43:51 -08:00
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, E_EVENT_DESKLOCK, _evry_cb_desklock, win);
|
2010-06-04 12:32:59 -07:00
|
|
|
#if 0
|
2013-02-25 06:04:12 -08:00
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_MOVE, _evry_cb_mouse, win);
|
|
|
|
|
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_WHEEL, _evry_cb_mouse, win);
|
|
|
|
|
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_X_EVENT_MOUSE_IN, _evry_cb_mouse_in, win);
|
|
|
|
|
|
|
|
E_LIST_HANDLER_APPEND(win->handlers, ECORE_X_EVENT_MOUSE_OUT, _evry_cb_mouse_out, win);
|
2010-06-04 12:32:59 -07:00
|
|
|
#endif
|
|
|
|
_evry_selector_plugins_get(SUBJ_SEL, NULL, params);
|
2010-05-21 23:35:46 -07:00
|
|
|
_evry_selector_update(SUBJ_SEL);
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2010-10-26 16:21:20 -07:00
|
|
|
windows = eina_list_append(windows, win);
|
2010-03-28 13:15:27 -07:00
|
|
|
|
2011-09-23 19:23:57 -07:00
|
|
|
_evry_selector_activate(SUBJ_SEL, 0);
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2011-09-23 19:23:57 -07:00
|
|
|
if ((!evry_conf->hide_list) || (edge))
|
2010-10-26 16:21:20 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
sel = CUR_SEL;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (sel && sel->state && evry_conf->views)
|
|
|
|
{
|
|
|
|
/* if (evry_conf->first_run)
|
|
|
|
* {
|
|
|
|
* evry_view_toggle(sel->state, "?");
|
|
|
|
* evry_conf->first_run = EINA_FALSE;
|
|
|
|
* } */
|
2010-10-26 16:21:20 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,list_show", "e");
|
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,entry_show", "e");
|
|
|
|
win->visible = EINA_TRUE;
|
|
|
|
}
|
2010-10-26 16:21:20 -07:00
|
|
|
}
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-09-02 16:02:26 -07:00
|
|
|
win->func.hide = &_evry_hide_func;
|
|
|
|
|
2012-12-20 01:37:37 -08:00
|
|
|
win->delay_hide_action = ecore_timer_add(0.2, _evry_delay_hide_timer, win);
|
|
|
|
|
2010-06-01 07:26:09 -07:00
|
|
|
return win;
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
|
|
|
|
2012-12-20 01:37:37 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_evry_delay_hide_timer(void *data)
|
|
|
|
{
|
|
|
|
Evry_Window *win = data;
|
|
|
|
win->delay_hide_action = NULL;
|
|
|
|
|
|
|
|
return ECORE_CALLBACK_CANCEL;
|
|
|
|
}
|
|
|
|
|
2011-09-02 16:02:26 -07:00
|
|
|
static void
|
|
|
|
_evry_hide_func(Evry_Window *win, int finished)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((finished) && (win->grab))
|
2011-09-02 16:02:26 -07:00
|
|
|
evry_hide(win, 0);
|
|
|
|
}
|
|
|
|
|
2009-08-13 08:10:54 -07:00
|
|
|
void
|
2010-06-04 12:32:59 -07:00
|
|
|
evry_hide(Evry_Window *win, int clear)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2009-12-23 13:46:39 -08:00
|
|
|
Ecore_Event_Handler *ev;
|
2010-05-15 19:37:07 -07:00
|
|
|
int i;
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
if (!win) return;
|
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_event_callback_del(win->ewin, EVAS_CALLBACK_DEL, _evry_cb_win_delete);
|
|
|
|
evas_object_hide(win->ewin);
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_state_clear(win);
|
2010-05-24 15:20:26 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if ((clear && CUR_SEL) &&
|
2011-09-02 16:02:26 -07:00
|
|
|
/* pop states */
|
2010-05-21 23:35:46 -07:00
|
|
|
((eina_list_count((SUBJ_SEL)->states) > 1) ||
|
2011-11-29 19:32:54 -08:00
|
|
|
/* move to subject selector */
|
|
|
|
(CUR_SEL != SUBJ_SEL) ||
|
|
|
|
/* clear input */
|
|
|
|
(((CUR_SEL)->state) && ((CUR_SEL)->state->input[0]))))
|
|
|
|
{
|
|
|
|
int slide = 0;
|
|
|
|
Evry_Selector *sel;
|
|
|
|
Evry_State *s;
|
|
|
|
|
|
|
|
if (CUR_SEL != SUBJ_SEL)
|
|
|
|
{
|
|
|
|
if (CUR_SEL == ACTN_SEL)
|
|
|
|
_evry_selectors_switch(win, -1);
|
|
|
|
else if (CUR_SEL == OBJ_SEL)
|
|
|
|
_evry_selectors_switch(win, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* just to be sure */
|
|
|
|
CUR_SEL = SUBJ_SEL;
|
|
|
|
|
|
|
|
while ((CUR_SEL)->states->next)
|
|
|
|
{
|
|
|
|
slide = SLIDE_RIGHT;
|
|
|
|
_evry_state_pop(CUR_SEL, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
sel = CUR_SEL;
|
|
|
|
s = sel->state;
|
|
|
|
_evry_clear(sel);
|
|
|
|
_evry_clear(sel);
|
|
|
|
|
|
|
|
_evry_aggregator_fetch(s);
|
|
|
|
_evry_selector_update(sel);
|
|
|
|
_evry_update_text_label(s);
|
|
|
|
if (s->view)
|
|
|
|
{
|
|
|
|
_evry_view_show(win, s->view, slide);
|
|
|
|
s->view->update(s->view);
|
|
|
|
}
|
|
|
|
return;
|
2010-05-01 12:27:26 -07:00
|
|
|
}
|
2010-05-03 12:19:42 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (_evry_selectors_shift(win, -1))
|
2011-09-02 16:02:26 -07:00
|
|
|
return;
|
2010-05-15 20:22:17 -07:00
|
|
|
|
|
|
|
win->visible = EINA_FALSE;
|
|
|
|
|
compositor rewrite / charlie-foxtrot situation
huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once.
* compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine.
** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes
** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects
** protocol-specific window management and compositor functionality is now kept exclusively in backend files
** e_pixmap api provides generic client finding and rendering api
** screen/xinerama screens are now provided directly by compositor on startup and re-set on change
** e_comp_render_update finally replaced with eina_tiler
** wayland compositor no longer creates X windows
** compositor e_layout removed entirely
* e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra
* e_manager is just for screensaver and keybind stuff now, possibly remove later?
* e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor
** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed.
*** do NOT set interceptors on a client's comp_object. seriously.
* startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor
* ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get
* e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas
* deskmirror is (more) broken for now
* illume is totally fucked
* Ecore_X_Window replaced with Ecore_Window in most cases
* edge binding XWindows replaced with regular canvas objects
* some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result
comp files and descriptions:
e_comp.c - overall compositor functions, rendering/update loop, shape cutting
e_comp_x.c - X window management and compositor functionality
e_comp_wl.c - Wayland surface management and compositor functionality
e_comp_canvas.c - general compositor canvas functions and utilities
e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems
additional authors: ivan.briano@intel.com
feature: new compositor
removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
|
|
|
if (win->sel_list)
|
|
|
|
{
|
|
|
|
for (i = 0; win->sel_list[i]; i++)
|
|
|
|
_evry_selector_free(win->sel_list[i]);
|
|
|
|
}
|
2010-05-15 20:22:17 -07:00
|
|
|
|
|
|
|
E_FREE(win->sel_list);
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FREE (win->handlers, ev)
|
2010-05-15 20:22:17 -07:00
|
|
|
ecore_event_handler_del(ev);
|
|
|
|
|
2012-12-20 01:37:37 -08:00
|
|
|
if (win->delay_hide_action)
|
|
|
|
ecore_timer_del(win->delay_hide_action);
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (win->grab)
|
2014-11-02 18:35:13 -08:00
|
|
|
e_grabinput_release(elm_win_window_id_get(win->ewin),
|
|
|
|
elm_win_window_id_get(win->ewin));
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
windows = eina_list_remove(windows, win);
|
|
|
|
|
|
|
|
_evry_window_free(win);
|
2010-05-15 20:22:17 -07:00
|
|
|
|
|
|
|
evry_history_unload();
|
2010-05-31 14:15:32 -07:00
|
|
|
|
|
|
|
#ifdef CHECK_REFS
|
|
|
|
Evry_Item *_it;
|
|
|
|
int _cnt = eina_list_count(_refd);
|
|
|
|
Eina_List *_l;
|
|
|
|
printf("__________________________");
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (_refd, _l, _it)
|
2010-05-31 14:15:32 -07:00
|
|
|
printf("%d %s\n", _it->ref, _it->label);
|
|
|
|
printf("sum: %d", _cnt);
|
|
|
|
#endif
|
2010-05-15 20:22:17 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_selectors_shift(Evry_Window *win, int dir)
|
2010-05-15 20:22:17 -07:00
|
|
|
{
|
2010-05-18 18:10:15 -07:00
|
|
|
if ((dir > 0) && (win->level == 0))
|
2010-05-15 20:22:17 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
void *new_sel;
|
|
|
|
Evry_Selector *sel;
|
|
|
|
Evry_State *s;
|
|
|
|
int i;
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
for (i = 1; i < 3; i++)
|
|
|
|
_evry_selector_item_clear(win->selectors[i]);
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!(new_sel = realloc(win->sel_list, sizeof(Evry_Selector *) * 6)))
|
|
|
|
return 0;
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->sel_list = new_sel;
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main,
|
|
|
|
"e,state,object_selector_hide", "e");
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->sel_list[5] = NULL;
|
|
|
|
win->selectors = win->sel_list + 2;
|
|
|
|
_evry_selector_new(win, EVRY_PLUGIN_ACTION);
|
|
|
|
_evry_selector_new(win, EVRY_PLUGIN_OBJECT);
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
CUR_SEL = SUBJ_SEL;
|
|
|
|
sel = CUR_SEL;
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_signal_emit(sel, "e,state,selected");
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_item_update(SUBJ_SEL);
|
|
|
|
_evry_selector_item_update(ACTN_SEL);
|
|
|
|
_evry_selector_item_update(OBJ_SEL);
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
/* was checked before. anyway */
|
|
|
|
if ((s = sel->state) && (s->cur_item))
|
|
|
|
_evry_selector_update_actions(sel);
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->level++;
|
2010-05-15 20:22:17 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
return 1;
|
2010-05-15 20:22:17 -07:00
|
|
|
}
|
|
|
|
else if ((dir < 0) && (win->level > 0))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_item_clear(SUBJ_SEL);
|
|
|
|
_evry_selector_free(ACTN_SEL);
|
|
|
|
_evry_selector_free(OBJ_SEL);
|
2010-05-15 19:37:07 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->selectors = win->sel_list;
|
|
|
|
win->sel_list[3] = NULL;
|
|
|
|
CUR_SEL = NULL;
|
2010-05-15 19:37:07 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main,
|
|
|
|
"e,state,object_selector_show", "e");
|
|
|
|
_evry_selector_item_update(SUBJ_SEL);
|
|
|
|
_evry_selector_item_update(ACTN_SEL);
|
|
|
|
_evry_selector_item_update(OBJ_SEL);
|
|
|
|
_evry_selector_activate(OBJ_SEL, 0);
|
2010-05-15 19:37:07 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->level = 0;
|
2010-05-15 19:37:07 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
return 1;
|
2010-05-15 20:22:17 -07:00
|
|
|
}
|
2009-08-30 05:01:50 -07:00
|
|
|
|
2010-05-15 20:22:17 -07:00
|
|
|
return 0;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
Evry_Item *
|
2011-08-12 03:58:44 -07:00
|
|
|
evry_item_new(Evry_Item *it, Evry_Plugin *p, const char *label,
|
2011-11-29 19:32:54 -08:00
|
|
|
Evas_Object *(*icon_get)(Evry_Item * it, Evas * e),
|
|
|
|
void (*cb_free)(Evry_Item *item))
|
2009-06-24 13:02:37 -07:00
|
|
|
{
|
2011-08-12 03:58:44 -07:00
|
|
|
if (!it)
|
2009-08-22 20:12:05 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
it = E_NEW(Evry_Item, 1);
|
|
|
|
if (!it) return NULL;
|
2009-08-22 20:12:05 -07:00
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-04-27 20:22:40 -07:00
|
|
|
if (p && EVRY_ITEM(p)->subtype)
|
2010-04-28 09:39:50 -07:00
|
|
|
it->type = EVRY_ITEM(p)->subtype;
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
it->plugin = p;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
if (label) it->label = eina_stringshare_add(label);
|
2009-08-21 19:11:35 -07:00
|
|
|
it->free = cb_free;
|
2010-04-27 20:22:40 -07:00
|
|
|
it->icon_get = icon_get;
|
2009-08-19 05:07:37 -07:00
|
|
|
|
2009-08-13 15:42:40 -07:00
|
|
|
it->ref = 1;
|
|
|
|
|
2009-08-27 03:35:32 -07:00
|
|
|
#ifdef CHECK_REFS
|
2010-05-31 14:15:32 -07:00
|
|
|
_item_cnt++;
|
|
|
|
_refd = eina_list_append(_refd, it);
|
|
|
|
#endif
|
|
|
|
#ifdef PRINT_REFS
|
|
|
|
printf("%d, %d\t new : %s\n", it->ref, _item_cnt, it->label);
|
2009-08-27 03:35:32 -07:00
|
|
|
#endif
|
2009-08-10 04:36:37 -07:00
|
|
|
return it;
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
void
|
2009-08-10 04:36:37 -07:00
|
|
|
evry_item_free(Evry_Item *it)
|
2009-06-24 13:02:37 -07:00
|
|
|
{
|
2009-08-13 15:42:40 -07:00
|
|
|
if (!it) return;
|
|
|
|
|
|
|
|
it->ref--;
|
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
#ifdef PRINT_REFS
|
2011-11-29 19:32:54 -08:00
|
|
|
printf("%d, %d\t unref: %s\n", it->ref, _item_cnt, it->label);
|
2009-08-27 03:35:32 -07:00
|
|
|
#endif
|
|
|
|
|
2009-08-13 15:42:40 -07:00
|
|
|
if (it->ref > 0) return;
|
|
|
|
|
2009-08-27 03:35:32 -07:00
|
|
|
#ifdef CHECK_REFS
|
2010-05-31 14:15:32 -07:00
|
|
|
_item_cnt--;
|
|
|
|
_refd = eina_list_remove(_refd, it);
|
2009-08-27 03:35:32 -07:00
|
|
|
#endif
|
2009-08-13 15:42:40 -07:00
|
|
|
|
2010-05-11 19:01:09 -07:00
|
|
|
IF_RELEASE(it->label);
|
|
|
|
IF_RELEASE(it->id);
|
|
|
|
IF_RELEASE(it->context);
|
|
|
|
IF_RELEASE(it->detail);
|
|
|
|
IF_RELEASE(it->icon);
|
2010-05-12 10:29:38 -07:00
|
|
|
|
2009-08-22 20:12:05 -07:00
|
|
|
if (it->free)
|
|
|
|
it->free(it);
|
|
|
|
else
|
|
|
|
E_FREE(it);
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
void
|
|
|
|
evry_item_ref(Evry_Item *it)
|
2010-04-01 22:31:02 -07:00
|
|
|
{
|
2010-05-19 07:44:36 -07:00
|
|
|
it->ref++;
|
2010-05-31 14:15:32 -07:00
|
|
|
#ifdef PRINT_REFS
|
|
|
|
printf("%d, %d\t ref : %s\n", it->ref, _item_cnt, it->label);
|
2010-05-19 07:44:36 -07:00
|
|
|
#endif
|
2010-04-01 22:31:02 -07:00
|
|
|
}
|
|
|
|
|
2010-04-25 15:12:54 -07:00
|
|
|
static int
|
2010-05-27 14:10:20 -07:00
|
|
|
_evry_selector_update_actions_do(Evry_Selector *sel)
|
2010-04-25 15:12:54 -07:00
|
|
|
{
|
|
|
|
Evry_State *s;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-04-25 15:12:54 -07:00
|
|
|
|
2010-05-27 14:10:20 -07:00
|
|
|
if (sel->action_timer)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ecore_timer_del(sel->action_timer);
|
|
|
|
sel->action_timer = NULL;
|
2010-05-27 14:10:20 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if ((s = (SUBJ_SEL)->state))
|
2010-06-08 07:46:39 -07:00
|
|
|
_evry_selector_plugins_get(sel, s->cur_item, NULL);
|
2010-04-25 15:12:54 -07:00
|
|
|
|
|
|
|
_evry_selector_update(sel);
|
|
|
|
|
2010-05-27 14:10:20 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-05-27 14:10:20 -07:00
|
|
|
_evry_timer_cb_actions_get(void *data)
|
|
|
|
{
|
|
|
|
Evry_Selector *sel = data;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-05-27 14:10:20 -07:00
|
|
|
Evry_State *s;
|
|
|
|
|
|
|
|
_evry_selector_update_actions_do(sel);
|
|
|
|
|
|
|
|
if ((CUR_SEL == sel) && (s = sel->state))
|
2010-04-25 15:12:54 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (_evry_view_update(win, s))
|
|
|
|
_evry_view_show(win, s->view, 0);
|
2010-04-25 15:12:54 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2010-04-25 15:12:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_selector_update_actions(Evry_Selector *sel)
|
2010-04-27 20:22:40 -07:00
|
|
|
{
|
2010-05-26 16:57:48 -07:00
|
|
|
if (sel->action_timer)
|
|
|
|
ecore_timer_del(sel->action_timer);
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2011-08-19 15:11:09 -07:00
|
|
|
_evry_selector_item_clear(sel);
|
2011-08-12 03:58:44 -07:00
|
|
|
sel->action_timer = ecore_timer_add(0.2, _evry_timer_cb_actions_get, sel);
|
2010-04-25 15:12:54 -07:00
|
|
|
}
|
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
void
|
2009-08-17 16:54:16 -07:00
|
|
|
evry_item_select(const Evry_State *state, Evry_Item *it)
|
|
|
|
{
|
|
|
|
Evry_State *s = (Evry_State *)state;
|
2010-05-19 07:44:36 -07:00
|
|
|
Evry_Selector *sel;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win;
|
2009-08-17 16:54:16 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if ((!s) || (s->delete_me))
|
|
|
|
return;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
sel = s->selector;
|
2010-06-04 12:32:59 -07:00
|
|
|
win = sel->win;
|
|
|
|
|
2009-08-17 16:54:16 -07:00
|
|
|
s->plugin_auto_selected = EINA_FALSE;
|
|
|
|
s->item_auto_selected = EINA_FALSE;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2009-08-17 16:54:16 -07:00
|
|
|
_evry_item_sel(s, it);
|
2010-04-07 08:03:27 -07:00
|
|
|
|
|
|
|
if (s == sel->state)
|
2010-04-27 20:22:40 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_update(sel);
|
2011-06-18 06:04:08 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (CUR_SEL == SUBJ_SEL)
|
|
|
|
_evry_selector_update_actions(ACTN_SEL);
|
2011-06-18 06:04:08 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (CUR_SEL == ACTN_SEL)
|
|
|
|
{
|
|
|
|
while (OBJ_SEL->state)
|
|
|
|
_evry_state_pop(OBJ_SEL, 1);
|
|
|
|
}
|
2010-04-25 15:12:54 -07:00
|
|
|
}
|
2009-08-17 16:54:16 -07:00
|
|
|
}
|
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
void
|
2009-08-28 21:42:17 -07:00
|
|
|
evry_item_mark(const Evry_State *state, Evry_Item *it, Eina_Bool mark)
|
|
|
|
{
|
|
|
|
Evry_State *s = (Evry_State *)state;
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if ((!s) || (s->delete_me))
|
|
|
|
return;
|
|
|
|
|
2010-04-25 09:26:13 -07:00
|
|
|
if (mark && !it->marked)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
it->marked = EINA_TRUE;
|
|
|
|
s->sel_items = eina_list_append(s->sel_items, it);
|
2010-04-25 09:26:13 -07:00
|
|
|
}
|
|
|
|
else if (it->marked)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
it->marked = EINA_FALSE;
|
|
|
|
s->sel_items = eina_list_remove(s->sel_items, it);
|
2010-04-25 09:26:13 -07:00
|
|
|
}
|
2009-08-28 21:42:17 -07:00
|
|
|
}
|
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
void
|
2010-05-10 15:35:13 -07:00
|
|
|
evry_plugin_update(Evry_Plugin *p, int action)
|
2009-08-14 02:35:51 -07:00
|
|
|
{
|
|
|
|
Evry_State *s;
|
2010-04-01 22:31:02 -07:00
|
|
|
Evry_Selector *sel;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (!(s = p->state) || (s->delete_me))
|
2010-05-19 07:44:36 -07:00
|
|
|
return;
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
if (!(sel = s->selector))
|
|
|
|
return;
|
2010-04-30 15:12:02 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (!(win = sel->win))
|
|
|
|
return;
|
|
|
|
|
2011-06-22 02:44:30 -07:00
|
|
|
if (sel->state->request != p->request)
|
|
|
|
return;
|
2010-05-03 12:19:42 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
DBG("update %d %d %s", s->request, p->request, p->name);
|
|
|
|
|
2010-05-10 15:35:13 -07:00
|
|
|
if (action == EVRY_UPDATE_ADD)
|
2009-08-14 02:35:51 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* clear marked items */
|
|
|
|
if (s->sel_items)
|
|
|
|
{
|
|
|
|
eina_list_free(s->sel_items);
|
|
|
|
s->sel_items = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((!p->items) && (!s->trigger_active))
|
|
|
|
{
|
|
|
|
/* remove plugin */
|
|
|
|
if (!(eina_list_data_find(s->cur_plugins, p)))
|
|
|
|
return;
|
|
|
|
|
|
|
|
s->cur_plugins = eina_list_remove(s->cur_plugins, p);
|
|
|
|
|
|
|
|
if (p == s->plugin)
|
|
|
|
_evry_plugin_select(s, NULL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* add plugin to current plugins*/
|
|
|
|
_evry_plugin_list_insert(s, p);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sel->state == s)
|
|
|
|
{
|
|
|
|
_evry_aggregator_fetch(s);
|
|
|
|
|
|
|
|
/* select first plugin */
|
|
|
|
if ((!s->plugin) || (s->plugin_auto_selected) ||
|
|
|
|
!(eina_list_data_find(s->cur_plugins, s->plugin)))
|
|
|
|
{
|
|
|
|
_evry_plugin_select(s, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((s->plugin && (sel->state == s)) &&
|
|
|
|
/* plugin is current */
|
|
|
|
((s->plugin == p) ||
|
|
|
|
/* plugin items are shown in aggregator */
|
|
|
|
((s->plugin == s->aggregator) && p->config->aggregate)))
|
|
|
|
{
|
|
|
|
_evry_selector_update(sel);
|
|
|
|
|
|
|
|
if (_evry_view_update(win, s))
|
|
|
|
/* XXX when there is a case where view disappears
|
|
|
|
check this one! is swallow always visible ? */
|
|
|
|
_evry_view_show(win, s->view, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* switch back to subject selector when no current items */
|
|
|
|
if ((sel == SUBJ_SEL) &&
|
|
|
|
(!(s->plugin) || !(s->plugin->items)) &&
|
|
|
|
(CUR_SEL == ACTN_SEL))
|
|
|
|
{
|
|
|
|
_evry_selectors_switch(win, -1);
|
|
|
|
_evry_clear(SUBJ_SEL);
|
|
|
|
}
|
|
|
|
}
|
2009-08-14 02:35:51 -07:00
|
|
|
}
|
2010-05-10 15:35:13 -07:00
|
|
|
else if (action == EVRY_UPDATE_REFRESH)
|
2010-03-14 10:53:13 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_clear(s);
|
|
|
|
_evry_view_update(win, s);
|
2010-03-14 10:53:13 -07:00
|
|
|
}
|
2009-08-14 02:35:51 -07:00
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_list_win_show(Evry_Window *win)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2010-05-13 23:35:06 -07:00
|
|
|
if (win->visible) return;
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2010-05-13 23:35:06 -07:00
|
|
|
win->visible = EINA_TRUE;
|
2010-05-21 23:35:46 -07:00
|
|
|
_evry_list_win_update((CUR_SEL)->state);
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2010-05-24 15:08:15 -07:00
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,list_show", "e");
|
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,entry_show", "e");
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_list_win_hide(Evry_Window *win)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2010-05-21 23:35:46 -07:00
|
|
|
Evry_Selector *sel = CUR_SEL;
|
|
|
|
|
2010-05-26 16:57:48 -07:00
|
|
|
if (!win->visible)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!evry_conf->hide_list)
|
|
|
|
return;
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (sel->state)
|
|
|
|
_evry_view_clear(sel->state);
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2010-05-26 16:57:48 -07:00
|
|
|
win->visible = EINA_FALSE;
|
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,list_hide", "e");
|
2010-05-21 23:35:46 -07:00
|
|
|
|
2010-05-26 16:57:48 -07:00
|
|
|
if (evry_conf->hide_input && (!(sel->state) || (sel->state->input[0])))
|
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,entry_hide", "e");
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2009-07-29 13:43:09 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
static void
|
2014-11-02 18:35:13 -08:00
|
|
|
_evry_cb_win_delete(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
2010-06-04 12:32:59 -07:00
|
|
|
{
|
2014-11-02 18:35:13 -08:00
|
|
|
evry_hide(data, 0);
|
2010-06-04 12:32:59 -07:00
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static Evry_Window *
|
2010-05-26 08:09:51 -07:00
|
|
|
_evry_window_new(E_Zone *zone, E_Zone_Edge edge)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2010-05-26 08:09:51 -07:00
|
|
|
int x, y, mw, mh, h, w;
|
2009-08-10 04:36:37 -07:00
|
|
|
Evry_Window *win;
|
|
|
|
Evas_Object *o;
|
2010-04-16 10:24:35 -07:00
|
|
|
const char *tmp;
|
|
|
|
int offset_s = 0;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
win = E_NEW(Evry_Window, 1);
|
2014-11-02 18:35:13 -08:00
|
|
|
win->ewin = elm_win_add(NULL, NULL, ELM_WIN_UTILITY);
|
|
|
|
elm_win_borderless_set(win->ewin, 1);
|
2010-06-04 12:32:59 -07:00
|
|
|
e_win_no_remember_set(win->ewin, 1);
|
|
|
|
e_win_placed_set(win->ewin, 1);
|
2014-11-02 18:35:13 -08:00
|
|
|
elm_win_override_set(win->ewin, 1);
|
|
|
|
win->evas = evas_object_evas_get(win->ewin);
|
2010-06-04 12:32:59 -07:00
|
|
|
win->zone = zone;
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_data_set(win->ewin, "evry_win", win);
|
2010-06-04 12:32:59 -07:00
|
|
|
|
|
|
|
o = edje_object_add(win->evas);
|
2009-08-10 04:36:37 -07:00
|
|
|
win->o_main = o;
|
2014-11-02 18:35:13 -08:00
|
|
|
elm_win_resize_object_add(win->ewin, o);
|
2014-11-21 12:10:46 -08:00
|
|
|
E_EXPAND(o);
|
|
|
|
E_FILL(o);
|
2010-05-27 13:25:09 -07:00
|
|
|
e_theme_edje_object_set(o, "base/theme/modules/everything",
|
2011-11-29 19:32:54 -08:00
|
|
|
"e/modules/everything/main");
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2013-02-25 06:04:12 -08:00
|
|
|
edje_object_signal_emit(o, "e,state,composited", "e");
|
|
|
|
edje_object_signal_emit(o, "list:e,state,composited", "e");
|
|
|
|
edje_object_message_signal_process(o);
|
|
|
|
edje_object_calc_force(o);
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2013-02-25 06:04:12 -08:00
|
|
|
tmp = edje_object_data_get(o, "shadow_offset");
|
|
|
|
offset_s = tmp ? atoi(tmp) : 0;
|
2009-08-28 22:08:06 -07:00
|
|
|
edje_object_size_min_calc(o, &mw, &mh);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2010-05-26 08:09:51 -07:00
|
|
|
if (edge == E_ZONE_EDGE_NONE)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
w = evry_conf->width;
|
|
|
|
h = evry_conf->height;
|
2010-05-26 08:09:51 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
w = evry_conf->edge_width;
|
|
|
|
h = evry_conf->edge_height;
|
2010-05-26 08:09:51 -07:00
|
|
|
}
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_size_hint_min_set(win->ewin, mw, mh);
|
2010-05-26 08:09:51 -07:00
|
|
|
|
2010-05-13 23:49:20 -07:00
|
|
|
evry_conf->min_w = mw;
|
2010-05-26 08:09:51 -07:00
|
|
|
if (w > mw) mw = w;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2010-05-13 23:35:06 -07:00
|
|
|
evry_conf->min_h = mh;
|
2010-05-26 08:09:51 -07:00
|
|
|
if (h > mh) mh = h;
|
|
|
|
|
|
|
|
if (edge == E_ZONE_EDGE_NONE)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
mw += offset_s * 2;
|
|
|
|
mh += offset_s * 2;
|
2010-05-26 08:09:51 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
x = (zone->x + (zone->w * evry_conf->rel_x)) - (mw / 2);
|
|
|
|
y = (zone->y + (zone->h * evry_conf->rel_y)) - (mh / 2);
|
2010-05-26 08:09:51 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
int to_side = 0;
|
|
|
|
|
|
|
|
switch (edge)
|
|
|
|
{
|
|
|
|
case E_ZONE_EDGE_TOP_LEFT:
|
|
|
|
x = to_side - offset_s;
|
|
|
|
y = to_side - offset_s;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case E_ZONE_EDGE_TOP_RIGHT:
|
|
|
|
x = zone->w - (mw + offset_s + to_side);
|
|
|
|
y = to_side - offset_s;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case E_ZONE_EDGE_BOTTOM_RIGHT:
|
|
|
|
x = zone->w - (mw + offset_s + to_side);
|
|
|
|
y = zone->h - (mh + offset_s + to_side);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case E_ZONE_EDGE_BOTTOM_LEFT:
|
|
|
|
x = to_side - offset_s;
|
|
|
|
y = zone->h - (mh + offset_s + to_side);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
mw += offset_s * 2;
|
|
|
|
mh += offset_s * 2;
|
|
|
|
x = (zone->w * evry_conf->rel_x) - (mw / 2);
|
|
|
|
y = (zone->h * evry_conf->rel_y) - (mh / 2);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
x += zone->x;
|
|
|
|
y += zone->y;
|
|
|
|
|
|
|
|
mw += offset_s * 2;
|
|
|
|
mh += offset_s * 2;
|
2010-05-26 08:09:51 -07:00
|
|
|
}
|
2010-05-14 15:06:06 -07:00
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_geometry_set(win->ewin, x, y, mw, mh);
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
evas_object_show(o);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2014-03-18 13:14:04 -07:00
|
|
|
evas_event_feed_mouse_in(win->evas, 0, NULL);
|
|
|
|
evas_event_feed_mouse_move(win->evas, -1000000, -1000000, 0, NULL);
|
2010-05-17 16:15:00 -07:00
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_event_callback_add(win->ewin, EVAS_CALLBACK_DEL, _evry_cb_win_delete, win);
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
return win;
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2010-10-28 16:07:59 -07:00
|
|
|
#if 0
|
2010-05-18 02:37:58 -07:00
|
|
|
static void
|
|
|
|
_evry_cb_drag_finished(E_Drag *drag, int dropped)
|
|
|
|
{
|
|
|
|
E_FREE(drag->data);
|
|
|
|
}
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-10-28 16:07:59 -07:00
|
|
|
#endif
|
2010-05-18 02:37:58 -07:00
|
|
|
|
2012-12-03 01:43:51 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_evry_cb_desklock(Evry_Window *win, int type __UNUSED__, E_Event_Desklock *ev)
|
|
|
|
{
|
|
|
|
if (ev->on) evry_hide(win, 0);
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-05-17 16:15:00 -07:00
|
|
|
_evry_cb_mouse(void *data, int type, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Event_Mouse_Button *ev;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = data;
|
2014-11-02 18:35:13 -08:00
|
|
|
Evas_Object *ewin;
|
|
|
|
int x, y, w, h;
|
2010-05-17 16:15:00 -07:00
|
|
|
|
|
|
|
ev = event;
|
2010-05-26 08:09:51 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (!win->grab)
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
if (ev->event_window != elm_win_window_id_get(win->ewin))
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-05-17 16:15:00 -07:00
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
ewin = win->ewin;
|
2010-05-17 16:15:00 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
#if 0
|
2010-05-17 16:15:00 -07:00
|
|
|
if (type == ECORE_EVENT_MOUSE_MOVE)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
Ecore_Event_Mouse_Move *ev = event;
|
|
|
|
Evry_State *s;
|
|
|
|
|
|
|
|
if ((win->mouse_button == 3) &&
|
|
|
|
(s = (CUR_SEL)->state) && (s->cur_item) &&
|
|
|
|
(CHECK_TYPE(s->cur_item, EVRY_TYPE_FILE)) &&
|
|
|
|
(!E_INSIDE(ev->x, ev->y,
|
|
|
|
win->zone->x,
|
|
|
|
win->zone->y,
|
2014-11-02 18:35:13 -08:00
|
|
|
ewin->w, ewin->h)))
|
2011-11-29 19:32:54 -08:00
|
|
|
{
|
|
|
|
const char *drag_types[] = { "text/uri-list" };
|
|
|
|
E_Drag *d;
|
|
|
|
Evas_Object *o;
|
|
|
|
const char *uri;
|
|
|
|
int s_len, sel_length = 0;
|
|
|
|
char *tmp, *sel = NULL;
|
|
|
|
|
|
|
|
GET_FILE(file, s->cur_item);
|
|
|
|
|
|
|
|
if (!(uri = evry_file_url_get(file)))
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
|
|
|
|
s_len = strlen(uri);
|
|
|
|
if (!(tmp = realloc(sel, sel_length + s_len + 2 + 1)))
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
sel = tmp;
|
|
|
|
memcpy(sel + sel_length, uri, s_len);
|
|
|
|
memcpy(sel + sel_length + s_len, "\r\n", 2);
|
|
|
|
sel_length += s_len + 2;
|
|
|
|
|
compositor rewrite / charlie-foxtrot situation
huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once.
* compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine.
** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes
** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects
** protocol-specific window management and compositor functionality is now kept exclusively in backend files
** e_pixmap api provides generic client finding and rendering api
** screen/xinerama screens are now provided directly by compositor on startup and re-set on change
** e_comp_render_update finally replaced with eina_tiler
** wayland compositor no longer creates X windows
** compositor e_layout removed entirely
* e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra
* e_manager is just for screensaver and keybind stuff now, possibly remove later?
* e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor
** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed.
*** do NOT set interceptors on a client's comp_object. seriously.
* startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor
* ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get
* e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas
* deskmirror is (more) broken for now
* illume is totally fucked
* Ecore_X_Window replaced with Ecore_Window in most cases
* edge binding XWindows replaced with regular canvas objects
* some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result
comp files and descriptions:
e_comp.c - overall compositor functions, rendering/update loop, shape cutting
e_comp_x.c - X window management and compositor functionality
e_comp_wl.c - Wayland surface management and compositor functionality
e_comp_canvas.c - general compositor canvas functions and utilities
e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems
additional authors: ivan.briano@intel.com
feature: new compositor
removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
|
|
|
d = e_drag_new(e_util_comp_current_get()),
|
2011-11-29 19:32:54 -08:00
|
|
|
ev->x, ev->y,
|
|
|
|
drag_types, 1, sel, sel_length, NULL,
|
|
|
|
_evry_cb_drag_finished);
|
|
|
|
e_drag_resize(d, 128, 128);
|
|
|
|
o = evry_util_icon_get(s->cur_item, e_drag_evas_get(d));
|
|
|
|
e_drag_object_set(d, o);
|
|
|
|
e_drag_xdnd_start(d, ev->x, ev->y);
|
|
|
|
|
|
|
|
evry_hide(win, 0);
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
2010-06-04 12:32:59 -07:00
|
|
|
else if (type == ECORE_EVENT_MOUSE_WHEEL)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
Ecore_Event_Mouse_Wheel *ev = event;
|
2010-06-04 12:32:59 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_geometry_get(ewin, &x, &y, &w, &h);
|
2010-06-04 12:32:59 -07:00
|
|
|
if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
win->mouse_out = 0;
|
2010-05-17 16:15:00 -07:00
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
if (!E_INSIDE(e_comp_canvas_x_root_adjust(e_comp_get(NULL), ev->root.x),
|
|
|
|
e_comp_canvas_y_root_adjust(e_comp_get(NULL), ev->root.y), x, y, w, h))
|
2011-11-29 19:32:54 -08:00
|
|
|
{
|
|
|
|
win->mouse_out = 1;
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
2010-05-17 16:15:00 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->mouse_button = ev->buttons;
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
else if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
win->mouse_button = 0;
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (win->mouse_out &&
|
2014-11-02 18:35:13 -08:00
|
|
|
(!E_INSIDE(e_comp_canvas_x_root_adjust(e_comp_get(NULL), ev->root.x),
|
|
|
|
e_comp_canvas_y_root_adjust(e_comp_get(NULL), ev->root.y), x, y, w, h)))
|
2011-11-29 19:32:54 -08:00
|
|
|
{
|
|
|
|
evry_hide(win, 0);
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
|
|
|
_evry_window_free(Evry_Window *win)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
evas_event_freeze(win->evas);
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_del(win->ewin);
|
|
|
|
free(win);
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2009-08-25 13:52:40 -07:00
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
static void
|
2011-01-23 14:34:28 -08:00
|
|
|
_evry_selector_cb_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Down *ev = event_info;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Selector *sel = data;
|
2010-05-17 16:15:00 -07:00
|
|
|
|
|
|
|
if (ev->button == 1)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
|
|
|
|
evry_plugin_action(sel->win, 1);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-01-23 14:34:28 -08:00
|
|
|
_evry_selector_cb_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Wheel *ev = event_info;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Selector *sel = data;
|
|
|
|
Evry_Window *win = sel->win;
|
2010-05-17 16:15:00 -07:00
|
|
|
|
|
|
|
if (ev->z > 0)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* FIXME dont loose selector 2 state until state 0 changed: */
|
|
|
|
if (CUR_SEL != OBJ_SEL)
|
|
|
|
_evry_selectors_switch(sel->win, 1);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
else if (ev->z < 0)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selectors_switch(sel->win, -1);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2011-01-23 14:34:28 -08:00
|
|
|
_evry_selector_cb_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Up *ev = event_info;
|
|
|
|
Evry_Selector *sel = data;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-05-17 16:15:00 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (sel == CUR_SEL)
|
2010-05-17 16:15:00 -07:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (ev->button == 3)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evry_plugin_action(win, 0);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
else if (ev->button == 1)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (sel == SUBJ_SEL)
|
|
|
|
{
|
|
|
|
if (CUR_SEL == ACTN_SEL)
|
|
|
|
_evry_selectors_switch(win, -1);
|
|
|
|
else
|
|
|
|
_evry_selectors_switch(win, 1);
|
|
|
|
}
|
|
|
|
else if (sel == ACTN_SEL)
|
|
|
|
{
|
|
|
|
if (CUR_SEL == SUBJ_SEL)
|
|
|
|
_evry_selectors_switch(win, 1);
|
|
|
|
else
|
|
|
|
_evry_selectors_switch(win, -1);
|
|
|
|
}
|
|
|
|
else if (sel == OBJ_SEL)
|
|
|
|
{
|
|
|
|
if (CUR_SEL == ACTN_SEL)
|
|
|
|
_evry_selectors_switch(win, 1);
|
|
|
|
}
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static Evry_Selector *
|
2010-05-14 15:06:06 -07:00
|
|
|
_evry_selector_new(Evry_Window *win, int type)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2010-04-23 17:21:45 -07:00
|
|
|
Plugin_Config *pc;
|
2011-01-15 17:19:22 -08:00
|
|
|
Eina_List *l, *pcs = NULL;
|
2009-08-10 04:36:37 -07:00
|
|
|
Evry_Selector *sel = E_NEW(Evry_Selector, 1);
|
2010-05-18 18:34:46 -07:00
|
|
|
Evas_Object *o = NULL;
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2011-08-21 08:41:37 -07:00
|
|
|
sel->aggregator = evry_aggregator_new(type);
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2010-04-27 20:22:40 -07:00
|
|
|
if (type == EVRY_PLUGIN_SUBJECT)
|
2009-08-30 01:51:15 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
pcs = evry_conf->conf_subjects;
|
|
|
|
sel->edje_part = "subject_selector";
|
2009-08-30 01:51:15 -07:00
|
|
|
}
|
2010-04-27 20:22:40 -07:00
|
|
|
else if (type == EVRY_PLUGIN_ACTION)
|
2009-08-30 01:51:15 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
pcs = evry_conf->conf_actions;
|
|
|
|
sel->edje_part = "action_selector";
|
2010-04-08 16:41:53 -07:00
|
|
|
}
|
2010-04-27 20:22:40 -07:00
|
|
|
else if (type == EVRY_PLUGIN_OBJECT)
|
2009-08-30 01:51:15 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
pcs = evry_conf->conf_objects;
|
|
|
|
sel->edje_part = "object_selector";
|
2010-05-18 18:34:46 -07:00
|
|
|
}
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if ((o = edje_object_part_swallow_get(win->o_main, sel->edje_part)))
|
2010-05-18 18:34:46 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
|
|
|
|
_evry_selector_cb_down, sel);
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
|
|
|
|
_evry_selector_cb_up, sel);
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL,
|
|
|
|
_evry_selector_cb_wheel, sel);
|
2009-08-30 01:51:15 -07:00
|
|
|
}
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (pcs, l, pc)
|
2009-07-10 08:47:19 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!pc->plugin) continue;
|
|
|
|
if (pc->plugin == sel->aggregator) continue;
|
|
|
|
sel->plugins = eina_list_append(sel->plugins, pc->plugin);
|
2009-07-10 08:47:19 -07:00
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-14 15:06:06 -07:00
|
|
|
win->selectors[type] = sel;
|
2010-05-24 15:08:15 -07:00
|
|
|
sel->win = win;
|
2010-05-14 15:06:06 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
return sel;
|
2009-07-10 08:47:19 -07:00
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
|
|
|
_evry_selector_free(Evry_Selector *sel)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2014-05-25 23:11:13 -07:00
|
|
|
Evas_Object *o;
|
|
|
|
|
|
|
|
if ((o = edje_object_part_swallow_get(win->o_main, sel->edje_part)))
|
|
|
|
{
|
|
|
|
evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_DOWN,
|
|
|
|
_evry_selector_cb_down, sel);
|
|
|
|
evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_UP,
|
|
|
|
_evry_selector_cb_up, sel);
|
|
|
|
evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_WHEEL,
|
|
|
|
_evry_selector_cb_wheel, sel);
|
|
|
|
}
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2010-05-18 18:24:26 -07:00
|
|
|
_evry_selector_item_clear(sel);
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (win->visible && (sel == CUR_SEL))
|
2009-08-17 16:54:16 -07:00
|
|
|
_evry_view_clear(sel->state);
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2009-08-13 15:42:40 -07:00
|
|
|
while (sel->states)
|
2010-05-24 15:08:15 -07:00
|
|
|
_evry_state_pop(sel, 1);
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2010-04-23 17:21:45 -07:00
|
|
|
EVRY_PLUGIN_FREE(sel->aggregator);
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2009-08-12 05:17:43 -07:00
|
|
|
if (sel->plugins) eina_list_free(sel->plugins);
|
2009-08-25 13:52:40 -07:00
|
|
|
|
2010-04-04 07:11:35 -07:00
|
|
|
if (sel->update_timer)
|
|
|
|
ecore_timer_del(sel->update_timer);
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-05-26 16:57:48 -07:00
|
|
|
if (sel->action_timer)
|
|
|
|
ecore_timer_del(sel->action_timer);
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
E_FREE(sel);
|
|
|
|
}
|
|
|
|
|
2010-05-18 18:10:15 -07:00
|
|
|
static void
|
|
|
|
_evry_selector_signal_emit(Evry_Selector *sel, const char *msg)
|
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
|
|
|
char buf[128];
|
|
|
|
snprintf(buf, sizeof(buf), "%s:%s", sel->edje_part, msg);
|
2010-05-18 18:10:15 -07:00
|
|
|
edje_object_signal_emit(win->o_main, buf, "e");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_selector_label_set(Evry_Selector *sel, const char *part, const char *label)
|
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
|
|
|
char buf[128];
|
|
|
|
snprintf(buf, sizeof(buf), "%s:%s", sel->edje_part, part);
|
2010-05-18 18:10:15 -07:00
|
|
|
edje_object_part_text_set(win->o_main, buf, label);
|
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
2010-05-26 16:57:48 -07:00
|
|
|
_evry_selector_activate(Evry_Selector *sel, int slide)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2014-09-05 07:50:25 -07:00
|
|
|
Evry_Window *win;
|
2009-08-17 16:54:16 -07:00
|
|
|
Evry_State *s;
|
2009-08-16 19:06:41 -07:00
|
|
|
|
2014-09-05 07:50:25 -07:00
|
|
|
if (!sel)
|
|
|
|
{
|
|
|
|
ERR("selector == NULL");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
win = sel->win;
|
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (CUR_SEL)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
Evry_Selector *cur = CUR_SEL;
|
|
|
|
_evry_selector_signal_emit(cur, "e,state,unselected");
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (cur->state && cur->state->view)
|
|
|
|
_evry_view_hide(win, cur->state->view, slide);
|
2009-08-17 16:54:16 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!slide && evry_conf->hide_list)
|
|
|
|
_evry_list_win_hide(win);
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
CUR_SEL = sel;
|
2010-05-19 07:44:36 -07:00
|
|
|
|
2010-05-18 19:43:41 -07:00
|
|
|
_evry_selector_signal_emit(sel, "e,state,selected");
|
2010-05-14 15:06:06 -07:00
|
|
|
|
2010-05-27 14:10:20 -07:00
|
|
|
/* do delayed actions fetch now */
|
2010-05-26 16:57:48 -07:00
|
|
|
if (sel->action_timer)
|
2010-05-27 14:10:20 -07:00
|
|
|
_evry_selector_update_actions_do(sel);
|
2010-05-26 16:57:48 -07:00
|
|
|
|
2010-05-14 15:06:06 -07:00
|
|
|
if ((s = sel->state))
|
2009-07-04 04:10:28 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_update_text_label(s);
|
2009-08-10 04:36:37 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (s->cur_item)
|
|
|
|
_evry_selector_label_set(sel, "e.text.plugin",
|
|
|
|
EVRY_ITEM(s->cur_item->plugin)->label);
|
2010-05-26 16:57:48 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (_evry_view_create(s))
|
|
|
|
{
|
|
|
|
_evry_view_show(win, s->view, slide);
|
|
|
|
s->view->update(s->view);
|
|
|
|
}
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-08-25 22:14:08 -07:00
|
|
|
static void
|
2011-01-23 14:34:28 -08:00
|
|
|
_evry_selector_thumb_gen(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
2009-08-25 22:14:08 -07:00
|
|
|
{
|
|
|
|
Evas_Coord w, h;
|
|
|
|
Evry_Selector *sel = data;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
|
|
|
char buf[64];
|
2009-08-25 22:14:08 -07:00
|
|
|
|
|
|
|
if (sel->o_icon)
|
2010-04-22 11:15:59 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_del(sel->o_icon);
|
|
|
|
sel->o_icon = NULL;
|
2010-04-22 11:15:59 -07:00
|
|
|
}
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2009-08-25 22:14:08 -07:00
|
|
|
e_icon_size_get(sel->o_thumb, &w, &h);
|
|
|
|
edje_extern_object_aspect_set(sel->o_thumb, EDJE_ASPECT_CONTROL_BOTH, w, h);
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
snprintf(buf, sizeof(buf), "%s:e.swallow.thumb", sel->edje_part);
|
|
|
|
edje_object_part_swallow(win->o_main, buf, sel->o_thumb);
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2009-08-25 22:14:08 -07:00
|
|
|
evas_object_show(sel->o_thumb);
|
2010-05-18 18:10:15 -07:00
|
|
|
_evry_selector_signal_emit(sel, "e,action,thumb,show");
|
|
|
|
/* edje_object_signal_emit(sel->o_main, "e,action,thumb,show", "e"); */
|
2009-08-25 22:14:08 -07:00
|
|
|
sel->do_thumb = EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_selector_thumb(Evry_Selector *sel, const Evry_Item *it)
|
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-05-18 00:52:26 -07:00
|
|
|
char *suffix = NULL;
|
2010-05-18 02:37:58 -07:00
|
|
|
|
2009-08-25 22:14:08 -07:00
|
|
|
if (sel->do_thumb)
|
|
|
|
e_thumb_icon_end(sel->o_thumb);
|
|
|
|
|
|
|
|
if (sel->o_thumb)
|
|
|
|
evas_object_del(sel->o_thumb);
|
|
|
|
sel->o_thumb = NULL;
|
|
|
|
|
2011-08-16 16:26:07 -07:00
|
|
|
if (it->type != EVRY_TYPE_FILE)
|
|
|
|
return 0;
|
2009-08-25 22:14:08 -07:00
|
|
|
|
2010-04-27 20:22:40 -07:00
|
|
|
GET_FILE(file, it);
|
2009-08-25 22:14:08 -07:00
|
|
|
|
2010-04-29 08:20:12 -07:00
|
|
|
if (!file->mime)
|
|
|
|
return 0;
|
2010-05-03 12:19:42 -07:00
|
|
|
|
2010-04-29 08:20:12 -07:00
|
|
|
if (!(evry_file_path_get(file)))
|
|
|
|
return 0;
|
2010-05-18 02:37:58 -07:00
|
|
|
|
2010-05-18 00:52:26 -07:00
|
|
|
if ((!strncmp(file->mime, "image/", 6)) ||
|
|
|
|
((suffix = strrchr(file->path, '.')) && (!strncmp(suffix, ".edj", 4))))
|
2009-08-25 22:14:08 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
sel->o_thumb = e_thumb_icon_add(win->evas);
|
|
|
|
e_thumb_icon_size_set(sel->o_thumb, 128, 128);
|
|
|
|
evas_object_smart_callback_add(sel->o_thumb, "e_thumb_gen",
|
|
|
|
_evry_selector_thumb_gen, sel);
|
|
|
|
if (suffix)
|
|
|
|
{
|
|
|
|
e_thumb_icon_file_set(sel->o_thumb, file->path, "e/desktop/background");
|
|
|
|
e_thumb_icon_size_set(sel->o_thumb, 128, 80);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
e_thumb_icon_file_set(sel->o_thumb, file->path, NULL);
|
2011-02-09 06:59:44 -08:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
e_thumb_icon_begin(sel->o_thumb);
|
|
|
|
sel->do_thumb = EINA_TRUE;
|
|
|
|
return 1;
|
2009-08-25 22:14:08 -07:00
|
|
|
}
|
2010-05-18 02:37:58 -07:00
|
|
|
|
2009-08-25 22:14:08 -07:00
|
|
|
return 0;
|
|
|
|
}
|
2009-08-25 13:52:40 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
2010-05-18 18:24:26 -07:00
|
|
|
_evry_selector_item_clear(Evry_Selector *sel)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2009-08-10 04:36:37 -07:00
|
|
|
if (sel->o_icon)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_del(sel->o_icon);
|
|
|
|
sel->o_icon = NULL;
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2010-05-18 18:24:26 -07:00
|
|
|
|
2010-05-18 18:10:15 -07:00
|
|
|
if (sel->o_thumb)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (sel->do_thumb)
|
|
|
|
e_thumb_icon_end(sel->o_thumb);
|
2010-05-18 18:24:26 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_del(sel->o_thumb);
|
|
|
|
sel->o_thumb = NULL;
|
2010-05-18 18:10:15 -07:00
|
|
|
}
|
2010-05-18 18:24:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_evry_selector_item_update(Evry_Selector *sel)
|
|
|
|
{
|
|
|
|
Evry_State *s = sel->state;
|
|
|
|
Evry_Item *it = NULL;
|
|
|
|
Evas_Object *o = NULL;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2009-06-24 13:02:37 -07:00
|
|
|
|
2010-05-18 18:24:26 -07:00
|
|
|
_evry_selector_item_clear(sel);
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if ((!s) || !(s->cur_item))
|
2010-05-12 10:29:38 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* no items for this state - clear selector */
|
|
|
|
_evry_selector_label_set(sel, "e.text.label", "");
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (sel == CUR_SEL && s && s->plugin)
|
|
|
|
_evry_selector_label_set(sel, "e.text.plugin",
|
|
|
|
EVRY_ITEM(s->plugin)->label);
|
|
|
|
else
|
|
|
|
_evry_selector_label_set(sel, "e.text.plugin", "");
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!s) return;
|
2010-05-12 10:29:38 -07:00
|
|
|
}
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2010-05-18 18:24:26 -07:00
|
|
|
if ((it = s->cur_item))
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_label_set(sel, "e.text.label", it->label);
|
|
|
|
_evry_selector_label_set(sel, "e.text.plugin",
|
|
|
|
EVRY_ITEM(it->plugin)->label);
|
2010-05-12 10:29:38 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!_evry_selector_thumb(sel, it))
|
|
|
|
{
|
|
|
|
o = evry_util_icon_get(it, win->evas);
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((!o) && it->plugin)
|
|
|
|
o = evry_util_icon_get(EVRY_ITEM(it->plugin), win->evas);
|
|
|
|
}
|
2009-08-25 13:52:40 -07:00
|
|
|
}
|
2009-08-22 14:22:38 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if ((!o) && (s->plugin && (EVRY_ITEM(s->plugin)->icon)))
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
o = evry_icon_theme_get(EVRY_ITEM(s->plugin)->icon, win->evas);
|
2010-05-18 18:10:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (o)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
char buf[64];
|
|
|
|
snprintf(buf, sizeof(buf), "%s:e.swallow.icons", sel->edje_part);
|
|
|
|
edje_object_part_swallow(win->o_main, buf, o);
|
|
|
|
evas_object_show(o);
|
|
|
|
sel->o_icon = o;
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
2009-06-21 03:31:38 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
|
|
|
_evry_selector_update(Evry_Selector *sel)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-08-10 04:36:37 -07:00
|
|
|
Evry_State *s = sel->state;
|
2009-08-14 16:30:54 -07:00
|
|
|
Evry_Item *it = NULL;
|
2010-04-25 15:12:54 -07:00
|
|
|
Eina_Bool item_changed = EINA_FALSE;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-05-12 10:29:38 -07:00
|
|
|
DBG("%p", sel);
|
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if (!s)
|
2009-08-14 16:30:54 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_item_update(sel);
|
|
|
|
return;
|
2010-05-31 14:15:32 -07:00
|
|
|
}
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if ((it = s->cur_item))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!s->plugin || !eina_list_data_find_list(s->plugin->items, it))
|
|
|
|
{
|
|
|
|
_evry_item_desel(s);
|
|
|
|
item_changed = EINA_TRUE;
|
|
|
|
}
|
2010-05-31 14:15:32 -07:00
|
|
|
}
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
/* get first item */
|
|
|
|
if (s->plugin && ((!s->cur_item) || s->item_auto_selected))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
it = eina_list_data_get(s->plugin->items);
|
|
|
|
s->item_auto_selected = EINA_TRUE;
|
|
|
|
if (!s->cur_plugins || (it != s->cur_item))
|
|
|
|
item_changed = EINA_TRUE;
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_item_sel(s, it);
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-12 10:29:38 -07:00
|
|
|
_evry_selector_item_update(sel);
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if ((sel == SUBJ_SEL) && (item_changed))
|
|
|
|
_evry_selector_update_actions(ACTN_SEL);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
2009-08-17 16:54:16 -07:00
|
|
|
_evry_list_win_update(Evry_State *s)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = s->selector->win;
|
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (s != (CUR_SEL)->state) return;
|
2010-05-13 23:35:06 -07:00
|
|
|
if (!win->visible) return;
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (_evry_view_update(win, s))
|
|
|
|
_evry_view_show(win, s->view, 0);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_selector_plugins_get(Evry_Selector *sel, Evry_Item *it, const char *plugin_name)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-08-10 04:36:37 -07:00
|
|
|
Eina_List *l, *plugins = NULL;
|
2010-04-27 20:22:40 -07:00
|
|
|
Evry_Plugin *p, *pp;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
|
|
|
Evry_Action *act = NULL;
|
2009-08-25 20:12:00 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
while (sel->state)
|
2010-05-24 15:08:15 -07:00
|
|
|
_evry_state_pop(sel, 1);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if ((sel != SUBJ_SEL) && (!it))
|
|
|
|
return 0;
|
2009-08-25 13:52:40 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (it && CHECK_TYPE(it, EVRY_TYPE_ACTION))
|
|
|
|
act = (Evry_Action *)it;
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (sel->plugins, l, p)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!p->config->enabled && !win->plugin_dedicated)
|
|
|
|
continue;
|
2011-09-02 16:02:26 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (plugin_name && strcmp(plugin_name, p->name))
|
|
|
|
continue;
|
2009-08-25 13:52:40 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (act && (!CHECK_SUBTYPE(p, act->it2.type)))
|
|
|
|
continue;
|
2010-05-19 07:44:36 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (p->begin && (pp = p->begin(p, it)))
|
|
|
|
plugins = eina_list_append(plugins, pp);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
_evry_state_new(sel, plugins);
|
2010-06-04 12:32:59 -07:00
|
|
|
|
|
|
|
if (plugins)
|
|
|
|
_evry_matches_update(sel, 1);
|
2009-05-06 07:20:45 -07:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static Evry_State *
|
|
|
|
_evry_state_new(Evry_Selector *sel, Eina_List *plugins)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-08-10 04:36:37 -07:00
|
|
|
Evry_State *s = E_NEW(Evry_State, 1);
|
2010-05-30 12:16:33 -07:00
|
|
|
Eina_List *l;
|
|
|
|
Evry_Plugin *p;
|
|
|
|
|
|
|
|
if (!s) return NULL;
|
|
|
|
|
2010-04-22 16:03:47 -07:00
|
|
|
s->inp = malloc(INPUTLEN);
|
|
|
|
s->inp[0] = 0;
|
|
|
|
s->input = s->inp;
|
2009-08-10 04:36:37 -07:00
|
|
|
s->plugins = plugins;
|
2010-05-19 07:44:36 -07:00
|
|
|
s->selector = sel;
|
2010-05-18 19:43:41 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
sel->states = eina_list_prepend(sel->states, s);
|
|
|
|
sel->state = s;
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-30 12:16:33 -07:00
|
|
|
p = sel->aggregator->begin(sel->aggregator, NULL);
|
|
|
|
s->plugins = eina_list_append(s->plugins, p);
|
|
|
|
s->aggregator = p;
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (s->plugins, l, p)
|
2010-05-30 12:16:33 -07:00
|
|
|
p->state = s;
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
return s;
|
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
2010-05-24 15:08:15 -07:00
|
|
|
_evry_state_pop(Evry_Selector *sel, int immediate)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
|
|
|
Evry_Plugin *p;
|
2010-05-30 12:16:33 -07:00
|
|
|
Evry_State *prev;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
|
|
|
Evry_State *s = sel->state;
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
_evry_item_desel(s);
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2011-06-22 02:44:30 -07:00
|
|
|
if (sel->update_timer)
|
2011-03-19 08:03:44 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ecore_timer_del(sel->update_timer);
|
|
|
|
sel->update_timer = NULL;
|
2011-03-19 08:03:44 -07:00
|
|
|
}
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-06-22 02:44:30 -07:00
|
|
|
if (sel->action_timer)
|
2011-03-19 08:03:44 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ecore_timer_del(sel->action_timer);
|
|
|
|
sel->action_timer = NULL;
|
2011-03-19 08:03:44 -07:00
|
|
|
}
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2009-08-17 16:54:16 -07:00
|
|
|
if (s->view)
|
2010-05-24 15:08:15 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (immediate)
|
|
|
|
{
|
|
|
|
s->view->destroy(s->view);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_evry_view_hide(win, s->view, SLIDE_RIGHT);
|
|
|
|
/* XXX delay free state? is it possible that
|
|
|
|
view can receive events here? */
|
|
|
|
s->delete_me = EINA_TRUE;
|
|
|
|
}
|
2010-05-24 15:08:15 -07:00
|
|
|
}
|
2009-08-16 19:06:41 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
if (s->sel_items)
|
|
|
|
eina_list_free(s->sel_items);
|
|
|
|
|
2011-08-24 18:27:52 -07:00
|
|
|
if (s->cur_plugins)
|
2011-11-29 19:32:54 -08:00
|
|
|
eina_list_free(s->cur_plugins);
|
2011-08-24 18:27:52 -07:00
|
|
|
|
2010-05-06 06:09:14 -07:00
|
|
|
sel->states = eina_list_remove_list(sel->states, sel->states);
|
2010-05-30 12:16:33 -07:00
|
|
|
prev = eina_list_data_get(sel->states);
|
2010-05-11 08:10:30 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FREE (s->plugins, p)
|
2010-05-06 06:09:14 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* skip non top-level plugins */
|
|
|
|
if (prev && eina_list_data_find(prev->plugins, p))
|
|
|
|
{
|
|
|
|
p->state = prev;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
EVRY_ITEM_FREE(p);
|
2010-05-06 06:09:14 -07:00
|
|
|
}
|
2010-06-04 12:32:59 -07:00
|
|
|
|
|
|
|
if (!s->delete_me)
|
|
|
|
{
|
2013-12-02 12:14:56 -08:00
|
|
|
if (win->state_clearing == s)
|
|
|
|
win->state_clearing = NULL;
|
|
|
|
ecore_timer_del(s->clear_timer);
|
2011-11-29 19:32:54 -08:00
|
|
|
E_FREE(s->inp);
|
|
|
|
E_FREE(s);
|
2010-06-04 12:32:59 -07:00
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-06 06:09:14 -07:00
|
|
|
sel->state = prev;
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
|
|
|
|
2010-05-20 08:41:27 -07:00
|
|
|
int
|
|
|
|
evry_state_push(Evry_Selector *sel, Eina_List *plugins)
|
|
|
|
{
|
|
|
|
Evry_State *s, *new_state;
|
|
|
|
Eina_List *l;
|
2010-10-28 16:07:59 -07:00
|
|
|
Evry_Plugin *p;
|
2010-05-20 08:41:27 -07:00
|
|
|
Evry_View *view = NULL;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-05-20 08:41:27 -07:00
|
|
|
|
|
|
|
s = sel->state;
|
|
|
|
|
|
|
|
if (!(new_state = _evry_state_new(sel, plugins)))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
DBG("no new state");
|
|
|
|
return 0;
|
2010-05-20 08:41:27 -07:00
|
|
|
}
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (plugins, l, p)
|
2010-05-20 08:41:27 -07:00
|
|
|
p->state = new_state;
|
|
|
|
|
|
|
|
if (s && s->view)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_hide(win, s->view, SLIDE_LEFT);
|
|
|
|
view = s->view;
|
2010-05-20 08:41:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
_evry_matches_update(sel, 1);
|
|
|
|
s = new_state;
|
|
|
|
|
|
|
|
_evry_selector_update(sel);
|
|
|
|
|
|
|
|
if (view && win->visible)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->view = view->create(view, s, win->o_main);
|
|
|
|
if (s->view)
|
|
|
|
{
|
|
|
|
s->view->state = s;
|
|
|
|
_evry_view_show(win, s->view, SLIDE_LEFT);
|
|
|
|
s->view->update(s->view);
|
|
|
|
}
|
2010-05-20 08:41:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
_evry_update_text_label(sel->state);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-08-31 06:04:53 -07:00
|
|
|
int
|
2010-05-19 07:44:36 -07:00
|
|
|
evry_browse_item(Evry_Item *it)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2010-05-06 06:09:14 -07:00
|
|
|
Evry_State *s, *new_state;
|
2010-05-19 07:44:36 -07:00
|
|
|
Evry_Selector *sel;
|
2009-08-10 04:36:37 -07:00
|
|
|
Eina_List *l, *plugins = NULL;
|
2010-05-28 16:30:24 -07:00
|
|
|
Evry_Plugin *p, *pp, *pref = NULL;
|
2009-08-24 21:23:11 -07:00
|
|
|
Evry_View *view = NULL;
|
2010-05-06 06:09:14 -07:00
|
|
|
int browse_aggregator = 0;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win;
|
2010-05-11 08:10:30 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
if (!(it) || !(it->plugin) || !(it->browseable))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
DBG("no item");
|
|
|
|
return 0;
|
2010-05-19 07:44:36 -07:00
|
|
|
}
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
if (!(s = it->plugin->state))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
DBG("no state");
|
|
|
|
return 0;
|
2010-05-19 07:44:36 -07:00
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
sel = s->selector;
|
2010-06-04 12:32:59 -07:00
|
|
|
win = sel->win;
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2010-05-30 12:16:33 -07:00
|
|
|
/* aggregator */
|
|
|
|
if (CHECK_TYPE(it, EVRY_TYPE_PLUGIN))
|
2010-05-28 16:30:24 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
browse_aggregator = 1;
|
|
|
|
plugins = eina_list_append(plugins, it);
|
2010-05-28 16:30:24 -07:00
|
|
|
}
|
2010-05-30 12:16:33 -07:00
|
|
|
else
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((it->plugin->browse) && (pp = it->plugin->browse(it->plugin, it)))
|
|
|
|
{
|
|
|
|
plugins = eina_list_append(plugins, pp);
|
|
|
|
pref = pp;
|
|
|
|
}
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
/* items of type NONE can only be browsed by their own plugin */
|
|
|
|
if (!CHECK_TYPE(it, EVRY_TYPE_NONE))
|
|
|
|
{
|
|
|
|
EINA_LIST_FOREACH (sel->plugins, l, p)
|
|
|
|
{
|
|
|
|
if (!p->browse)
|
|
|
|
continue;
|
2010-05-31 14:15:32 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((pref) && (!strcmp(p->name, pref->name)))
|
|
|
|
continue;
|
2010-05-31 14:15:32 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((pp = p->browse(p, it)))
|
|
|
|
plugins = eina_list_append(plugins, pp);
|
|
|
|
}
|
|
|
|
}
|
2010-05-06 06:09:14 -07:00
|
|
|
}
|
2010-05-11 08:10:30 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
if (!(plugins))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
DBG("no plugins");
|
|
|
|
return 0;
|
2010-05-19 07:44:36 -07:00
|
|
|
}
|
2009-08-24 21:23:11 -07:00
|
|
|
|
2010-05-06 06:09:14 -07:00
|
|
|
if (!(new_state = _evry_state_new(sel, plugins)))
|
2010-05-19 07:44:36 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
DBG("no new state");
|
|
|
|
return 0;
|
2010-05-19 07:44:36 -07:00
|
|
|
}
|
|
|
|
|
2009-08-24 21:23:11 -07:00
|
|
|
if (s->view)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_hide(win, s->view, SLIDE_LEFT);
|
|
|
|
view = s->view;
|
2009-08-24 21:23:11 -07:00
|
|
|
}
|
2009-08-25 13:52:40 -07:00
|
|
|
|
2010-05-06 06:09:14 -07:00
|
|
|
if (browse_aggregator)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
it->hi = NULL;
|
|
|
|
|
|
|
|
if (!EVRY_PLUGIN(it)->items)
|
|
|
|
{
|
|
|
|
evry_history_item_add(it, NULL, s->input);
|
|
|
|
s = new_state;
|
|
|
|
EVRY_PLUGIN(it)->state = s;
|
|
|
|
_evry_matches_update(sel, 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evry_history_item_add(it, NULL, NULL);
|
|
|
|
strncpy(new_state->input, s->input, INPUTLEN);
|
|
|
|
s = new_state;
|
|
|
|
EVRY_PLUGIN(it)->state = s;
|
|
|
|
s->cur_plugins = eina_list_append(s->cur_plugins, it);
|
|
|
|
}
|
|
|
|
|
|
|
|
_evry_plugin_select(s, EVRY_PLUGIN(it));
|
2010-05-06 06:09:14 -07:00
|
|
|
}
|
2010-05-13 20:11:03 -07:00
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (it->plugin->history)
|
|
|
|
evry_history_item_add(it, NULL, s->input);
|
2010-05-19 07:44:36 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_matches_update(sel, 1);
|
|
|
|
s = new_state;
|
|
|
|
_evry_plugin_select(s, pref);
|
2010-05-13 20:11:03 -07:00
|
|
|
}
|
2010-05-06 06:09:14 -07:00
|
|
|
|
2009-08-19 05:07:37 -07:00
|
|
|
_evry_selector_update(sel);
|
2009-08-24 21:23:11 -07:00
|
|
|
|
2010-05-13 23:35:06 -07:00
|
|
|
if (view && win->visible)
|
2009-08-24 21:23:11 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->view = view->create(view, s, win->o_main);
|
|
|
|
if (s->view)
|
|
|
|
{
|
|
|
|
s->view->state = s;
|
|
|
|
s->view->update(s->view);
|
|
|
|
_evry_view_show(win, s->view, SLIDE_LEFT);
|
|
|
|
}
|
2009-08-24 21:23:11 -07:00
|
|
|
}
|
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
_evry_update_text_label(sel->state);
|
2009-08-24 21:23:11 -07:00
|
|
|
|
|
|
|
return 1;
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
int
|
2009-08-31 06:04:53 -07:00
|
|
|
evry_browse_back(Evry_Selector *sel)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2011-08-19 15:11:09 -07:00
|
|
|
Evry_Window *win;
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-08-19 15:11:09 -07:00
|
|
|
if (!sel) return 0;
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-08-19 15:11:09 -07:00
|
|
|
if ((!sel) || !(win = sel->win))
|
|
|
|
return 0;
|
2010-05-13 20:11:03 -07:00
|
|
|
|
2011-09-02 16:02:26 -07:00
|
|
|
if ((!sel->state) || (!sel->states->next))
|
2010-04-23 15:26:48 -07:00
|
|
|
return 0;
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-24 15:08:15 -07:00
|
|
|
_evry_state_pop(sel, 0);
|
2009-08-13 15:42:40 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
_evry_selector_update(sel);
|
2011-09-02 16:02:26 -07:00
|
|
|
_evry_update_text_label(sel->state);
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (sel == SUBJ_SEL)
|
2010-05-27 14:10:20 -07:00
|
|
|
_evry_selector_update_actions(ACTN_SEL);
|
2010-04-23 15:26:48 -07:00
|
|
|
|
2011-09-02 16:02:26 -07:00
|
|
|
if (sel->state->view)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_show(win, sel->state->view, SLIDE_RIGHT);
|
|
|
|
sel->state->view->update(sel->state->view);
|
2011-09-02 16:02:26 -07:00
|
|
|
}
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-04-23 15:26:48 -07:00
|
|
|
return 1;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
int
|
2010-06-04 12:32:59 -07:00
|
|
|
evry_selectors_switch(Evry_Window *win, int dir, int slide)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2010-05-21 23:35:46 -07:00
|
|
|
Evry_State *s = (CUR_SEL)->state;
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if ((CUR_SEL)->update_timer)
|
2009-08-12 13:26:27 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((CUR_SEL == SUBJ_SEL) || (CUR_SEL == ACTN_SEL))
|
|
|
|
{
|
|
|
|
_evry_matches_update(CUR_SEL, 0);
|
|
|
|
_evry_selector_update(CUR_SEL);
|
|
|
|
}
|
2009-08-12 13:26:27 -07:00
|
|
|
}
|
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
if (CUR_SEL != SUBJ_SEL && dir == 0)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main, "e,state,object_selector_hide", "e");
|
|
|
|
_evry_selector_activate(SUBJ_SEL, (slide * SLIDE_RIGHT));
|
|
|
|
return 1;
|
2010-05-27 07:30:12 -07:00
|
|
|
}
|
2010-05-21 23:35:46 -07:00
|
|
|
if (CUR_SEL == SUBJ_SEL && dir > 0)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (s->cur_item)
|
|
|
|
{
|
|
|
|
_evry_selector_activate(ACTN_SEL, slide * SLIDE_LEFT);
|
|
|
|
return 1;
|
|
|
|
}
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2010-05-21 23:35:46 -07:00
|
|
|
else if (CUR_SEL == ACTN_SEL && dir > 0)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
Evry_Item *it;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!s || !(it = s->cur_item) || !(CHECK_TYPE(it, EVRY_TYPE_ACTION)))
|
|
|
|
return 0;
|
2010-05-27 13:25:09 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
GET_ACTION(act, it);
|
|
|
|
if (!act->it2.type)
|
|
|
|
return 0;
|
2010-05-27 07:30:12 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_plugins_get(OBJ_SEL, it, NULL);
|
|
|
|
_evry_selector_update(OBJ_SEL);
|
|
|
|
edje_object_signal_emit(win->o_main, "e,state,object_selector_show", "e");
|
2010-05-27 07:30:12 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_activate(OBJ_SEL, (slide * SLIDE_LEFT));
|
|
|
|
return 1;
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2010-05-21 23:35:46 -07:00
|
|
|
else if (CUR_SEL == ACTN_SEL && dir < 0)
|
2010-04-23 15:26:48 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_activate(SUBJ_SEL, (slide * SLIDE_RIGHT));
|
|
|
|
edje_object_signal_emit(win->o_main, "e,state,object_selector_hide", "e");
|
|
|
|
return 1;
|
2010-04-23 15:26:48 -07:00
|
|
|
}
|
2010-05-21 23:35:46 -07:00
|
|
|
else if (CUR_SEL == OBJ_SEL && dir < 0)
|
2010-04-23 15:26:48 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_activate(ACTN_SEL, (slide * SLIDE_RIGHT));
|
|
|
|
return 1;
|
2010-04-23 15:26:48 -07:00
|
|
|
}
|
2010-05-27 07:30:12 -07:00
|
|
|
return 0;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2010-05-26 16:57:48 -07:00
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
static int
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_selectors_switch(Evry_Window *win, int dir)
|
2010-05-26 16:57:48 -07:00
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
return evry_selectors_switch(win, dir, 0);
|
2010-05-26 16:57:48 -07:00
|
|
|
}
|
|
|
|
|
2010-05-12 19:52:02 -07:00
|
|
|
static int
|
|
|
|
_evry_input_complete(Evry_State *s)
|
|
|
|
{
|
|
|
|
int action = 0;
|
|
|
|
char *input = NULL;
|
|
|
|
Evry_Item *it = s->cur_item;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = s->selector->win;
|
2010-05-12 19:52:02 -07:00
|
|
|
|
2010-05-18 08:12:32 -07:00
|
|
|
if (!it) return 0;
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2010-05-12 19:52:02 -07:00
|
|
|
evry_item_ref(it);
|
|
|
|
|
|
|
|
s->item_auto_selected = EINA_FALSE;
|
|
|
|
|
|
|
|
if (it->plugin->complete)
|
|
|
|
action = it->plugin->complete(it->plugin, it, &input);
|
|
|
|
else
|
2010-05-19 07:44:36 -07:00
|
|
|
evry_browse_item(it);
|
2010-05-12 19:52:02 -07:00
|
|
|
|
|
|
|
if (input && action == EVRY_COMPLETE_INPUT)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
strncpy(s->input, input, INPUTLEN - 1);
|
|
|
|
_evry_update_text_label(s);
|
|
|
|
_evry_cb_update_timer(CUR_SEL);
|
|
|
|
evry_item_select(s, it);
|
2010-05-12 19:52:02 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
evry_item_free(it);
|
|
|
|
E_FREE(input);
|
2010-05-13 20:11:03 -07:00
|
|
|
|
2010-05-12 19:52:02 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_cheat_history(Evry_State *s, int promote, int delete)
|
|
|
|
{
|
|
|
|
History_Entry *he;
|
|
|
|
History_Item *hi;
|
2010-05-15 12:19:05 -07:00
|
|
|
History_Types *ht;
|
2010-05-12 19:52:02 -07:00
|
|
|
Eina_List *l, *ll;
|
|
|
|
Evry_Item *it = s->cur_item;
|
2010-05-13 20:11:03 -07:00
|
|
|
|
2010-05-18 08:12:32 -07:00
|
|
|
if (!it) return 0;
|
2010-05-18 18:10:15 -07:00
|
|
|
|
2010-05-15 12:19:05 -07:00
|
|
|
if (!(ht = evry_history_types_get(it->type)))
|
|
|
|
return 1;
|
2010-05-15 19:37:07 -07:00
|
|
|
|
2010-05-15 12:19:05 -07:00
|
|
|
if (!(he = eina_hash_find(ht->types, (it->id ? it->id : it->label))))
|
2010-05-12 19:52:02 -07:00
|
|
|
return 1;
|
2010-05-13 20:11:03 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH_SAFE (he->items, l, ll, hi)
|
|
|
|
{
|
|
|
|
if (hi->plugin != it->plugin->name)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (delete)
|
|
|
|
{
|
|
|
|
if (hi->input)
|
|
|
|
eina_stringshare_del(hi->input);
|
|
|
|
if (hi->plugin)
|
|
|
|
eina_stringshare_del(hi->plugin);
|
|
|
|
if (hi->context)
|
|
|
|
eina_stringshare_del(hi->context);
|
|
|
|
E_FREE(hi);
|
|
|
|
|
|
|
|
he->items = eina_list_remove_list(he->items, l);
|
|
|
|
}
|
|
|
|
else if (promote)
|
|
|
|
{
|
|
|
|
hi->count += 5;
|
|
|
|
hi->last_used = ecore_time_unix_get();
|
|
|
|
}
|
|
|
|
else /* demote */
|
|
|
|
{
|
|
|
|
hi->count -= 5;
|
|
|
|
if (hi->count < 0) hi->count = 1;
|
|
|
|
}
|
2010-05-12 19:52:02 -07:00
|
|
|
}
|
2010-05-30 12:16:33 -07:00
|
|
|
if (s->plugin == s->aggregator)
|
|
|
|
_evry_aggregator_fetch(s);
|
2010-05-12 19:52:02 -07:00
|
|
|
if (s->view)
|
2010-05-24 15:08:15 -07:00
|
|
|
s->view->update(s->view);
|
2010-05-12 19:52:02 -07:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2011-08-10 23:02:18 -07:00
|
|
|
_evry_cb_key_down(void *data, int type __UNUSED__, void *event)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2010-04-20 08:22:01 -07:00
|
|
|
Ecore_Event_Key *ev = event;
|
|
|
|
Evry_State *s;
|
2010-05-14 15:41:30 -07:00
|
|
|
Evry_Selector *sel;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = data;
|
2010-05-15 21:06:15 -07:00
|
|
|
const char *old;
|
2009-08-17 16:54:16 -07:00
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
if (ev->event_window != elm_win_window_id_get(win->ewin))
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-04-20 08:22:01 -07:00
|
|
|
|
|
|
|
if (!strcmp(ev->key, "Escape"))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evry_hide(win, 0);
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-04-20 08:22:01 -07:00
|
|
|
}
|
2010-06-04 12:32:59 -07:00
|
|
|
#ifdef DRAG_OFF_WINDOW
|
|
|
|
else if (win->grab && !strcmp(ev->key, "F1"))
|
|
|
|
{
|
2014-11-02 18:35:13 -08:00
|
|
|
Evas_Object *ewin = win->ewin;
|
|
|
|
E_Client *ec;
|
|
|
|
|
|
|
|
e_grabinput_release(elm_win_window_id_get(ewin), elm_win_window_id_get(ewin));
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2014-11-02 18:35:13 -08:00
|
|
|
ec = e_win_client_get(ewin);
|
|
|
|
elm_win_borderless_set(ewin, 0);
|
2014-03-18 13:14:04 -07:00
|
|
|
#ifndef HAVE_WAYLAND_ONLY
|
2014-11-02 18:35:13 -08:00
|
|
|
if (ec->comp->comp_type == E_PIXMAP_TYPE_X)
|
|
|
|
ecore_x_netwm_window_type_set(elm_win_window_id_get(ewin),
|
2014-03-18 13:14:04 -07:00
|
|
|
ECORE_X_WINDOW_TYPE_DIALOG);
|
|
|
|
#endif
|
2014-11-02 18:35:13 -08:00
|
|
|
evas_object_layer_set(ec->frame, E_LAYER_CLIENT_NORMAL);
|
|
|
|
EC_CHANGED(ec);
|
|
|
|
ec->netwm.fetch.type = 1;
|
|
|
|
ec->netwm.state.skip_taskbar = 0;
|
|
|
|
ec->netwm.update.state = 1;
|
|
|
|
ec->internal_no_remember = 1;
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
win->grab = 0;
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-06-04 12:32:59 -07:00
|
|
|
}
|
|
|
|
#endif
|
2012-12-20 01:37:37 -08:00
|
|
|
else if ((ev->modifiers) && (!win->delay_hide_action))
|
2010-05-01 12:27:26 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
Eina_List *l;
|
2012-05-04 02:38:52 -07:00
|
|
|
E_Config_Binding_Key *binding;
|
2011-11-29 19:32:54 -08:00
|
|
|
E_Binding_Modifier mod;
|
2010-05-01 12:27:26 -07:00
|
|
|
|
2013-02-01 02:21:54 -08:00
|
|
|
EINA_LIST_FOREACH(e_bindings->key_bindings, l, binding)
|
2011-11-29 19:32:54 -08:00
|
|
|
{
|
2012-05-04 02:38:52 -07:00
|
|
|
if (binding->action && strcmp(binding->action, "everything")) continue;
|
2010-05-01 12:27:26 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
mod = 0;
|
2010-05-01 12:27:26 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
|
|
|
|
mod |= E_BINDING_MODIFIER_SHIFT;
|
|
|
|
if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
|
|
|
|
mod |= E_BINDING_MODIFIER_CTRL;
|
|
|
|
if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
|
|
|
|
mod |= E_BINDING_MODIFIER_ALT;
|
|
|
|
if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN)
|
|
|
|
mod |= E_BINDING_MODIFIER_WIN;
|
2010-05-01 12:27:26 -07:00
|
|
|
|
2014-03-13 10:00:57 -07:00
|
|
|
if (!(binding->key && (!strcmp(binding->key, ev->key)) &&
|
2012-05-04 02:38:52 -07:00
|
|
|
(((unsigned int)binding->modifiers == mod) || (binding->any_mod))))
|
2011-11-29 19:32:54 -08:00
|
|
|
continue;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (win->level > 0)
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2010-05-14 15:41:30 -07:00
|
|
|
|
2012-05-04 02:38:52 -07:00
|
|
|
if (!(binding->params) && (CUR_SEL == OBJ_SEL) &&
|
2011-11-29 19:32:54 -08:00
|
|
|
((CUR_SEL)->state && (CUR_SEL)->state->cur_item))
|
|
|
|
{
|
|
|
|
_evry_selectors_shift(win, 1);
|
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
evry_hide(win, 1);
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2011-06-28 11:59:04 -07:00
|
|
|
#if 0 /* FIXME this causes segv when triggering a plugin keybinding twice */
|
2012-05-04 02:38:52 -07:00
|
|
|
if (win && CUR_SEL && binding->params)
|
2011-11-29 19:32:54 -08:00
|
|
|
{
|
|
|
|
Eina_List *ll;
|
|
|
|
Evry_Plugin *p;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH ((SUBJ_SEL)->plugins, ll, p)
|
2012-05-04 02:38:52 -07:00
|
|
|
if (!strcmp(binding->params, p->name)) break;
|
2011-11-29 19:32:54 -08:00
|
|
|
|
|
|
|
if (p)
|
|
|
|
{
|
|
|
|
_evry_plugin_select((CUR_SEL)->state, p);
|
|
|
|
_evry_selector_update(CUR_SEL);
|
|
|
|
_evry_view_update(win, (CUR_SEL)->state);
|
|
|
|
}
|
|
|
|
}
|
2011-06-28 11:59:04 -07:00
|
|
|
#endif
|
2011-11-29 19:32:54 -08:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
|
|
|
}
|
2010-05-01 12:27:26 -07:00
|
|
|
}
|
2010-05-03 12:19:42 -07:00
|
|
|
|
2009-08-17 16:54:16 -07:00
|
|
|
old = ev->key;
|
2010-05-14 15:41:30 -07:00
|
|
|
win->request_selection = EINA_FALSE;
|
2009-08-17 16:54:16 -07:00
|
|
|
|
2010-05-24 15:48:19 -07:00
|
|
|
if (!strcmp(ev->key, "KP_Enter"))
|
2010-05-01 12:27:26 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ev->key = "Return";
|
2010-05-01 12:27:26 -07:00
|
|
|
}
|
2010-05-23 06:54:44 -07:00
|
|
|
else if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!strcmp(ev->key, "Tab"))
|
|
|
|
{
|
|
|
|
ev->key = "Down";
|
|
|
|
}
|
|
|
|
else if (!strcmp(ev->key, "ISO_Left_Tab") || (!strcmp(ev->key, "Tab") &&
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)))
|
|
|
|
{
|
|
|
|
ev->key = "Up";
|
|
|
|
ev->modifiers = 0;
|
|
|
|
}
|
|
|
|
else if (!strcmp(ev->key, "q"))
|
|
|
|
{
|
|
|
|
evry_hide(win, 0);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if (!strcmp(ev->key, "w"))
|
|
|
|
{
|
|
|
|
ev->key = "Return";
|
|
|
|
ev->modifiers = 0;
|
|
|
|
}
|
|
|
|
else if (evry_conf->quick_nav == 1)
|
|
|
|
{
|
|
|
|
if (!strcmp(ev->key, "k") || (!strcmp(ev->key, "K")))
|
|
|
|
ev->key = "Up";
|
|
|
|
else if (!strcmp(ev->key, "j") || (!strcmp(ev->key, "J")))
|
|
|
|
ev->key = "Down";
|
|
|
|
else if (!strcmp(ev->key, "n") || (!strcmp(ev->key, "N")))
|
|
|
|
ev->key = "Next";
|
|
|
|
else if (!strcmp(ev->key, "p") || (!strcmp(ev->key, "P")))
|
|
|
|
ev->key = "Prior";
|
|
|
|
else if (!strcmp(ev->key, "l") || (!strcmp(ev->key, "L")))
|
|
|
|
ev->key = "Right";
|
|
|
|
else if (!strcmp(ev->key, "h") || (!strcmp(ev->key, "H")))
|
|
|
|
ev->key = "Left";
|
|
|
|
else if (!strcmp(ev->key, "i") || (!strcmp(ev->key, "I")))
|
|
|
|
ev->key = "Tab";
|
|
|
|
else if (!strcmp(ev->key, "m") || (!strcmp(ev->key, "M")))
|
|
|
|
ev->key = "Return";
|
|
|
|
}
|
|
|
|
else if (evry_conf->quick_nav == 3)
|
|
|
|
{
|
|
|
|
if (!strcmp(ev->key, "p") || (!strcmp(ev->key, "P")))
|
|
|
|
ev->key = "Up";
|
|
|
|
else if (!strcmp(ev->key, "n") || (!strcmp(ev->key, "N")))
|
|
|
|
ev->key = "Down";
|
|
|
|
else if (!strcmp(ev->key, "f") || (!strcmp(ev->key, "F")))
|
|
|
|
ev->key = "Right";
|
|
|
|
else if (!strcmp(ev->key, "b") || (!strcmp(ev->key, "B")))
|
|
|
|
ev->key = "Left";
|
|
|
|
else if (!strcmp(ev->key, "i") || (!strcmp(ev->key, "I")))
|
|
|
|
ev->key = "Tab";
|
|
|
|
else if (!strcmp(ev->key, "m") || (!strcmp(ev->key, "M")))
|
|
|
|
ev->key = "Return";
|
|
|
|
}
|
2009-08-16 02:43:38 -07:00
|
|
|
}
|
2009-08-17 16:54:16 -07:00
|
|
|
|
2014-09-05 07:47:53 -07:00
|
|
|
if (!(sel = CUR_SEL))
|
2010-05-14 15:41:30 -07:00
|
|
|
goto end;
|
|
|
|
|
2010-05-15 21:06:15 -07:00
|
|
|
if (!strcmp(ev->key, "Tab") &&
|
|
|
|
!((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) ||
|
2011-11-29 19:32:54 -08:00
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)))
|
2010-05-14 15:41:30 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!_evry_selectors_switch(win, 1))
|
|
|
|
_evry_selectors_switch(win, 0);
|
|
|
|
goto end;
|
2010-05-14 15:41:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!(s = sel->state))
|
|
|
|
goto end;
|
|
|
|
|
2010-05-15 21:06:15 -07:00
|
|
|
if (!win->visible && (!strcmp(ev->key, "Down")))
|
2010-05-12 19:52:02 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_list_win_show(win);
|
|
|
|
goto end;
|
2010-05-12 19:52:02 -07:00
|
|
|
}
|
2010-05-15 21:06:15 -07:00
|
|
|
else if ((!strcmp(ev->key, "ISO_Left_Tab") ||
|
2011-11-29 19:32:54 -08:00
|
|
|
(((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) ||
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)) &&
|
|
|
|
(!strcmp(ev->key, "Tab")))))
|
2010-04-15 06:58:44 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_input_complete(s);
|
|
|
|
goto end;
|
2010-04-15 06:58:44 -07:00
|
|
|
}
|
2010-04-12 13:52:23 -07:00
|
|
|
else if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
|
2011-11-29 19:32:54 -08:00
|
|
|
(!strcmp(ev->key, "Delete") || !strcmp(ev->key, "Insert")))
|
2010-04-12 13:52:23 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
int delete = (!strcmp(ev->key, "Delete") &&
|
|
|
|
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT));
|
|
|
|
int promote = (!strcmp(ev->key, "Insert"));
|
2010-04-12 13:52:23 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_cheat_history(s, promote, delete);
|
|
|
|
goto end;
|
2010-04-12 13:52:23 -07:00
|
|
|
}
|
2009-08-16 02:43:38 -07:00
|
|
|
else if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!strcmp(ev->key, "u"))
|
|
|
|
{
|
|
|
|
if (!_evry_clear(sel))
|
|
|
|
evry_browse_back(sel);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
else if (!strcmp(ev->key, "1"))
|
|
|
|
evry_view_toggle(s, NULL);
|
|
|
|
else if (!strcmp(ev->key, "Return"))
|
|
|
|
_evry_plugin_action(sel, 0);
|
|
|
|
else if (!strcmp(ev->key, "v"))
|
|
|
|
{
|
2014-03-18 13:14:04 -07:00
|
|
|
#ifndef HAVE_WAYLAND_ONLY
|
2014-11-02 18:35:13 -08:00
|
|
|
if (e_comp_get(NULL)->comp_type == E_PIXMAP_TYPE_X)
|
2014-03-18 13:14:04 -07:00
|
|
|
{
|
|
|
|
win->request_selection = EINA_TRUE;
|
|
|
|
ecore_x_selection_primary_request
|
2014-11-02 18:35:13 -08:00
|
|
|
(elm_win_window_id_get(win->ewin), ECORE_X_SELECTION_TARGET_UTF8_STRING);
|
2014-03-18 13:14:04 -07:00
|
|
|
}
|
|
|
|
#endif
|
2011-11-29 19:32:54 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_evry_view_key_press(s, ev);
|
|
|
|
}
|
|
|
|
goto end;
|
2009-08-16 02:43:38 -07:00
|
|
|
}
|
2010-05-27 07:30:12 -07:00
|
|
|
if ((s->plugin && s->plugin->cb_key_down) &&
|
|
|
|
(s->plugin->cb_key_down(s->plugin, ev)))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* let plugin intercept keypress */
|
|
|
|
goto end;
|
2010-05-27 07:30:12 -07:00
|
|
|
}
|
2009-08-20 17:07:27 -07:00
|
|
|
else if (_evry_view_key_press(s, ev))
|
2010-05-27 07:30:12 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* let view intercept keypress */
|
|
|
|
goto end;
|
2010-05-27 07:30:12 -07:00
|
|
|
}
|
2010-05-15 21:06:15 -07:00
|
|
|
else if (!strcmp(ev->key, "Right"))
|
2010-04-23 15:26:48 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!evry_browse_item(sel->state->cur_item))
|
|
|
|
evry_selectors_switch(win, 1, EINA_TRUE);
|
2010-04-23 15:26:48 -07:00
|
|
|
}
|
2010-05-15 21:06:15 -07:00
|
|
|
else if (!strcmp(ev->key, "Left"))
|
2010-04-23 15:26:48 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!evry_browse_back(sel))
|
|
|
|
evry_selectors_switch(win, -1, EINA_TRUE);
|
2010-04-23 15:26:48 -07:00
|
|
|
}
|
2010-05-15 21:06:15 -07:00
|
|
|
else if (!strcmp(ev->key, "Return"))
|
2009-08-16 02:43:38 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
|
|
|
|
{
|
|
|
|
_evry_plugin_action(sel, 0);
|
|
|
|
}
|
|
|
|
else if (s->cur_item && s->cur_item->browseable)
|
|
|
|
{
|
|
|
|
evry_browse_item(sel->state->cur_item);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_evry_plugin_action(sel, 1);
|
|
|
|
}
|
2009-08-16 02:43:38 -07:00
|
|
|
}
|
2010-05-15 21:06:15 -07:00
|
|
|
else if (!strcmp(ev->key, "BackSpace"))
|
2009-08-24 21:23:11 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!_evry_backspace(sel))
|
|
|
|
evry_browse_back(sel);
|
2009-08-24 21:23:11 -07:00
|
|
|
}
|
2009-08-20 14:39:01 -07:00
|
|
|
else if ((ev->compose && !(ev->modifiers & ECORE_EVENT_MODIFIER_ALT)))
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
unsigned int len = strlen(s->inp);
|
2010-04-22 11:15:59 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (len == 0 && (evry_view_toggle(s, ev->compose)))
|
|
|
|
goto end;
|
2010-04-22 11:15:59 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (len < (INPUTLEN - strlen(ev->compose)))
|
|
|
|
{
|
|
|
|
strcat(s->inp, ev->compose);
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_update(sel, 1);
|
|
|
|
}
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2009-08-17 16:54:16 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
end:
|
2009-08-17 16:54:16 -07:00
|
|
|
ev->key = old;
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2009-08-24 21:23:11 -07:00
|
|
|
static int
|
2010-04-04 07:11:35 -07:00
|
|
|
_evry_backspace(Evry_Selector *sel)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2010-04-04 07:11:35 -07:00
|
|
|
Evry_State *s = sel->state;
|
2009-05-06 07:20:45 -07:00
|
|
|
int len, val, pos;
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if (!(len = strlen(s->inp)))
|
2010-05-11 08:10:30 -07:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
pos = evas_string_char_prev_get(s->inp, len, &val);
|
|
|
|
if ((pos < len) && (pos >= 0))
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
val = *(s->inp + pos);
|
2009-08-20 16:43:56 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
s->inp[pos] = 0;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (s->trigger_active && s->inp[0] != 0)
|
|
|
|
s->input = s->inp + 1;
|
|
|
|
else
|
|
|
|
s->input = s->inp;
|
2009-08-20 16:43:56 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (pos == 0)
|
|
|
|
s->trigger_active = EINA_FALSE;
|
2010-05-27 07:30:12 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((pos == 0) || !isspace(val))
|
|
|
|
_evry_update(sel, 1);
|
2009-08-24 21:23:11 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
return 1;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2009-08-24 21:23:11 -07:00
|
|
|
|
|
|
|
return 0;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-08-10 04:36:37 -07:00
|
|
|
_evry_update_text_label(Evry_State *s)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = s->selector->win;
|
|
|
|
|
2010-05-13 23:35:06 -07:00
|
|
|
if (!win->visible && evry_conf->hide_input)
|
2009-08-16 20:30:04 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (strlen(s->inp) > 0)
|
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,entry_show", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,entry_hide", "e");
|
2009-08-16 20:30:04 -07:00
|
|
|
}
|
2009-08-17 16:54:16 -07:00
|
|
|
|
2010-05-24 15:08:15 -07:00
|
|
|
edje_object_part_text_set(win->o_main, "list:e.text.label", s->inp);
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
static void
|
2010-04-04 07:11:35 -07:00
|
|
|
_evry_update(Evry_Selector *sel, int fetch)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2010-04-04 07:11:35 -07:00
|
|
|
Evry_State *s = sel->state;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2009-08-10 04:36:37 -07:00
|
|
|
_evry_update_text_label(s);
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2009-08-15 13:12:04 -07:00
|
|
|
if (fetch)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (sel->update_timer)
|
|
|
|
ecore_timer_del(sel->update_timer);
|
2010-04-04 07:11:35 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
sel->update_timer =
|
|
|
|
ecore_timer_add(MATCH_LAG, _evry_cb_update_timer, sel);
|
2009-08-20 07:45:47 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main, "list:e,signal,update", "e");
|
2009-08-15 13:12:04 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-04-04 07:11:35 -07:00
|
|
|
_evry_cb_update_timer(void *data)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2010-04-04 07:11:35 -07:00
|
|
|
Evry_Selector *sel = data;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-04-04 07:11:35 -07:00
|
|
|
_evry_matches_update(sel, 1);
|
|
|
|
_evry_selector_update(sel);
|
|
|
|
_evry_list_win_update(sel->state);
|
|
|
|
sel->update_timer = NULL;
|
2009-08-12 05:17:43 -07:00
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2009-06-21 03:31:38 -07:00
|
|
|
}
|
|
|
|
|
2009-08-16 02:43:38 -07:00
|
|
|
static int
|
2010-04-04 07:11:35 -07:00
|
|
|
_evry_clear(Evry_Selector *sel)
|
2009-06-24 13:02:37 -07:00
|
|
|
{
|
2010-04-04 07:11:35 -07:00
|
|
|
Evry_State *s = sel->state;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-05-12 19:52:02 -07:00
|
|
|
if (!(s->inp) || (s->inp[0] == 0))
|
|
|
|
return 0;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-05-12 19:52:02 -07:00
|
|
|
if (s->trigger_active && s->inp[1] != 0)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->inp[1] = 0;
|
|
|
|
s->input = s->inp + 1;
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
2010-05-12 19:52:02 -07:00
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->inp[0] = 0;
|
|
|
|
s->input = s->inp;
|
|
|
|
s->trigger_active = EINA_FALSE;
|
2010-05-12 19:52:02 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
_evry_update(sel, 1);
|
|
|
|
|
2010-05-13 23:35:06 -07:00
|
|
|
if (!win->visible && evry_conf->hide_input)
|
2010-05-24 15:08:15 -07:00
|
|
|
edje_object_signal_emit(win->o_main, "list:e,state,entry_hide", "e");
|
2010-05-13 20:11:03 -07:00
|
|
|
|
2010-05-12 19:52:02 -07:00
|
|
|
return 1;
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
|
|
|
|
2010-05-13 15:27:57 -07:00
|
|
|
static void
|
2011-01-23 14:34:28 -08:00
|
|
|
_evry_cb_free_action_performed(void *data __UNUSED__, void *event)
|
2010-05-13 15:27:57 -07:00
|
|
|
{
|
|
|
|
Evry_Event_Action_Performed *ev = event;
|
|
|
|
|
|
|
|
if (ev->it1)
|
|
|
|
EVRY_ITEM_FREE(ev->it1);
|
|
|
|
if (ev->it2)
|
|
|
|
EVRY_ITEM_FREE(ev->it2);
|
|
|
|
|
|
|
|
IF_RELEASE(ev->action);
|
|
|
|
|
|
|
|
E_FREE(ev);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_action_do(Evry_Action *act)
|
|
|
|
{
|
|
|
|
Evry_Event_Action_Performed *ev;
|
2011-08-10 23:02:18 -07:00
|
|
|
int ret;
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-08-10 23:02:18 -07:00
|
|
|
if ((ret = act->action(act)))
|
2010-05-13 15:27:57 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ev = E_NEW(Evry_Event_Action_Performed, 1);
|
|
|
|
ev->action = eina_stringshare_ref(act->name);
|
|
|
|
ev->it1 = act->it1.item;
|
|
|
|
ev->it2 = act->it2.item;
|
2010-05-13 20:11:03 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (ev->it1)
|
|
|
|
EVRY_ITEM_REF(ev->it1);
|
|
|
|
if (ev->it2)
|
|
|
|
EVRY_ITEM_REF(ev->it2);
|
2010-05-13 15:27:57 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
ecore_event_add(_evry_events[EVRY_EVENT_ACTION_PERFORMED], ev,
|
|
|
|
_evry_cb_free_action_performed, NULL);
|
|
|
|
return ret;
|
2010-05-13 15:27:57 -07:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
void
|
2010-06-04 12:32:59 -07:00
|
|
|
evry_plugin_action(Evry_Window *win, int finished)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
2010-05-21 23:35:46 -07:00
|
|
|
_evry_plugin_action(CUR_SEL, finished);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
|
2009-05-06 07:20:45 -07:00
|
|
|
static void
|
2009-08-10 04:36:37 -07:00
|
|
|
_evry_plugin_action(Evry_Selector *sel, int finished)
|
2009-08-12 12:00:25 -07:00
|
|
|
{
|
2010-04-26 11:21:09 -07:00
|
|
|
Evry_State *s_subj, *s_act, *s_obj = NULL;
|
2010-05-12 21:42:22 -07:00
|
|
|
Evry_Item *it, *it_subj, *it_act, *it_obj = NULL;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-04-25 09:26:13 -07:00
|
|
|
Eina_List *l;
|
2011-08-10 23:02:18 -07:00
|
|
|
int ret = 0;
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if ((SUBJ_SEL)->update_timer)
|
2010-04-08 16:29:35 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_matches_update(SUBJ_SEL, 0);
|
|
|
|
_evry_selector_update(SUBJ_SEL);
|
2010-04-08 16:29:35 -07:00
|
|
|
}
|
2009-08-10 04:36:37 -07:00
|
|
|
|
2010-05-27 14:10:20 -07:00
|
|
|
/* do delayed fetch actions now */
|
|
|
|
if ((ACTN_SEL)->action_timer)
|
|
|
|
_evry_selector_update_actions_do(ACTN_SEL);
|
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (!(s_subj = (SUBJ_SEL)->state))
|
2010-04-26 11:21:09 -07:00
|
|
|
return;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-04-26 11:21:09 -07:00
|
|
|
if (!(it_subj = s_subj->cur_item))
|
2009-08-30 01:51:15 -07:00
|
|
|
return;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2011-06-18 06:04:08 -07:00
|
|
|
if ((CUR_SEL == SUBJ_SEL) && (ACTN_SEL)->update_timer)
|
2009-07-10 08:47:19 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* _evry_selector_actions_get(it_subj); */
|
|
|
|
_evry_selector_plugins_get(ACTN_SEL, it_subj, NULL);
|
2010-04-08 16:29:35 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!(ACTN_SEL)->state)
|
|
|
|
return;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_selector_update(ACTN_SEL);
|
2009-07-10 08:47:19 -07:00
|
|
|
}
|
2009-08-10 04:36:37 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
if (!(s_act = (ACTN_SEL)->state))
|
2009-08-30 01:51:15 -07:00
|
|
|
return;
|
2009-08-10 04:36:37 -07:00
|
|
|
|
2010-04-26 11:21:09 -07:00
|
|
|
if (!(it_act = s_act->cur_item))
|
|
|
|
return;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-04-28 09:39:50 -07:00
|
|
|
if (CHECK_TYPE(it_act, EVRY_TYPE_ACTION) ||
|
|
|
|
CHECK_SUBTYPE(it_act, EVRY_TYPE_ACTION))
|
2009-06-24 13:02:37 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
GET_ACTION(act, it_act);
|
|
|
|
|
|
|
|
if (!act->action)
|
|
|
|
return;
|
|
|
|
|
|
|
|
/* get object item for action, when required */
|
|
|
|
if (act->it2.type)
|
|
|
|
{
|
|
|
|
/* check if object is provided */
|
|
|
|
if ((s_obj = (OBJ_SEL)->state) && (!s_obj->delete_me))
|
|
|
|
{
|
|
|
|
it_obj = s_obj->cur_item;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!it_obj)
|
|
|
|
{
|
|
|
|
if (SUBJ_SEL == CUR_SEL)
|
|
|
|
_evry_selectors_switch(win, 1);
|
|
|
|
if (ACTN_SEL == CUR_SEL)
|
|
|
|
_evry_selectors_switch(win, 1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
act->it2.item = it_obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (s_obj && s_obj->sel_items && !(act->it2.accept_list))
|
|
|
|
{
|
|
|
|
if (!(act->it1.item && CHECK_TYPE(act->it1.item, EVRY_TYPE_PLUGIN)))
|
|
|
|
act->it1.item = it_subj;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH (s_obj->sel_items, l, it)
|
|
|
|
{
|
|
|
|
if (it->type != act->it2.type)
|
|
|
|
continue;
|
|
|
|
act->it2.item = it;
|
|
|
|
|
|
|
|
_evry_action_do(act);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (s_subj->sel_items && !(act->it1.accept_list))
|
|
|
|
{
|
|
|
|
EINA_LIST_FOREACH (s_subj->sel_items, l, it)
|
|
|
|
{
|
|
|
|
if (it->type != act->it1.type)
|
|
|
|
continue;
|
|
|
|
act->it1.item = it;
|
|
|
|
|
|
|
|
_evry_action_do(act);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!(act->it1.item && CHECK_TYPE(act->it1.item, EVRY_TYPE_PLUGIN)))
|
|
|
|
{
|
|
|
|
act->it1.item = it_subj;
|
|
|
|
act->it1.items = s_subj->sel_items;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (s_obj)
|
|
|
|
act->it2.items = s_obj->sel_items;
|
|
|
|
|
|
|
|
ret = _evry_action_do(act);
|
|
|
|
|
|
|
|
if (ret == EVRY_ACTION_OTHER)
|
|
|
|
return;
|
|
|
|
}
|
2009-06-24 13:02:37 -07:00
|
|
|
}
|
2009-08-25 17:36:59 -07:00
|
|
|
else return;
|
2009-07-04 04:10:28 -07:00
|
|
|
|
2010-05-02 04:31:01 -07:00
|
|
|
if (s_subj && it_subj && it_subj->plugin->history)
|
2010-05-11 10:24:38 -07:00
|
|
|
evry_history_item_add(it_subj, NULL, s_subj->input);
|
2010-04-26 11:21:09 -07:00
|
|
|
|
2010-05-02 04:31:01 -07:00
|
|
|
if (s_act && it_act && it_act->plugin->history)
|
2010-05-11 10:24:38 -07:00
|
|
|
evry_history_item_add(it_act, it_subj->context, s_act->input);
|
2010-04-26 11:21:09 -07:00
|
|
|
|
2010-05-02 04:31:01 -07:00
|
|
|
if (s_obj && it_obj && it_obj->plugin->history)
|
2010-05-11 10:24:38 -07:00
|
|
|
evry_history_item_add(it_obj, it_act->context, s_obj->input);
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2011-08-10 23:02:18 -07:00
|
|
|
if (ret == EVRY_ACTION_CONTINUE)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (ret == EVRY_ACTION_CLEAR)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_clear(CUR_SEL);
|
2011-08-10 23:02:18 -07:00
|
|
|
}
|
2011-09-02 16:02:26 -07:00
|
|
|
else
|
2011-11-29 19:32:54 -08:00
|
|
|
{
|
|
|
|
win->func.hide(win, finished);
|
2011-08-10 23:02:18 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2011-08-19 15:11:09 -07:00
|
|
|
static void
|
|
|
|
_evry_view_list_swallow_set(Evas_Object *obj, const char *part, Evas_Object *swallow)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
|
|
|
|
|
|
|
o = edje_object_part_swallow_get(obj, part);
|
|
|
|
if (o != swallow)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_hide(o);
|
|
|
|
edje_object_part_unswallow(obj, o);
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_part_unswallow(obj, swallow);
|
|
|
|
edje_object_part_swallow(obj, part, swallow);
|
|
|
|
evas_object_show(swallow);
|
2011-08-19 15:11:09 -07:00
|
|
|
}
|
|
|
|
}
|
2011-08-10 23:02:18 -07:00
|
|
|
|
2009-08-20 14:39:01 -07:00
|
|
|
static void
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_view_show(Evry_Window *win, Evry_View *v, int slide)
|
2009-08-20 14:39:01 -07:00
|
|
|
{
|
|
|
|
if (!v) return;
|
|
|
|
|
2010-05-24 15:08:15 -07:00
|
|
|
if (v->o_bar)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_part_swallow(win->o_main, "list:e.swallow.bar", v->o_bar);
|
|
|
|
evas_object_show(v->o_bar);
|
2010-05-24 15:08:15 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!v->o_list)
|
|
|
|
return;
|
|
|
|
|
2010-05-26 16:57:48 -07:00
|
|
|
if (slide == SLIDE_LEFT)
|
2009-08-20 14:39:01 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_list_swallow_set(win->o_main, "list:e.swallow.list2", v->o_list);
|
2010-05-24 15:08:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main, "list:e,action,slide,left", "e");
|
|
|
|
edje_object_signal_emit(v->o_list, "e,action,show,list", "e");
|
2009-08-20 14:39:01 -07:00
|
|
|
}
|
2010-05-26 16:57:48 -07:00
|
|
|
else if (slide == SLIDE_RIGHT)
|
2010-05-24 15:08:15 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_list_swallow_set(win->o_main, "list:e.swallow.list", v->o_list);
|
2009-08-20 14:39:01 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main, "list:e,action,slide,right", "e");
|
|
|
|
edje_object_signal_emit(v->o_list, "e,action,show,list", "e");
|
2010-05-24 15:08:15 -07:00
|
|
|
}
|
|
|
|
else
|
2009-08-20 14:39:01 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_list_swallow_set(win->o_main, "list:e.swallow.list", v->o_list);
|
2010-05-24 15:08:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(win->o_main, "list:e,action,slide,default", "e");
|
|
|
|
edje_object_signal_emit(v->o_list, "e,action,show,list", "e");
|
2009-08-20 14:39:01 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-05-24 15:08:15 -07:00
|
|
|
_clear_timer(void *data)
|
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_state_clear(data);
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2010-05-24 15:08:15 -07:00
|
|
|
}
|
|
|
|
|
2009-08-20 14:39:01 -07:00
|
|
|
static void
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_state_clear(Evry_Window *win)
|
2009-08-20 14:39:01 -07:00
|
|
|
{
|
2010-06-12 18:05:24 -07:00
|
|
|
Evry_State *s;
|
|
|
|
Evry_View *v;
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (!win->state_clearing)
|
|
|
|
return;
|
|
|
|
|
2010-06-12 18:05:24 -07:00
|
|
|
s = win->state_clearing;
|
|
|
|
win->state_clearing = NULL;
|
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
ecore_timer_del(s->clear_timer);
|
2010-06-12 18:05:24 -07:00
|
|
|
s->clear_timer = NULL;
|
2010-05-24 15:08:15 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
if (s->delete_me)
|
2010-05-24 16:00:04 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (s->view) s->view->destroy(s->view);
|
|
|
|
s->clear_timer = NULL;
|
|
|
|
E_FREE(s->inp);
|
|
|
|
E_FREE(s);
|
2010-05-24 15:08:15 -07:00
|
|
|
}
|
2010-06-12 18:05:24 -07:00
|
|
|
else if ((v = s->view))
|
2010-05-24 15:08:15 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
v->clear(v);
|
2010-05-24 15:08:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (v->o_list)
|
|
|
|
{
|
|
|
|
evas_object_hide(v->o_list);
|
|
|
|
edje_object_part_unswallow(win->o_main, v->o_list);
|
|
|
|
}
|
2010-05-30 12:16:33 -07:00
|
|
|
}
|
2010-05-27 13:25:09 -07:00
|
|
|
|
2010-05-30 12:16:33 -07:00
|
|
|
/* replay mouse down to allow direct sliding back */
|
|
|
|
if (win->mouse_button)
|
2010-06-04 12:32:59 -07:00
|
|
|
evas_event_feed_mouse_down(win->evas, win->mouse_button, 0, 0, NULL);
|
2010-05-24 15:20:26 -07:00
|
|
|
}
|
2010-05-24 15:08:15 -07:00
|
|
|
|
2010-05-24 15:20:26 -07:00
|
|
|
static void
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_view_hide(Evry_Window *win, Evry_View *v, int slide)
|
2010-05-24 15:20:26 -07:00
|
|
|
{
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_state_clear(win);
|
2010-05-24 16:00:04 -07:00
|
|
|
|
2012-10-04 16:27:01 -07:00
|
|
|
if (!v || v->state->delete_me) return;
|
2010-05-24 15:08:15 -07:00
|
|
|
|
|
|
|
if (slide && v->o_list)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
win->state_clearing = v->state;
|
2010-05-27 13:25:09 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (slide == SLIDE_RIGHT)
|
|
|
|
{
|
|
|
|
_evry_view_list_swallow_set(win->o_main, "list:e.swallow.list2", v->o_list);
|
|
|
|
}
|
|
|
|
else /* if (slide == SLIDE_LEFT) */
|
|
|
|
{
|
|
|
|
_evry_view_list_swallow_set(win->o_main, "list:e.swallow.list", v->o_list);
|
|
|
|
}
|
2010-05-30 12:48:03 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_signal_emit(v->o_list, "e,action,hide,list", "e");
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
/* FIXME get signal from theme when anim finished */
|
|
|
|
v->state->clear_timer = ecore_timer_add(1.5, _clear_timer, win);
|
2010-05-30 12:48:03 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (v->o_bar)
|
|
|
|
{
|
|
|
|
evas_object_hide(v->o_bar);
|
|
|
|
edje_object_part_unswallow(win->o_main, v->o_bar);
|
|
|
|
}
|
2010-05-24 15:08:15 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
return;
|
2010-05-24 15:08:15 -07:00
|
|
|
}
|
2009-08-20 14:39:01 -07:00
|
|
|
|
2010-05-24 15:08:15 -07:00
|
|
|
v->clear(v);
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2009-08-20 14:39:01 -07:00
|
|
|
if (v->o_list)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_hide(v->o_list);
|
|
|
|
edje_object_part_unswallow(win->o_main, v->o_list);
|
2009-08-20 14:39:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (v->o_bar)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_hide(v->o_bar);
|
|
|
|
edje_object_part_unswallow(win->o_main, v->o_bar);
|
2009-08-20 14:39:01 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-05-30 12:16:33 -07:00
|
|
|
static int
|
2011-08-10 21:14:10 -07:00
|
|
|
_evry_view_create(Evry_State *s)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2011-08-10 21:14:10 -07:00
|
|
|
Evry_View *view;
|
2009-08-12 12:00:25 -07:00
|
|
|
|
2011-08-10 21:14:10 -07:00
|
|
|
if (s->view)
|
|
|
|
return 1;
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-08-10 21:14:10 -07:00
|
|
|
if (s->plugin && s->plugin->view)
|
|
|
|
view = s->plugin->view;
|
|
|
|
else
|
|
|
|
view = eina_list_data_get(evry_conf->views);
|
2010-05-30 12:16:33 -07:00
|
|
|
|
2011-08-10 21:14:10 -07:00
|
|
|
s->view = view->create(view, s, s->selector->win->o_main);
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-08-10 21:14:10 -07:00
|
|
|
if (s->view)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->view->state = s;
|
|
|
|
return 1;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2009-06-08 06:44:11 -07:00
|
|
|
|
2011-08-10 21:14:10 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_evry_view_update(Evry_Window *win, Evry_State *s)
|
|
|
|
{
|
|
|
|
if (!win->visible) return 0;
|
|
|
|
/* TODO check this again !!!!*/
|
2009-08-19 05:07:37 -07:00
|
|
|
if (s->view)
|
2011-08-10 21:14:10 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->view->update(s->view);
|
|
|
|
return 0;
|
2011-08-10 21:14:10 -07:00
|
|
|
}
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2011-08-10 21:14:10 -07:00
|
|
|
if (_evry_view_create(s))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->view->update(s->view);
|
|
|
|
return 1;
|
2011-08-10 21:14:10 -07:00
|
|
|
}
|
2010-05-30 12:16:33 -07:00
|
|
|
|
|
|
|
return 0;
|
2009-08-10 04:36:37 -07:00
|
|
|
}
|
|
|
|
|
2009-08-13 15:42:40 -07:00
|
|
|
static void
|
2009-08-17 16:54:16 -07:00
|
|
|
_evry_view_clear(Evry_State *s)
|
2009-08-13 15:42:40 -07:00
|
|
|
{
|
2009-08-19 05:07:37 -07:00
|
|
|
if (!s || !s->view) return;
|
2009-08-13 15:42:40 -07:00
|
|
|
|
2010-05-24 15:08:15 -07:00
|
|
|
s->view->clear(s->view);
|
2009-08-17 16:54:16 -07:00
|
|
|
}
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2009-08-17 16:54:16 -07:00
|
|
|
static int
|
|
|
|
_evry_view_key_press(Evry_State *s, Ecore_Event_Key *ev)
|
|
|
|
{
|
2009-08-21 01:19:30 -07:00
|
|
|
if (!s || !s->view || !s->view->cb_key_down) return 0;
|
2009-08-19 05:07:37 -07:00
|
|
|
|
|
|
|
return s->view->cb_key_down(s->view, ev);
|
2009-08-13 15:42:40 -07:00
|
|
|
}
|
2009-08-10 04:36:37 -07:00
|
|
|
|
2010-05-21 23:35:46 -07:00
|
|
|
int
|
|
|
|
evry_view_toggle(Evry_State *s, const char *trigger)
|
2009-08-10 04:36:37 -07:00
|
|
|
{
|
2009-08-21 01:19:30 -07:00
|
|
|
Evry_View *view, *v = NULL;
|
2009-08-19 05:07:37 -07:00
|
|
|
Eina_List *l, *ll;
|
2013-01-03 10:16:04 -08:00
|
|
|
Eina_Bool triggered = EINA_FALSE;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = s->selector->win;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2009-08-21 01:19:30 -07:00
|
|
|
if (trigger)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (evry_conf->views, ll, view)
|
|
|
|
{
|
|
|
|
if (view->trigger && !strncmp(trigger, view->trigger, 1) &&
|
|
|
|
(!s->view || (view->id != s->view->id)) &&
|
|
|
|
(v = view->create(view, s, win->o_main)))
|
|
|
|
{
|
|
|
|
triggered = EINA_TRUE;
|
|
|
|
goto found;
|
|
|
|
}
|
|
|
|
}
|
2009-08-21 01:19:30 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (s->view)
|
|
|
|
l = eina_list_data_find_list(evry_conf->views, s->view->id);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
view = evry_conf->views->data;
|
|
|
|
v = view->create(view, s, win->o_main);
|
|
|
|
goto found;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (l && l->next)
|
|
|
|
l = l->next;
|
|
|
|
else
|
|
|
|
l = evry_conf->views;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH (l, ll, view)
|
|
|
|
{
|
|
|
|
if ((!view->trigger) &&
|
|
|
|
((!s->view || (view->id != s->view->id)) &&
|
|
|
|
(v = view->create(view, s, win->o_main))))
|
|
|
|
goto found;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
found:
|
2009-08-19 05:07:37 -07:00
|
|
|
if (!v) return 0;
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2010-06-04 12:32:59 -07:00
|
|
|
_evry_list_win_show(win);
|
2009-08-21 01:19:30 -07:00
|
|
|
|
2009-08-19 05:07:37 -07:00
|
|
|
if (s->view)
|
2010-06-04 12:32:59 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_view_hide(win, s->view, 0);
|
|
|
|
s->view->destroy(s->view);
|
2010-06-04 12:32:59 -07:00
|
|
|
}
|
2009-07-03 06:37:54 -07:00
|
|
|
|
2009-08-19 05:07:37 -07:00
|
|
|
s->view = v;
|
2010-06-04 12:32:59 -07:00
|
|
|
s->view->state = s;
|
|
|
|
_evry_view_show(win, s->view, 0);
|
2010-05-24 15:08:15 -07:00
|
|
|
view->update(s->view);
|
2009-08-19 05:07:37 -07:00
|
|
|
|
2010-04-20 11:49:42 -07:00
|
|
|
return triggered;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-08-27 13:52:14 -07:00
|
|
|
_evry_matches_update(Evry_Selector *sel, int async)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-08-10 04:36:37 -07:00
|
|
|
Evry_State *s = sel->state;
|
2009-06-21 03:31:38 -07:00
|
|
|
Evry_Plugin *p;
|
2009-05-06 07:20:45 -07:00
|
|
|
Eina_List *l;
|
2010-04-25 09:26:13 -07:00
|
|
|
Evry_Item *it;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = sel->win;
|
2010-05-21 23:35:46 -07:00
|
|
|
const char *input = NULL;
|
2011-11-14 13:07:29 -08:00
|
|
|
size_t len_inp = 0;
|
2010-04-25 09:26:13 -07:00
|
|
|
|
2010-04-23 17:54:12 -07:00
|
|
|
s->changed = 1;
|
2010-05-21 23:35:46 -07:00
|
|
|
s->request++;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2011-02-20 23:30:55 -08:00
|
|
|
#ifdef CHECK_TIME
|
2011-01-23 14:34:28 -08:00
|
|
|
DBG("matches update %f", ecore_time_get() - _evry_time);
|
2011-02-20 23:30:55 -08:00
|
|
|
#endif
|
2011-08-19 15:11:09 -07:00
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
if (sel->update_timer)
|
2010-05-21 23:35:46 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ecore_timer_del(sel->update_timer);
|
|
|
|
sel->update_timer = NULL;
|
2010-05-21 23:35:46 -07:00
|
|
|
}
|
2010-04-30 15:12:02 -07:00
|
|
|
|
2010-04-25 09:26:13 -07:00
|
|
|
if (s->sel_items)
|
2010-05-27 07:30:12 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
eina_list_free(s->sel_items);
|
|
|
|
s->sel_items = NULL;
|
2010-05-27 07:30:12 -07:00
|
|
|
}
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
if (s->inp[0])
|
2010-04-23 17:54:12 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
len_inp = strlen(s->inp);
|
|
|
|
input = s->inp;
|
2010-04-22 17:49:29 -07:00
|
|
|
}
|
2010-05-08 21:10:53 -07:00
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
/* use current plugins */
|
2010-05-08 21:10:53 -07:00
|
|
|
if (s->trigger_active)
|
2009-06-21 03:31:38 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->plugin_auto_selected = EINA_FALSE;
|
2010-05-27 07:30:12 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (s->cur_plugins, l, p)
|
|
|
|
{
|
|
|
|
p->request = s->request;
|
|
|
|
p->fetch(p, s->input);
|
|
|
|
}
|
|
|
|
goto found;
|
2010-04-22 17:49:29 -07:00
|
|
|
}
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FREE (s->cur_plugins, p) ;
|
2010-05-27 07:30:12 -07:00
|
|
|
|
2010-04-30 15:12:02 -07:00
|
|
|
/* check if input matches plugin trigger */
|
2010-05-27 07:30:12 -07:00
|
|
|
if (input)
|
2010-04-22 17:49:29 -07:00
|
|
|
{
|
2012-04-30 00:07:33 -07:00
|
|
|
size_t len_trigger = 0;
|
2011-11-29 19:32:54 -08:00
|
|
|
|
|
|
|
EINA_LIST_FOREACH (s->plugins, l, p)
|
|
|
|
{
|
2012-05-18 06:02:20 -07:00
|
|
|
size_t len;
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!p->config->trigger) continue;
|
2012-05-18 06:02:20 -07:00
|
|
|
len = strlen(p->config->trigger);
|
2011-11-29 19:32:54 -08:00
|
|
|
|
|
|
|
if (len_trigger && len != len_trigger)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if ((len_inp >= len) &&
|
|
|
|
(!strncmp(s->inp, p->config->trigger, len)))
|
|
|
|
{
|
|
|
|
len_trigger = len;
|
|
|
|
s->cur_plugins = eina_list_append(s->cur_plugins, p);
|
|
|
|
p->request = s->request;
|
|
|
|
if (len_inp == len)
|
|
|
|
p->fetch(p, NULL);
|
|
|
|
else
|
|
|
|
p->fetch(p, s->input + len);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (s->cur_plugins)
|
|
|
|
{
|
|
|
|
s->trigger_active = EINA_TRUE;
|
|
|
|
/* replace trigger with indicator */
|
|
|
|
if (len_trigger > 1)
|
|
|
|
{
|
|
|
|
s->inp[0] = ':';
|
|
|
|
|
2014-04-04 11:15:13 -07:00
|
|
|
if (s->inp[len_trigger])
|
2011-11-29 19:32:54 -08:00
|
|
|
strcpy(s->inp + 1, s->inp + len_trigger);
|
|
|
|
else
|
|
|
|
s->inp[1] = 0;
|
|
|
|
}
|
|
|
|
s->input = s->inp + 1;
|
|
|
|
_evry_update_text_label(s);
|
|
|
|
|
|
|
|
goto found;
|
|
|
|
}
|
2009-07-15 07:37:01 -07:00
|
|
|
}
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2010-05-27 07:30:12 -07:00
|
|
|
/* query all other plugins for this state */
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (s->plugins, l, p)
|
|
|
|
{
|
|
|
|
p->request = s->request;
|
|
|
|
|
|
|
|
if (p == s->aggregator)
|
|
|
|
goto next;
|
|
|
|
|
|
|
|
/* dont wait for async plugin. use their current items */
|
|
|
|
if (!async && p->async_fetch && p->items)
|
|
|
|
{
|
|
|
|
s->cur_plugins = eina_list_append(s->cur_plugins, p);
|
|
|
|
goto next;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!((sel->states->next) ||
|
|
|
|
((CUR_SEL == SUBJ_SEL) &&
|
|
|
|
(win->plugin_dedicated))))
|
|
|
|
{
|
|
|
|
/* skip plugins in toplevel which trigger-only */
|
|
|
|
if ((sel == SUBJ_SEL) &&
|
|
|
|
(p->config->top_level) &&
|
|
|
|
(p->config->trigger_only))
|
|
|
|
goto next;
|
|
|
|
|
|
|
|
/* skip non-toplevel plugins when input < min_query */
|
|
|
|
if ((!p->config->top_level) &&
|
2012-04-30 00:07:33 -07:00
|
|
|
((size_t) p->config->min_query > len_inp))
|
2011-11-29 19:32:54 -08:00
|
|
|
goto next;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p->fetch(p, input))
|
|
|
|
{
|
2011-02-20 23:30:55 -08:00
|
|
|
#ifdef CHECK_TIME
|
2011-11-29 19:32:54 -08:00
|
|
|
DBG("fetch %s %f", p->name, ecore_time_get() - _evry_time);
|
2011-02-20 23:30:55 -08:00
|
|
|
#endif
|
2011-11-29 19:32:54 -08:00
|
|
|
s->cur_plugins = eina_list_append(s->cur_plugins, p);
|
|
|
|
continue;
|
|
|
|
}
|
2010-05-30 12:16:33 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
next:
|
|
|
|
if (s->plugin == p)
|
|
|
|
s->plugin = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
found:
|
2010-05-31 14:15:32 -07:00
|
|
|
_evry_aggregator_fetch(s);
|
2010-04-23 17:51:08 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if (s->plugin_auto_selected)
|
|
|
|
s->plugin = NULL;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
_evry_plugin_select(s, s->plugin);
|
|
|
|
|
|
|
|
if (!s->plugin)
|
|
|
|
return;
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (s->plugin->items, l, it)
|
2010-05-31 14:15:32 -07:00
|
|
|
if (it->marked)
|
|
|
|
s->sel_items = eina_list_append(s->sel_items, it);
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-05-31 14:15:32 -07:00
|
|
|
_evry_item_desel(Evry_State *s)
|
2009-08-14 02:35:51 -07:00
|
|
|
{
|
2010-05-31 14:15:32 -07:00
|
|
|
Evry_Item *it = s->cur_item;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if (it)
|
2010-04-07 08:03:27 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
it->selected = EINA_FALSE;
|
|
|
|
evry_item_free(it);
|
2010-04-07 08:03:27 -07:00
|
|
|
}
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2009-08-28 21:42:17 -07:00
|
|
|
s->cur_item = NULL;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-08-17 16:54:16 -07:00
|
|
|
_evry_item_sel(Evry_State *s, Evry_Item *it)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2009-08-28 21:42:17 -07:00
|
|
|
if (s->cur_item == it) return;
|
2009-08-12 11:47:46 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
_evry_item_desel(s);
|
2009-08-14 02:35:51 -07:00
|
|
|
|
2009-08-17 16:54:16 -07:00
|
|
|
evry_item_ref(it);
|
2010-04-07 08:03:27 -07:00
|
|
|
it->selected = EINA_TRUE;
|
2010-04-08 16:41:53 -07:00
|
|
|
|
2009-08-28 21:42:17 -07:00
|
|
|
s->cur_item = it;
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-08-20 14:39:01 -07:00
|
|
|
_evry_plugin_select(Evry_State *s, Evry_Plugin *p)
|
2009-05-06 07:20:45 -07:00
|
|
|
{
|
2010-05-31 14:15:32 -07:00
|
|
|
if (!s) return;
|
2010-04-27 20:22:40 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if (p)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->plugin_auto_selected = EINA_FALSE;
|
2010-05-31 14:15:32 -07:00
|
|
|
}
|
|
|
|
else
|
2009-08-13 15:42:40 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
p = eina_list_data_get(s->cur_plugins);
|
|
|
|
s->plugin_auto_selected = EINA_TRUE;
|
2009-08-13 15:42:40 -07:00
|
|
|
}
|
2010-04-23 17:21:45 -07:00
|
|
|
|
2011-08-11 02:47:16 -07:00
|
|
|
s->plugin = p;
|
|
|
|
|
|
|
|
if ((s->view && s->plugin && s->plugin->view) &&
|
2011-08-10 21:14:10 -07:00
|
|
|
(s->view->name != s->plugin->view->name))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
s->view->destroy(s->view);
|
|
|
|
s->view = NULL;
|
|
|
|
if (_evry_view_create(s))
|
|
|
|
{
|
|
|
|
_evry_view_show(s->selector->win, s->view, 0);
|
|
|
|
s->view->update(s->view);
|
|
|
|
}
|
2011-08-10 21:14:10 -07:00
|
|
|
}
|
2009-05-06 07:20:45 -07:00
|
|
|
}
|
|
|
|
|
2010-06-02 16:19:02 -07:00
|
|
|
static void
|
2011-01-23 14:34:28 -08:00
|
|
|
_evry_cb_free_plugin_selected(void *data __UNUSED__, void *event)
|
2010-06-02 16:19:02 -07:00
|
|
|
{
|
|
|
|
Evry_Event_Item_Selected *ev = event;
|
|
|
|
|
|
|
|
evry_item_free(ev->item);
|
|
|
|
E_FREE(ev);
|
|
|
|
}
|
|
|
|
|
2009-08-20 14:39:01 -07:00
|
|
|
void
|
2010-05-19 07:44:36 -07:00
|
|
|
evry_plugin_select(Evry_Plugin *p)
|
2009-08-20 07:45:47 -07:00
|
|
|
{
|
2010-06-02 16:19:02 -07:00
|
|
|
Evry_Event_Item_Selected *ev;
|
2010-06-04 12:32:59 -07:00
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
if (!p) return;
|
2009-08-20 07:45:47 -07:00
|
|
|
|
2010-05-31 14:15:32 -07:00
|
|
|
if (!p->state)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
ERR("no state!");
|
|
|
|
return;
|
2010-05-31 14:15:32 -07:00
|
|
|
}
|
|
|
|
|
2010-05-19 07:44:36 -07:00
|
|
|
_evry_plugin_select(p->state, p);
|
|
|
|
_evry_selector_update(p->state->selector);
|
2010-06-02 16:19:02 -07:00
|
|
|
|
|
|
|
ev = E_NEW(Evry_Event_Item_Selected, 1);
|
|
|
|
ev->item = EVRY_ITEM(p);
|
|
|
|
EVRY_ITEM_REF(p);
|
|
|
|
ecore_event_add(_evry_events[EVRY_EVENT_PLUGIN_SELECTED], ev,
|
2011-11-29 19:32:54 -08:00
|
|
|
_evry_cb_free_plugin_selected, NULL);
|
2009-08-20 07:45:47 -07:00
|
|
|
}
|
|
|
|
|
2009-08-12 11:47:46 -07:00
|
|
|
static void
|
|
|
|
_evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
2010-05-31 14:15:32 -07:00
|
|
|
Evry_Plugin *p2;
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (s->cur_plugins, l, p2)
|
2010-05-31 14:15:32 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (p == p2)
|
|
|
|
return;
|
2010-05-31 14:15:32 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (p->config->priority < p2->config->priority)
|
|
|
|
break;
|
2010-05-31 14:15:32 -07:00
|
|
|
}
|
2009-08-12 11:47:46 -07:00
|
|
|
|
|
|
|
if (l)
|
|
|
|
s->cur_plugins = eina_list_prepend_relative_list(s->cur_plugins, p, l);
|
|
|
|
else
|
|
|
|
s->cur_plugins = eina_list_append(s->cur_plugins, p);
|
|
|
|
}
|
|
|
|
|
2014-03-18 13:14:04 -07:00
|
|
|
static void
|
|
|
|
_evry_cb_show(Evry_Window *win, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
2013-02-25 06:04:12 -08:00
|
|
|
{
|
|
|
|
if (win->grab)
|
2014-11-02 18:35:13 -08:00
|
|
|
e_grabinput_get(elm_win_window_id_get(win->ewin), 0, elm_win_window_id_get(win->ewin));
|
2013-02-25 06:04:12 -08:00
|
|
|
}
|
|
|
|
|
2014-03-18 13:14:04 -07:00
|
|
|
#ifndef HAVE_WAYLAND_ONLY
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2011-01-23 14:34:28 -08:00
|
|
|
_evry_cb_selection_notify(void *data, int type __UNUSED__, void *event)
|
2009-08-18 07:29:30 -07:00
|
|
|
{
|
|
|
|
Ecore_X_Event_Selection_Notify *ev;
|
2010-06-04 12:32:59 -07:00
|
|
|
Evry_Window *win = data;
|
2010-05-21 23:35:46 -07:00
|
|
|
Evry_State *s = (CUR_SEL)->state;
|
2009-08-18 07:29:30 -07:00
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
if (!s || (data != win)) return ECORE_CALLBACK_PASS_ON;
|
|
|
|
if (!win->request_selection) return ECORE_CALLBACK_PASS_ON;
|
2009-08-18 07:29:30 -07:00
|
|
|
|
|
|
|
win->request_selection = EINA_FALSE;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) ||
|
|
|
|
(ev->selection == ECORE_X_SELECTION_PRIMARY))
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0)
|
|
|
|
{
|
|
|
|
Ecore_X_Selection_Data_Text *text_data;
|
2009-08-18 07:29:30 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
text_data = ev->data;
|
2009-08-18 07:29:30 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
strncat(s->input, text_data->text, (INPUTLEN - strlen(s->input)) - 1);
|
|
|
|
_evry_update(CUR_SEL, 1);
|
|
|
|
}
|
2009-08-18 07:29:30 -07:00
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2009-08-18 07:29:30 -07:00
|
|
|
}
|
2014-03-18 13:14:04 -07:00
|
|
|
#endif
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2011-11-29 20:00:51 -08:00
|
|
|
void
|
|
|
|
evry_item_app_free(Evry_Item_App *app)
|
|
|
|
{
|
|
|
|
efreet_desktop_free(app->desktop);
|
|
|
|
eina_stringshare_del(app->file);
|
|
|
|
|
|
|
|
free(app);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
evry_item_file_free(Evry_Item_File *file)
|
|
|
|
{
|
|
|
|
eina_stringshare_del(file->url);
|
|
|
|
eina_stringshare_del(file->path);
|
|
|
|
eina_stringshare_del(file->mime);
|
|
|
|
|
|
|
|
free(file);
|
|
|
|
}
|