You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

304 lines
10 KiB

#ifndef EVRY_API_H
#define EVRY_API_H
#include "evry_types.h"
#define EVRY_API_VERSION 31
#define EVRY_ACTION_OTHER 0
#define EVRY_ACTION_FINISHED 1
#define EVRY_ACTION_CONTINUE 2
#define EVRY_ACTION_CLEAR 3
#define EVRY_UPDATE_ADD 0
#define EVRY_UPDATE_CLEAR 1
#define EVRY_UPDATE_REFRESH 2
#define EVRY_COMPLETE_NONE 0
#define EVRY_COMPLETE_INPUT 1
#define EVRY_COMPLETE_BROWSE 2
#define VIEW_MODE_NONE -1
#define VIEW_MODE_LIST 0
#define VIEW_MODE_DETAIL 1
#define VIEW_MODE_THUMB 2
#define EVRY_PLUGIN_SUBJECT 0
#define EVRY_PLUGIN_ACTION 1
#define EVRY_PLUGIN_OBJECT 2
#define EVRY_TYPE_NONE 0
#define EVRY_TYPE_FILE 1
#define EVRY_TYPE_DIR 2
#define EVRY_TYPE_APP 3
#define EVRY_TYPE_ACTION 4
#define EVRY_TYPE_PLUGIN 5
#define EVRY_TYPE_CLIENT 6
#define EVRY_TYPE_TEXT 7
#define NUM_EVRY_TYPES 8
#define EVRY_EVENT_ITEM_SELECTED 0
#define EVRY_EVENT_ITEM_CHANGED 1
#define EVRY_EVENT_ITEMS_UPDATE 2
#define EVRY_EVENT_ACTION_PERFORMED 3
#define EVRY_EVENT_PLUGIN_SELECTED 4
#define NUM_EVRY_EVENTS 5
typedef struct _Evry_API Evry_API;
typedef struct _Evry_Module Evry_Module;
typedef struct _Evry_Event_Item_Changed Evry_Event_Item_Changed;
typedef struct _Evry_Event_Item_Selected Evry_Event_Item_Selected;
typedef struct _Evry_Event_Action_Performed Evry_Event_Action_Performed;
typedef void (*Evry_Item_Free_Cb) (Evry_Item *it);
struct _Evry_Module
{
Eina_Bool active;
int (*init)(const Evry_API *api);
void (*shutdown)(void);
};
struct _Evry_API
{
int (*api_version_check)(int version);
Evry_Item *(*item_new)(Evry_Item *base, Evry_Plugin *p, const char *label,
Evas_Object *(*icon_get) (Evry_Item *it, Evas *e),
Evry_Item_Free_Cb item_free);
void (*item_free)(Evry_Item *it);
void (*item_ref)(Evry_Item *it);
/* sends EVRY_EVENT_ITEM_CHANGED event */
void (*item_changed)(Evry_Item *it, int change_icon, int change_selected);
Evry_Plugin *(*plugin_new)(Evry_Plugin *base, const char *name,
const char *label, const char *icon,
Evry_Type item_type,
Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item),
void (*cleanup) (Evry_Plugin *p),
int (*fetch) (Evry_Plugin *p, const char *input));
void (*plugin_free)(Evry_Plugin *p);
/* when a new plugin config was created return val is 1. in this
case you can set defaults of p->config */
int (*plugin_register)(Evry_Plugin *p, int type, int priority);
void (*plugin_unregister)(Evry_Plugin *p);
void (*plugin_update)(Evry_Plugin *plugin, int state);
Evry_Plugin *(*plugin_find)(const char *name);
Evry_Action *(*action_new)(const char *name, const char *label,
Evry_Type type1, Evry_Type type2,
const char *icon,
int (*action) (Evry_Action *act),
int (*check_item) (Evry_Action *act, const Evry_Item *it));
void (*action_free)(Evry_Action *act);
void (*action_register)(Evry_Action *act, int priority);
void (*action_unregister)(Evry_Action *act);
Evry_Action *(*action_find)(const char *name);
Evry_Type (*type_register)(const char *type);
/* evry_util.c */
Evas_Object *(*icon_theme_get)(const char *icon, Evas *e);
int (*fuzzy_match)(const char *str, const char *match);
int (*util_exec_app)(const Evry_Item *it_app, const Evry_Item *it_file);
char *(*util_url_escape)(const char *string, int inlength);
char *(*util_url_unescape)(const char *string, int length);
void (*util_file_detail_set)(Evry_Item_File *file);
int (*util_plugin_items_add)(Evry_Plugin *p, Eina_List *items, const char *input, int match_detail, int set_usage);
char *(*util_md5_sum)(const char *str);
Evas_Object *(*util_icon_get)(Evry_Item *it, Evas *e);
const char *(*file_path_get)(Evry_Item_File *file);
const char *(*file_url_get)(Evry_Item_File *file);
History_Item *(*history_item_add)(Evry_Item *it, const char *ctxt, const char *input);
History_Types *(*history_types_get)(Evry_Type type);
int (*history_item_usage_set)(Evry_Item *it, const char *input, const char *ctxt);
Ecore_Event_Handler *(*event_handler_add)(int type, Eina_Bool (*func) (void *data, int type, void *event), const void *data);
};
struct _Evry_Event_Item_Changed
{
Evry_Item *item;
int changed_selection;
int changed_icon;
};
struct _Evry_Event_Item_Selected
{
Evry_Item *item;
};
struct _Evry_Event_Action_Performed
{
const char *action;
const Evry_Item *it1;
const Evry_Item *it2;
};
/*** cast default types ***/
#define EVRY_ITEM(_item) ((Evry_Item *)_item)
#define EVRY_ACTN(_item) ((Evry_Action *) _item)
#define EVRY_PLUGIN(_plugin) ((Evry_Plugin *) _plugin)
#define EVRY_VIEW(_view) ((Evry_View *) _view)
#define EVRY_FILE(_it) ((Evry_Item_File *) _it)
#define GET_APP(_app, _item) Evry_Item_App *_app = (Evry_Item_App *) _item
#define GET_CMD(_app, _item) Evry_Item_App *_app = (Evry_Item_App *) _item
#define GET_FILE(_file, _item) Evry_Item_File *_file = (Evry_Item_File *) _item
#define GET_EVRY_PLUGIN(_p, _plugin) Evry_Plugin *_p = (Evry_Plugin*) _plugin
#define GET_PLUGIN(_p, _plugin) Plugin *_p = (Plugin*) _plugin
#define GET_VIEW(_v, _view) View *_v = (View*) _view
#define GET_ACTION(_act, _item) Evry_Action *_act = (Evry_Action *) _item
#define GET_ITEM(_it, _any) Evry_Item *_it = (Evry_Item *) _any
/*** Evry_Item macros ***/
/* */
#define EVRY_ITEM_NEW(_base, _plugin, _label, _icon_get, _free) \
(_base *) evry->item_new(EVRY_ITEM(E_NEW(_base, 1)), \
EVRY_PLUGIN(_plugin), \
_label, _icon_get, (Evry_Item_Free_Cb)_free)
#define EVRY_ITEM_FREE(_item) evry->item_free((Evry_Item *)_item)
#define EVRY_ITEM_REF(_item) evry->item_ref((Evry_Item *)_item)
#define EVRY_ITEM_DATA_INT_SET(_item, _data) \
((Evry_Item *)_item)->data = (void*)(long) _data
#define EVRY_ITEM_DATA_INT_GET(_item) (long) \
((Evry_Item *)_item)->data
#define EVRY_ITEM_DETAIL_SET(_it, _detail) \
eina_stringshare_replace(&(EVRY_ITEM(_it)->detail), _detail);
#define EVRY_ITEM_LABEL_SET(_it, _label) \
eina_stringshare_replace(&(EVRY_ITEM(_it)->label), _label);
#define EVRY_ITEM_CONTEXT_SET(_it, _context) \
eina_stringshare_replace(&(EVRY_ITEM(_it)->context), _context);
#define EVRY_ITEM_ICON_SET(_it, _icon) \
eina_stringshare_replace(&(EVRY_ITEM(_it)->icon), _icon);
#define CHECK_TYPE(_item, _type) \
(((Evry_Item *)_item)->type == _type)
#define CHECK_SUBTYPE(_item, _type) \
(((Evry_Item *)_item)->subtype == _type)
#define IS_BROWSEABLE(_item) ((Evry_Item *)_item)->browseable
/*** Evry_Plugin macros ***/
/* creates a Evry_Plugin to be registered with evry */
#define EVRY_PLUGIN_BASE(_name, _icon, _item_type, _begin, _finish, _fetch) \
evry->plugin_new(EVRY_PLUGIN(E_NEW(Evry_Plugin, 1)), _name, _(_name), _icon, _item_type, \
_begin, _finish, _fetch)
/* creates the plugin instance '_p' for the Evry_Plugin '_plugin' */
#define EVRY_PLUGIN_INSTANCE(_p, _plugin) { \
_p = E_NEW(Plugin, 1); \
_p->base = *_plugin; \
_p->base.items = NULL; \
_p->base.base.ref = 1; \
_p->base.base.plugin = (Evry_Plugin*)_p; \
_p->base.base.free = (Evry_Item_Free_Cb)_p->base.finish; \
_p->base.base.label = eina_stringshare_ref(_plugin->base.label); \
_p->base.base.detail = eina_stringshare_ref(_plugin->base.detail); \
_p->base.base.icon = eina_stringshare_ref(_plugin->base.icon); \
_p->base.base.context = eina_stringshare_ref(_plugin->base.context); \
_p->base.base.id = eina_stringshare_ref(_plugin->base.id); \
}
/* free the plugin instance '_p' */
#define EVRY_PLUGIN_FREE(_p) if (_p) evry->plugin_free(EVRY_PLUGIN(_p))
/* call free on all items provided by plugin instance '_p' */
#define EVRY_PLUGIN_ITEMS_FREE(_p) { \
Evry_Item *_it; \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, _it) \
evry->item_free(_it); }
/* append '_item' to list of items provided by plugin instance '_p' */
#define EVRY_PLUGIN_ITEM_APPEND(_p, _item) \
EVRY_PLUGIN(_p)->items = eina_list_append(EVRY_PLUGIN(_p)->items, EVRY_ITEM(_item))
/* */
#define EVRY_PLUGIN_ITEMS_ADD(_plugin, _items, _input, _match_detail, _set_usage) \
evry->util_plugin_items_add(EVRY_PLUGIN(_plugin), _items, _input, _match_detail, _set_usage)
/* call EVRY_PLUGIN_UPDATE when the list of items provided by plugin '_p' has
* changed. e.g. for files plugin when files were created or deleted
* while evry is active.
* '_action' can be EVRY_UPDATE_ADD (new items were added),
* EVRY_UPDATE_CLEAR (plugin does not provide any items) or
* EVRY_UPDATE_REFRESH (items have changed) */
#define EVRY_PLUGIN_UPDATE(_p, _action) \
if (_p) evry->plugin_update(EVRY_PLUGIN(_p), _action)
#define EVRY_PLUGIN_ITEMS_SORT(_p, _sortcb) \
EVRY_PLUGIN(_p)->items = eina_list_sort \
(EVRY_PLUGIN(_p)->items, eina_list_count(EVRY_PLUGIN(_p)->items), _sortcb)
#define EVRY_PLUGIN_MIN_QUERY(_p, _input) \
if (!(EVRY_PLUGIN(_p)->config->min_query) || \
(_input && ((int) strlen(_input) >= EVRY_PLUGIN(_p)->config->min_query)))
#define EVRY_PLUGIN_ITEMS_CLEAR(_p) { \
Evry_Item *_it; \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, _it) \
if (_it) _it->fuzzy_match = 0; }
#define EVRY_PLUGIN_HAS_ITEMS(_p) !!(EVRY_PLUGIN(_p)->items)
/*** Evry_Action macros ***/
#define EVRY_ACTION_NEW(_name, _in1, _in2, _icon, _action, _check) \
evry->action_new(N_(_name), _(_name), _in1, _in2, _icon, _action, _check)
#define EVRY_ACTION_FREE(_act) if (_act) evry->action_free(EVRY_ACTN(_act))
/* register */
#define EVRY_MODULE_NEW(_module, _evry, _init, _shutdown) \
{ \
_module = E_NEW(Evry_Module, 1); \
_module->init = &_init; \
_module->shutdown = &_shutdown; \
Eina_List *_l = e_datastore_get("evry_modules"); \
_l = eina_list_append(_l, _module); \
e_datastore_set("evry_modules", _l); \
if ((_evry = e_datastore_get("evry_api"))) \
_module->active = _init(_evry); \
}
#define EVRY_MODULE_FREE(_module) \
{ \
if (_module->active) _module->shutdown(); \
_module->active = EINA_FALSE; \
Eina_List *_l = e_datastore_get("evry_modules"); \
_l = eina_list_remove(_l, _module); \
if (_l) e_datastore_set("evry_modules", _l); \
else e_datastore_del("evry_modules"); \
E_FREE(_module); \
}
/*** handy macros ***/
#define IF_RELEASE(x) do { \
if (x) { \
const char *__tmp; __tmp = (x); \
(x) = NULL; eina_stringshare_del(__tmp); \
} \
(x) = NULL; \
} while (0)
#endif