From: NeilBrown Date: Wed, 9 Dec 2015 23:35:44 +0000 (+1100) Subject: Use callbacks to return string from Complete:prefix. X-Git-Tag: lca2016~95 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=9087d3b1a4210f5721eccc035ad81ac377194f1c;p=edlib.git Use callbacks to return string from Complete:prefix. Also fix up freeing of strings. Signed-off-by: NeilBrown --- diff --git a/mode-emacs.c b/mode-emacs.c index 196be69b..1ff65581 100644 --- a/mode-emacs.c +++ b/mode-emacs.c @@ -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); diff --git a/render-complete.c b/render-complete.c index 32b7ae0d..4ff637f9 100644 --- a/render-complete.c +++ b/render-complete.c @@ -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);