]> git.neil.brown.name Git - edlib.git/commitdiff
Introduce PANE_DATA_PTR_TYPE for mode-emacs.
authorNeilBrown <neil@brown.name>
Thu, 14 Sep 2023 10:04:06 +0000 (20:04 +1000)
committerNeilBrown <neil@brown.name>
Fri, 15 Sep 2023 03:38:14 +0000 (13:38 +1000)
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 <neil@brown.name>
core-pane.h
core.h
mode-emacs.c

index 706acea72e4b8a9e9f020155cce852eca6f3340b..c466f5ac7ba8b8c86601ef8fae74e6c4b400e341 100644 (file)
@@ -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 d475662b2f29679266ba9d7de55320ed4732b1fa..3a8b5835340dc2629274c264a6d658329f1a7c92 100644 (file)
--- 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
index ebe1786234f9f6ec1923921c2deba937a33f8449..0cc1bf33edd8d29683c8a836ccf25ae917a67ac0 100644 (file)
@@ -19,7 +19,9 @@
 
 #include <stdio.h>
 
+#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;