aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2018-01-18 22:52:46 +0100
committerThomas White <taw@physics.org>2018-01-18 22:52:46 +0100
commit53830f66ca3cd8573340b4f43945aeedf60e5f5f (patch)
treeac9cf4a26b81a2af1c9a3152f4c9ed7c4c452607
parente5caed8842c52b6cb1abfa4e9567174d8a920e75 (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
-rw-r--r--src/frame.c5
-rw-r--r--src/frame.h3
-rw-r--r--src/sc_editor.c4
-rw-r--r--src/sc_interp.c11
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);