/** \brief Free a \e libcaca canvas. * * Free all resources allocated by caca_create_canvas(). The canvas * pointer becomes invalid and must no longer be used unless a new call * to caca_create_canvas() is made. * * If an error occurs, -1 is returned and \b errno is set accordingly: * - \c EBUSY The canvas is in use by a display driver and cannot be freed. * * \param cv A libcaca canvas. * \return 0 in case of success, -1 if an error occurred. */ int caca_free_canvas(caca_canvas_t *cv) { int f; if(cv->refcount) { seterrno(EBUSY); return -1; } for(f = 0; f < cv->framecount; f++) { free(cv->frames[f].chars); free(cv->frames[f].attrs); free(cv->frames[f].name); } caca_canvas_set_figfont(cv, NULL); free(cv->frames); free(cv); return 0; }
int main(int argc, char *argv[]) { caca_canvas_t *cv; caca_canvas_t *figcv; caca_display_t *dp; uint32_t w, h, fw, fh; char *format = "%R:%S"; char *font = "/usr/share/figlet/mono12.tlf"; for(;;) { int option_index = 0; static struct caca_option long_options[] = { { "font", 1, NULL, 'f' }, { "dateformat", 1, NULL, 'd' }, { "help", 0, NULL, 'h' }, { "version", 0, NULL, 'v' }, }; int c = caca_getopt(argc, argv, "f:d:hv", long_options, &option_index); if(c == -1) break; switch(c) { case 'h': /* --help */ usage(argc, argv); return 0; break; case 'v': /* --version */ version(); return 0; break; case 'f': /* --font */ font = caca_optarg; break; case 'd': /* --dateformat */ format = caca_optarg; break; default: return 1; break; } } cv = caca_create_canvas(0, 0); figcv = caca_create_canvas(0, 0); if(!cv || !figcv) { fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]); return 1; } if(caca_canvas_set_figfont(figcv, font)) { fprintf(stderr, "Could not open font\n"); return -1; } dp = caca_create_display(cv); if(!dp) { printf("Can't open window. CACA_DRIVER problem ?\n"); return -1; } caca_set_color_ansi(figcv, CACA_DEFAULT, CACA_DEFAULT); caca_clear_canvas(cv); for(;;) { caca_event_t ev; while(caca_get_event(dp, CACA_EVENT_KEY_PRESS | CACA_EVENT_QUIT, &ev, 1)) { if(caca_get_event_type(&ev)) goto end; } char *d = get_date(format); uint32_t o = 0; // figfont API is not complete, and does not allow us to put a string // at another position than 0,0 // So, we have to create a canvas which will hold the figfont string, // then blit this canvas to the main one at the desired position. caca_clear_canvas(cv); caca_clear_canvas(figcv); while(d[o]) { caca_put_figchar(figcv, d[o++]); } caca_flush_figlet (figcv); free(d); w = caca_get_canvas_width (cv); h = caca_get_canvas_height(cv); fw = caca_get_canvas_width (figcv); fh = caca_get_canvas_height(figcv); uint32_t x = (w/2) - (fw/2); uint32_t y = (h/2) - (fh/2); caca_blit(cv, x, y, figcv, NULL); caca_refresh_display(dp); usleep(250000); } end: caca_free_canvas(figcv); caca_free_canvas(cv); caca_free_display(dp); return 0; }