]> git.neil.brown.name Git - edlib.git/commitdiff
Delay freeing of pane->data
authorNeilBrown <neil@brown.name>
Fri, 7 Feb 2020 21:38:57 +0000 (08:38 +1100)
committerNeilBrown <neil@brown.name>
Fri, 7 Feb 2020 21:38:57 +0000 (08:38 +1100)
We already delay the freeing of a pane until it cannot be in use.
But we also sometimes need the ->data to hang around a bit beyond
close too.
So introduce a new "Free" callback to tell a pane to free its
data, and call that just before the pane is freed.

Signed-off-by: NeilBrown <neil@brown.name>
33 files changed:
DOC/TODO.md
core-doc.c
core-editor.c
core-pane.c
core.h
display-ncurses.c
doc-dir.c
doc-docs.c
doc-email.c
doc-multipart.c
doc-rendering.c
doc-text.c
emacs-search.c
lib-base64.c
lib-copybuf.c
lib-crop.c
lib-history.c
lib-input.c
lib-keymap.c
lib-libevent.c
lib-linecount.c
lib-messageline.c
lib-popup.c
lib-qprint.c
lib-renderline.c
lib-rfc822header.c
lib-tile.c
lib-view.c
lib-whitespace.c
render-complete.c
render-format.c
render-hex.c
render-lines.c

index 867d1d7ddb34940f7c560f843bc16f7d3664f9a0..1a073357d6612b833e45b03806e2b91b27e23d5e 100644 (file)
@@ -29,7 +29,7 @@ Bugs to be fixed
 Core features
 -------------
 
-- [ ] pane_close() can be called at awkward times.  We need to do some initial
+- [X] pane_close() can be called at awkward times.  We need to do some initial
       processing so that it looks closed, but so that code can continue to
       run, then schedule proper close for later.
       ..Hmm... I already do this, since before I added this item to the todo list.
index 80be7a9b97122d35b9bd6c7e14e481731fabbc13..6e5c4817c2c6c1be9769bb38a38146637400ab21 100644 (file)
@@ -895,8 +895,6 @@ DEF_CMD(doc_close)
        mark_free(dd->point);
        mark_free(dd->mark);
        call("doc:closed", dd->doc);
-       free(dd);
-       ci->home->data = safe_cast NULL;
        return 1;
 }
 
@@ -1118,6 +1116,7 @@ static void init_doc_cmds(void)
        key_add(doc_handle_cmd, "Refresh", &doc_refresh);
        key_add(doc_handle_cmd, "Clone", &doc_clone);
        key_add(doc_handle_cmd, "Close", &doc_close);
+       key_add(doc_handle_cmd, "Free", &edlib_do_free);
        key_add(doc_handle_cmd, "doc:dup-point", &doc_dup_point);
        key_add(doc_handle_cmd, "Replace", &doc_replace);
        key_add(doc_handle_cmd, "get-attr", &doc_handle_get_attr);
index ad270f611e8577ee5acffabb71fc875dd06c38da..59af2ee8f221db8c76be84d734abd0a5d4207eeb 100644 (file)
@@ -225,6 +225,10 @@ DEF_CMD(editor_clean_up)
        while (ei->freelist) {
                struct pane *p = ei->freelist;
                ei->freelist = p->focus;
+               p->focus = NULL;
+
+               p->damaged &= ~DAMAGED_DEAD;
+               pane_call(p, "Free", p);
                command_put(p->handle);
                p->handle = NULL;
                attr_free(&p->attrs);
@@ -243,6 +247,13 @@ DEF_CMD(editor_clean_up)
        return 0;
 }
 
