summaryrefslogtreecommitdiffstats
path: root/tv/2configs/xserver/xmonad/Util/Submap.hs
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2015-10-25 00:23:59 +0200
committermakefu <github@syntax-fehler.de>2015-10-25 00:23:59 +0200
commitc62885a0bcf4a1a09400aa69d83723857ab558d8 (patch)
tree2df3980c179c8da1ffb584fe9dd73f66da09d347 /tv/2configs/xserver/xmonad/Util/Submap.hs
parenta1d05482e5527d32baef9d9343b900dee8d46694 (diff)
parenta4d7f920bf49de6237191558d02b0f58ed307fd4 (diff)
Merge remote-tracking branch 'cd/master'
Diffstat (limited to 'tv/2configs/xserver/xmonad/Util/Submap.hs')
-rw-r--r--tv/2configs/xserver/xmonad/Util/Submap.hs31
1 files changed, 31 insertions, 0 deletions
diff --git a/tv/2configs/xserver/xmonad/Util/Submap.hs b/tv/2configs/xserver/xmonad/Util/Submap.hs
new file mode 100644
index 000000000..b09b97cc2
--- /dev/null
+++ b/tv/2configs/xserver/xmonad/Util/Submap.hs
@@ -0,0 +1,31 @@
+-- This module is based on Jason Creighton's XMonad.Actions.Submap
+
+module Util.Submap
+ ( submapString
+ ) where
+
+import Data.Bits
+import XMonad hiding (keys)
+import qualified Data.Map as M
+import Control.Monad.Fix (fix)
+
+
+-- | Like 'XMonad.Actions.Submap.submapDefault', but provides the looked up string to the default action.
+submapString :: (String -> X ()) -> M.Map (KeyMask, KeySym) (X ()) -> X ()
+submapString def keys = do
+ XConf { theRoot = root, display = d } <- ask
+
+ (m, s, str) <- io $ allocaXEvent $ \p -> fix $ \nextkey -> do
+ maskEvent d keyPressMask p
+ KeyEvent { ev_keycode = code, ev_state = m } <- getEvent p
+ keysym <- keycodeToKeysym d code 0
+ if isModifierKey keysym
+ then nextkey
+ else do
+ (mbKeysym, str) <- lookupString (asKeyEvent p)
+ return (m, keysym, str)
+
+ -- Remove num lock mask and Xkb group state bits
+ m' <- cleanMask $ m .&. ((1 `shiftL` 12) - 1)
+
+ maybe (def str) id (M.lookup (m', s) keys)