Пример #1
0
// 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);
      microgl_close();
      run_flag=0;
      break; 
    default:
      ffi_event(t,x,y);
      break; 
  }
}
Пример #2
0
int main(int argc, char *argv[])
{
  int w=0,h=0;

  cmd_argc=argc; cmd_argv=argv;

// 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);

  // handle signals
  #ifndef WIN32
    signal(SIGHUP,signal_hook);
  #endif
  signal(SIGTERM,signal_hook);
  signal(SIGINT,signal_hook);

#ifndef USECONSOLE

  // open a window
  if ((w==scm_width()&&h==scm_height())||scm_forcefullscreen()) {
    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

   }

  if (int_flag) ffi_event(EVENT_CLOSE,0,0);
  ffi_event(EVENT_TERMINATE,0,0);

#ifndef USECONSOLE
  microgl_close();
#endif

  return 1;
}