diff options
| author | David Moc <personal@cdatgoose.org> | 2026-06-02 13:50:21 +0200 |
|---|---|---|
| committer | David Moc <personal@cdatgoose.org> | 2026-06-02 13:50:21 +0200 |
| commit | a15cb041654ae307add0b998b526c87c3f42bf5f (patch) | |
| tree | 225bb4b70e9fa05aa5f4d2722a1a9cf5fc6fca7f /include/plugin.h | |
| parent | 6aeaa171dc1ca43392f53cbd02097f76e1b1c5a0 (diff) | |
Add plugin hooks and mode plugins
Diffstat (limited to 'include/plugin.h')
| -rw-r--r-- | include/plugin.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/include/plugin.h b/include/plugin.h new file mode 100644 index 0000000..50aad33 --- /dev/null +++ b/include/plugin.h @@ -0,0 +1,110 @@ +#ifndef ECEX_PLUGIN_H +#define ECEX_PLUGIN_H + +#include "types.h" + +#include <stddef.h> +#include <stdint.h> + +#define ECEX_PLUGIN_API_VERSION 1 +#define ECEX_PLUGIN_EXPORT_READ 1 + +typedef struct ecex_plugin ecex_plugin_t; +typedef struct ecex_plugin_runtime ecex_plugin_runtime_t; + +typedef enum ecex_plugin_value_type { + ECEX_PLUGIN_BYTES = 0, + ECEX_PLUGIN_I32 = 1, + ECEX_PLUGIN_U32 = 2, + ECEX_PLUGIN_I64 = 3, + ECEX_PLUGIN_PTR = 4, +} ecex_plugin_value_type_t; + +ecex_plugin_runtime_t *ecex_plugin_runtime_new(void); +void ecex_plugin_runtime_free(ecex_plugin_runtime_t *runtime); + +ecex_plugin_t *ecex_plugin_register(ecex_t *ed, const char *id, int api_version); +ecex_plugin_t *ecex_plugin_require(ecex_t *ed, const char *id, int api_version); +ecex_plugin_t *ecex_plugin_find(ecex_t *ed, const char *id); +const char *ecex_plugin_id(ecex_plugin_t *plugin); + +/* Plugin slots are named, plugin-private arrays unless explicitly exported. */ +void *ecex_plugin_slot_alloc(ecex_plugin_t *plugin, + const char *name, + size_t count, + size_t elem_size); +void *ecex_plugin_slot_get(ecex_plugin_t *plugin, const char *name); +int ecex_plugin_slot_free(ecex_plugin_t *plugin, const char *name); +int ecex_plugin_slot_set_export_flags(ecex_plugin_t *plugin, + const char *name, + int type, + int flags); +int ecex_plugin_slot_read_exported(ecex_t *ed, + const char *plugin_id, + const char *name, + void *out, + size_t out_cap, + size_t *out_len); + +int ecex_plugin_slot_i32_get_scalar(ecex_plugin_t *plugin, const char *name, int fallback); +int ecex_plugin_slot_i32_get(ecex_plugin_t *plugin, + const char *name, + size_t index, + int fallback); +int ecex_plugin_slot_i32_set(ecex_plugin_t *plugin, + const char *name, + size_t index, + int value); +int ecex_plugin_slot_i32_get_2d(ecex_plugin_t *plugin, + const char *name, + size_t width, + size_t x, + size_t y, + int fallback); +int ecex_plugin_slot_i32_set_2d(ecex_plugin_t *plugin, + const char *name, + size_t width, + size_t x, + size_t y, + int value); +int ecex_plugin_slot_i32_set_scalar(ecex_plugin_t *plugin, + const char *name, + int value); + +/* Plugin objects are tracked allocations intended for callback userdata. */ +void *ecex_plugin_object_alloc(ecex_plugin_t *plugin, const char *name, size_t size); +void *ecex_plugin_object_calloc(ecex_plugin_t *plugin, + const char *name, + size_t count, + size_t size); +int ecex_plugin_object_free(ecex_plugin_t *plugin, void *object); +int ecex_plugin_object_valid(ecex_plugin_t *plugin, void *object); +int ecex_plugin_object_i32_get(ecex_plugin_t *plugin, + void *object, + size_t byte_offset, + int fallback); +int ecex_plugin_object_i32_set(ecex_plugin_t *plugin, + void *object, + size_t byte_offset, + int value); +void *ecex_plugin_object_ptr_get(ecex_plugin_t *plugin, + void *object, + size_t byte_offset); +int ecex_plugin_object_ptr_set(ecex_plugin_t *plugin, + void *object, + size_t byte_offset, + void *value); + +/* Plugin text stores host-owned strings for later draw-time lookup. */ +int ecex_plugin_text_set(ecex_plugin_t *plugin, int id, const char *text, int len); +int ecex_plugin_text_set_from_buffer_title(ecex_plugin_t *plugin, int id, buffer_t *buffer); +int ecex_plugin_text_free(ecex_plugin_t *plugin, int id); +int ecex_plugin_text_free_all(ecex_plugin_t *plugin); +const char *ecex_plugin_text_get_drawable(ecex_t *ed, void *owner, int id); + +int ecex_plugin_file_handler_register(ecex_plugin_t *plugin, + const char *extension, + ecex_file_handler_fn fn); +int ecex_plugin_file_handlers_run(ecex_t *ed, buffer_t *buffer); + +#endif |