+DEF_EXTERN_CMD(edlib_do_free)
+{
+       free(ci->home->data);
+       ci->home->data= safe_cast NULL;
+       return 1;
+}
+
 DEF_CMD(editor_on_idle)
 {
        /* register comm2 to be called when next idle. */
@@ -262,11 +273,18 @@ DEF_CMD(editor_on_idle)
 
 DEF_CMD(editor_close)
 {
-
        stat_free();
        return 0;
 }
 
+DEF_CMD(editor_free)
+{
+       /* Freeing the ed_info here mustn't happen.  It must be
+        * done much later
+        */
+       return 1;
+}
+
 void * safe memsave(struct pane *p safe, char *buf, int len)
 {
        struct ed_info *ei;
@@ -335,6 +353,8 @@ void editor_delayed_free(struct pane *ed safe, struct pane *p safe)
 {
        struct ed_info *ei = ed->data;
        if (!ei) {
+               p->damaged &= ~DAMAGED_DEAD;
+               pane_call(p, "Free", p);
                command_put(p->handle);
                p->handle = NULL;
                attr_free(&p->attrs);
@@ -381,6 +401,7 @@ struct pane *editor_new(void)
                key_add_prefix(ed_map, "editor:notify:",
                               &editor_send_notify);
                key_add(ed_map, "Close", &editor_close);
+               key_add(ed_map, "Free", &editor_free);
        }
        ei->map = key_alloc();
        key_add(ei->map, "on_idle-clean_up", &editor_clean_up);
index 96dadad425105b2d0d929ce4b2ff4a6a2a1bd355..d3aa55b7f184292c6cc28df7cc41d070dba9c44e 100644 (file)
@@ -418,11 +418,11 @@ restart:
        /* If a child has not yet had "Close" called, we need to leave
         * ->parent in place so a full range of commands are available.
         */
-       // p->parent = p;
-       p->damaged |= DAMAGED_DEAD;
-       if (ed != p)
+       if (ed != p) {
+               p->damaged |= DAMAGED_DEAD;
                editor_delayed_free(ed, p);
-       else {
+       } else {
+               pane_call(p, "Free", p);
                command_put(p->handle);
                p->handle = NULL;
                attr_free(&p->attrs);
diff --git a/core.h b/core.h
index 755825ac00cde89fb053ff40192e567bdc053dd5..c4d3d70017ea2d290af08e1eb8df16b16ce9a926 100644 (file)
--- a/core.h
+++ b/core.h
@@ -303,11 +303,20 @@ struct lookup_cmd {
        static int _name ## _func(const struct cmd_info *ci safe)
 #define REDEF_CMD(_name) \
        static int _name ## _func(const struct cmd_info *ci safe)
+#define DEF_EXTERN_CMD(_name) \
+       static int _name ## _func(const struct cmd_info *ci safe); \
+       struct command _name = CMD(_name);              \
+       static int _name ## _func(const struct cmd_info *ci safe)
+#define DECL_EXTERN_CMD(_name) \
+       extern struct command _name;
+
 
 #define DEF_LOOKUP_CMD(_name, _map) \
        static struct lookup_cmd _name = { { key_lookup_cmd_func, 0, NULL }, \
                                          &_map};
 
+DECL_EXTERN_CMD(edlib_do_free);
+
 int key_lookup_cmd_func(const struct cmd_info *ci safe);
 
 struct pfx_cmd {
index cbe819c847d7d45e9844486e7b6cf9c70286fccd..538dd2d8e79a3c9a11e051bc6e35a0a28d712a3a 100644 (file)
@@ -585,8 +585,6 @@ DEF_CMD(nc_close)
        struct display_data *dd = p->data;
        ncurses_end(p);
        hash_free(dd);
-       free(dd);
-       p->data = safe_cast NULL;
        return 1;
 }
 
@@ -1011,6 +1009,7 @@ void edlib_init(struct pane *ed safe)
        key_add(nc_map, "Display:close", &nc_close_display);
        key_add(nc_map, "Display:set-noclose", &nc_set_noclose);
        key_add(nc_map, "Close", &nc_close);
+       key_add(nc_map, "Free", &edlib_do_free);
        key_add(nc_map, "pane-clear", &nc_clear);
        key_add(nc_map, "text-size", &nc_text_size);
        key_add(nc_map, "Draw:text", &nc_draw_text);
index e717d88b9ef220067a55321efe952161832ad31f..2fd954f54ecb140afb80968d1d2e491b44a25e0b 100644 (file)
--- a/doc-dir.c
+++ b/doc-dir.c
@@ -568,7 +568,6 @@ DEF_CMD(dir_destroy)
        if (dr->rendering)
                pane_close(dr->rendering);
        doc_free(d);
-       free(dr);
        return 1;
 }
 
@@ -765,4 +764,5 @@ void edlib_init(struct pane *ed safe)
        key_add(doc_map, "get-attr", &dir_get_attr);
        key_add(doc_map, "Notify:Close", &dir_notify_close);
        key_add(doc_map, "Close", &dir_destroy);
+       key_add(doc_map, "Free", &edlib_do_free);
 }
index 3804ac872c5b883b9c49ebeefd3e6f183d3da0b1..6e5a566a7356f84fdd4ba46eab14e27a8b64f698 100644 (file)
@@ -894,6 +894,7 @@ static void docs_init_map(void)
        key_add(docs_map, "Notify:Close", &docs_notify_close);
 
        key_add(docs_map, "get-attr", &docs_get_attr);
+       key_add(docs_map, "Free", &edlib_do_free);
 
        key_add(docs_aux_map, "doc:revisit", &doc_revisit);
        key_add(docs_aux_map, "doc:status-changed", &doc_damage);
index 1b048a6f741598f78b261c667984c72715ecd296..1ff6925fe828f2f4aba330cbd80f8da985825dcb 100644 (file)
@@ -43,7 +43,6 @@ DEF_CMD(email_close)
        struct email_info *ei = ci->home->data;
        // ??? ;
        call("doc:closed", ei->spacer);
-       free(ei);
        return 1;
 }
 
@@ -634,7 +633,7 @@ struct email_view {
        char    *invis safe;
 };
 
-DEF_CMD(email_view_close)
+DEF_CMD(email_view_free)
 {
        struct email_view *evi = ci->home->data;
 
@@ -814,12 +813,13 @@ static void email_init_map(void)
 {
        email_map = key_alloc();
        key_add(email_map, "Close", &email_close);
+       key_add(email_map, "Free", &edlib_do_free);
        key_add(email_map, "doc:email:render-spacer", &email_spacer);
        key_add(email_map, "doc:email:select", &email_select);
        key_add(email_map, "doc:get-attr", &email_get_attr);
 
        email_view_map = key_alloc();
-       key_add(email_view_map, "Close", &email_view_close);
+       key_add(email_view_map, "Free", &email_view_free);
        key_add(email_view_map, "doc:step", &email_step);
        key_add(email_view_map, "doc:set-ref", &email_set_ref);
        key_add(email_view_map, "doc:set-attr", &email_view_set_attr);
index d973b1a17a0d36b977dbcf443763c0b357ee49e2..397cd757830950f74a403349810e5bf7bd8cb9dc 100644 (file)
@@ -214,6 +214,13 @@ DEF_CMD(mp_close)
        for (i = 0; i < mpi->nparts; i++)
                call("doc:closed", mpi->parts[i].pane);
        doc_free(&mpi->doc);
+       return 1;
+}
+
+DEF_CMD(mp_free)
+{
+       struct mp_info *mpi = ci->home->data;
+
        free(mpi->parts);
        free(mpi);
        return 1;
@@ -550,6 +557,7 @@ static void mp_init_map(void)
        key_add(mp_map, "doc:set-attr", &mp_set_attr);
        key_add(mp_map, "doc:step-part", &mp_step_part);
        key_add(mp_map, "Close", &mp_close);
+       key_add(mp_map, "Free", &mp_free);
        key_add(mp_map, "Notify:Close", &mp_notify_close);
        key_add(mp_map, "doc:notify-viewers", &mp_notify_viewers);
        key_add(mp_map, "multipart-add", &mp_add);
index 83b550339dca997f646fe7c2d82e4fc1cacc06b3..8fe4116ca2d86bef93fa090e501dcd8222066154 100644 (file)
@@ -363,8 +363,6 @@ DEF_CMD(dr_close)
        if (p)
                home_call(p, "doc:del-view", ci->home, dri->vnum);
        doc_free(d);
-       free(dri);
-       ci->home->data = safe_cast NULL;
        return 1;
 }
 
@@ -581,6 +579,7 @@ static void dr_init_map(void)
        key_add(dr_map, "doc:set-ref", &dr_set_ref);
        key_add(dr_map, "doc:step", &dr_step);
        key_add(dr_map, "Close", &dr_close);
+       key_add(dr_map, "Free", &edlib_do_free);
        key_add(dr_map, "doc:notify-viewers", &dr_notify_viewers);
        key_add(dr_map, "doc:replaced", &dr_notify_replace);
        key_add(dr_map, "Notify:Close", &dr_notify_close);
index 4c2f8085e567788abbee8d2103fe05314f525f2f..9e13898f3f5aed406c892c5e46a57792a5864765 100644 (file)
@@ -2225,8 +2225,16 @@ DEF_CMD(text_destroy)
        struct text *t = container_of(d, struct text, doc);
 
        text_cleanout(t);
-       free(t->fname);
        doc_free(d);
+       return 1;
+}
+
+DEF_CMD(text_free)
+{
+       struct doc *d = ci->home->data;
+       struct text *t = container_of(d, struct text, doc);
+
+       free(t->fname);
        free(t);
        return 1;
 }
@@ -2258,5 +2266,6 @@ void edlib_init(struct pane *ed safe)
        key_add(text_map, "doc:revisit", &text_revisited);
 
        key_add(text_map, "Close", &text_destroy);
+       key_add(text_map, "Free", &text_free);
        key_add(text_map, "get-attr", &text_get_attr);
 }
index 2beda1212b5cff2ea194ba5fc1857469154d632f..757b37e90f011f90c9d8b3ab83949f7fdbbd674d 100644 (file)
@@ -282,7 +282,6 @@ DEF_CMD(search_close)
                mark_free(n->m);
                free(n);
        }
-       free(esi);
        return 1;
 }
 
