@ -942,23 +942,24 @@ EvdevProc(DeviceIntPtr device, int what)
return EvdevInit ( device ) ;
case DEVICE_ON :
if ( ! pEvdev - > kernel24 & & ioctl ( pInfo - > fd , EVIOCGRAB , ( void * ) 1 ) )
if ( pEvdev - > grabDevice & & ioctl ( pInfo - > fd , EVIOCGRAB , ( void * ) 1 ) )
{
xf86Msg ( X_WARNING , " %s: Grab failed (%s) \n " , pInfo - > name ,
strerror ( errno ) ) ;
if ( errno ! = ENODEV )
if ( errno = = ENODEV )
return ! Success ;
}
xf86AddEnabledDevice ( pInfo ) ;
if ( pEvdev - > flags & EVDEV_BUTTON_EVENTS )
{
xf86AddEnabledDevice ( pInfo ) ;
if ( pEvdev - > flags & EVDEV_BUTTON_EVENTS )
{
EvdevMBEmuPreInit ( pInfo ) ;
EvdevWheelEmuPreInit ( pInfo ) ;
}
device - > public . on = TRUE ;
EvdevMBEmuPreInit ( pInfo ) ;
EvdevWheelEmuPreInit ( pInfo ) ;
}
device - > public . on = TRUE ;
break ;
case DEVICE_OFF :
if ( ! pEvdev - > kernel24 & & ioctl ( pInfo - > fd , EVIOCGRAB , ( void * ) 0 ) )
if ( pEvdev - > grabDevice & & ioctl ( pInfo - > fd , EVIOCGRAB , ( void * ) 0 ) )
xf86Msg ( X_WARNING , " %s: Release failed (%s) \n " , pInfo - > name ,
strerror ( errno ) ) ;
xf86RemoveEnabledDevice ( pInfo ) ;
@ -982,17 +983,19 @@ EvdevProbe(InputInfoPtr pInfo)
long rel_bitmask [ NBITS ( REL_MAX ) ] ;
long abs_bitmask [ NBITS ( ABS_MAX ) ] ;
int i , has_axes , has_keys , num_buttons ;
int kernel24 = 0 ;
EvdevPtr pEvdev = pInfo - > private ;
if ( ioctl ( pInfo - > fd , EVIOCGRAB , ( void * ) 1 ) ) {
if ( pEvdev - > grabDevice & & ioctl ( pInfo - > fd , EVIOCGRAB , ( void * ) 1 ) ) {
if ( errno = = EINVAL ) {
/* keyboards are unsafe in 2.4 */
pEvdev - > kernel24 = 1 ;
kernel24 = 1 ;
pEvdev - > grabDevice = 0 ;
} else {
xf86Msg ( X_ERROR , " Grab failed. Device already configured? \n " ) ;
return 1 ;
}
} else {
} else if ( pEvdev - > grabDevice ) {
ioctl ( pInfo - > fd , EVIOCGRAB , ( void * ) 0 ) ;
}
@ -1068,7 +1071,7 @@ EvdevProbe(InputInfoPtr pInfo)
}
if ( has_keys ) {
if ( pEvdev - > kernel24 ) {
if ( kernel24 ) {
xf86Msg ( X_INFO , " %s: Kernel < 2.6 is too old, ignoring keyboard \n " ,
pInfo - > name ) ;
} else {
@ -1152,6 +1155,10 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
return NULL ;
}
/* Grabbing the event device stops in-kernel event forwarding. In other
words , it disables rfkill and the " Macintosh mouse button emulation " . */
pEvdev - > grabDevice = xf86CheckBoolOption ( dev - > commonOptions , " GrabDevice " , 0 ) ;
EvdevInitButtonMapping ( pInfo ) ;
pEvdev - > noXkb = noXkbExtension ;