summaryrefslogtreecommitdiff
path: root/src/glut/directfb/events.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glut/directfb/events.c')
-rw-r--r--src/glut/directfb/events.c94
1 files changed, 86 insertions, 8 deletions
diff --git a/src/glut/directfb/events.c b/src/glut/directfb/events.c
index babd617e50..8c848ce26f 100644
--- a/src/glut/directfb/events.c
+++ b/src/glut/directfb/events.c
@@ -24,6 +24,54 @@
#include "internal.h"
+/*****************************************************************************/
+
+static int g_ignore_key_repeat = 0;
+
+/*****************************************************************************/
+
+
+int GLUTAPIENTRY
+glutDeviceGet( GLenum type )
+{
+ switch (type) {
+ case GLUT_HAS_KEYBOARD:
+ return (keyboard != NULL);
+ case GLUT_HAS_MOUSE:
+ return (mouse != NULL);
+ case GLUT_NUM_MOUSE_BUTTONS:
+ if (mouse) {
+ DFBInputDeviceDescription dsc;
+ mouse->GetDescription( mouse, &dsc );
+ return dsc.max_button+1;
+ }
+ break;
+ case GLUT_HAS_JOYSTICK:
+ return (g_game && joystick); /* only available in game mode */
+ case GLUT_JOYSTICK_BUTTONS:
+ if (joystick) {
+ DFBInputDeviceDescription dsc;
+ joystick->GetDescription( joystick, &dsc );
+ return dsc.max_button+1;
+ }
+ break;
+ case GLUT_JOYSTICK_AXES:
+ if (joystick) {
+ DFBInputDeviceDescription dsc;
+ joystick->GetDescription( joystick, &dsc );
+ return dsc.max_axis+1;
+ }
+ break;
+ case GLUT_DEVICE_IGNORE_KEY_REPEAT:
+ return g_ignore_key_repeat;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+
int GLUTAPIENTRY
glutGetModifiers( void )
{
@@ -36,12 +84,14 @@ glutGetModifiers( void )
void GLUTAPIENTRY
glutIgnoreKeyRepeat( int ignore )
{
+ g_ignore_key_repeat = ignore;
}
void GLUTAPIENTRY
glutSetKeyRepeat( int mode )
{
+ g_ignore_key_repeat = (mode == GLUT_KEY_REPEAT_OFF);
}
@@ -137,7 +187,7 @@ __glutModifiers( DFBInputDeviceModifierMask mask )
static void
-__glutWindowEvent( DFBWindowEvent *e )
+__glutWindowEvent( DFBWindowEvent *e, DFBWindowEvent *p )
{
__GlutWindow *window;
@@ -148,6 +198,12 @@ __glutWindowEvent( DFBWindowEvent *e )
switch (e->type) {
case DWET_KEYDOWN:
window->modifiers = __glutModifiers( e->modifiers );
+ if (g_ignore_key_repeat && p) {
+ if (p->type == DWET_KEYDOWN &&
+ p->window_id == e->window_id &&
+ p->key_symbol == e->key_symbol)
+ break;
+ }
if (DFB_KEY_IS_ASCII( e->key_symbol )) {
if (keyboard_func) {
__glutSetWindow( window );
@@ -227,13 +283,18 @@ __glutWindowEvent( DFBWindowEvent *e )
static void
-__glutInputEvent( DFBInputEvent *e )
+__glutInputEvent( DFBInputEvent *e, DFBInputEvent *p )
{
__glutAssert( g_game != NULL );
switch (e->type) {
case DIET_KEYPRESS:
- g_game->modifiers = __glutModifiers( e->modifiers );
+ g_game->modifiers = __glutModifiers( e->modifiers );
+ if (g_ignore_key_repeat && p) {
+ if (p->type == DIET_KEYPRESS &&
+ p->key_symbol == e->key_symbol)
+ break;
+ }
if (DFB_KEY_IS_ASCII( e->key_symbol )) {
if (keyboard_func) {
__glutSetWindow( g_game );
@@ -367,20 +428,37 @@ glutMainLoop( void )
__glutAssert( events != NULL );
while (GL_TRUE) {
- DFBEvent evt;
+ DFBEvent evt, prev;
g_idle = GL_TRUE;
__glutHandleTimers();
__glutHandleWindows();
+
+ prev.clazz = DFEC_NONE;
while (events->GetEvent( events, &evt ) == DFB_OK) {
g_idle = GL_FALSE;
- if (evt.clazz == DFEC_WINDOW)
- __glutWindowEvent( &evt.window );
- else
- __glutInputEvent( &evt.input );
+ switch (evt.clazz) {
+ case DFEC_WINDOW:
+ if (prev.clazz == DFEC_WINDOW)
+ __glutWindowEvent( &evt.window, &prev.window );
+ else
+ __glutWindowEvent( &evt.window, NULL );
+ break;
+ case DFEC_INPUT:
+ if (prev.clazz == DFEC_INPUT)
+ __glutInputEvent( &evt.input, &prev.input );
+ else
+ __glutInputEvent( &evt.input, NULL );
+ break;
+ default:
+ __glutWarning( "unexpected event class %d!\n", evt.clazz );
+ break;
+ }
+
+ prev = evt;
__glutHandleTimers();
}