@@ -558,6 +557,7 @@ static void emacs_search_init_map(void)
        key_add(es_map, "C-Chr-C", &search_add);
        key_add(es_map, "C-Chr-R", &search_forward);
        key_add(es_map, "Close", &search_close);
+       key_add(es_map, "Free", &edlib_do_free);
        key_add(es_map, "Enter", &search_done);
        key_add(es_map, "search:done", &search_done);
        key_add(es_map, "doc:replaced", &search_again);
@@ -943,7 +943,8 @@ DEF_CMD(emacs_highlight_close)
        }
        mark_free(hi->start);
        mark_free(hi->end);
-       free(hi);
+       hi->start = NULL;
+       hi->end = NULL;
        return 0;
 }
 DEF_CMD(emacs_search_done)
@@ -997,6 +998,7 @@ static void emacs_highlight_init_map(void)
        key_add(m, "map-attr", &emacs_hl_attrs);
        key_add(m, "Draw:text", &highlight_draw);
        key_add(m, "Close", &emacs_highlight_close);
+       key_add(m, "Free", &edlib_do_free);
        key_add(m, "Abort", &emacs_highlight_abort);
        key_add(m, "Notify:clip", &emacs_highlight_clip);
        key_add(m, "highlight:set-popup", &emacs_highlight_set_popup);
