From 71328234d531524005c934bd48c48936ffca00e1 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 14 Sep 2023 20:04:06 +1000 Subject: [PATCH] Introduce PANE_DATA_PTR_TYPE for mode-emacs. PANE_DATA_PTR_TYPE means that ->data is a simple pointer that gets initialised by pane_register. Use this for mode-emacs.c Signed-off-by: NeilBrown --- core-pane.h | 6 ++++++ core.h | 26 ++++++++++++++++++++++---- mode-emacs.c | 14 ++++++++------ 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/core-pane.h b/core-pane.h index 706acea7..c466f5ac 100644 --- a/core-pane.h +++ b/core-pane.h @@ -31,11 +31,17 @@ struct pane { #ifdef PANE_DATA_TYPE PANE_DATA_TYPE data[1]; #endif +#ifdef PANE_DATA_PTR_TYPE + PANE_DATA_PTR_TYPE data safe; +#endif #ifdef DOC_DATA_TYPE DOC_DATA_TYPE doc_data[1]; #endif #ifdef PANE_DATA_TYPE_2 PANE_DATA_TYPE_2 data2[1]; +#endif +#ifdef PANE_DATA_PTR_TYPE_2 + PANE_DATA_PTR_TYPE_2 data2 safe; #endif void *_data safe; }; diff --git a/core.h b/core.h index d475662b..3a8b5835 100644 --- a/core.h +++ b/core.h @@ -462,13 +462,31 @@ struct pane * do_pane_register(struct pane *parent safe, short z, #ifdef PANE_DATA_TYPE #define pane_register4(p,z,h,d) do_pane_register(p,z,h,d,sizeof(d)) #define pane_register3(p,z,h) do_pane_register(p,z,h,NULL, sizeof(PANE_DATA_TYPE)) -#ifdef PANE_DATA_TYPE_2 -#define pane_register_2(p,z,h) do_pane_register(p,z,h,NULL, sizeof(PANE_DATA_TYPE_2)) -#endif +#else +#ifdef PANE_DATA_PTR_TYPE +static inline struct pane *pane_register(struct pane *parent safe, short z, + struct command *handle safe, + PANE_DATA_PTR_TYPE data) +{ + return do_pane_register(parent, z, handle, (void*)data, sizeof(data)); +} #else #define pane_register4(p,z,h,d) do_pane_register(p,z,h,d,sizeof((d)[0])) #define pane_register3(p,z,h) do_pane_register(p,z,h,NULL, 0) #endif +#endif + +#ifdef PANE_DATA_TYPE_2 +#define pane_register_2(p,z,h) do_pane_register(p,z,h,NULL, sizeof(PANE_DATA_TYPE_2)) +#endif +#ifdef PANE_DATA_PTR_TYPE_2 +static inline struct pane *pane_register_2(struct pane *parent safe, short z, + struct command *handle safe, + PANE_DATA_PTR_TYPE_2 data) +{ + return do_pane_register(parent, z, handle, (void*)data, sizeof(data)); +} +#endif void pane_update_handle(struct pane *p safe, struct command *handle safe); @@ -782,7 +800,7 @@ char *do_call_strsave(enum target_type type, struct pane *home, #define HOMENOTIFY3(home, not, focus) \ do_pane_notify(home, not, focus, 0, NULL, NULL, 0, NULL, NULL, NULL) -#if !defined(PANE_DATA_TYPE) && !defined(DOC_DATA_TYPE) +#if !defined(PANE_DATA_TYPE) && !defined(DOC_DATA_TYPE) && !defined(PANE_DATA_PTR_TYPE) /* If you define PANE_DATA_TYPEor DOC_DATA_TYPE, you need to include this yourself */ #include "core-pane.h" #endif diff --git a/mode-emacs.c b/mode-emacs.c index ebe17862..0cc1bf33 100644 --- a/mode-emacs.c +++ b/mode-emacs.c @@ -19,7 +19,9 @@ #include +#define PANE_DATA_PTR_TYPE char * #include "core.h" +#include "core-pane.h" static struct map *emacs_map; static const char * safe file_normalize(struct pane *p safe, const char *path, @@ -817,7 +819,7 @@ REDEF_CMD(emacs_cmd_complete); DEF_CMD(find_complete) { - char *type = ci->home->_data; + char *type = ci->home->data; if (strstarts(type, "file")) return emacs_file_complete_func(ci); @@ -833,7 +835,7 @@ DEF_CMD(find_complete) DEF_CMD(find_done) { int ret; - char *type = ci->home->_data; + char *type = ci->home->data; char *str = call_ret(strsave, "doc:get-str", ci->focus); const char *norm = NULL; struct stat stb; @@ -977,7 +979,7 @@ DEF_CMD(find_prevnext) * walk the list in mru order. * When we find it, insert the name into ci->focus document */ - char *type = ci->home->_data; + char *type = ci->home->data; struct find_helper h; if (strcmp(type, "doc") != 0) @@ -1006,7 +1008,7 @@ DEF_CMD(find_prevnext) DEF_CMD(find_attr) { - char *type = ci->home->_data; + char *type = ci->home->data; if (!ci->str) return Enoarg; @@ -1043,7 +1045,7 @@ DEF_CMD(find_attr) DEF_CMD(find_check_replace) { char *str, *cp, *sl; - char *type = ci->home->_data; + char *type = ci->home->data; char *initial_path; char *prev_dir; struct stat stb; @@ -1457,7 +1459,7 @@ REDEF_CMD(emacs_file_complete) int fd; struct pane *par, *pop, *docp, *p; struct call_return cr; - char *type = ci->home->_data; + char *type = ci->home->data; char *initial = attr_find(ci->home->attrs, "initial_path"); int wholebuf = strcmp(type, "file") == 0; struct mark *st; -- 2.39.5