allow multiple evry instances. just for testing atm: use F1 to drag-off popup.

fix segv: keep state until cleared. ignore events from delete_me states


SVN revision: 49453
This commit is contained in:
Hannes Janetzek 2010-06-04 19:32:59 +00:00
parent 1e8d952fa2
commit c197c02360
10 changed files with 489 additions and 500 deletions

View File

@ -21,7 +21,11 @@ typedef struct _Evry_Window Evry_Window;
struct _Evry_Window struct _Evry_Window
{ {
E_Popup *popup; E_Win *ewin;
Evas *evas;
E_Zone *zone;
Ecore_X_Window input_window;
Evas_Object *o_main; Evas_Object *o_main;
Eina_Bool request_selection; Eina_Bool request_selection;
@ -37,13 +41,14 @@ struct _Evry_Window
Evry_Selector **selectors; Evry_Selector **selectors;
Evry_Selector **sel_list; Evry_Selector **sel_list;
int level; unsigned int level;
int mouse_out; unsigned int mouse_out;
int mouse_button; unsigned int mouse_button;
Evry_View *view_clearing; unsigned int grab;
Evry_View *view_freeing;
Evry_State *state_clearing;
}; };
struct _Evry_Selector struct _Evry_Selector
@ -74,6 +79,8 @@ struct _Evry_Selector
Ecore_Timer *update_timer; Ecore_Timer *update_timer;
Ecore_Timer *action_timer; Ecore_Timer *action_timer;
const char *edje_part;
}; };
struct _Evry_State struct _Evry_State
@ -111,6 +118,10 @@ struct _Evry_State
Eina_Bool trigger_active; Eina_Bool trigger_active;
unsigned int request; unsigned int request;
Ecore_Timer *clear_timer;
Eina_Bool delete_me;
}; };
struct _Evry_View struct _Evry_View
@ -128,9 +139,9 @@ struct _Evry_View
int (*update) (Evry_View *view); int (*update) (Evry_View *view);
void (*clear) (Evry_View *view); void (*clear) (Evry_View *view);
Ecore_Timer *clear_timer;
int priority; int priority;
Evry_State *state;
}; };
struct _Tab_View struct _Tab_View
@ -150,7 +161,7 @@ struct _Tab_View
double align; double align;
double align_to; double align_to;
Ecore_Animator *animator; Ecore_Animator *animator;
Ecore_Timer *timer; Ecore_Idle_Exiter *timer;
}; };
struct _Config struct _Config
@ -203,16 +214,12 @@ struct _History
int version; int version;
Eina_Hash *subjects; Eina_Hash *subjects;
double begin; double begin;
Eina_Bool changed;
}; };
/* evry.c */ /*** Evry_Api functions ***/
void evry_item_select(const Evry_State *s, Evry_Item *it); void evry_item_select(const Evry_State *s, Evry_Item *it);
void evry_item_mark(const Evry_State *state, Evry_Item *it, Eina_Bool mark); void evry_item_mark(const Evry_State *state, Evry_Item *it, Eina_Bool mark);
void evry_plugin_select(Evry_Plugin *p); void evry_plugin_select(Evry_Plugin *p);
/* int evry_list_win_show(void);
* void evry_list_win_hide(void); */
Evry_Item *evry_item_new(Evry_Item *base, Evry_Plugin *p, const char *label, Evry_Item *evry_item_new(Evry_Item *base, Evry_Plugin *p, const char *label,
Evas_Object *(*icon_get) (Evry_Item *it, Evas *e), Evas_Object *(*icon_get) (Evry_Item *it, Evas *e),
void (*cb_free) (Evry_Item *item)); void (*cb_free) (Evry_Item *item));
@ -278,7 +285,7 @@ int evry_api_version_check(int version);
Evry_Type evry_type_register(const char *type); Evry_Type evry_type_register(const char *type);
const char *evry_type_get(Evry_Type type); const char *evry_type_get(Evry_Type type);
/*** internal ***/
Tab_View *evry_tab_view_new(Evry_View *view, const Evry_State *s, Evas *e); Tab_View *evry_tab_view_new(Evry_View *view, const Evry_State *s, Evas *e);
void evry_tab_view_free(Tab_View *v); void evry_tab_view_free(Tab_View *v);
@ -300,7 +307,7 @@ void evry_plug_collection_shutdown(void);
int evry_init(void); int evry_init(void);
int evry_shutdown(void); int evry_shutdown(void);
Evry_Window *evry_show(E_Zone *zone, E_Zone_Edge edge, const char *params); Evry_Window *evry_show(E_Zone *zone, E_Zone_Edge edge, const char *params);
void evry_hide(int clear); void evry_hide(Evry_Window *win, int clear);
int evry_plug_actions_init(); int evry_plug_actions_init();
void evry_plug_actions_shutdown(); void evry_plug_actions_shutdown();
@ -313,10 +320,10 @@ void evry_history_free(void);
int evry_browse_item(Evry_Item *it); int evry_browse_item(Evry_Item *it);
int evry_browse_back(Evry_Selector *sel); int evry_browse_back(Evry_Selector *sel);
void evry_plugin_action(int finished); void evry_plugin_action(Evry_Window *win, int finished);
int evry_state_push(Evry_Selector *sel, Eina_List *plugins); int evry_state_push(Evry_Selector *sel, Eina_List *plugins);
int evry_selectors_switch(int dir, int slide); int evry_selectors_switch(Evry_Window *win,int dir, int slide);
int evry_view_toggle(Evry_State *s, const char *trigger); int evry_view_toggle(Evry_State *s, const char *trigger);
int evry_gadget_init(void); int evry_gadget_init(void);