index b3f3c96dcb06fb210204064896e77804eb962cdc..9f5e06fb54b8ea206047d290f0438c5d749376cc 100644 (file)
@@ -216,7 +216,6 @@ DEF_CMD(b64_close)
        while ((m = vmark_first(ci->home, bi->view, ci->home)) != NULL)
                mark_free(m);
        call("doc:del-view", ci->home, bi->view);
-       free(bi);
        return 1;
 }
 
@@ -250,6 +249,7 @@ void edlib_init(struct pane *ed safe)
 
        key_add(b64_map, "doc:step", &base64_step);
        key_add(b64_map, "Close", &b64_close);
+       key_add(b64_map, "Free", &edlib_do_free);
        key_add(b64_map, "Notify:clip", &b64_clip);
 
        call_comm("global-set-command", ed, &b64_attach, 0, NULL, "attach-base64");
index 422d4b7278d05341f16ce789586568ed178ca036..b6d67f5de1f175f61f9ccd1afb6ce3b234fa5fdb 100644 (file)
@@ -46,7 +46,7 @@ static void free_txt(struct txt **tp safe)
        free(t);
 }
 
-DEF_CMD(copy_close)
+DEF_CMD(copy_free)
 {
        struct copy_info *cyi = ci->home->data;
 
@@ -116,7 +116,7 @@ void edlib_init(struct pane *ed safe)
 
        if (!copy_map) {
                copy_map = key_alloc();
-               key_add(copy_map, "Close", &copy_close);
+               key_add(copy_map, "Free", &copy_free);
        }
 
        cyi->pane = pane_register(ed, 0, &copy_handle.c, cyi);
index 439958c2460ead424d4e721aab47aba9c9975f93..75393efdf040e83663e4dac339c235cc45beedfc 100644 (file)
@@ -60,7 +60,6 @@ DEF_CMD(crop_close)
 
        mark_free(cd->start);
        mark_free(cd->end);
-       free(cd);
        return 1;
 }
 
