aboutsummaryrefslogtreecommitdiff
path: root/src/sc_interp.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2015-01-03 18:50:15 +0000
committerThomas White <taw@bitwiz.org.uk>2015-01-03 18:50:15 +0000
commit94d1b5ea051bd4a6cb41ed0b2bc9b90f461c6e71 (patch)
treeeccf4aca724461772a33dc6c963932b295bf733b /src/sc_interp.c
parenta68d64edca4f67df49b9499272319cad93d38bbe (diff)
Thumbnails!
Diffstat (limited to 'src/sc_interp.c')
-rw-r--r--src/sc_interp.c50
1 files changed, 34 insertions, 16 deletions
diff --git a/src/sc_interp.c b/src/sc_interp.c
index 7d90b4f..e954613 100644
--- a/src/sc_interp.c
+++ b/src/sc_interp.c
@@ -84,7 +84,8 @@ struct _sccallbacklist
int n_callbacks;
int max_callbacks;
char **names;
- SCCallbackFunc *funcs;
+ SCCallbackBoxFunc *box_funcs;
+ SCCallbackDrawFunc *draw_funcs;
void **vps;
};
@@ -99,8 +100,11 @@ SCCallbackList *sc_callback_list_new()
cbl->names = calloc(8, sizeof(char *));
if ( cbl->names == NULL ) return NULL;
- cbl->funcs = calloc(8, sizeof(cbl->funcs[0]));
- if ( cbl->funcs == NULL ) return NULL;
+ cbl->box_funcs = calloc(8, sizeof(cbl->box_funcs[0]));
+ if ( cbl->box_funcs == NULL ) return NULL;
+
+ cbl->draw_funcs = calloc(8, sizeof(cbl->draw_funcs[0]));
+ if ( cbl->draw_funcs == NULL ) return NULL;
cbl->vps = calloc(8, sizeof(cbl->vps[0]));
if ( cbl->vps == NULL ) return NULL;
@@ -123,41 +127,50 @@ void sc_callback_list_free(SCCallbackList *cbl)
}
free(cbl->names);
- free(cbl->funcs);
+ free(cbl->box_funcs);
+ free(cbl->draw_funcs);
free(cbl->vps);
free(cbl);
+
}
void sc_callback_list_add_callback(SCCallbackList *cbl, const char *name,
- SCCallbackFunc func, void *vp)
+ SCCallbackBoxFunc box_func,
+ SCCallbackDrawFunc draw_func, void *vp)
{
if ( cbl->n_callbacks == cbl->max_callbacks ) {
- SCCallbackFunc *funcs_new;
+ SCCallbackBoxFunc *box_funcs_new;
+ SCCallbackDrawFunc *draw_funcs_new;
char **names_new;
void **vps_new;
int mcn = cbl->max_callbacks + 8;
names_new = realloc(cbl->names, mcn*sizeof(char *));
- funcs_new = realloc(cbl->funcs, mcn*sizeof(SCCallbackFunc));
+ box_funcs_new = realloc(cbl->box_funcs,
+ mcn*sizeof(SCCallbackBoxFunc));
+ draw_funcs_new = realloc(cbl->draw_funcs,
+ mcn*sizeof(SCCallbackDrawFunc));
vps_new = realloc(cbl->vps, mcn*sizeof(void *));
- if ( (names_new == NULL) || (funcs_new == NULL)
- || (vps_new == NULL) ) {
+ if ( (names_new == NULL) || (box_funcs_new == NULL)
+ || (vps_new == NULL) || (draw_funcs_new == NULL) ) {
fprintf(stderr, "Failed to grow callback list\n");
return;
}
cbl->names = names_new;
- cbl->funcs = funcs_new;
+ cbl->box_funcs = box_funcs_new;
+ cbl->draw_funcs = draw_funcs_new;
cbl->vps = vps_new;
cbl->max_callbacks = mcn;
}
cbl->names[cbl->n_callbacks] = strdup(name);
- cbl->funcs[cbl->n_callbacks] = func;
+ cbl->box_funcs[cbl->n_callbacks] = box_func;
+ cbl->draw_funcs[cbl->n_callbacks] = draw_func;
cbl->vps[cbl->n_callbacks] = vp;
cbl->n_callbacks++;
}
@@ -184,12 +197,17 @@ static void do_callback(SCInterpreter *scin, SCBlock *bl, const char *name)
}
for ( i=0; i<cbl->n_callbacks; i++ ) {
- cairo_surface_t *surf;
+
+ double w, h;
+ int r;
+ void *bvp;
+
if ( strcmp(cbl->names[i], name) != 0 ) continue;
- surf = cbl->funcs[i](scin, bl, cbl->vps[i]);
- if ( surf == NULL ) return;
- add_surface_box(sc_interp_get_frame(scin)->boxes, surf,
- 256, 256); // FIXME: Box size
+ r = cbl->box_funcs[i](scin, bl, &w, &h, &bvp, cbl->vps[i]);
+ if ( !r ) return;
+ add_callback_box(sc_interp_get_frame(scin)->boxes, w, h,
+ cbl->draw_funcs[i], bvp, cbl->vps[i]);
+
return;
}