Add rscblocks for image and callback paragraphs
authorThomas White <taw@physics.org>
Mon, 12 Mar 2018 18:55:39 +0000 (19:55 +0100)
committerThomas White <taw@physics.org>
Mon, 12 Mar 2018 18:55:39 +0000 (19:55 +0100)
src/frame.c
src/frame.h
src/sc_interp.c

index 7099209..9792746 100644 (file)
@@ -59,6 +59,7 @@ 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;
@@ -472,7 +473,7 @@ Paragraph *insert_paragraph(struct frame *fr, int pos)
 }
 
 
-void add_callback_para(struct frame *fr, SCBlock *bl,
+void add_callback_para(struct frame *fr, SCBlock *bl, SCBlock *rbl,
                        double w, double h,
                        SCCallbackDrawFunc draw_func,
                        SCCallbackClickFunc click_func, void *bvp,
@@ -488,6 +489,7 @@ void add_callback_para(struct frame *fr, SCBlock *bl,
 
        pnew->type = PARA_TYPE_CALLBACK;
        pnew->scblock = bl;
+       pnew->rscblock = rbl;
        pnew->cb_w = w;
        pnew->cb_h = h;
        pnew->draw_func = draw_func;
@@ -499,7 +501,8 @@ void add_callback_para(struct frame *fr, SCBlock *bl,
 }
 
 
-void add_image_para(struct frame *fr, SCBlock *scblock, const char *filename,
+void add_image_para(struct frame *fr, SCBlock *scblock, SCBlock *rscblock,
+                    const char *filename,
                     ImageStore *is, double w, double h, int editable)
 {
        Paragraph *pnew;
@@ -524,6 +527,7 @@ void add_image_para(struct frame *fr, SCBlock *scblock, const char *filename,
 
        pnew->type = PARA_TYPE_IMAGE;
        pnew->scblock = scblock;
+       pnew->rscblock = rscblock;
        pnew->filename = strdup(filename);
        pnew->image_w = w;
        pnew->image_h = h;
@@ -1776,6 +1780,12 @@ SCBlock *para_scblock(Paragraph *para)
 }
 
 
+SCBlock *para_rscblock(Paragraph *para)
+{
+       return para->rscblock;
+}
+
+
 enum para_type para_type(Paragraph *para)
 {
        return para->type;
index f3e1538..af2e9fd 100644 (file)
@@ -143,13 +143,14 @@ extern void add_run(Paragraph *para, SCBlock *scblock, SCBlock *rscblock,
 extern Paragraph *insert_paragraph(struct frame *fr, int pos);
 
 extern void add_callback_para(struct frame *fr, SCBlock *scblock,
+                              SCBlock *rscblock,
                               double w, double h,
                               SCCallbackDrawFunc draw_func,
                               SCCallbackClickFunc click_func, void *bvp,
                               void *vp);
 
 extern void add_image_para(struct frame *fr, SCBlock *scblock,
-                           const char *filename,
+                           SCBlock *rscblock, const char *filename,
                            ImageStore *is, double w, double h, int editable);
 
 extern void wrap_paragraph(Paragraph *para, PangoContext *pc, double w,
@@ -204,6 +205,7 @@ extern void merge_paragraphs(struct frame *fr, int para);
 
 extern enum para_type para_type(Paragraph *para);
 extern SCBlock *para_scblock(Paragraph *para);
+extern SCBlock *para_rscblock(Paragraph *para);
 
 extern int para_debug_num_runs(Paragraph *para);
 extern int para_debug_run_info(Paragraph *para, int i, SCBlock **scblock,
index 5c3cd8c..c9f3d76 100644 (file)
@@ -231,15 +231,17 @@ static void do_callback(SCInterpreter *scin, SCBlock *bl, const char *name)
                double w, h;
                int r;
                void *bvp;
-               SCBlock *mr;
+               SCBlock *rbl;
 
-               mr = sc_interp_get_macro_real_block(scin);
-               if ( mr == NULL ) mr = bl;
+               rbl = bl;
+               if ( sc_interp_get_macro_real_block(scin) != NULL ) {
+                       bl = sc_interp_get_macro_real_block(scin);
+               }
 
                if ( strcmp(cbl->names[i], name) != 0 ) continue;
                r = cbl->box_funcs[i](scin, bl, &w, &h, &bvp, cbl->vps[i]);
                if ( !r ) return;
-               add_callback_para(sc_interp_get_frame(scin), bl, w, h,
+               add_callback_para(sc_interp_get_frame(scin), bl, rbl, w, h,
                                  cbl->draw_funcs[i], cbl->click_funcs[i],
                                  bvp, cbl->vps[i]);
 
@@ -988,11 +990,11 @@ static int check_outputs(SCBlock *bl, SCInterpreter *scin)
                if ( parse_image_options(options, sc_interp_get_frame(scin),
                                         &w, &h, &filename) == 0 )
                {
-                       SCBlock *ebl = bl;
+                       SCBlock *rbl = bl;
                        if ( st->macro_real_block != NULL ) {
-                               ebl = st->macro_real_block;
+                               rbl = st->macro_real_block;
                        }
-                       add_image_para(sc_interp_get_frame(scin), ebl,
+                       add_image_para(sc_interp_get_frame(scin), bl, rbl,
                                       filename, scin->is, w, h, 1);
                        free(filename);
                } else {