@@ -169,6 +168,7 @@ void edlib_init(struct pane *ed safe)
        crop_map = key_alloc();
        key_add_prefix(crop_map, "doc:", &crop_generic);
        key_add(crop_map, "Close", &crop_close);
+       key_add(crop_map, "Free", &edlib_do_free);
        key_add(crop_map, "doc:write_file", &crop_write);
        key_add(crop_map, "doc:step", &crop_step);
        key_add(crop_map, "Notify:clip", &crop_clip);
index ce3bf21432cc13841e302f65c09c64e0ec15be7e..54932b11d60511bb353f19eaef3429d88a68f898 100644 (file)
@@ -40,10 +40,19 @@ DEF_CMD(history_close)
 
        if (hi->history)
                pane_close(hi->history);
+       return 1;
+}
+
+DEF_CMD(history_free)
+{
+       struct history_info *hi = ci->home->data;
+
        free(hi->search.b);
        free(hi->saved);
        free(hi);
        ci->home->data = safe_cast NULL;
+       /* handle was in 'hi' */
+       ci->home->handle = NULL;
        return 1;
 }
 
@@ -245,6 +254,7 @@ void edlib_init(struct pane *ed safe)
 
        history_map = key_alloc();
        key_add(history_map, "Close", &history_close);
+       key_add(history_map, "Free", &history_free);
        key_add(history_map, "Notify:Close", &history_notify_close);
        key_add(history_map, "doc:replaced", &history_notify_replace);
        key_add(history_map, "M-Chr-p", &history_move);
index 0cc93fe651b204bed301dbd1331507ef56cbba5f..5de63a75d933e3b4d1619ece66eaf3457859d586 100644 (file)
@@ -320,6 +320,7 @@ static void register_map(void)
        key_add(im_map, "Notify:Close", &close_focus);
        key_add_prefix(im_map, "window:request:", &request_notify);
        key_add_prefix(im_map, "window:notify:", &send_notify);
+       key_add(im_map, "Free", &edlib_do_free);
 }
 
 DEF_LOOKUP_CMD(input_handle, im_map);
index 1638a31cd78c34d21ebf799d1d64746ba444ef62..6152f4cd23fde88cf52af6fc418b3ab1f9082139 100644 (file)
@@ -54,7 +54,11 @@ DEF_CMD(keymap_handle)
                                command_put(kd->cmds[i]);
                        free(kd->cmds);
                }
+               return 1;
+       }
+       if (strcmp(ci->key, "Free") == 0) {
                free(kd);
+               ci->home->data = safe_cast NULL;
                return 1;
        }
        if (strcmp(ci->key, "Clone") == 0) {
index 34a9ab490724ef8e6c9a1291811b5d2a6b9fea70..eb075ae5265f9ec1e7a5e38b93b92ebfec7fce46 100644 (file)
@@ -290,4 +290,5 @@ void edlib_init(struct pane *ed safe)
                return;
        libevent_map = key_alloc();
        key_add(libevent_map, "Notify:Close", &libevent_notify);
+       key_add(libevent_map, "Free", &edlib_do_free);
 }
