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.

305 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
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
9 years ago
#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