/* * annotator.c * * Annotates an image file containg a piano music sheet with * the help of a human for use in the main program. * * Author: Dario Rodriguez <antartica@whereismybit.com> * Please see the file LICENSE.txt in the sources root directory */ #ifdef EMSCRIPTEN #include <emscripten.h> #endif #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <time.h> #include <signal.h> #include "boxui.h" #define DEFAULT_SCREENW 640 #define DEFAULT_SCREENH 480 typedef struct mydata_t { int flag_exit; boxui_t *boxui; } mydata_t; volatile int flag_sigint; static void sigint(int n); static int install_signal(int n,void (*f)(int)); mydata_t *mydata_init(void); void mydata_free(mydata_t *mydata); int main_loop_iteration(mydata_t *mydata); int main(int argc, char *argv[]) { mydata_t *mydata; if((mydata=mydata_init())==NULL) { DEBUG_FPRINTF((stderr,"Couldn't init\n")); return(-1); /* couldn't init */ } flag_sigint=0; install_signal(SIGINT,sigint); while(flag_sigint==0 && mydata->flag_exit==0 && mydata->boxui!=NULL) { #ifdef EMSCRIPTEN emscripten_set_main_loop_arg((void (*)(void *))main_loop_iteration,(void *) mydata,boxui_getfps(mydata->boxui),1); #else main_loop_iteration(mydata); #endif } mydata_free(mydata),mydata=NULL; return(0); } static int install_signal(int n,void (*f)(int)) { #ifndef LINUX return(-1); #else struct sigaction sact; sact.sa_handler=f; sigemptyset(&sact.sa_mask); sact.sa_flags=0; return(sigaction(n,&sact,0)); #endif } static void sigint(int n) { flag_sigint++; } mydata_t * mydata_init(void) { boxui_t *boxui; mydata_t *mydata; char *p; if((mydata=malloc(sizeof(mydata_t)))==NULL) return(NULL); memset(mydata,0,sizeof(mydata_t)); if((mydata->boxui=boxui=boxui_init("Presto! Sight-Reading - Annotator",DEFAULT_SCREENW,DEFAULT_SCREENH,0))==NULL || boxui_setuserptr(boxui,mydata)!=0) { mydata_free(mydata),mydata=NULL; return(NULL); } /* initial UI config */ p=boxui_add(boxui,_F,_L,"label:.l","-text \"(Here goes the music sheet)\""); boxui_pack(boxui,_F,_L,p,"-side top -fill both -expand true"); return(mydata); } void mydata_free(mydata_t *mydata) { boxui_t *boxui; if(mydata==NULL) return; if((boxui=mydata->boxui)!=NULL) { boxui_setuserptr(boxui,NULL); boxui_free(boxui),boxui=NULL,mydata->boxui=NULL; } free(mydata),mydata=NULL; return; } int main_loop_iteration(mydata_t *mydata) { boxui_t *boxui; SDL_Event event; int keycode,neww,newh; char *actionstr,*actionparams; if(mydata==NULL || (boxui=mydata->boxui)==NULL) return(-1); boxui_tick(boxui); boxui_refreshevents(boxui); while(boxui_getevent(boxui,&event)==0) { /* standard events */ if(boxui_event_isquit(boxui,&event)) mydata->flag_exit=1; if(boxui_event_iskeydown(boxui,&event,&keycode) && keycode==SDLK_ESCAPE) mydata->flag_exit=1; if(boxui_event_isresize(boxui,&event,&neww,&newh)) boxui_resize(boxui,neww,newh); } while((actionstr=boxui_getactionstr(boxui,&actionparams))!=NULL) { if(strcmp(actionstr,"exit")==0) mydata->flag_exit=1; } return(0); }