daed468048c8fbeb41f7f29d53cab59a88b871e2
[framework/uifw/e17.git] / src / modules / everything / evry_plugin.c
1 #include "e_mod_main.h"
2
3 static Eina_List *actions = NULL;
4
5 int
6 evry_plugins_init(void)
7 {
8    return 1;
9 }
10
11 void
12 evry_plugins_shutdown(void)
13 {
14    Evry_Action *act;
15
16    EINA_LIST_FREE(actions, act)
17      evry_action_free(act);
18 }
19
20
21 static int
22 _evry_cb_plugin_sort(const void *data1, const void *data2)
23 {
24    const Plugin_Config *pc1 = data1;
25    const Plugin_Config *pc2 = data2;
26
27    return pc1->priority - pc2->priority;
28 }
29
30 void
31 _evry_plugin_free(Evry_Item *it)
32 {
33    GET_EVRY_PLUGIN(p, it);
34
35    evry_plugin_unregister(p);
36
37    DBG("%s", p->name);
38    if (p->config) p->config->plugin = NULL;
39    if (p->name) eina_stringshare_del(p->name);
40
41    if (p->free)
42      p->free(p);
43    else
44      E_FREE(p);
45 }
46
47 Evry_Plugin *
48 evry_plugin_new(Evry_Plugin *base, const char *name, const char *label,
49                 const char *icon, Evry_Type item_type,
50                 Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item),
51                 void (*finish) (Evry_Plugin *p),
52                 int  (*fetch) (Evry_Plugin *p, const char *input),
53                 void (*cb_free) (Evry_Plugin *p))
54 {
55    Evry_Plugin *p;
56    Evry_Item *it;
57
58    if (base)
59      p = base;
60    else
61      p = E_NEW(Evry_Plugin, 1);
62
63    it = evry_item_new(EVRY_ITEM(p), NULL, label, NULL, _evry_plugin_free);
64    it->plugin = p;
65    it->browseable = EINA_TRUE;
66    it->type  = EVRY_TYPE_PLUGIN;
67    if (item_type)
68      it->subtype = item_type;
69    if (icon)
70      it->icon = eina_stringshare_add(icon);
71
72    p->name   = eina_stringshare_add(name);
73    p->begin  = begin;
74    p->finish = finish;
75    p->fetch  = fetch;
76
77    p->async_fetch = EINA_FALSE;
78    p->history     = EINA_TRUE;
79
80    p->free = cb_free;
81
82    return p;
83 }
84
85 void
86 evry_plugin_free(Evry_Plugin *p)
87 {
88    evry_item_free(EVRY_ITEM(p));
89 }
90
91 static int
92 _evry_plugin_action_browse(Evry_Action *act)
93 {
94    Evry_Plugin *p;
95    Eina_List *plugins = NULL;
96    Evry_Selector *sel;
97
98    GET_ITEM(it, act->it1.item);
99    GET_EVRY_PLUGIN(pp, EVRY_ITEM(act)->data);
100
101    if (!it->plugin || !it->plugin->state)
102      return 0;
103
104    sel = it->plugin->state->selector;
105
106    evry_selectors_switch(sel->win, -1, EINA_TRUE);
107
108    if ((p = pp->begin(pp, it)))
109      {
110         plugins = eina_list_append(plugins, p);
111
112         if (!evry_state_push(sel, plugins))
113           eina_list_free(plugins);
114      }
115
116    return 0;
117 }
118
119 int
120 evry_plugin_register(Evry_Plugin *p, int type, int priority)
121 {
122    Eina_List *l;
123    Plugin_Config *pc;
124    Eina_List *conf;
125    int new_conf = 0;
126
127    if ((type < 0) || (type > 2))
128      return 0;
129
130    if (type == EVRY_PLUGIN_SUBJECT)
131      conf = evry_conf->conf_subjects;
132    else if (type == EVRY_PLUGIN_ACTION)
133      conf = evry_conf->conf_actions;
134    else if (type == EVRY_PLUGIN_OBJECT)
135      conf = evry_conf->conf_objects;
136
137    EINA_LIST_FOREACH(conf, l, pc)
138      if (pc->name && p->name && !strcmp(pc->name, p->name))
139        break;
140
141    /* check if module of same name is already loaded */
142    /* if ((pc) && (pc->plugin))
143     *   return 0; */
144    
145    /* collection plugin sets its own config */
146    if (!pc && p->config)
147      {
148         conf = eina_list_append(conf, p->config);
149         pc = p->config;
150      }
151    else if (!pc)
152      {
153         new_conf = 1;
154         pc = E_NEW(Plugin_Config, 1);
155         pc->name = eina_stringshare_add(p->name);
156         pc->enabled = 1;
157         pc->priority = priority ? priority : 100;
158         pc->view_mode = VIEW_MODE_NONE;
159         pc->aggregate = EINA_TRUE;
160         pc->top_level = EINA_TRUE;
161
162         conf = eina_list_append(conf, pc);
163      }
164    if (pc->trigger && strlen(pc->trigger) == 0)
165      {
166         eina_stringshare_del(pc->trigger);
167         pc->trigger = NULL;
168      }
169
170    p->config = pc;
171    pc->plugin = p;
172
173    conf = eina_list_sort(conf, -1, _evry_cb_plugin_sort);
174
175    if (type == EVRY_PLUGIN_SUBJECT)
176      evry_conf->conf_subjects = conf;
177    else if (type == EVRY_PLUGIN_ACTION)
178      evry_conf->conf_actions = conf;
179    else if (type == EVRY_PLUGIN_OBJECT)
180      evry_conf->conf_objects = conf;
181    
182    if ((type == EVRY_PLUGIN_SUBJECT) && (strcmp(p->name, "All")))
183      {
184         char buf[256];
185         snprintf(buf, sizeof(buf), _("Show %s Plugin"), p->name);
186
187         e_action_predef_name_set(_("Everything Launcher"), buf,
188                                  "everything", p->name, NULL, 1);
189      }
190
191    if (p->input_type)
192      {
193         Evry_Action *act;
194         char buf[256];
195         snprintf(buf, sizeof(buf), _("Browse %s"), EVRY_ITEM(p)->label);
196
197         act = EVRY_ACTION_NEW(buf, p->input_type, 0, EVRY_ITEM(p)->icon,
198                               _evry_plugin_action_browse, NULL);
199         EVRY_ITEM(act)->icon_get = EVRY_ITEM(p)->icon_get;
200         EVRY_ITEM(act)->data = p;
201         evry_action_register(act, 1);
202         actions = eina_list_append(actions, act);
203      }
204
205    return new_conf;
206 }
207
208 void
209 evry_plugin_unregister(Evry_Plugin *p)
210 {
211    DBG("%s", p->name);
212    Eina_List *l = evry_conf->conf_subjects;
213
214    if (l && eina_list_data_find_list(l, p->config))
215      {
216         char buf[256];
217         snprintf(buf, sizeof(buf), _("Show %s Plugin"), p->name);
218
219         e_action_predef_name_del(_("Everything"), buf);
220      }
221 }
222
223 Evry_Plugin *
224 evry_plugin_find(const char *name)
225 {
226    Plugin_Config *pc = NULL;
227    Eina_List *l;
228    const char *n = eina_stringshare_add(name);
229
230    EINA_LIST_FOREACH(evry_conf->conf_subjects, l, pc)
231      {
232         if (!pc->plugin) continue;
233         if (pc->name == n)
234           break;
235      }
236
237    eina_stringshare_del(n);
238
239    if (!pc) return NULL;
240
241    return pc->plugin;
242 }