index d3a24e5377e61382d51a4e7ff523a2b0720c2af2..96cbf7a08fe1671e862af231b71f87c387224f53 100644 (file)
@@ -222,8 +222,6 @@ DEF_CMD(linecount_close)
        while ((m = vmark_first(d, cli->view_num, ci->home)) != NULL)
                mark_free(m);
        home_call(d, "doc:del-view", ci->home, cli->view_num);
-       free(cli);
-       ci->home->data = safe_cast NULL;
        pane_close(ci->home);
        return 1;
 }
@@ -341,4 +339,5 @@ void edlib_init(struct pane *ed safe)
        key_add(linecount_map, "doc:CountLines", &linecount_notify_count);
        key_add(linecount_map, "doc:GotoLine", &linecount_notify_goto);
        key_add(linecount_map, "Notify:clip", &linecount_clip);
+       key_add(linecount_map, "Free", &edlib_do_free);
 }
index 9da505843826e44cd80d0378017fc0f6b0929096..a991f149bb18b841e7c702556822590b174ceff8 100644 (file)
@@ -214,6 +214,7 @@ void edlib_init(struct pane *ed safe)
                return;
        messageline_map = key_alloc();
        key_add(messageline_map, "Clone", &messageline_clone);
+       key_add(messageline_map, "Free", &edlib_do_free);
        key_add(messageline_map, "Display:border", &messageline_border);
        key_add(messageline_map, "Message", &messageline_msg);
        key_add(messageline_map, "Message:modal", &messageline_msg);
index 09b3ed2e8cae17de0047c469c678f7768a7b5c9c..348a66cc4889d1e56dec591cb8f256ef6790e87d 100644 (file)
@@ -107,7 +107,16 @@ static void popup_resize(struct pane *p safe, char *style safe)
 DEF_CMD(popup_close)
 {
        struct popup_info *ppi = ci->home->data;
+
        command_put(ppi->done);
+       ppi->done = NULL;
+       return 1;
+}
+
+DEF_CMD(popup_free)
+{
+       struct popup_info *ppi = ci->home->data;
+
        free(ppi->style);
        free(ppi);
        return 1;
@@ -394,6 +403,7 @@ void edlib_init(struct pane *ed safe)
        popup_map = key_alloc();
 
        key_add(popup_map, "Close", &popup_close);
+       key_add(popup_map, "Free", &popup_free);
        key_add(popup_map, "Notify:Close", &popup_notify_close);
        key_add(popup_map, "Abort", &popup_abort);
        key_add(popup_map, "popup:style", &popup_style);
index d01264a73ff0cee30d2e21cb9d59c3db5d401942..67da7df7138871264b3fa85907dff2ec76f6d7fb 100644 (file)
@@ -197,6 +197,7 @@ void edlib_init(struct pane *ed safe)
        qp_map = key_alloc();
 
        key_add(qp_map, "doc:step", &qp_step);
+       key_add(qp_map, "Free", &edlib_do_free);
 
        call_comm("global-set-command", ed, &qp_attach, 0, NULL, "attach-quoted_printable");
        call_comm("global-set-command", ed, &qp_attach, 0, NULL, "attach-qprint");
index 8aac8d03416031edc2dfff0874e751351937c974..a9794138a84d72baa2af3fcbfba1b96c28ffe8c8 100644 (file)
@@ -432,9 +432,6 @@ DEF_CMD(rl_close)
        while ((m = vmark_first(p, rl->view, p)) != NULL)
                mark_free(m);
        call("doc:del-view", p, rl->view);
-       free(rl);
-       p->data = safe_cast NULL;
-       p->handle = NULL;
        return 0;
 }
 
@@ -446,6 +443,7 @@ void edlib_init(struct pane *ed safe)
        key_add(rl_map, "doc:render-line-prev", &render_prev);
        key_add(rl_map, "Clone", &rl_clone);
        key_add(rl_map, "Close", &rl_close);
+       key_add(rl_map, "Free", &edlib_do_free);
        key_add(rl_map, "Notify:clip", &rl_clip);
 
        call_comm("global-set-command", ed, &renderline_attach, 0, NULL, "attach-renderline");
