From: steve <sjb...@ai...> - 2005-12-27 23:58:48
|
David wrote: > Hello, > > I'm still working on the rubygl bindings and I have a question about multiple keys. > > I have used all functions glutKeyboardFunc, glutSpecialFunc, glutSpecialUpFunc and glutKeyboardUpFunc in combination with glutIgnoreKeyRepeat and glutSetKeyRepeat but multiple keys doesn't work ok. > > This is what I get: > > Up key down -> event > Left key down -> _no_ event > Left key up -> event > Left key down -> event > Left key up > event > Up key up -> event > > Do you know why this behaviour occurs? And how I can use multiple keys at the same time with or without key repeat? It works least confusingly with key repeat disabled. (Since you get key-up and key-down events - key repeat isn't really needed). So after you've initialised GLUT, register four callbacks: glutKeyboardFunc ( getGLUTKeystroke ) ; glutSpecialFunc ( getGLUTSpecialKeystroke ) ; glutKeyboardUpFunc ( getGLUTUpKeystroke ) ; glutSpecialUpFunc ( getGLUTUpSpecialKeystroke ) ; Then write something like this: static unsigned int lastGLUTKeystroke = 0 ; static char keyIsDown [ 512 ] = { FALSE } ; static void getGLUTUpSpecialKeystroke ( int key, int, int ) { keyIsDown [ 256 + key ] = FALSE ; } static void getGLUTUpKeystroke ( unsigned char key, int, int ) { keyIsDown [ key ] = FALSE ; } static void getGLUTSpecialKeystroke ( int key, int, int ) { lastGLUTKeystroke = 256 + key ; keyIsDown [ 256 + key ] = TRUE ; } static void getGLUTKeystroke ( unsigned char key, int, int ) { lastGLUTKeystroke = key ; keyIsDown [ key ] = TRUE ; } Then your application can use these two functions: int isGLUTKeyDown ( unsigned int k ) { return keyIsDown [ k ] ; } int getGLUTKeystroke () { int k = lastGLUTKeystroke ; lastGLUTKeystroke = 0 ; return k ; } 'isGLUTKeyDown' tells you whether a specific key is up (FALSE) or down (TRUE). 'getGLUTKeystroke' returns the most recently typed character or '0' if you've alread read it. Special characters use the GLUT names. If you are planning on using this a lot, you should read this document: http://www.sjbaker.org/steve/omniv/keyboards_are_evil.html ...it discusses the issues of false key detection when several keys are held down at the same time. |