1 #include "e_mod_main.h"
3 /* action selector plugin: provides list of actions registered for
4 candidate types provided by current plugin */
6 typedef struct _Plugin Plugin;
16 static Evry_Plugin *_plug = NULL;
19 _finish(Evry_Plugin *plugin)
21 GET_PLUGIN(p, plugin);
24 EVRY_PLUGIN_ITEMS_CLEAR(p);
26 EINA_LIST_FREE (p->actions, act) ;
31 _browse(Evry_Plugin *plugin, const Evry_Item *it)
36 if (!CHECK_TYPE(it, EVRY_TYPE_ACTION))
41 EVRY_PLUGIN_INSTANCE(p, plugin);
42 p->actions = act->fetch(act);
43 p->parent = EINA_TRUE;
46 return EVRY_PLUGIN(p);
50 _begin(Evry_Plugin *plugin, const Evry_Item *it)
56 EVRY_PLUGIN_INSTANCE(p, plugin);
58 if (!(CHECK_TYPE(it, EVRY_TYPE_PLUGIN)))
60 EINA_LIST_FOREACH (evry_conf->actions, l, act)
62 if (!((!act->it1.type) ||
63 (CHECK_TYPE(it, act->it1.type)) ||
64 (CHECK_SUBTYPE(it, act->it1.type))))
67 if (act->check_item && !(act->check_item(act, it)))
70 act->base.plugin = EVRY_PLUGIN(p);
72 EVRY_ITEM(act)->hi = NULL;
74 p->actions = eina_list_append(p->actions, act);
80 EINA_LIST_FOREACH (it->plugin->actions, l, act)
82 act->base.plugin = EVRY_PLUGIN(p);
84 act->it1.item = EVRY_ITEM(it->plugin);
85 EVRY_ITEM(act)->hi = NULL;
86 p->actions = eina_list_append(p->actions, act);
90 return EVRY_PLUGIN(p);
94 _cb_sort(const void *data1, const void *data2)
96 const Evry_Item *it1 = data1;
97 const Evry_Item *it2 = data2;
98 const Evry_Action *act1 = data1;
99 const Evry_Action *act2 = data2;
101 if (act1->remember_context || act2->remember_context)
103 if (act1->remember_context && !act2->remember_context)
105 if (!act1->remember_context && act2->remember_context)
109 /* sort type match before subtype match */
110 if (act1->it1.item && act2->it1.item)
112 if ((act1->it1.type == act1->it1.item->type) &&
113 (act2->it1.type != act2->it1.item->type))
116 if ((act1->it1.type != act1->it1.item->type) &&
117 (act2->it1.type == act2->it1.item->type))
121 if (it1->fuzzy_match || it2->fuzzy_match)
122 if (it1->fuzzy_match || it2->fuzzy_match)
124 if (it1->fuzzy_match && !it2->fuzzy_match)
127 if (!it1->fuzzy_match && it2->fuzzy_match)
130 if (it1->fuzzy_match - it2->fuzzy_match)
131 return it1->fuzzy_match - it2->fuzzy_match;
134 if (it1->priority - it2->priority)
135 return it1->priority - it2->priority;
141 _fetch(Evry_Plugin *plugin, const char *input)
143 GET_PLUGIN(p, plugin);
148 EVRY_PLUGIN_ITEMS_CLEAR(p);
150 EINA_LIST_FOREACH (p->actions, l, it)
152 match = evry_fuzzy_match(it->label, input);
156 it->fuzzy_match = match;
157 EVRY_PLUGIN_ITEM_APPEND(p, it);
161 if (!plugin->items) return 0;
163 EVRY_PLUGIN_ITEMS_SORT(p, _cb_sort);
168 /***************************************************************************/
171 evry_plug_actions_init()
173 _plug = EVRY_PLUGIN_BASE("Actions", NULL, EVRY_TYPE_ACTION,
174 _begin, _finish, _fetch);
176 _plug->browse = &_browse;
178 evry_plugin_register(_plug, EVRY_PLUGIN_ACTION, 2);
184 evry_plug_actions_shutdown()
188 evry_plugin_free(_plug);
190 /* bypass unregister, because it modifies the list */
191 EINA_LIST_FREE (evry_conf->actions, it)
196 evry_action_register(Evry_Action *act, int priority)
198 EVRY_ITEM(act)->priority = priority;
200 evry_conf->actions = eina_list_append(evry_conf->actions, act);
201 /* TODO sorting, initialization, etc */
205 evry_action_unregister(Evry_Action *act)
207 evry_conf->actions = eina_list_remove(evry_conf->actions, act);
212 _action_free_cb(Evry_Item *it)
216 IF_RELEASE(act->name);
222 evry_action_new(const char *name, const char *label,
223 Evry_Type type_in1, Evry_Type type_in2,
225 int (*action)(Evry_Action *act),
226 int (*check_item)(Evry_Action *act, const Evry_Item *it))
228 Evry_Action *act = EVRY_ITEM_NEW(Evry_Action, _plug, label,
229 NULL, _action_free_cb);
231 act->base.icon = eina_stringshare_add(icon);
233 act->name = eina_stringshare_add(name);
235 act->it1.type = type_in1;
236 act->it2.type = type_in2;
238 act->action = action;
239 act->check_item = check_item;
245 evry_action_free(Evry_Action *act)
247 evry_action_unregister(act);
249 evry_item_free(EVRY_ITEM(act));
252 /* TODO assign actions to plugins othersie there will be too liitle
255 evry_action_find(const char *name)
257 Evry_Action *act = NULL;
260 const char *n = eina_stringshare_add(name);
262 EINA_LIST_FOREACH (evry_conf->actions, l, act)
266 eina_stringshare_del(n);