index 6242e97a506a6458998f5cb4d8fd2636bfdadb09..1df9c719b06fa74a523ef8fccc1d9f1dc906079b 100644 (file)
@@ -45,8 +45,6 @@ DEF_CMD(header_close)
        while ((m = vmark_first(p, hi->vnum, p)) != NULL)
                mark_free(m);
        call("doc:del-view", p, hi->vnum);
-       p->data = safe_cast NULL;
-       free(hi);
        return 1;
 }
 
@@ -409,6 +407,7 @@ static void header_init_map(void)
 {
        header_map = key_alloc();
        key_add(header_map, "Close", &header_close);
+       key_add(header_map, "Free", &edlib_do_free);
        key_add(header_map, "get-header", &header_get);
        key_add(header_map, "Notify:clip", &header_clip);
 }
index 6864faed71573c8522a449e808580bfa7cf3e761..54631ab9a63369157ef46bf028205de614528e33 100644 (file)
@@ -60,6 +60,15 @@ DEF_CMD(tile_close)
        return 0;
 }
 
+DEF_CMD(tile_free)
+{
+       struct tileinfo *ti = ci->home->data;
+
+       free(ti->name);
+       free(ti);
+       return 1;
+}
+
 DEF_CMD(tile_refresh_size)
 {
        struct pane *p = ci->home;
@@ -245,16 +254,12 @@ static int tile_destroy(struct pane *p safe)
 
        if (ti->direction == Neither) {
                /* Children have already been destroyed, just clean up */
-               free(ti->group);
                free(ti->name);
-               free(ti);
                return 1;
        }
 
        if (p->parent == p) {
                /* subsumed husk being destroyed */
-               free(ti->name);
-               free(ti);
                return 1;
        }
 
@@ -334,8 +339,6 @@ static int tile_destroy(struct pane *p safe)
                tile_adjust(prev);
        }
        list_del(&ti->tiles);
-       free(ti->name);
-       free(ti);
        if (remaining == 1 && remain->parent != remain) {
                struct tileinfo *ti2;
                enum dir tmp;
@@ -1065,6 +1068,7 @@ void edlib_init(struct pane *ed safe)
        key_add(tile_map, "ChildRegistered", &tile_child_registered);
        key_add(tile_map, "ChildReplaced", &tile_child_replaced);
        key_add(tile_map, "Close", &tile_close);
+       key_add(tile_map, "Free", &tile_free);
        key_add(tile_map, "Refresh:size", &tile_refresh_size);
 
        call_comm("global-set-command", ed, &tile_attach, 0, NULL, "attach-tile");
index be4e977cdc890feb0a9d00c63af70a291cc3fc29..ab210d2c247fda80771742b8e01cc36f57a747a6 100644 (file)
@@ -259,7 +259,6 @@ DEF_CMD(view_close)
 
        if (vd->viewpoint)
                mark_free(vd->viewpoint);
-       free(vd);
        return 1;
 }
 
@@ -517,6 +516,7 @@ void edlib_init(struct pane *ed safe)
        key_add(view_map, "Window:border", &view_border);
        key_add(view_map, "Refresh:view", &view_refresh_view);
        key_add(view_map, "Close", &view_close);
+       key_add(view_map, "Free", &edlib_do_free);
        key_add(view_map, "Clone", &view_clone);
        key_add(view_map, "ChildRegistered", &view_child_registered);
        key_add(view_map, "Refresh:size", &view_refresh_size);
index 7546ae0b8dc1eb6e904d9d181a155322891de926..f28e2dfd2c0ac87c00834ea0b79441feebb4040c 100644 (file)
@@ -155,8 +155,6 @@ DEF_CMD(ws_close)
 
        mark_free(ws->mymark);
        ws->mymark = NULL;
-       free(ws);
-       ci->home->data = safe_cast NULL;
        return 1;
 }
 
@@ -196,6 +194,7 @@ void edlib_init(struct pane *ed safe)
 
        key_add(ws_map, "map-attr", &ws_attrs);
        key_add(ws_map, "Close", &ws_close);