File diff suppressed because it is too large Load Diff

View File

@ -69,7 +69,7 @@ _gc_shutdown(E_Gadcon_Client *gcc)
inst = gcc->data; inst = gcc->data;
if (inst->del_fn && inst->win) if (inst->del_fn && inst->win)
e_object_delfn_del(E_OBJECT(inst->win->popup), inst->del_fn); e_object_delfn_del(E_OBJECT(inst->win->ewin), inst->del_fn);
evas_object_del(inst->o_button); evas_object_del(inst->o_button);
free(inst); free(inst);
@ -125,7 +125,7 @@ static void _del_func(void *data, void *obj)
Instance *inst = data; Instance *inst = data;
e_gadcon_locked_set(inst->gcc->gadcon, 0); e_gadcon_locked_set(inst->gcc->gadcon, 0);
e_object_delfn_del(E_OBJECT(inst->win->popup), inst->del_fn); e_object_delfn_del(E_OBJECT(inst->win->ewin), inst->del_fn);
inst->del_fn = NULL; inst->del_fn = NULL;
inst->win = NULL; inst->win = NULL;
edje_object_signal_emit(inst->o_button, "e,state,unfocused", "e"); edje_object_signal_emit(inst->o_button, "e,state,unfocused", "e");
@ -162,8 +162,8 @@ _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
* evry_conf->edge_width, * evry_conf->edge_width,
* evry_conf->edge_height); */ * evry_conf->edge_height); */
pw = win->popup->w; pw = win->ewin->w;
ph = win->popup->h; ph = win->ewin->h;
switch (inst->gcc->gadcon->orient) switch (inst->gcc->gadcon->orient)
{ {
@ -171,22 +171,22 @@ _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
case E_GADCON_ORIENT_TOP: case E_GADCON_ORIENT_TOP:
case E_GADCON_ORIENT_CORNER_TL: case E_GADCON_ORIENT_CORNER_TL:
case E_GADCON_ORIENT_CORNER_TR: case E_GADCON_ORIENT_CORNER_TR:
e_popup_move(win->popup, x, y + h); e_win_move(win->ewin, x, y + h);
break; break;
case E_GADCON_ORIENT_BOTTOM: case E_GADCON_ORIENT_BOTTOM:
case E_GADCON_ORIENT_CORNER_BR: case E_GADCON_ORIENT_CORNER_BR:
case E_GADCON_ORIENT_CORNER_BL: case E_GADCON_ORIENT_CORNER_BL:
e_popup_move(win->popup, x, y - ph); e_win_move(win->ewin, x, y - ph);
break; break;
case E_GADCON_ORIENT_LEFT: case E_GADCON_ORIENT_LEFT:
case E_GADCON_ORIENT_CORNER_LT: case E_GADCON_ORIENT_CORNER_LT:
case E_GADCON_ORIENT_CORNER_LB: case E_GADCON_ORIENT_CORNER_LB:
e_popup_move(win->popup, x + w, y); e_win_move(win->ewin, x + w, y);
break; break;
case E_GADCON_ORIENT_RIGHT: case E_GADCON_ORIENT_RIGHT:
case E_GADCON_ORIENT_CORNER_RT: case E_GADCON_ORIENT_CORNER_RT:
case E_GADCON_ORIENT_CORNER_RB: case E_GADCON_ORIENT_CORNER_RB:
e_popup_move(win->popup, x - pw, y); e_win_move(win->ewin, x - pw, y);
break; break;
case E_GADCON_ORIENT_FLOAT: case E_GADCON_ORIENT_FLOAT:
case E_GADCON_ORIENT_HORIZ: case E_GADCON_ORIENT_HORIZ:
@ -197,15 +197,15 @@ _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
inst->win = win; inst->win = win;
if (win->popup->x + pw > win->popup->zone->w) if (win->ewin->x + pw > win->zone->w)
e_popup_move(win->popup, win->popup->zone->w - pw, win->popup->y); e_win_move(win->ewin, win->zone->w - pw, win->ewin->y);
if (win->popup->y + ph > win->popup->zone->h) if (win->ewin->y + ph > win->zone->h)
e_popup_move(win->popup, win->popup->x, win->popup->zone->h - ph); e_win_move(win->ewin, win->ewin->x, win->zone->h - ph);
e_gadcon_locked_set(inst->gcc->gadcon, 1); e_gadcon_locked_set(inst->gcc->gadcon, 1);
inst->del_fn = e_object_delfn_add(E_OBJECT(win->popup), _del_func, inst); inst->del_fn = e_object_delfn_add(E_OBJECT(win->ewin), _del_func, inst);
edje_object_signal_emit(inst->o_button, "e,state,focused", "e"); edje_object_signal_emit(inst->o_button, "e,state,focused", "e");
} }

