diff options
author | Thomas White <taw@bitwiz.me.uk> | 2018-10-28 00:03:51 +0200 |
---|---|---|
committer | Thomas White <taw@bitwiz.me.uk> | 2018-10-28 00:03:51 +0200 |
commit | 8e05062ad3b94068825a1f80eb362aa3d3e9098f (patch) | |
tree | 77944d65437fa57755a7bc8bc16fd3e2c5b43f17 /src/frame.c | |
parent | 791ee4e65f3ec7ef470302e4381baefb431fb56d (diff) | |
parent | 21418cfb52b87a32cfdc9bb14be83b85a8e70281 (diff) |
Merge branch 'json-stylesheets'
Diffstat (limited to 'src/frame.c')
-rw-r--r-- | src/frame.c | 212 |
1 files changed, 43 insertions, 169 deletions
diff --git a/src/frame.c b/src/frame.c index d4a5637..2926d4e 100644 --- a/src/frame.c +++ b/src/frame.c @@ -39,7 +39,6 @@ struct text_run { SCBlock *scblock; /* If macro, this is \macro */ - SCBlock *rscblock; /* The block with the actual text */ PangoFontDescription *fontdesc; double col[4]; }; @@ -61,7 +60,6 @@ struct _paragraph /* For anything other than PARA_TYPE_TEXT * (for text paragraphs, these things are in the runs) */ SCBlock *scblock; - SCBlock *rscblock; /* For PARA_TYPE_IMAGE */ char *filename; @@ -186,7 +184,7 @@ struct frame *add_subframe(struct frame *fr) } -void show_hierarchy(struct frame *fr, const char *t) +void show_frame_hierarchy(struct frame *fr, const char *t) { int i; char tn[1024]; @@ -197,65 +195,12 @@ void show_hierarchy(struct frame *fr, const char *t) printf(_("%s%p (%.2f x %.2f)\n"), t, fr, fr->w, fr->h); for ( i=0; i<fr->num_children; i++ ) { - show_hierarchy(fr->children[i], tn); + show_frame_hierarchy(fr->children[i], tn); } } -static struct frame *find_parent(struct frame *fr, struct frame *search) -{ - int i; - - for ( i=0; i<fr->num_children; i++ ) { - if ( fr->children[i] == search ) { - return fr; - } - } - - for ( i=0; i<fr->num_children; i++ ) { - struct frame *tt; - tt = find_parent(fr->children[i], search); - if ( tt != NULL ) return tt; - } - - return NULL; -} - - -void delete_subframe(struct frame *top, struct frame *fr) -{ - struct frame *parent; - int i, idx, found; - - parent = find_parent(top, fr); - if ( parent == NULL ) { - fprintf(stderr, _("Couldn't find parent when deleting frame.\n")); - return; - } - - found = 0; - for ( i=0; i<parent->num_children; i++ ) { - if ( parent->children[i] == fr ) { - idx = i; - found = 1; - break; - } - } - - if ( !found ) { - fprintf(stderr, _("Couldn't find child when deleting frame.\n")); - return; - } - - for ( i=idx; i<parent->num_children-1; i++ ) { - parent->children[i] = parent->children[i+1]; - } - - parent->num_children--; -} - - struct frame *find_frame_with_scblocks(struct frame *fr, SCBlock *scblocks) { int i; @@ -279,17 +224,17 @@ static size_t run_text_len(const struct text_run *run) return 0; } - if ( run->rscblock == NULL ) { - fprintf(stderr, _("NULL rscblock in run_text_len\n")); + if ( run->scblock == NULL ) { + fprintf(stderr, _("NULL scblock in run_text_len\n")); return 0; } - if ( sc_block_contents(run->rscblock) == NULL ) { - fprintf(stderr, _("NULL rscblock contents in run_text_len\n")); + if ( sc_block_contents(run->scblock) == NULL ) { + fprintf(stderr, _("NULL scblock contents in run_text_len\n")); return 0; } - return strlen(sc_block_contents(run->rscblock)); + return strlen(sc_block_contents(run->scblock)); } @@ -340,7 +285,7 @@ void wrap_paragraph(Paragraph *para, PangoContext *pc, double w, size_t run_len; guint16 r, g, b; - run_text = sc_block_contents(para->runs[i].rscblock); + run_text = sc_block_contents(para->runs[i].scblock); run_len = strlen(run_text); attr = pango_attr_font_desc_new(para->runs[i].fontdesc); @@ -384,19 +329,25 @@ void wrap_paragraph(Paragraph *para, PangoContext *pc, double w, para->height = pango_units_to_double(rect.height); } -SCBlock *get_newline_at_end(Paragraph *para) +static SCBlock *get_newline_at_end(Paragraph *para) { return para->newline_at_end; } +SCBlock *para_debug_get_newline_at_end(Paragraph *para) +{ + return get_newline_at_end(para); +} + + void set_newline_at_end(Paragraph *para, SCBlock *bl) { para->newline_at_end = bl; } -void add_run(Paragraph *para, SCBlock *scblock, SCBlock *rscblock, +void add_run(Paragraph *para, SCBlock *scblock, PangoFontDescription *fdesc, double col[4]) { struct text_run *runs_new; @@ -410,7 +361,6 @@ void add_run(Paragraph *para, SCBlock *scblock, SCBlock *rscblock, para->runs = runs_new; para->runs[para->n_runs].scblock = scblock; - para->runs[para->n_runs].rscblock = rscblock; para->runs[para->n_runs].fontdesc = pango_font_description_copy(fdesc); para->runs[para->n_runs].col[0] = col[0]; para->runs[para->n_runs].col[1] = col[1]; @@ -421,7 +371,7 @@ void add_run(Paragraph *para, SCBlock *scblock, SCBlock *rscblock, } -Paragraph *create_paragraph(struct frame *fr, SCBlock *bl, SCBlock *rbl) +Paragraph *create_paragraph(struct frame *fr, SCBlock *bl) { Paragraph **paras_new; Paragraph *pnew; @@ -439,7 +389,6 @@ Paragraph *create_paragraph(struct frame *fr, SCBlock *bl, SCBlock *rbl) * However, this can easily be changed */ pnew->type = PARA_TYPE_TEXT; pnew->scblock = bl; - pnew->rscblock = rbl; pnew->n_runs = 0; pnew->runs = NULL; pnew->layout = NULL; @@ -481,8 +430,7 @@ Paragraph *insert_paragraph(struct frame *fr, int pos) } -Paragraph *add_callback_para(struct frame *fr, SCBlock *bl, SCBlock *rbl, - double w, double h, +Paragraph *add_callback_para(struct frame *fr, SCBlock *bl, double w, double h, SCCallbackDrawFunc draw_func, SCCallbackClickFunc click_func, void *bvp, void *vp) @@ -492,7 +440,7 @@ Paragraph *add_callback_para(struct frame *fr, SCBlock *bl, SCBlock *rbl, if ( (fr->n_paras > 0) && (fr->paras[fr->n_paras-1]->empty) ) { pnew = fr->paras[fr->n_paras-1]; } else { - pnew = create_paragraph(fr, bl, rbl); + pnew = create_paragraph(fr, bl); if ( pnew == NULL ) { fprintf(stderr, _("Failed to add callback paragraph\n")); return NULL; @@ -501,7 +449,6 @@ Paragraph *add_callback_para(struct frame *fr, SCBlock *bl, SCBlock *rbl, pnew->type = PARA_TYPE_CALLBACK; pnew->scblock = bl; - pnew->rscblock = rbl; pnew->cb_w = w; pnew->cb_h = h; pnew->draw_func = draw_func; @@ -515,7 +462,7 @@ Paragraph *add_callback_para(struct frame *fr, SCBlock *bl, SCBlock *rbl, } -void add_image_para(struct frame *fr, SCBlock *scblock, SCBlock *rscblock, +void add_image_para(struct frame *fr, SCBlock *scblock, const char *filename, ImageStore *is, double w, double h, int editable) { @@ -530,7 +477,7 @@ void add_image_para(struct frame *fr, SCBlock *scblock, SCBlock *rscblock, if ( (fr->n_paras > 0) && (fr->paras[fr->n_paras-1]->empty) ) { pnew = fr->paras[fr->n_paras-1]; } else { - pnew = create_paragraph(fr, scblock, rscblock); + pnew = create_paragraph(fr, scblock); if ( pnew == NULL ) { fprintf(stderr, _("Failed to add image paragraph\n")); return; @@ -545,7 +492,6 @@ void add_image_para(struct frame *fr, SCBlock *scblock, SCBlock *rscblock, pnew->type = PARA_TYPE_IMAGE; pnew->scblock = scblock; - pnew->rscblock = rscblock; pnew->filename = strdup(filename); pnew->image_w = w; pnew->image_h = h; @@ -662,7 +608,7 @@ void render_paragraph(cairo_t *cr, Paragraph *para, ImageStore *is) } -size_t end_offset_of_para(struct frame *fr, int pn) +static size_t end_offset_of_para(struct frame *fr, int pn) { int i; size_t total = 0; @@ -726,11 +672,6 @@ void ensure_run(struct frame *fr, struct edit_pos cpos) if ( para->type != PARA_TYPE_TEXT ) return; - if ( para->scblock != para->rscblock ) { - fprintf(stderr, _("Need to add run, but paragraph not editable\n")); - return; - } - if ( para->scblock != NULL ) { bl = sc_block_prepend(para->scblock, fr->scblocks); @@ -745,13 +686,12 @@ void ensure_run(struct frame *fr, struct edit_pos cpos) /* If the paragraph's SCBlock is NULL, it means this paragraph * is right at the end of the document. The last thing in the * document is something like \newpara. */ - bl = sc_block_append_end(fr->scblocks, NULL, NULL, strdup("")); + bl = sc_block_append_inside(fr->scblocks, NULL, NULL, strdup("")); } para->scblock = bl; - para->rscblock = bl; - add_run(para, bl, bl, fr->fontdesc, fr->col); + add_run(para, bl, fr->fontdesc, fr->col); wrap_paragraph(para, NULL, fr->w - fr->pad_l - fr->pad_r, 0, 0); } @@ -907,11 +847,6 @@ void cursor_moveh(struct frame *fr, struct edit_pos *cp, signed int dir) } -void cursor_movev(struct frame *fr, struct edit_pos *cp, signed int dir) -{ -} - - void check_callback_click(struct frame *fr, int para) { Paragraph *p = fr->paras[para]; @@ -987,7 +922,7 @@ size_t pos_trail_to_offset(Paragraph *para, size_t offs, int trail) return 0; } - if ( sc_block_contents(run->rscblock) == NULL ) { + if ( sc_block_contents(run->scblock) == NULL ) { fprintf(stderr, _("pos_trail_to_offset: No contents " "(%p name=%s, options=%s)\n"), run->scblock, sc_block_name(run->scblock), @@ -996,7 +931,7 @@ size_t pos_trail_to_offset(Paragraph *para, size_t offs, int trail) } /* Get the text for the run */ - run_text = sc_block_contents(run->rscblock); + run_text = sc_block_contents(run->scblock); /* Turn the paragraph offset into a run offset */ para_offset_of_run = get_paragraph_offset(para, nrun); @@ -1035,11 +970,6 @@ int position_editable(struct frame *fr, struct edit_pos cp) para = fr->paras[cp.para]; - if ( para->scblock != para->rscblock ) { - fprintf(stderr, _("Paragraph is not editable.\n")); - return 0; - } - if ( para->type != PARA_TYPE_TEXT ) { fprintf(stderr, _("Paragraph is not text.\n")); return 0; @@ -1052,7 +982,7 @@ int position_editable(struct frame *fr, struct edit_pos cp) return 0; } - return (para->runs[run].scblock == para->runs[run].rscblock); + return 1; } @@ -1074,33 +1004,11 @@ void insert_text_in_paragraph(Paragraph *para, size_t offs, const char *t) size_t run_offs; run = ¶->runs[nrun]; run_offs = offs - get_paragraph_offset(para, nrun); - sc_insert_text(run->rscblock, run_offs, t); + sc_insert_text(run->scblock, run_offs, t); } } -static SCBlock *pos_to_rscblock(struct frame *fr, struct edit_pos p) -{ - int run; - size_t paraoffs; - Paragraph *para; - - para = fr->paras[p.para]; - - if ( para->type != PARA_TYPE_TEXT ) { - return NULL; - } - - paraoffs = pos_trail_to_offset(para, p.pos, p.trail); - - run = which_run(para, paraoffs); - assert(run < para->n_runs); - - return para->runs[run].rscblock; -} - - - static SCBlock *pos_to_scblock(struct frame *fr, struct edit_pos p, enum para_type *type) { @@ -1192,17 +1100,9 @@ static Paragraph *scan_runs_for_scblock(struct frame *fr, int pn1, int pn2, *run = 0; return fr->paras[i]; } - if ( fr->paras[i]->rscblock == bl ) { - *run = 0; - return fr->paras[i]; - } /* Check all runs */ for ( j=0; j<fr->paras[i]->n_runs; j++ ) { - if ( fr->paras[i]->runs[j].rscblock == bl ) { - *run = j; - return fr->paras[i]; - } if ( fr->paras[i]->runs[j].scblock == bl ) { *run = j; return fr->paras[i]; @@ -1440,7 +1340,6 @@ void delete_text_from_frame(struct frame *fr, struct edit_pos p1, struct edit_po { int i; SCBlock *p1scblock, *p2scblock; - SCBlock *p1rscblock, *p2rscblock; enum para_type type1, type2; size_t p2offs; SCBlock *scblock; @@ -1467,8 +1366,6 @@ void delete_text_from_frame(struct frame *fr, struct edit_pos p1, struct edit_po /* Find SC positions for start and end */ p1scblock = pos_to_scblock(fr, p1, &type1); p2scblock = pos_to_scblock(fr, p2, &type2); - p1rscblock = pos_to_rscblock(fr, p1); - p2rscblock = pos_to_rscblock(fr, p2); p2offs = pos_to_offset(fr, p2); wrap_end = p2.para; @@ -1512,9 +1409,9 @@ void delete_text_from_frame(struct frame *fr, struct edit_pos p1, struct edit_po printf(" offs %li\n", (long int)p1offs); if ( p1offs != 0 ) { printf("Partial delete\n"); - printf("contents '%s'\n", sc_block_contents(p1rscblock)); + printf("contents '%s'\n", sc_block_contents(p1scblock)); printf("from offs %li\n", (long int)p1offs); - scblock_delete_text(p1rscblock, p1offs, -1); + scblock_delete_text(p1scblock, p1offs, -1); } else { printf("Deleting the whole text SCBlock\n"); sc_block_delete(&fr->scblocks, p1scblock); @@ -1564,8 +1461,8 @@ void delete_text_from_frame(struct frame *fr, struct edit_pos p1, struct edit_po if ( type2 == PARA_TYPE_TEXT ) { size_t len; printf(" offs %li\n", (long int)p2offs); - if ( sc_block_contents(p2rscblock) != NULL ) { - len = strlen(sc_block_contents(p2rscblock)); + if ( sc_block_contents(p2scblock) != NULL ) { + len = strlen(sc_block_contents(p2scblock)); } else { len = 0; } @@ -1580,9 +1477,9 @@ void delete_text_from_frame(struct frame *fr, struct edit_pos p1, struct edit_po NULL); } else if ( p2offs > 0 ) { printf("Partial delete\n"); - printf("contents '%s'\n", sc_block_contents(p2rscblock)); + printf("contents '%s'\n", sc_block_contents(p2scblock)); printf("up to offs %li\n", (long int)p2offs); - scblock_delete_text(p2rscblock, 0, p2offs); + scblock_delete_text(p2scblock, 0, p2offs); } /* else do nothing */ } else { printf("Deleting the whole non-text SCBlock\n"); @@ -1610,10 +1507,10 @@ void show_para(Paragraph *p) printf(_("%i runs:\n"), p->n_runs); for ( i=0; i<p->n_runs; i++ ) { - printf(_(" Run %2i: SCBlock %p/%p %s '%s'\n"), - i, p->runs[i].scblock, p->runs[i].rscblock, + printf(_(" Run %2i: SCBlock %p %s '%s'\n"), + i, p->runs[i].scblock, pango_font_description_to_string(p->runs[i].fontdesc), - sc_block_contents(p->runs[i].rscblock)); + sc_block_contents(p->runs[i].scblock)); } } else if ( p->type == PARA_TYPE_IMAGE ) { @@ -1695,9 +1592,8 @@ static SCBlock *split_text_paragraph(struct frame *fr, int pn, size_t pos, end = sc_block_append(np, NULL, NULL, strdup(""), NULL); pnew->n_runs = 0; - add_run(pnew, end, end, fr->fontdesc, fr->col); + add_run(pnew, end, fr->fontdesc, fr->col); pnew->scblock = end; - pnew->rscblock = end; wrap_paragraph(pnew, pc, fr->w - fr->pad_l - fr->pad_r, 0, 0); @@ -1710,12 +1606,11 @@ static SCBlock *split_text_paragraph(struct frame *fr, int pn, size_t pos, /* Split the run (and SCBlock) into two */ double col[4] = {0,0,0,0}; struct text_run *rn; - int macro = 0; printf("Splitting run %i. Before:\n", run); show_para(para); - add_run(para, NULL, NULL, NULL, col); + add_run(para, NULL, NULL, col); /* -2 here because add_run increased para->n_runs by 1 */ memmove(¶->runs[run+2], ¶->runs[run+1], (para->n_runs - run - 2)*sizeof(struct text_run)); @@ -1723,19 +1618,7 @@ static SCBlock *split_text_paragraph(struct frame *fr, int pn, size_t pos, rr = ¶->runs[run]; /* Because add_run realloced the runs */ rn = ¶->runs[run+1]; - if ( rr->rscblock != rr->scblock) { - macro = 1; - } - - rn->rscblock = sc_block_split(rr->rscblock, run_offs); - - if ( !macro ) { - /* Literal text block */ - rn->scblock = rn->rscblock; - } else { - /* Macro block */ - rn->scblock = rr->scblock; - } + rn->scblock = sc_block_split(rr->scblock, run_offs); rn->fontdesc = pango_font_description_copy(rr->fontdesc); rn->col[0] = rr->col[0]; @@ -1752,11 +1635,10 @@ static SCBlock *split_text_paragraph(struct frame *fr, int pn, size_t pos, for ( i=run+1; i<para->n_runs; i++ ) { double col[4] = {0,0,0,0}; printf("Moving run %i to pos %i\n", i, pnew->n_runs); - add_run(pnew, NULL, NULL, NULL, col); + add_run(pnew, NULL, NULL, col); pnew->runs[pnew->n_runs-1] = para->runs[i]; } pnew->scblock = pnew->runs[0].scblock; - pnew->rscblock = pnew->runs[0].rscblock; /* Truncate the first paragraph at the appropriate position */ para->n_runs = run+1; @@ -1768,7 +1650,7 @@ static SCBlock *split_text_paragraph(struct frame *fr, int pn, size_t pos, show_para(pnew); /* Add a \newpara after the end of the first paragraph's SC */ - nnp = sc_block_append(rr->rscblock, strdup("newpara"), NULL, NULL, NULL); + nnp = sc_block_append(rr->scblock, strdup("newpara"), NULL, NULL, NULL); set_newline_at_end(pnew, get_newline_at_end(para)); set_newline_at_end(para, nnp); @@ -1853,12 +1735,6 @@ SCBlock *para_scblock(Paragraph *para) } -SCBlock *para_rscblock(Paragraph *para) -{ - return para->rscblock; -} - - enum para_type para_type(Paragraph *para) { return para->type; @@ -1872,13 +1748,11 @@ int para_debug_num_runs(Paragraph *para) } -int para_debug_run_info(Paragraph *para, int i, SCBlock **scblock, - SCBlock **rscblock) +int para_debug_run_info(Paragraph *para, int i, SCBlock **scblock) { if ( para->type != PARA_TYPE_TEXT ) return 1; if ( i >= para->n_runs ) return 1; *scblock = para->runs[i].scblock; - *rscblock = para->runs[i].rscblock; return 0; } |