+       key_add(ws_map, "Free", &edlib_do_free);
        key_add(ws_map, "Clone", &ws_clone);
        call_comm("global-set-command", ed, &whitespace_attach,
                  0, NULL, "attach-whitespace");
index 2a0ff921e02a23ce86cb5a7b9a924139f7b33df6..04bb4aabd535bba64a032ab3a296af53f2285cab 100644 (file)
@@ -236,7 +236,7 @@ DEF_CMD(render_complete_prev)
        return do_render_complete_prev(cd, ci->mark, ci->home->parent, ci->num, NULL);
 }
 
-DEF_CMD(complete_close)
+DEF_CMD(complete_free)
 {
        struct complete_data *cd = ci->home->data;
 
@@ -530,7 +530,7 @@ static void register_map(void)
 
        key_add(rc_map, "doc:render-line", &render_complete_line);
        key_add(rc_map, "doc:render-line-prev", &render_complete_prev);
-       key_add(rc_map, "Close", &complete_close);
+       key_add(rc_map, "Free", &complete_free);
        key_add(rc_map, "Clone", &complete_clone);
 
        key_add(rc_map, "Replace", &complete_ignore_replace);
index 236760fba93a30837fa30693585dc795c73a1b71..fce1360b9d1c31b8851dd5671093df78029a4b05 100644 (file)
@@ -220,13 +220,6 @@ DEF_CMD(render_line_prev)
        return 1;
 }
 
-DEF_CMD(format_close)
-{
-       struct rf_data *rl = ci->home->data;
-       free(rl);
-       return 1;
-}
-
 static struct pane *do_render_format_attach(struct pane *parent, int nolines);
 DEF_CMD(format_clone)
 {
@@ -258,10 +251,10 @@ static void render_format_register_map(void)
 
        key_add(rf_map, "doc:render-line", &render_line);
        key_add(rf_map, "doc:render-line-prev", &render_line_prev);
-       key_add(rf_map, "Close", &format_close);
        key_add(rf_map, "Clone", &format_clone);
        key_add(rf_map, "doc:get-attr", &format_get_attr);
        key_add(rf_map, "doc:content", &format_content);
+       key_add(rf_map, "Free", &edlib_do_free);
 }
 
 DEF_LOOKUP_CMD(render_format_handle, rf_map);
index 0e0f3f48db0991bbe0cb77b1ce0e970c7ec7e4b9..152ee29618b8a5f1105d1c5d62c4d95133c078cb 100644 (file)
@@ -35,9 +35,6 @@ DEF_CMD(render_hex_close)
        struct he_data *he = p->data;
 
        he->pane = NULL;
-       p->data = safe_cast NULL;
-       p->handle = NULL;
-       free(he);
        return 1;
 }
 
@@ -207,6 +204,7 @@ static void render_hex_register_map(void)
        key_add(he_map, "doc:render-line", &render_line);
 
        key_add(he_map, "Close", &render_hex_close);
+       key_add(he_map, "Free", &edlib_do_free);
        key_add(he_map, "Clone", &render_hex_clone);
        key_add(he_map, "doc:replaced", &render_hex_notify_replace);
 }
index f91aac1d053ec7096123c1fcf26e50a01a702718..7f78ed5d2e25e8056043f0149708cc6bfa39063f 100644 (file)
@@ -1441,9 +1441,6 @@ DEF_CMD(render_lines_close)
 
        call("doc:del-view", p, rl->typenum);
        mark_free(rl->old_point);
-       p->data = safe_cast NULL;
-       p->handle = NULL;
-       free(rl);
        return 0;
 }
 
@@ -1895,6 +1892,7 @@ static void render_lines_register_map(void)
        key_add(rl_map, "Abort", &render_lines_abort);
 
        key_add(rl_map, "Close", &render_lines_close);
+       key_add(rl_map, "Free", &edlib_do_free);
        key_add(rl_map, "Clone", &render_lines_clone);
        key_add(rl_map, "Refresh", &render_lines_refresh);
        key_add(rl_map, "Refresh:view", &render_lines_refresh_view);