aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2017-09-09 00:17:02 +0200
committerThomas White <taw@physics.org>2017-09-09 00:17:02 +0200
commitb69fb0c999d97dba8b790838cd9d3a8be350a099 (patch)
tree97d04b9ebce40fb531e62f51c859b87b3bd70506 /src
parentb31ade0db9cd85dab14ddd3cb525b7fd2de7778d (diff)
Remove fix_scblock_offsets, fix subsequent paragraphs straight away
Diffstat (limited to 'src')
-rw-r--r--src/frame.c70
-rw-r--r--src/frame.h4
-rw-r--r--src/sc_editor.c9
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);