View File

@ -67,6 +67,7 @@ _add_item(Plugin *p, Plugin_Config *pc)
it->icon_get = itp->icon_get; it->icon_get = itp->icon_get;
it->data = pc; it->data = pc;
it->browseable = EINA_TRUE; it->browseable = EINA_TRUE;
it->detail = eina_stringshare_ref(EVRY_ITEM(p)->label);
p->plugins = eina_list_append(p->plugins, it); p->plugins = eina_list_append(p->plugins, it);
} }
return it; return it;
@ -100,9 +101,7 @@ _begin_all(Evry_Plugin *plugin, const Evry_Item *item)
{ {
if (!strcmp(pc->name, "All") || if (!strcmp(pc->name, "All") ||
!strcmp(pc->name, "Actions") || !strcmp(pc->name, "Actions") ||
!strcmp(pc->name, "Text") ||
!strcmp(pc->name, "Calculator") || !strcmp(pc->name, "Calculator") ||
!strcmp(pc->name, "Spell Checker") ||
!strcmp(pc->name, "Plugins")) !strcmp(pc->name, "Plugins"))
continue; continue;
@ -139,51 +138,17 @@ _fetch(Evry_Plugin *plugin, const char *input)
return !!(plugin->items); return !!(plugin->items);
} }
Eina_Bool static Evry_Plugin *
evry_plug_collection_init(void) _add_plugin(const char *name)
{ {
Evry_Plugin *p; Evry_Plugin *p;
Plugin_Config *pc, *pcc;
Eina_List *l;
char path[4096]; char path[4096];
char title[4096]; char title[4096];
plugin_config.min_query = 0; p = EVRY_PLUGIN_NEW(Evry_Plugin, N_(name),
plugin_config.top_level = EINA_TRUE;
plugin_config.aggregate = EINA_FALSE;
plugin_config.view_mode = VIEW_MODE_DETAIL;
COLLECTION_PLUGIN = evry_type_register("COLLECTION_PLUGIN");
e_configure_registry_category_add
("extensions", 80, _("Extensions"), NULL, "preferences-extensions");
p = EVRY_PLUGIN_NEW(Evry_Plugin, N_("Plugins"),
_module_icon, COLLECTION_PLUGIN,
_begin_all, _finish, _fetch, NULL);
p->browse = &_browse;
if (evry_plugin_register(p, EVRY_PLUGIN_SUBJECT, 100))
{
p->config->aggregate = EINA_TRUE;
p->config->top_level = EINA_TRUE;
p->config->view_mode = VIEW_MODE_THUMB;
}
plugins = eina_list_append(plugins, p);
EINA_LIST_FOREACH(evry_conf->collections, l, pc)
{
p = EVRY_PLUGIN_NEW(Evry_Plugin, N_(pc->name),
_module_icon, COLLECTION_PLUGIN, _module_icon, COLLECTION_PLUGIN,
_begin, _finish, _fetch, NULL); _begin, _finish, _fetch, NULL);
p->browse = &_browse; p->browse = &_browse;
p->config = pc;
pc->plugin = p;
if (evry_plugin_register(p, EVRY_PLUGIN_SUBJECT, 1))
{
p->config->aggregate = EINA_FALSE;
}
snprintf(path, sizeof(path), "extensions/everything-%s", p->name); snprintf(path, sizeof(path), "extensions/everything-%s", p->name);
@ -195,6 +160,44 @@ evry_plug_collection_init(void)
p->config_path = eina_stringshare_add(path); p->config_path = eina_stringshare_add(path);
plugins = eina_list_append(plugins, p); plugins = eina_list_append(plugins, p);
return p;
}
Eina_Bool
evry_plug_collection_init(void)
{
Evry_Plugin *p;
Plugin_Config *pc;
Eina_List *l;
plugin_config.min_query = 0;
plugin_config.top_level = EINA_TRUE;
plugin_config.aggregate = EINA_FALSE;
plugin_config.view_mode = VIEW_MODE_DETAIL;
COLLECTION_PLUGIN = evry_type_register("COLLECTION_PLUGIN");
e_configure_registry_category_add
("extensions", 80, _("Extensions"), NULL, "preferences-extensions");
p = _add_plugin("Plugins");
p->begin = &_begin_all;
if (evry_plugin_register(p, EVRY_PLUGIN_SUBJECT, 100))
{
p->config->aggregate = EINA_TRUE;
p->config->top_level = EINA_TRUE;
p->config->view_mode = VIEW_MODE_THUMB;
}
EINA_LIST_FOREACH(evry_conf->collections, l, pc)
{
p = _add_plugin(pc->name);
p->config = pc;
pc->plugin = p;
if (evry_plugin_register(p, EVRY_PLUGIN_SUBJECT, 1))
p->config->aggregate = EINA_FALSE;
} }
return EINA_TRUE; return EINA_TRUE;

View File

@ -3,6 +3,12 @@
static Evry_Plugin *p1; static Evry_Plugin *p1;
static Evry_Plugin *p2; static Evry_Plugin *p2;
static Evry_Plugin *
_begin(Evry_Plugin *p, const Evry_Item *it)
{
return p;
}
static void static void
_finish(Evry_Plugin *p) _finish(Evry_Plugin *p)
{ {
@ -38,11 +44,11 @@ evry_plug_text_init(void)
{ {
p1 = EVRY_PLUGIN_NEW(Evry_Plugin, N_("Text"), p1 = EVRY_PLUGIN_NEW(Evry_Plugin, N_("Text"),
"accessories-text-editor", EVRY_TYPE_TEXT, "accessories-text-editor", EVRY_TYPE_TEXT,
NULL, _finish, _fetch, NULL); _begin, _finish, _fetch, NULL);
p2 = EVRY_PLUGIN_NEW(Evry_Plugin, N_("Text"), p2 = EVRY_PLUGIN_NEW(Evry_Plugin, N_("Text"),
"accessories-text-editor", EVRY_TYPE_TEXT, "accessories-text-editor", EVRY_TYPE_TEXT,
NULL, _finish, _fetch, NULL); _begin, _finish, _fetch, NULL);
if (evry_plugin_register(p1, EVRY_PLUGIN_OBJECT,999)) if (evry_plugin_register(p1, EVRY_PLUGIN_OBJECT,999))
{ {

View File

@ -106,7 +106,7 @@ _evry_plugin_action_browse(Evry_Action *act)
sel = it->plugin->state->selector; sel = it->plugin->state->selector;
evry_selectors_switch(-1, EINA_TRUE); evry_selectors_switch(sel->win, -1, EINA_TRUE);
if ((p = pp->begin(pp, it))) if ((p = pp->begin(pp, it)))
{ {

View File

@ -149,8 +149,8 @@ struct _Evry_Plugin
active. free 'items' here */ active. free 'items' here */
void (*finish) (Evry_Plugin *p); void (*finish) (Evry_Plugin *p);
/* optional: plugin is added to the list of current plugins and /* plugin is added to the list of current plugins and
queried for results when not returning NULL. The previos queried for results when not returning NULL. The previous
selectors item is passed, i.e. a plugin registered as action selectors item is passed, i.e. a plugin registered as action
receives the subject, a plugin registered as object receives the receives the subject, a plugin registered as object receives the
action item. here you can check wheter the plugin can be queried, action item. here you can check wheter the plugin can be queried,

View File

@ -205,21 +205,27 @@ _item_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
Evas_Event_Mouse_Down *ev = event_info; Evas_Event_Mouse_Down *ev = event_info;
Item *it = data; Item *it = data;
Smart_Data *sd = evas_object_smart_data_get(it->obj); Smart_Data *sd = evas_object_smart_data_get(it->obj);
const Evry_State *s;
if (!sd) return; if (!sd) return;
sd->mouse_act = 1; sd->mouse_act = 1;
sd->it_down = it; sd->it_down = it;
sd->mouse_button = ev->button; sd->mouse_button = ev->button;
s = sd->view->state;
if ((ev->button == 1) && (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)) if ((ev->button == 1) && (ev->flags & EVAS_BUTTON_DOUBLE_CLICK))
{ {
evry_item_select(sd->view->state, it->item); if (it != sd->cur_item)
{
evry_item_select(s, it->item);
_pan_item_select(it->obj, it, 0); _pan_item_select(it->obj, it, 0);
}
if (it->item->browseable) if (it->item->browseable)
evry_browse_item(it->item); evry_browse_item(it->item);
else else
evry_plugin_action(1); evry_plugin_action(s->selector->win, 1);
} }
else else
{ {
@ -234,6 +240,7 @@ _item_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
Evas_Event_Mouse_Up *ev = event_info; Evas_Event_Mouse_Up *ev = event_info;
Item *it = data; Item *it = data;
Smart_Data *sd = evas_object_smart_data_get(it->obj); Smart_Data *sd = evas_object_smart_data_get(it->obj);
const Evry_State *s;
if (!sd) return; if (!sd) return;
sd->mouse_x = 0; sd->mouse_x = 0;
@ -245,20 +252,23 @@ _item_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e"); edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
sd->it_down = NULL; sd->it_down = NULL;
s = sd->view->state;
if (ev->button == 1) if (ev->button == 1)
{ {
if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)) if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) &&
(it != sd->cur_item))
{ {
evry_item_select(sd->view->state, it->item); evry_item_select(s, it->item);
_pan_item_select(it->obj, it, 0); _pan_item_select(it->obj, it, 0);
} }
} }
else if (ev->button == 3) else if (ev->button == 3)
{ {
evry_item_select(sd->view->state, it->item); evry_item_select(s, it->item);
_pan_item_select(it->obj, it, 0); _pan_item_select(it->obj, it, 0);
evry_plugin_action(0); evry_plugin_action(s->selector->win, 0);
} }
} }
@ -1313,7 +1323,7 @@ _cb_key_down(Evry_View *view, const Ecore_Event_Key *ev)
} }
else else
{ {
if (it->y >= cur - sd->h) break; if (it->y + it->h >= cur - sd->h) break;
} }
if (!l->next) if (!l->next)
@ -1487,9 +1497,9 @@ _view_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
sd->mouse_x = 0; sd->mouse_x = 0;
sd->mouse_y = 0; sd->mouse_y = 0;
if (sel->states->next) if (sel->states->next)
evry_browse_back(NULL); evry_browse_back(sel);
else else
evry_selectors_switch(-1, EINA_TRUE); evry_selectors_switch(sel->win, -1, EINA_TRUE);
} }
else if ((sd->it_down && (sd->cur_item == sd->it_down)) && else if ((sd->it_down && (sd->cur_item == sd->it_down)) &&
(sd->mouse_x - ev->cur.canvas.x > SLIDE_RESISTANCE)) (sd->mouse_x - ev->cur.canvas.x > SLIDE_RESISTANCE))
@ -1503,7 +1513,7 @@ _view_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
} }
else else
{ {
evry_selectors_switch(1, EINA_TRUE); evry_selectors_switch(sel->win, 1, EINA_TRUE);
} }
sd->it_down = NULL; sd->it_down = NULL;
@ -1529,7 +1539,6 @@ _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
v = E_NEW(View, 1); v = E_NEW(View, 1);
v->view = *view; v->view = *view;
v->view.clear_timer = NULL;
v->state = s; v->state = s;
v->evas = evas_object_evas_get(swallow); v->evas = evas_object_evas_get(swallow);

View File

@ -2,7 +2,6 @@
static Evry_View *view; static Evry_View *view;
static Evas_Object *o_text = NULL; static Evas_Object *o_text = NULL;
static const Evry_State *state = NULL;
static void static void
_view_clear(Evry_View *v) _view_clear(Evry_View *v)
@ -13,7 +12,6 @@ _view_clear(Evry_View *v)
o_text = NULL; o_text = NULL;
} }
static int static int
_view_update(Evry_View *v) _view_update(Evry_View *v)
{ {
@ -55,7 +53,7 @@ _cb_key_down(Evry_View *v, const Ecore_Event_Key *ev)
return 1; return 1;
} }
evry_view_toggle((Evry_State *)state, NULL); evry_view_toggle(v->state, NULL);
return 1; return 1;
} }
@ -106,7 +104,6 @@ _view_create(Evry_View *v, const Evry_State *s, const Evas_Object *swallow)
o_text = o; o_text = o;
v->active = 1; v->active = 1;
state = s;
return v; return v;
} }

View File

@ -26,7 +26,6 @@ _timer_cb(void *data)
v->timer = NULL; v->timer = NULL;
return 0; return 0;
} }
static void static void
@ -117,7 +116,8 @@ _tabs_update(Tab_View *v)
if (!w && !v->timer) if (!w && !v->timer)
{ {
v->timer = ecore_timer_add(0.1, _timer_cb, v); v->timer = ecore_idle_exiter_add(_timer_cb, v);
e_util_wakeup();
return; return;
} }
@ -384,7 +384,7 @@ evry_tab_view_free(Tab_View *v)
ecore_animator_del(v->animator); ecore_animator_del(v->animator);
if (v->timer) if (v->timer)
ecore_timer_del(v->timer); ecore_idle_exiter_del(v->timer);
E_FREE(v); E_FREE(v);
} }