]> git.neil.brown.name Git - edlib.git/commitdiff
Use callbacks to return string from Complete:prefix.
authorNeilBrown <neil@brown.name>
Wed, 9 Dec 2015 23:35:44 +0000 (10:35 +1100)
committerNeilBrown <neil@brown.name>
Thu, 10 Dec 2015 02:54:09 +0000 (13:54 +1100)
Also fix up freeing of strings.

Signed-off-by: NeilBrown <neil@brown.name>
mode-emacs.c
render-complete.c

index 196be69b332a6efd5664bef3625a7e7a5d6dfa8f..1ff65581842597f0cea5065945796dc52e092f20 100644 (file)
@@ -315,6 +315,13 @@ DEF_CMD(emacs_findfile)
        return 1;
 }
 
+DEF_CMD(save_str)
+{
+       struct call_return *cr = container_of(ci->comm, struct call_return, c);
+       cr->s = ci->str ? strdup(ci->str) : NULL;
+       return 1;
+}
+
 DEF_CMD(emacs_file_complete)
 {
        /* Extract a directory name and a basename from the document.
@@ -327,6 +334,7 @@ DEF_CMD(emacs_file_complete)
        int fd;
        struct pane *par, *pop, *docp;
        struct cmd_info ci2 = {0};
+       struct call_return cr;
        int ret;
 
        d = str;
@@ -360,19 +368,24 @@ DEF_CMD(emacs_file_complete)
        ci2.key = "Complete:prefix";
        ci2.str = b;
        ci2.focus = par;
+       cr.c = save_str;
+       cr.s = NULL;
+       ci2.comm2 = &cr.c;
        ret = key_handle_focus(&ci2);
        free(d);
-       if (ci2.str && (strlen(ci2.str) <= strlen(b) && ret-1 > 1)) {
+       if (cr.s && (strlen(cr.s) <= strlen(b) && ret-1 > 1)) {
                /* We need the dropdown */
                pane_damaged(par, DAMAGED_CONTENT);
                free(str);
+               free(cr.s);
                return 1;
        }
-       if (ci2.str) {
+       if (cr.s) {
                /* add the extra chars from ci2.str */
-               char *c = ci2.str + strlen(b);
+               char *c = cr.s + strlen(b);
 
                call5("Replace", ci->focus, 1, ci->mark, c, 0);
+               free(cr.s);
        }
        /* Now need to close the popup */
        pane_close(pop);
@@ -437,6 +450,7 @@ DEF_CMD(emacs_doc_complete)
        char *str = doc_getstr(ci->focus, NULL);
        struct pane *par, *pop;
        struct cmd_info ci2 = {0};
+       struct call_return cr;
        int ret;
 
        pop = pane_attach(ci->focus, "popup", ed->docs->home, "DM1r");
@@ -451,18 +465,23 @@ DEF_CMD(emacs_doc_complete)
        ci2.key = "Complete:prefix";
        ci2.str = str;
        ci2.focus = par;
+       cr.c = save_str;
+       cr.s = NULL;
+       ci2.comm2= &cr.c;
        ret = key_handle_focus(&ci2);
-       if (ci2.str && (strlen(ci2.str) <= strlen(str) && ret - 1 > 1)) {
+       if (cr.s && (strlen(cr.s) <= strlen(str) && ret - 1 > 1)) {
                /* We need the dropdown */
                pane_damaged(par, DAMAGED_CONTENT);
                free(str);
+               free(cr.s);
                return 1;
        }
-       if (ci2.str) {
-               /* add the extra chars from ci2.str */
-               char *c = ci2.str + strlen(str);
+       if (cr.s) {
+               /* add the extra chars from cr.s */
+               char *c = cr.s + strlen(str);
 
                call5("Replace", ci->focus, 1, ci->mark, c, 0);
+               free(cr.s);
        }
        /* Now need to close the popup */
        pane_close(pop);
index 32b7ae0dee96d5d6d89866e38e1e3b63e2215d35..4ff637f981827f18f00f747136b48b7776cc7ff9 100644 (file)
@@ -314,7 +314,8 @@ DEF_CMD(complete_set_prefix)
                        common[common_len(c, common)] = 0;
                cnt += 1;
        }
-       ci->str = common;
+       comm_call(ci->comm2, "callback:prefix", ci->focus, 0, NULL, common, 0);
+       free(common);
        call3("Move-to", ci->home, 0, m);
        mark_free(m);
        call3("render-lines:redraw", ci->focus, 0, NULL);