Sync kxkb with the latest numlockx sources

This is related to Bug 561, but may not be sufficient to close it


git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1261045 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
v3.5.13-sru
tpearson 13 years ago
parent 2b33100f52
commit c95d8deaf1

@ -235,6 +235,8 @@ void KeyboardConfig::changed()
NumLockX NumLockX
$Id$
Copyright (C) 2000-2001 Lubos Lunak <l.lunak@kde.org> Copyright (C) 2000-2001 Lubos Lunak <l.lunak@kde.org>
Copyright (C) 2001 Oswald Buddenhagen <ossi@kde.org> Copyright (C) 2001 Oswald Buddenhagen <ossi@kde.org>
@ -265,15 +267,15 @@ DEALINGS IN THE SOFTWARE.
#endif #endif
#ifdef HAVE_XKB #ifdef HAVE_XKB
#define explicit myexplicit
#include <X11/XKBlib.h> #include <X11/XKBlib.h>
#undef explicit
#endif #endif
#include <X11/keysym.h> #include <X11/keysym.h>
#if defined(HAVE_XTEST) || defined(HAVE_XKB) #if defined(HAVE_XTEST) || defined(HAVE_XKB)
Display* dpy = qt_xdisplay();
/* the XKB stuff is based on code created by Oswald Buddenhagen <ossi@kde.org> */ /* the XKB stuff is based on code created by Oswald Buddenhagen <ossi@kde.org> */
#ifdef HAVE_XKB #ifdef HAVE_XKB
int xkb_init() int xkb_init()
@ -282,7 +284,7 @@ int xkb_init()
int xkb_lmaj = XkbMajorVersion; int xkb_lmaj = XkbMajorVersion;
int xkb_lmin = XkbMinorVersion; int xkb_lmin = XkbMinorVersion;
return XkbLibraryVersion( &xkb_lmaj, &xkb_lmin ) return XkbLibraryVersion( &xkb_lmaj, &xkb_lmin )
&& XkbQueryExtension( qt_xdisplay(), &xkb_opcode, &xkb_event, &xkb_error, && XkbQueryExtension( dpy, &xkb_opcode, &xkb_event, &xkb_error,
&xkb_lmaj, &xkb_lmin ); &xkb_lmaj, &xkb_lmin );
} }
@ -309,7 +311,7 @@ unsigned int xkb_mask_modifier( XkbDescPtr xkb, const char *name )
unsigned int xkb_numlock_mask() unsigned int xkb_numlock_mask()
{ {
XkbDescPtr xkb; XkbDescPtr xkb;
if(( xkb = XkbGetKeyboard( qt_xdisplay(), XkbAllComponentsMask, XkbUseCoreKbd )) != NULL ) if(( xkb = XkbGetKeyboard( dpy, XkbAllComponentsMask, XkbUseCoreKbd )) != NULL )
{ {
unsigned int mask = xkb_mask_modifier( xkb, "NumLock" ); unsigned int mask = xkb_mask_modifier( xkb, "NumLock" );
XkbFreeKeyboard( xkb, 0, True ); XkbFreeKeyboard( xkb, 0, True );
@ -326,7 +328,7 @@ int xkb_set_on()
mask = xkb_numlock_mask(); mask = xkb_numlock_mask();
if( mask == 0 ) if( mask == 0 )
return 0; return 0;
XkbLockModifiers ( qt_xdisplay(), XkbUseCoreKbd, mask, mask); XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, mask);
return 1; return 1;
} }
@ -338,9 +340,29 @@ int xkb_set_off()
mask = xkb_numlock_mask(); mask = xkb_numlock_mask();
if( mask == 0 ) if( mask == 0 )
return 0; return 0;
XkbLockModifiers ( qt_xdisplay(), XkbUseCoreKbd, mask, 0); XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, 0);
return 1; return 1;
} }
int xkb_toggle()
{
unsigned int mask;
unsigned int numlockState;
XkbStateRec xkbState;
if( !xkb_init())
return 0;
mask = xkb_numlock_mask();
if( mask == 0 )
return 0;
XkbGetState( dpy, XkbUseCoreKbd, &xkbState);
numlockState = xkbState.locked_mods & mask;
if (numlockState)
XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, 0);
else
XkbLockModifiers ( dpy, XkbUseCoreKbd, mask, mask);
return 1;
}
#endif #endif
#ifdef HAVE_XTEST #ifdef HAVE_XTEST
@ -351,10 +373,10 @@ int xtest_get_numlock_state()
Window dummy1, dummy2; Window dummy1, dummy2;
int dummy3, dummy4, dummy5, dummy6; int dummy3, dummy4, dummy5, dummy6;
unsigned int mask; unsigned int mask;
KeyCode numlock_keycode = XKeysymToKeycode( qt_xdisplay(), XK_Num_Lock ); XModifierKeymap* map = XGetModifierMapping( dpy );
KeyCode numlock_keycode = XKeysymToKeycode( dpy, XK_Num_Lock );
if( numlock_keycode == NoSymbol ) if( numlock_keycode == NoSymbol )
return 0; return 0;
XModifierKeymap* map = XGetModifierMapping( qt_xdisplay() );
for( i = 0; for( i = 0;
i < 8; i < 8;
++i ) ++i )
@ -362,7 +384,7 @@ int xtest_get_numlock_state()
if( map->modifiermap[ map->max_keypermod * i ] == numlock_keycode ) if( map->modifiermap[ map->max_keypermod * i ] == numlock_keycode )
numlock_mask = 1 << i; numlock_mask = 1 << i;
} }
XQueryPointer( qt_xdisplay(), DefaultRootWindow( qt_xdisplay() ), &dummy1, &dummy2, XQueryPointer( dpy, DefaultRootWindow( dpy ), &dummy1, &dummy2,
&dummy3, &dummy4, &dummy5, &dummy6, &mask ); &dummy3, &dummy4, &dummy5, &dummy6, &mask );
XFreeModifiermap( map ); XFreeModifiermap( map );
return mask & numlock_mask; return mask & numlock_mask;
@ -370,8 +392,8 @@ int xtest_get_numlock_state()
void xtest_change_numlock() void xtest_change_numlock()
{ {
XTestFakeKeyEvent( qt_xdisplay(), XKeysymToKeycode( qt_xdisplay(), XK_Num_Lock ), True, CurrentTime ); XTestFakeKeyEvent( dpy, XKeysymToKeycode( dpy, XK_Num_Lock ), True, CurrentTime );
XTestFakeKeyEvent( qt_xdisplay(), XKeysymToKeycode( qt_xdisplay(), XK_Num_Lock ), False, CurrentTime ); XTestFakeKeyEvent( dpy, XKeysymToKeycode( dpy, XK_Num_Lock ), False, CurrentTime );
} }
void xtest_set_on() void xtest_set_on()
@ -385,6 +407,11 @@ void xtest_set_off()
if( xtest_get_numlock_state()) if( xtest_get_numlock_state())
xtest_change_numlock(); xtest_change_numlock();
} }
void xtest_toggle()
{
xtest_change_numlock();
}
#endif #endif
void numlock_set_on() void numlock_set_on()
@ -409,6 +436,18 @@ void numlock_set_off()
#endif #endif
} }
void numlock_toggle()
{
#ifdef HAVE_XKB
if( xkb_toggle())
return;
#endif
#ifdef HAVE_XTEST
xtest_toggle();
#endif
}
// This code is taken from xset utility from XFree 4.3 (http://www.xfree86.org/)
void numlockx_change_numlock_state( bool set_P ) void numlockx_change_numlock_state( bool set_P )
{ {
if( set_P ) if( set_P )
@ -421,9 +460,6 @@ void numlockx_change_numlock_state( bool ) {} // dummy
#endif // defined(HAVE_XTEST) || defined(HAVE_XKB) #endif // defined(HAVE_XTEST) || defined(HAVE_XKB)
// This code is taken from xset utility from XFree 4.3 (http://www.xfree86.org/)
#if 0 #if 0
//HAVE_XF86MISC //HAVE_XF86MISC
#include <X11/extensions/xf86misc.h> #include <X11/extensions/xf86misc.h>

Loading…
Cancel
Save