diff options
author | Sergey Udaltsov <svu@gnome.org> | 2004-11-25 23:17:30 +0000 |
---|---|---|
committer | Sergey Udaltsov <svu@gnome.org> | 2004-11-25 23:17:30 +0000 |
commit | d431ef4a3ca6228954ddb21e2e4a88f0cf9e8624 (patch) | |
tree | bf8eb5bf48f308bfe325e1d7dcffa89bdfb9245e /libxklavier/xklavier_evt_xmm.c | |
parent | d5c0ab08dad47f5a9d1c17eb18f80aceca5843b9 (diff) | |
download | libxklavier-d431ef4a3ca6228954ddb21e2e4a88f0cf9e8624.tar.gz |
first commit with xmodmap support
Diffstat (limited to 'libxklavier/xklavier_evt_xmm.c')
-rw-r--r-- | libxklavier/xklavier_evt_xmm.c | 130 |
1 files changed, 128 insertions, 2 deletions
diff --git a/libxklavier/xklavier_evt_xmm.c b/libxklavier/xklavier_evt_xmm.c index 4a30e79..1046757 100644 --- a/libxklavier/xklavier_evt_xmm.c +++ b/libxklavier/xklavier_evt_xmm.c @@ -4,18 +4,144 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xlibint.h> +#include <X11/keysym.h> #include "xklavier_private.h" #include "xklavier_private_xmm.h" +static int _XklXmmKeypressEventHandler( XKeyPressedEvent* kpe ) +{ + if( _xklListenerType & XKLL_MANAGE_LAYOUTS ) + { + XklDebug( 200, "Processing the KeyPress event\n" ); + int currentShortcut = 0; + const XmmSwitchOptionPtr sop = _XklXmmFindSwitchOption( kpe->keycode, + kpe->state, + ¤tShortcut ); + if( sop != NULL ) + { + XklDebug( 150, "It is THE shortcut\n" ); + XklState state; + _XklXmmGetRealState( &state ); + if( state.group != -1 ) + { + int newGroup = ( state.group + sop->shortcutSteps[currentShortcut] ) % + currentXmmConfig.numLayouts; + XklDebug( 150, "Setting new xmm group %d\n", newGroup ); + _XklXmmLockGroup( newGroup ); + return 1; + } + } + } + return 0; +} + +static int _XklXmmPropertyEventHandler( XPropertyEvent* kpe ) +{ + XklDebug( 200, "Processing the PropertyNotify event: %d/%d\n", + kpe->atom, xmmStateAtom ); + if( kpe->atom == xmmStateAtom ) + { + if( _xklListenerType & XKLL_MANAGE_LAYOUTS ) + { + XklState state; + _XklXmmGetRealState( &state ); + XklDebug( 150, "Current group from the root window property %d\n", state.group ); + _XklXmmUngrabShortcuts(); + _XklXmmActualizeGroup( state.group ); + _XklXmmGrabShortcuts(); + return 1; + } + } + return 0; +} + /** - * XKB event handler + * XMM event handler */ int _XklXmmEventHandler( XEvent *xev ) { + switch( xev->type ) + { + case KeyPress: + return _XklXmmKeypressEventHandler( (XKeyPressedEvent*)xev ); + case PropertyNotify: + return _XklXmmPropertyEventHandler( (XPropertyEvent*)xev ); + } return 0; } -void _XklXmmSetIndicators( const XklState *windowState ) +/** + * We have to find which of Shift/Lock/Control/ModX masks + * belong to Caps/Num/Scroll lock + */ +static void _XklXmmInitXmmIndicatorsMap( int* pCapsLockMask, + int* pNumLockMask, + int* pScrollLockMask ) +{ + XModifierKeymap *xmkm = NULL; + KeyCode *kcmap, nlkc, clkc, slkc; + int m, k, mask; + + xmkm = XGetModifierMapping( _xklDpy ); + if( xmkm ) + { + clkc = XKeysymToKeycode( _xklDpy, XK_Num_Lock ); + nlkc = XKeysymToKeycode( _xklDpy, XK_Caps_Lock ); + slkc = XKeysymToKeycode( _xklDpy, XK_Scroll_Lock ); + + kcmap = xmkm->modifiermap; + mask = 1; + for( m = 8; --m >= 0; mask <<= 1 ) + for( k = xmkm->max_keypermod; --k >= 0; kcmap++ ) + { + if( *kcmap == clkc ) + *pCapsLockMask = mask; + if( *kcmap == slkc ) + *pScrollLockMask = mask; + if( *kcmap == nlkc ) + *pNumLockMask = mask; + } + XFreeModifiermap( xmkm ); + } +} + +void _XklXmmGrabIgnoringIndicators( int keycode, int modifiers ) { + int CapsLockMask = 0, NumLockMask = 0, ScrollLockMask = 0; + + _XklXmmInitXmmIndicatorsMap( &CapsLockMask, &NumLockMask, &ScrollLockMask ); + +#define GRAB(mods) \ + XklGrabKey( keycode, modifiers|(mods) ) + + GRAB( 0 ); + GRAB( CapsLockMask ); + GRAB( NumLockMask ); + GRAB( ScrollLockMask ); + GRAB( CapsLockMask | NumLockMask ); + GRAB( CapsLockMask | ScrollLockMask ); + GRAB( NumLockMask | ScrollLockMask ); + GRAB( CapsLockMask | NumLockMask | ScrollLockMask ); +#undef GRAB +} + +void _XklXmmUngrabIgnoringIndicators( int keycode, int modifiers ) +{ + int CapsLockMask = 0, NumLockMask = 0, ScrollLockMask = 0; + + _XklXmmInitXmmIndicatorsMap( &CapsLockMask, &NumLockMask, &ScrollLockMask ); + +#define UNGRAB(mods) \ + XklUngrabKey( keycode, modifiers|(mods) ) + + UNGRAB( 0 ); + UNGRAB( CapsLockMask ); + UNGRAB( NumLockMask ); + UNGRAB( ScrollLockMask ); + UNGRAB( CapsLockMask | NumLockMask ); + UNGRAB( CapsLockMask | ScrollLockMask ); + UNGRAB( NumLockMask | ScrollLockMask ); + UNGRAB( CapsLockMask | NumLockMask | ScrollLockMask ); +#undef UNGRAB } |