aboutsummaryrefslogtreecommitdiff
path: root/include/types.h
diff options
context:
space:
mode:
authorDavid Moc <personal@cdatgoose.org>2026-06-02 13:50:21 +0200
committerDavid Moc <personal@cdatgoose.org>2026-06-02 13:50:21 +0200
commita15cb041654ae307add0b998b526c87c3f42bf5f (patch)
tree225bb4b70e9fa05aa5f4d2722a1a9cf5fc6fca7f /include/types.h
parent6aeaa171dc1ca43392f53cbd02097f76e1b1c5a0 (diff)
Add plugin hooks and mode plugins
Diffstat (limited to 'include/types.h')
-rw-r--r--include/types.h138
1 files changed, 93 insertions, 45 deletions
diff --git a/include/types.h b/include/types.h
index 800c3d6..2b63ad3 100644
--- a/include/types.h
+++ b/include/types.h
@@ -7,6 +7,7 @@ typedef struct ecex ecex_t;
typedef struct buffer buffer_t;
typedef struct ecex_window ecex_window_t;
typedef struct ecex_draw_context ecex_draw_context_t;
+typedef struct ecex_plugin_runtime ecex_plugin_runtime_t;
typedef int (*ecex_command_fn)(ecex_t *ed);
typedef int (*ecex_interactive_line_fn)(ecex_t *ed, buffer_t *buffer, size_t line, const char *payload, void *userdata);
@@ -18,6 +19,37 @@ typedef int (*ecex_buffer_tick_ms_fn)(ecex_t *ed, buffer_t *buffer, int now_ms,
typedef int (*ecex_buffer_mouse_fn)(ecex_t *ed, buffer_t *buffer, int event, int x, int y, int button, void *userdata);
typedef int (*ecex_file_handler_fn)(ecex_t *ed, buffer_t *buffer);
typedef void (*ecex_buffer_userdata_free_fn)(void *userdata);
+typedef void (*ecex_hook_free_fn)(void *userdata);
+typedef void (*ecex_command_hook_fn)(ecex_t *ed, const char *command, int event, int result, void *userdata);
+typedef void (*ecex_prefix_hook_fn)(ecex_t *ed, const char *prefix, int event, void *userdata);
+typedef void (*ecex_buffer_hook_fn)(ecex_t *ed, buffer_t *buffer, int event, void *userdata);
+typedef int (*ecex_completion_provider_fn)(ecex_t *ed,
+ buffer_t *buffer,
+ const char *prefix,
+ char *out,
+ size_t out_size,
+ void *userdata);
+
+typedef enum ecex_command_hook_event {
+ ECEX_COMMAND_HOOK_BEFORE = 1,
+ ECEX_COMMAND_HOOK_AFTER = 2,
+} ecex_command_hook_event_t;
+
+typedef enum ecex_prefix_hook_event {
+ ECEX_PREFIX_HOOK_BEGIN = 1,
+ ECEX_PREFIX_HOOK_UPDATE = 2,
+ ECEX_PREFIX_HOOK_CANCEL = 3,
+ ECEX_PREFIX_HOOK_FINISH = 4,
+ ECEX_PREFIX_HOOK_UNDEFINED = 5,
+} ecex_prefix_hook_event_t;
+
+typedef enum ecex_buffer_hook_event {
+ ECEX_BUFFER_HOOK_CREATE = 1,
+ ECEX_BUFFER_HOOK_SWITCH = 2,
+ ECEX_BUFFER_HOOK_SAVE = 3,
+ ECEX_BUFFER_HOOK_KILL = 4,
+ ECEX_BUFFER_HOOK_MODE_CHANGE = 5,
+} ecex_buffer_hook_event_t;
typedef enum ecex_prompt_request {
ECEX_PROMPT_NONE = 0,
@@ -154,6 +186,7 @@ struct buffer {
void *media_pipe;
double media_last_frame_time;
int media_playing;
+ int media_audio_pid;
char media_status[256];
ecex_buffer_render_fn render_fn;
@@ -198,42 +231,43 @@ typedef struct ecex_mode_keybind {
char *command;
} ecex_mode_keybind_t;
-typedef struct ecex_major_mode {
- int id;
+typedef struct ecex_command_hook {
char *name;
-} ecex_major_mode_t;
+ ecex_command_hook_fn fn;
+ void *userdata;
+ ecex_hook_free_fn free_fn;
+} ecex_command_hook_t;
-typedef enum ecex_var_kind {
- ECEX_VAR_BYTES = 0,
- ECEX_VAR_I32 = 1,
-} ecex_var_kind_t;
+typedef struct ecex_prefix_hook {
+ char *name;
+ ecex_prefix_hook_fn fn;
+ void *userdata;
+ ecex_hook_free_fn free_fn;
+} ecex_prefix_hook_t;
-typedef struct ecex_var_entry {
- void *owner;
+typedef struct ecex_buffer_hook {
char *name;
- void *data;
- size_t elem_size;
- size_t count;
- int kind;
- int dynamic;
-} ecex_var_entry_t;
-
-typedef struct ecex_text_entry {
- void *owner;
- int id;
- char *text;
- size_t len;
-} ecex_text_entry_t;
+ ecex_buffer_hook_fn fn;
+ void *userdata;
+ ecex_hook_free_fn free_fn;
+} ecex_buffer_hook_t;
-typedef struct ecex_file_handler {
- char *extension;
- ecex_file_handler_fn fn;
-} ecex_file_handler_t;
+typedef struct ecex_completion_provider {
+ char *name;
+ int mode;
+ ecex_completion_provider_fn fn;
+ void *userdata;
+ ecex_hook_free_fn free_fn;
+ char *detail;
+ char **words;
+ size_t word_count;
+ int flags;
+} ecex_completion_provider_t;
-typedef struct ecex_object_entry {
- void *ptr;
- size_t size;
-} ecex_object_entry_t;
+typedef struct ecex_major_mode {
+ int id;
+ char *name;
+} ecex_major_mode_t;
struct ecex_window {
buffer_t *buffer;
@@ -273,26 +307,34 @@ struct ecex {
size_t mode_keybind_cap;
size_t mode_keybind_count;
+ ecex_command_hook_t *command_hooks;
+ size_t command_hook_cap;
+ size_t command_hook_count;
+
+ ecex_prefix_hook_t *prefix_hooks;
+ size_t prefix_hook_cap;
+ size_t prefix_hook_count;
+
+ ecex_buffer_hook_t *buffer_hooks;
+ size_t buffer_hook_cap;
+ size_t buffer_hook_count;
+
+ ecex_completion_provider_t *completion_providers;
+ size_t completion_provider_cap;
+ size_t completion_provider_count;
+ int completion_cycle_active;
+ buffer_t *completion_cycle_buffer;
+ size_t completion_cycle_start;
+ size_t completion_cycle_index;
+ char completion_cycle_prefix[256];
+ char completion_cycle_current[256];
+
ecex_major_mode_t *major_modes;
size_t major_mode_cap;
size_t major_mode_count;
int next_major_mode_id;
- ecex_var_entry_t *vars;
- size_t var_cap;
- size_t var_count;
-
- ecex_text_entry_t *texts;
- size_t text_cap;
- size_t text_count;
-
- ecex_file_handler_t *file_handlers;
- size_t file_handler_cap;
- size_t file_handler_count;
-
- ecex_object_entry_t *objects;
- size_t object_cap;
- size_t object_count;
+ ecex_plugin_runtime_t *plugins;
char *last_eval_source;
char *last_eval_filename;
@@ -305,13 +347,19 @@ struct ecex {
char prompt_message[128];
char *config_path;
+ char message[1024];
+ unsigned long message_revision;
ecex_clipboard_get_fn clipboard_get;
ecex_clipboard_set_fn clipboard_set;
void *clipboard_userdata;
+ char *clipboard_text;
int should_quit;
+ unsigned long ui_revision;
+ unsigned long font_revision;
+
ecex_theme_t theme;
};