/**************************************************************************** REMARKS: Simple utility function to use the event library to check if a key has been hit. We check for keydown and keyrepeat events, and we also flush the event queue of all non keydown events to avoid it filling up. ****************************************************************************/ int EVT_kbhit(void) { int hit; event_t evt; hit = EVT_peekNext(&evt,EVT_KEYDOWN | EVT_KEYREPEAT); EVT_flush(~(EVT_KEYDOWN | EVT_KEYREPEAT)); return hit; }
/**************************************************************************** REMARKS: Does the hard work to create the actual display device context. ****************************************************************************/ static MGLDC * _MGL_createDisplayDC( int mode, int virtualX, int virtualY, int numBuffers, ibool stereo, int refreshRate) { MGLDC *dc; driverent *entry; modeent *me = &DEV.availableModes[mode]; PM_HWND hwndConsole = (PM_HWND)NULL; /* Check if the mode is currently available */ __MGL_result = grOK; if (mode >= DEV.numModes || DEV.availableModes[mode].driver == 0xFF) { SETERROR(grInvalidMode); return NULL; } _MGL_destroyCurrentMode(); /* Allocate memory for the new DC */ if ((dc = _LST_newNode(sizeof(MGLDC))) == NULL) { FATALERROR(grNoMem); return NULL; } /* The display device list is currently empty, so create the new * list and start the specified graphics mode */ if ((DEV.dispDCList = _LST_create()) == NULL) { FATALERROR(grNoMem); goto Error; } /* Open a new fullscreen console for the mode, and save it's state */ DEV.stateBuf = NULL; if (_MGL_consoleSupport && (GET_CURRENT_DEVICE() == 0)) { hwndConsole = PM_openConsole((PM_HWND)_MGL_hwndFullScreen,GET_CURRENT_DEVICE(),me->xRes,me->yRes,me->bits,true); if ((DEV.stateBuf = PM_malloc(PM_getConsoleStateSize())) == NULL) { FATALERROR(grNoMem); goto Error; } PM_saveConsoleState(DEV.stateBuf,hwndConsole); } /* Now intialise the driver */ entry = &DEV.driverTable[me->driver]; if (!_MGL_initDC(dc,entry,me,(MGL_HWND)hwndConsole,virtualX,virtualY,numBuffers,stereo,refreshRate)) goto Error; /* Set the suspend application callback for the console */ PM_setSuspendAppCallback(_MGL_suspendAppProc); /* Set up the mouse cursor */ if (_MGL_consoleSupport) { _MS_setDisplayDC(dc); MS_setCursor(MGL_DEF_CURSOR); MS_moveTo(dc->mi.xRes/2,dc->mi.yRes/2); } /* Now clear the device page */ MGL_makeCurrentDC(dc); MGL_clearDevice(); /* And clear the event queue of any extraneous events */ if (_MGL_consoleSupport) { EVT_flush(EVT_EVERYEVT); } /* Add the new DC to the start of the DC chain */ RESET_DEFAULT_CW(); _LST_addToHead(DEV.dispDCList,dc); return dc; Error: if (hwndConsole) { if (DEV.stateBuf) { PM_restoreConsoleState(DEV.stateBuf,hwndConsole); PM_free(DEV.stateBuf); DEV.stateBuf = NULL; } PM_closeConsole(hwndConsole); } DEV.fullScreen = false; if (DEV.dispDCList && DEV.dispDCList->count == 0) { _LST_destroy(DEV.dispDCList,_LST_freeNode); DEV.dispDCList = NULL; } _LST_freeNode(dc); return NULL; }
int mechTest( GA_HGLRC glrc, int width, int height) { ibool done = false; int initPageCount = 5; int fpsRate = 0,key = 0,waitVRT = gaWaitVRT,pageCount = initPageCount; ulong lastCount = 0,newCount; event_t evt; myinit(); myReshape(width,height); LZTimerOn(); while (!done) { animation(); display(); gmoveto(0,0); gprintf("%d x %d %d bit %s (%d.%d fps)",(int)maxX+1,(int)maxY+1, (int)modeInfo.BitsPerPixel, (cntMode & gaLinearBuffer) ? "Linear" : "Banked", fpsRate / 10, fpsRate % 10); if (softwareOnly) gprintf("Rendering to system memory back buffer"); switch (waitVRT) { case gaTripleBuffer: gprintf("Triple buffering - should be no flicker"); gprintf("Frame rate *must* max at refresh rate"); break; case gaWaitVRT: gprintf("Double buffering - should be no flicker"); gprintf("Frame rate *must* lock to multiple of refresh"); break; default: gprintf("Page flipping (no wait) - may flicker"); gprintf("Frame rate *must* max at hardware limit"); break; } glFuncs.SwapBuffers(glrc,waitVRT); if (EVT_kbhit()) { EVT_getNext(&evt,EVT_KEYDOWN | EVT_KEYREPEAT); EVT_flush(EVT_KEYREPEAT); key = EVT_asciiCode(evt.message); if (key == 'v' || key == 'V') { waitVRT -= 1; if (modeInfo.Attributes & gaHaveTripleBuffer) { if (waitVRT < gaTripleBuffer) waitVRT = gaDontWait; } else { if (waitVRT < gaWaitVRT) waitVRT = gaDontWait; } } else if (key == 0x1B || key == 0x0D || key == ' ') { done = true; } else { handleASCIICode(key); handleScanCode(EVT_scanCode(evt.message)); } } /* Compute the frames per second rate after going through a large * number of pages. */ if (--pageCount == 0) { newCount = LZTimerLap(); fpsRate = (int)(10000000L / (newCount - lastCount)) * initPageCount; lastCount = newCount; pageCount = initPageCount; } } LZTimerOff(); if (quadObj) { gluDeleteQuadric(quadObj); quadObj = NULL; } return key; }
// Flush all events specified by the mask void flush(ulong mask = evAll) { EVT_flush(mask); };