int parts_size;
struct part {
struct pane *pane;
- } *parts safe;
+ } *parts;
};
#include "core-pane.h"
struct mark *m1;
struct part *p;
- if (part < 0 || part > mpi->nparts)
+ if (part < 0 || part > mpi->nparts || !mpi->parts)
return;
if (m->ref.m) {
ASSERT(GET_REFS(m->ref.m) == 1);
* of the next instead.
*/
struct part *p;
+ if (!mpi->parts)
+ return;
while (m->ref.m && (p = &mpi->parts[m->ref.docnum]) && p->pane &&
doc_following(p->pane, m->ref.m) == WEOF) {
int n = m->ref.docnum + 1;
if (GET_REFS(m2) == 0)
mark_free(m2);
}
+ if (!mpi->parts)
+ return Efallthrough;
for (i = 0; i < mpi->nparts; i++) {
struct pane *p = mpi->parts[i].pane;
if (p)
call("doc:closed", p);
}
- return Efallthrough;
-}
-
-DEF_CMD(mp_free)
-{
- struct mp_info *mpi = ci->home->doc_data;
-
free(mpi->parts);
- return 1;
+ mpi->parts = NULL;
+ return Efallthrough;
}
DEF_CMD(mp_set_ref)
m1 = m->ref.m;
- if (m->ref.docnum >= mpi->nparts)
+ if (m->ref.docnum >= mpi->nparts || !mpi->parts)
ret = -1;
else
ret = home_call(mpi->parts[m->ref.docnum].pane,
change_part(mpi, m, n, 1);
}
m1 = m->ref.m;
- if (m->ref.docnum >= mpi->nparts)
+ if (m->ref.docnum >= mpi->nparts || !mpi->parts)
ret = -1;
else
ret = home_call(mpi->parts[m->ref.docnum].pane,
m2 = ci->mark2;
cb.last_ret = 1;
while (cb.last_ret > 0 && m->ref.docnum < mpi->nparts &&
+ mpi->parts &&
(!m2 || m->ref.docnum <= m2->ref.docnum)) {
/* Need to call doc:content on this document */
int n = m->ref.docnum;
m1 = ci->mark->ref.m;
d = ci->mark->ref.docnum;
- if (d < mpi->nparts && m1 && (p = &mpi->parts[d]) &&
+ if (d < mpi->nparts && m1 && mpi->parts && (p = &mpi->parts[d]) &&
p->pane && doc_following(p->pane, m1) == WEOF)
/* at the wrong end of a part */
d += 1;
return 1;
}
- if (d >= mpi->nparts || d < 0)
+ if (d >= mpi->nparts || d < 0 || !mpi->parts)
return 1;
if (attr != ci->str) {
return Enoarg;
if (!m)
return Efallthrough;
+ if (!mpi->parts)
+ return Efail;
dn = m->ref.docnum;
m1 = m->ref.m;
struct mp_info *mpi = ci->home->doc_data;
int i;
- for (i = 0; i < mpi->nparts; i++)
+ for (i = 0; i < mpi->nparts && mpi->parts; i++)
if (mpi->parts[i].pane == ci->focus) {
/* sub-document has been closed.
* Can we survive? or should we just shut down?
return Einval;
key += 1;
- if (d >= mpi->nparts || d < 0)
+ if (d >= mpi->nparts || d < 0 || !mpi->parts)
return 1;
if (ci->mark && ci->mark->ref.docnum == d)
struct part *p;
int d = ci->num;
- if (d < 0 || d >= mpi->nparts)
+ if (d < 0 || d >= mpi->nparts || !mpi->parts)
return Einval;
p = &mpi->parts[d];
if (p->pane)
if (!ci->mark2)
return Enoarg;
-
+ if (!mpi->parts)
+ return Efail;
m2 = ci->mark2->ref.m;
d = ci->mark2->ref.docnum;
key_add(mp_map, "doc:step-part", &mp_step_part);
key_add(mp_map, "doc:get-boundary", &mp_get_boundary);
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, "doc:replaced", &mp_doc_replaced);