summaryrefslogtreecommitdiff
path: root/libxklavier/xklavier_evt_xmm.c
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2004-11-25 23:17:30 +0000
committerSergey Udaltsov <svu@gnome.org>2004-11-25 23:17:30 +0000
commitd431ef4a3ca6228954ddb21e2e4a88f0cf9e8624 (patch)
treebf8eb5bf48f308bfe325e1d7dcffa89bdfb9245e /libxklavier/xklavier_evt_xmm.c
parentd5c0ab08dad47f5a9d1c17eb18f80aceca5843b9 (diff)
downloadlibxklavier-d431ef4a3ca6228954ddb21e2e4a88f0cf9e8624.tar.gz
first commit with xmodmap support
Diffstat (limited to 'libxklavier/xklavier_evt_xmm.c')
-rw-r--r--libxklavier/xklavier_evt_xmm.c130
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,
+ &currentShortcut );
+ 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
}