// event hook void microgl_hook(int t, int x, int y) { switch (t) { case EVENT_REDRAW: glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.,scm_width(),0.,scm_height(),-1.,1.); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); ffi_event(EVENT_REDRAW,0,0); microgl_swapbuffers(); break; case EVENT_CLOSE: ffi_event(EVENT_CLOSE,0,0); run_flag=0; break; default: ffi_event(t,x,y); break; } }
int main(int argc, char *argv[]) { int w=0,h=0; #ifdef USECONSOLE // 20101007: quick hack to get a command line argument through if (argc>1) cmd_arg1=argv[1]; #endif // fork to release terminal (for starting processes on embedded systems) #if defined(USECONSOLE) && defined(OPENBSD) signal(SIGHUP,SIG_IGN); signal(SIGTERM,SIG_IGN); signal(SIGCHLD,SIG_IGN); if(fork() != 0) return 0; chdir("/"); setsid(); umask(0); if(fork() != 0) return 0; { int fd = open("/tmp/stdin",O_RDONLY|O_CREAT); dup2(fd,STDIN_FILENO); fd = open("/tmp/stdout",O_WRONLY|O_CREAT); dup2(fd,STDOUT_FILENO); fd = open("/tmp/stderr",O_WRONLY|O_CREAT); dup2(fd,STDERR_FILENO); } #endif #ifndef USECONSOLE // opengl preparations microgl_init(); // determine width and height of display w=microgl_screenwidth(); h=microgl_screenheight(); #endif // USECONSOLE // allow payload to initialize ffi_event(EVENT_INIT,w,h); #ifndef USECONSOLE // open a window if (w==scm_width()&&h==scm_height()) { microgl_fullscreen(w,h); } else { microgl_window(scm_width(),scm_height()); } #endif // USECONSOLE while (run_flag) { // check for application exit if (run_flag) run_flag=scm_runflag(); #ifndef USECONSOLE // check for events microgl_pollevents(); // ask for a redraw microgl_refresh(); #else // generate a fake redraw event ffi_event(EVENT_REDRAW,0,0); #endif // USECONSOLE #ifndef USECONSOLE // sleep 10ms... #ifdef WIN32 Sleep(10); #else usleep(10000); #endif #endif // USECONSOLE } ffi_event(EVENT_TERMINATE,0,0); return 1; }