diff options
author | Thomas White <taw@physics.org> | 2018-01-18 22:52:46 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2018-01-18 22:52:46 +0100 |
commit | 53830f66ca3cd8573340b4f43945aeedf60e5f5f (patch) | |
tree | ac9cf4a26b81a2af1c9a3152f4c9ed7c4c452607 /src | |
parent | e5caed8842c52b6cb1abfa4e9567174d8a920e75 (diff) |
Store macro contents block in text run
We need it in order to find where to delete from, e.g. when paragraphs
get united inside a slide title
Diffstat (limited to 'src')
-rw-r--r-- | src/frame.c | 5 | ||||
-rw-r--r-- | src/frame.h | 3 | ||||
-rw-r--r-- | src/sc_editor.c | 4 | ||||
-rw-r--r-- | src/sc_interp.c | 11 |
4 files changed, 15 insertions, 8 deletions
diff --git a/src/frame.c b/src/frame.c index d5ec137..1bc21bc 100644 --- a/src/frame.c +++ b/src/frame.c @@ -40,6 +40,7 @@ struct text_run { SCBlock *scblock; SCBlock *macro_real_block; + SCBlock *macro_contents; size_t scblock_offs_bytes; /* Offset from start of SCBlock */ size_t para_offs_bytes; /* Offset from start of paragraph */ size_t len_bytes; @@ -376,7 +377,8 @@ void set_newline_at_end(Paragraph *para, SCBlock *bl) } -void add_run(Paragraph *para, SCBlock *scblock, SCBlock *macro_real, +void add_run(Paragraph *para, SCBlock *scblock, + SCBlock *macro_real, SCBlock *contents_top, size_t offs_bytes, size_t len_bytes, PangoFontDescription *fdesc, double col[4]) { @@ -397,6 +399,7 @@ void add_run(Paragraph *para, SCBlock *scblock, SCBlock *macro_real, para->runs = runs_new; para->runs[para->n_runs].scblock = scblock; para->runs[para->n_runs].macro_real_block = macro_real; + para->runs[para->n_runs].macro_contents = contents_top; para->runs[para->n_runs].scblock_offs_bytes = offs_bytes; para->runs[para->n_runs].para_offs_bytes = para->offset_last; para->offset_last += len_bytes; diff --git a/src/frame.h b/src/frame.h index ac91548..24e8356 100644 --- a/src/frame.h +++ b/src/frame.h @@ -135,7 +135,8 @@ extern void set_newline_at_end(Paragraph *para, SCBlock *bl); extern void check_run(struct frame *fr, int pn); extern void show_edit_pos(struct edit_pos a); -extern void add_run(Paragraph *para, SCBlock *scblock, SCBlock *macro_real, +extern void add_run(Paragraph *para, SCBlock *scblock, + SCBlock *macro_real, SCBlock *contents_top, size_t offs_bytes, size_t len_bytes, PangoFontDescription *fdesc, double col[4]); diff --git a/src/sc_editor.c b/src/sc_editor.c index f486598..bde5795 100644 --- a/src/sc_editor.c +++ b/src/sc_editor.c @@ -849,7 +849,7 @@ static void insert_text(char *t, SCEditor *e) fprintf(stderr, "Failed to insert paragraph\n"); return; } - add_run(pnew, ad, NULL, 0, strlen(t), + add_run(pnew, ad, NULL, NULL, 0, strlen(t), e->cursor_frame->fontdesc, e->cursor_frame->col); wrap_frame(e->cursor_frame, e->pc); @@ -1072,7 +1072,7 @@ static void check_paragraph(struct frame *fr, PangoContext *pc, } scblocks = sc_block_append(scblocks, NULL, NULL, strdup(""), NULL); - add_run(para, scblocks, NULL, 0, 0, fr->fontdesc, fr->col); + add_run(para, scblocks, NULL, NULL, 0, 0, fr->fontdesc, fr->col); wrap_paragraph(para, pc, fr->w - fr->pad_l - fr->pad_r, 0, 0); } diff --git a/src/sc_interp.c b/src/sc_interp.c index 31c1f77..3ea8d96 100644 --- a/src/sc_interp.c +++ b/src/sc_interp.c @@ -75,8 +75,8 @@ struct sc_state int max_templates; struct template *templates; - SCBlock *macro_contents; - SCBlock *macro_real_block; + SCBlock *macro_contents; /* If running a macro, the child block of the caller */ + SCBlock *macro_real_block; /* If running a macro, the block which called the macro */ }; @@ -965,7 +965,8 @@ static int add_text(struct frame *fr, PangoContext *pc, SCBlock *bl, size_t len = strlen(text+start); Paragraph *para = last_open_para(fr); - add_run(para, bl, mrb, start, len, fontdesc, col); + add_run(para, bl, mrb, st->macro_contents, start, len, + fontdesc, col); set_para_spacing(para, st->paraspace); start += len; @@ -1027,8 +1028,10 @@ static int check_outputs(SCBlock *bl, SCInterpreter *scin) } else if ( strcmp(name, "newpara")==0 ) { struct frame *fr = sc_interp_get_frame(scin); Paragraph *para = last_open_para(fr); + struct sc_state *st = &scin->state[scin->j]; /* Add a dummy run which we can type into */ - add_run(para, bl, NULL, 0, 0, sc_interp_get_fontdesc(scin), fr->col); + add_run(para, bl, st->macro_real_block, st->macro_contents, 0, 0, + sc_interp_get_fontdesc(scin), fr->col); set_newline_at_end(para, bl); close_last_paragraph(fr); |