diff options
author | Thomas White <taw@physics.org> | 2017-09-09 00:17:02 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2017-09-09 00:17:02 +0200 |
commit | b69fb0c999d97dba8b790838cd9d3a8be350a099 (patch) | |
tree | 97d04b9ebce40fb531e62f51c859b87b3bd70506 /src | |
parent | b31ade0db9cd85dab14ddd3cb525b7fd2de7778d (diff) |
Remove fix_scblock_offsets, fix subsequent paragraphs straight away
Diffstat (limited to 'src')
-rw-r--r-- | src/frame.c | 70 | ||||
-rw-r--r-- | src/frame.h | 4 | ||||
-rw-r--r-- | src/sc_editor.c | 9 |
3 files changed, 31 insertions, 52 deletions
diff --git a/src/frame.c b/src/frame.c index bdfb453..aa4ab86 100644 --- a/src/frame.c +++ b/src/frame.c @@ -980,16 +980,17 @@ void delete_text_from_frame(struct frame *fr, struct edit_pos p1, struct edit_po i--; } else { printf("deleting from %ld to %ld\n", start, finis); - del += delete_text_in_paragraph(para, start, finis); + del += delete_text_in_paragraph(fr, i, start, finis); wrap_paragraph(para, NULL, wrapw, 0, 0); } } - /* Update offsets for all subsequent paragraphs, but only if they're - * from the same SCBlock */ - printf("fixing offsets from para %i by %i\n", p1.para, (int)del); - fix_scblock_offsets(fr, p1, del); + /* If we deleted across a paragraph, merge paragraphs */ + if ( p1.para != p2.para ) { + merge_paragraphs(fr, p1.para); + wrap_paragraph(fr->paras[p1.para], NULL, wrapw, 0, 0); + } } @@ -1011,12 +1012,13 @@ static void eliminate_empty_runs(Paragraph *para) /* offs2 negative means "to end" */ -size_t delete_text_in_paragraph(Paragraph *para, size_t offs1, ssize_t offs2) +size_t delete_text_in_paragraph(struct frame *fr, int npara, size_t offs1, ssize_t offs2) { int nrun1, nrun2, nrun; int i; size_t scblock_offs1, scblock_offs2; size_t sum_del = 0; + Paragraph *para = fr->paras[npara]; /* Find which run we are in */ nrun1 = which_run(para, offs1); @@ -1061,7 +1063,6 @@ size_t delete_text_in_paragraph(Paragraph *para, size_t offs1, ssize_t offs2) scblock_offs1 = ds + run->scblock_offs_bytes; scblock_offs2 = de + run->scblock_offs_bytes; sum_del += scblock_offs2 - scblock_offs1; - printf("del %i %i\n", (int)scblock_offs1, (int)scblock_offs2); scblock_delete_text(run->scblock, scblock_offs1, scblock_offs2); /* Fix up the offsets of the subsequent text runs */ @@ -1069,10 +1070,30 @@ size_t delete_text_in_paragraph(Paragraph *para, size_t offs1, ssize_t offs2) run->len_bytes -= del_len; for ( i=nrun+1; i<para->n_runs; i++ ) { if ( para->runs[i].scblock == run->scblock ) { + printf("para %p run %i del %i\n", para, i, (int)del_len); para->runs[i].scblock_offs_bytes -= del_len; } para->runs[i].para_offs_bytes -= del_len; } + + /* ... and in subsequent paragraphs, if they're from the same + * SCBlock */ + for ( i=npara+1; i<fr->n_paras; i++ ) { + int j; + int done = 0; + Paragraph *para = fr->paras[i]; + if ( para->type != PARA_TYPE_TEXT ) continue; + for ( j=0; j<para->n_runs; j++ ) { + if ( para->runs[j].scblock != run->scblock) { + done = 1; + break; + } + printf("subsq para %p run %i del %i\n", para, i, (int)del_len); + para->runs[j].scblock_offs_bytes -= del_len; + } + if ( done ) break; + } + offs2 -= del_len; } @@ -1083,41 +1104,6 @@ size_t delete_text_in_paragraph(Paragraph *para, size_t offs1, ssize_t offs2) } -void fix_scblock_offsets(struct frame *fr, struct edit_pos pos, size_t del) -{ - int i; - int nrun; - size_t offs; - SCBlock *scblock; - - offs = pos_trail_to_offset(fr->paras[pos.para], pos.pos, pos.trail); - nrun = which_run(fr->paras[pos.para], offs); - - if ( nrun == fr->paras[pos.para]->n_runs ) { - fprintf(stderr, "Couldn't find new start\n"); - return; - } - - /* We will update the offsets of any runs which match this block */ - scblock = fr->paras[pos.para]->runs[nrun].scblock; - - for ( i=pos.para+1; i<fr->n_paras; i++ ) { - - int j; - Paragraph *para; - - para = fr->paras[i]; - - if ( para->type != PARA_TYPE_TEXT ) continue; - - for ( j=0; j<para->n_runs; j++ ) { - if ( para->runs[j].scblock != scblock) return; - para->runs[j].scblock_offs_bytes -= del; - } - } -} - - static char *run_text(struct text_run *run) { return strndup(sc_block_contents(run->scblock)+run->scblock_offs_bytes, diff --git a/src/frame.h b/src/frame.h index ed997ef..c52df27 100644 --- a/src/frame.h +++ b/src/frame.h @@ -181,9 +181,7 @@ extern void insert_text_in_paragraph(Paragraph *para, size_t offs, extern void delete_text_from_frame(struct frame *fr, struct edit_pos p1, struct edit_pos p2, double wrap_w); -extern size_t delete_text_in_paragraph(Paragraph *para, size_t offs0, ssize_t offs2); - -extern void fix_scblock_offsets(struct frame *fr, struct edit_pos pos, size_t del); +extern size_t delete_text_in_paragraph(struct frame *fr, int npara, size_t offs0, ssize_t offs2); extern SCBlock *split_paragraph(struct frame *fr, int pn, size_t pos, PangoContext *pc); diff --git a/src/sc_editor.c b/src/sc_editor.c index 2ba3392..5cc612e 100644 --- a/src/sc_editor.c +++ b/src/sc_editor.c @@ -773,19 +773,14 @@ static void do_backspace(struct frame *fr, SCEditor *e) } else { - size_t del; size_t offs_new, offs_old; - struct edit_pos pos; offs_new = pos_trail_to_offset(para, e->cursor_pos, e->cursor_trail); offs_old = pos_trail_to_offset(para, old_pos, old_trail); - del = delete_text_in_paragraph(para, offs_new, offs_old); - pos.para = new_para; - pos.pos = new_pos; - pos.trail = new_trail; - fix_scblock_offsets(fr, pos, 1); + delete_text_in_paragraph(e->cursor_frame, old_para, + offs_new, offs_old); wrap_paragraph(para, NULL, wrapw, 0, 0); |