enlightenment/src/modules/everything/evry_plug_collection.c

214 lines
4.4 KiB
C

#include "e_mod_main.h"
typedef struct _Plugin Plugin;
struct _Plugin
{
Evry_Plugin base;
Eina_List *plugins;
};
static Eina_List *plugins = NULL;
static Evry_Type COLLECTION_PLUGIN;
static Plugin_Config plugin_config;
static Evry_Plugin *
_browse(Evry_Plugin *plugin, const Evry_Item *item)
{
Evry_Plugin *inst;
Evry_Plugin *pp;
Plugin_Config *pc;
if (!CHECK_TYPE(item, COLLECTION_PLUGIN))
return NULL;
if (item->plugin != plugin)
return NULL;
pc = item->data;
pp = pc->plugin;
if (pp->begin && (inst = pp->begin(pp, NULL)))
{
if (!strcmp(plugin->name, "Plugins"))
inst->config = &plugin_config;
else
inst->config = pc;
return inst;
}
return NULL;
}
static Evry_Item *
_add_item(Plugin *p, Plugin_Config *pc)
{
Evry_Plugin *pp;
Evry_Item *it = NULL;
if (pc->enabled && (pp = evry_plugin_find(pc->name)))
{
pc->plugin = pp;
GET_ITEM(itp, pp);
it = EVRY_ITEM_NEW(Evry_Item, EVRY_PLUGIN(p), itp->label, NULL, NULL);
if (itp->icon) it->icon = eina_stringshare_ref(itp->icon);
it->icon_get = itp->icon_get;
it->data = pc;
it->browseable = EINA_TRUE;
it->detail = eina_stringshare_ref(EVRY_ITEM(p)->label);
p->plugins = eina_list_append(p->plugins, it);
}
return it;
}
static Evry_Plugin *
_begin(Evry_Plugin *plugin, const Evry_Item *item __UNUSED__)
{
Plugin_Config *pc;
Eina_List *l;
Plugin *p;
EVRY_PLUGIN_INSTANCE(p, plugin);
EINA_LIST_FOREACH (plugin->config->plugins, l, pc)
_add_item(p, pc);
return EVRY_PLUGIN(p);
}
static Evry_Plugin *
_begin_all(Evry_Plugin *plugin, const Evry_Item *item __UNUSED__)
{
Plugin_Config *pc;
Eina_List *l;
Plugin *p;
EVRY_PLUGIN_INSTANCE(p, plugin);
EINA_LIST_FOREACH (evry_conf->conf_subjects, l, pc)
{
if (!strcmp(pc->name, "All") ||
!strcmp(pc->name, "Actions") ||
!strcmp(pc->name, "Calculator") ||
!strcmp(pc->name, "Plugins"))
continue;
_add_item(p, pc);
}
return EVRY_PLUGIN(p);
}
static void
_finish(Evry_Plugin *plugin)
{
Evry_Item *it;
GET_PLUGIN(p, plugin);
EVRY_PLUGIN_ITEMS_CLEAR(p);
EINA_LIST_FREE (p->plugins, it)
EVRY_ITEM_FREE(it);
E_FREE(p);
}
static int
_fetch(Evry_Plugin *plugin, const char *input)
{
GET_PLUGIN(p, plugin);
EVRY_PLUGIN_ITEMS_CLEAR(p);
EVRY_PLUGIN_ITEMS_ADD(p, p->plugins, input, 1, 0);
return EVRY_PLUGIN_HAS_ITEMS(p);
}
static Evry_Plugin *
_add_plugin(const char *name)
{
Evry_Plugin *p;
char path[4096];
char title[4096];
p = EVRY_PLUGIN_BASE(name, NULL, COLLECTION_PLUGIN,
_begin, _finish, _fetch);
p->browse = &_browse;
snprintf(path, sizeof(path), "launcher/everything-%s", p->name);
snprintf(title, sizeof(title), "%s: %s", _("Everything Plugin"), p->base.label);
e_configure_registry_item_params_add
(path, 110, title, NULL, p->base.icon, evry_collection_conf_dialog, p->name);
p->config_path = eina_stringshare_add(path);
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");
p = _add_plugin(N_("Plugins"));
p->begin = &_begin_all;
EVRY_ITEM_ICON_SET(p, "preferences-plugin");
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);
EVRY_ITEM_ICON_SET(p, "start-here");
p->config = pc;
pc->plugin = p;
if (evry_plugin_register(p, EVRY_PLUGIN_SUBJECT, 1))
p->config->aggregate = EINA_FALSE;
}
return EINA_TRUE;
}
void
evry_plug_collection_shutdown(void)
{
Evry_Plugin *p;
EINA_LIST_FREE (plugins, p)
{
if (p->config_path)
{
e_configure_registry_item_del(p->config_path);
eina_stringshare_del(p->config_path);
}
EVRY_PLUGIN_FREE(p);
}
}