103 lines
2.5 KiB
Diff
103 lines
2.5 KiB
Diff
diff -upNr numlockx-1.0.orign/main.c numlockx-1.0/main.c
|
|
--- numlockx-1.0.orign/main.c 2001-04-30 22:55:20.000000000 +0200
|
|
+++ numlockx-1.0/main.c 2010-10-22 10:56:33.686559525 +0200
|
|
@@ -47,6 +47,8 @@ DEALINGS IN THE SOFTWARE.
|
|
#include <X11/XKBlib.h>
|
|
#endif
|
|
|
|
+#include <X11/extensions/XInput2.h>
|
|
+
|
|
#include <X11/keysym.h>
|
|
|
|
void usage( const char* argv0 )
|
|
@@ -95,10 +97,10 @@ unsigned int xkb_mask_modifier( XkbDescP
|
|
return 0;
|
|
}
|
|
|
|
-unsigned int xkb_numlock_mask()
|
|
+unsigned int xkb_numlock_mask( int deviceid )
|
|
{
|
|
XkbDescPtr xkb;
|
|
- if(( xkb = XkbGetKeyboard( dpy, XkbAllComponentsMask, XkbUseCoreKbd )) != NULL )
|
|
+ if(( xkb = XkbGetKeyboard( dpy, XkbAllComponentsMask, deviceid )) != NULL )
|
|
{
|
|
unsigned int mask = xkb_mask_modifier( xkb, "NumLock" );
|
|
XkbFreeKeyboard( xkb, 0, True );
|
|
@@ -107,29 +109,52 @@ unsigned int xkb_numlock_mask()
|
|
return 0;
|
|
}
|
|
|
|
-int xkb_set_on()
|
|
+int xkb_set_on( int deviceid )
|
|
{
|
|
unsigned int mask;
|
|
if( !xkb_init())
|
|
return 0;
|
|
- mask = xkb_numlock_mask();
|
|
+ mask = xkb_numlock_mask ( deviceid );
|
|
if( mask == 0 )
|
|
return 0;
|
|
- XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, mask);
|
|
+ XkbLockModifiers ( dpy, deviceid, mask, mask);
|
|
return 1;
|
|
}
|
|
|
|
-int xkb_set_off()
|
|
+int xkb_set_off( int deviceid )
|
|
{
|
|
unsigned int mask;
|
|
if( !xkb_init())
|
|
return 0;
|
|
- mask = xkb_numlock_mask();
|
|
+ mask = xkb_numlock_mask ( deviceid );
|
|
if( mask == 0 )
|
|
return 0;
|
|
- XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, 0);
|
|
+ XkbLockModifiers ( dpy, deviceid, mask, 0);
|
|
return 1;
|
|
}
|
|
+
|
|
+static int xkb_foreach_keyboard( int (*func)(int))
|
|
+{
|
|
+ XIDeviceInfo *info;
|
|
+ int ndevices;
|
|
+
|
|
+ info = XIQueryDevice ( dpy, XIAllDevices, &ndevices );
|
|
+
|
|
+ while ( ndevices-- )
|
|
+ {
|
|
+ XIDeviceInfo *d = &info[ndevices];
|
|
+ if ( d->use != XISlaveKeyboard )
|
|
+ continue;
|
|
+ if ( d->attachment != 3 ) /* virtual core keyboard */
|
|
+ continue;
|
|
+
|
|
+ func( d->deviceid);
|
|
+ }
|
|
+
|
|
+ XIFreeDeviceInfo ( info );
|
|
+
|
|
+ return 1;
|
|
+}
|
|
#endif
|
|
|
|
#ifdef HAVE_XTEST
|
|
@@ -179,7 +204,7 @@ void xtest_set_off()
|
|
void numlock_set_on()
|
|
{
|
|
#ifdef HAVE_XKB
|
|
- if( xkb_set_on())
|
|
+ if ( xkb_foreach_keyboard( xkb_set_on))
|
|
return;
|
|
#endif
|
|
#ifdef HAVE_XTEST
|
|
@@ -190,7 +215,7 @@ void numlock_set_on()
|
|
void numlock_set_off()
|
|
{
|
|
#ifdef HAVE_XKB
|
|
- if( xkb_set_off())
|
|
+ if ( xkb_foreach_keyboard( xkb_set_off))
|
|
return;
|
|
#endif
|
|
#ifdef HAVE_XTEST
|
|
|