diff options
Diffstat (limited to 'source/in_evdev.c')
-rw-r--r-- | source/in_evdev.c | 102 |
1 files changed, 47 insertions, 55 deletions
diff --git a/source/in_evdev.c b/source/in_evdev.c index 932b3fa..8eb1c1d 100644 --- a/source/in_evdev.c +++ b/source/in_evdev.c @@ -34,19 +34,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static cvar_t *in_device; -static qboolean mouseinitialized; -static qboolean mouseactive; -static int evdev_fd; +static struct { + qboolean initialized; + qboolean grabbed; + int fd; + int dx, dy; +} evdev; #define MAX_EVENTS 64 #define EVENT_SIZE sizeof( struct input_event ) /* =========== -Evdev_SendMouseMoveEvents +Evdev_RunMouse =========== */ -static void Evdev_SendMouseMoveEvents( void ) { +static void Evdev_RunMouse( void ) { struct input_event ev[MAX_EVENTS]; fd_set fdset; struct timeval timeout; @@ -55,27 +58,23 @@ static void Evdev_SendMouseMoveEvents( void ) { int i, button; unsigned time; - if( !mouseinitialized ) { - return; - } - - if( !mouseactive ) { + if( !evdev.initialized || !evdev.grabbed ) { return; } FD_ZERO( &fdset ); - FD_SET( evdev_fd, &fdset ); + FD_SET( evdev.fd, &fdset ); timeout.tv_sec = 0; timeout.tv_usec = 0; if( select( FD_SETSIZE, &fdset, NULL, NULL, &timeout ) == -1 ) { return; } - if( !FD_ISSET( evdev_fd, &fdset ) ) { + if( !FD_ISSET( evdev.fd, &fdset ) ) { return; } - bytes = read( evdev_fd, ev, EVENT_SIZE * MAX_EVENTS ); + bytes = read( evdev.fd, ev, EVENT_SIZE * MAX_EVENTS ); if( bytes < EVENT_SIZE ) { return; } @@ -98,10 +97,10 @@ static void Evdev_SendMouseMoveEvents( void ) { case EV_REL: switch( ev[i].code ) { case REL_X: - dx += ( int )ev[i].value; + evdev.dx += ( int )ev[i].value; break; case REL_Y: - dy += ( int )ev[i].value; + evdev.dy += ( int )ev[i].value; break; case REL_WHEEL: if( ( int )ev[i].value == 1 ) { @@ -119,12 +118,17 @@ static void Evdev_SendMouseMoveEvents( void ) { break; } } +} - - if( dx || dy ) { - CL_MouseEvent( dx, dy ); - } - +static qboolean Evdev_GetMouseMotion( int *dx, int *dy ) { + if( !evdev.initialized || !evdev.grabbed ) { + return qfalse; + } + *dx = evdev.dx; + *dy = evdev.dy; + evdev.dx = 0; + evdev.dy = 0; + return qtrue; } /* @@ -133,12 +137,11 @@ Evdev_ShutdownMouse =========== */ static void Evdev_ShutdownMouse( void ) { - if( !mouseinitialized ) { + if( !evdev.initialized ) { return; } - close( evdev_fd ); - mouseinitialized = qfalse; - mouseactive = qfalse; + close( evdev.fd ); + memset( &evdev, 0, sizeof( evdev ) ); } /* @@ -149,79 +152,68 @@ Evdev_StartupMouse static qboolean Evdev_InitMouse( void ) { in_device = Cvar_Get( "in_device", "/dev/input/event2", CVAR_LATCH ); - evdev_fd = open( in_device->string, O_RDONLY ); - - if( evdev_fd == -1 ) { + evdev.fd = open( in_device->string, O_RDONLY ); + if( evdev.fd == -1 ) { Com_EPrintf( "Couldn't open %s: %s\n", in_device->string, - strerror( errno ) ); + strerror( errno ) ); return qfalse; } - fcntl( evdev_fd, F_SETFL, fcntl( evdev_fd, F_GETFL, 0 ) | FNDELAY ); + fcntl( evdev.fd, F_SETFL, fcntl( evdev.fd, F_GETFL, 0 ) | FNDELAY ); Com_Printf( "Event interface initialized.\n" ); - mouseinitialized = qtrue; + evdev.initialized = qtrue; return qtrue; } /* =========== -Evdev_ActivateMouse - -Called when the main window gains or loses focus. -The window may have been destroyed and recreated -between a deactivate and an activate. +Evdev_GrabMouse =========== */ -static void Evdev_ActivateMouse( qboolean active ) { - if( !mouseinitialized ) { +static void Evdev_GrabMouse( grab_t grab ) { + if( !evdev.initialized ) { return; } - if( mouseactive == active ) { + if( evdev.grabbed == grab ) { return; } #ifdef EVIOCGRAB - if( ioctl( evdev_fd, EVIOCGRAB, active ) == -1 ) { + if( ioctl( evdev.fd, EVIOCGRAB, active ) == -1 ) { Com_EPrintf( "Grab/Release failed: %s\n", strerror( errno ) ); } #endif // EVIOCGRAB - if( active ) { + if( grab ) { struct input_event ev; SDL_ShowCursor( SDL_DISABLE ); - while( read( evdev_fd, &ev, EVENT_SIZE ) == EVENT_SIZE ) + while( read( evdev.fd, &ev, EVENT_SIZE ) == EVENT_SIZE ) ; } else { SDL_ShowCursor( SDL_ENABLE ); } - mouseactive = active; -} - -/* -=================== -Evdev_ClearMouseStates -=================== -*/ -static void Evdev_ClearMouseStates( void ) { + evdev.dx = 0; + evdev.dy = 0; + evdev.grabbed = grab; } /* @@@@@@@@@@@@@@@@@@@ -Evdev_FillAPI +DI_FillAPI @@@@@@@@@@@@@@@@@@@ */ -void Evdev_FillAPI( inputAPI_t *api ) { +void DI_FillAPI( inputAPI_t *api ) { api->Init = Evdev_InitMouse; api->Shutdown = Evdev_ShutdownMouse; - api->Activate = Evdev_ActivateMouse; - api->Frame = Evdev_SendMouseMoveEvents; - api->ClearStates = Evdev_ClearMouseStates; + api->Grab = Evdev_GrabMouse; + api->GetEvents = Evdev_GetMouseEvents; + api->GetMotion = Evdev_GetMouseMotion; } |