module XMonad.Util.EZConfig (
additionalKeys, additionalKeysP,
removeKeys, removeKeysP,
additionalMouseBindings, removeMouseBindings,
mkKeymap, checkKeymap,
mkNamedKeymap,
parseKey
) where
import XMonad
import XMonad.Actions.Submap
import XMonad.Util.NamedActions
import qualified Data.Map as M
import Data.List (foldl', sortBy, groupBy, nub)
import Data.Ord (comparing)
import Data.Maybe
import Control.Arrow (first, (&&&))
import Text.ParserCombinators.ReadP
additionalKeys :: XConfig a -> [((KeyMask, KeySym), X ())] -> XConfig a
additionalKeys :: XConfig a -> [((KeyMask, KeySym), X ())] -> XConfig a
additionalKeys conf :: XConfig a
conf keyList :: [((KeyMask, KeySym), X ())]
keyList =
XConfig a
conf { keys :: XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys = \cnf :: XConfig Layout
cnf -> Map (KeyMask, KeySym) (X ())
-> Map (KeyMask, KeySym) (X ()) -> Map (KeyMask, KeySym) (X ())
forall k a. Ord k => Map k a -> Map k a -> Map k a
M.union ([((KeyMask, KeySym), X ())] -> Map (KeyMask, KeySym) (X ())
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [((KeyMask, KeySym), X ())]
keyList) (XConfig a -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
forall (l :: * -> *).
XConfig l -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys XConfig a
conf XConfig Layout
cnf) }
additionalKeysP :: XConfig l -> [(String, X ())] -> XConfig l
additionalKeysP :: XConfig l -> [(String, X ())] -> XConfig l
additionalKeysP conf :: XConfig l
conf keyList :: [(String, X ())]
keyList =
XConfig l
conf { keys :: XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys = \cnf :: XConfig Layout
cnf -> Map (KeyMask, KeySym) (X ())
-> Map (KeyMask, KeySym) (X ()) -> Map (KeyMask, KeySym) (X ())
forall k a. Ord k => Map k a -> Map k a -> Map k a
M.union (XConfig Layout -> [(String, X ())] -> Map (KeyMask, KeySym) (X ())
forall (l :: * -> *).
XConfig l -> [(String, X ())] -> Map (KeyMask, KeySym) (X ())
mkKeymap XConfig Layout
cnf [(String, X ())]
keyList) (XConfig l -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
forall (l :: * -> *).
XConfig l -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys XConfig l
conf XConfig Layout
cnf) }
removeKeys :: XConfig a -> [(KeyMask, KeySym)] -> XConfig a
removeKeys :: XConfig a -> [(KeyMask, KeySym)] -> XConfig a
removeKeys conf :: XConfig a
conf keyList :: [(KeyMask, KeySym)]
keyList =
XConfig a
conf { keys :: XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys = \cnf :: XConfig Layout
cnf -> XConfig a -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
forall (l :: * -> *).
XConfig l -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys XConfig a
conf XConfig Layout
cnf Map (KeyMask, KeySym) (X ())
-> Map (KeyMask, KeySym) () -> Map (KeyMask, KeySym) (X ())
forall k a b. Ord k => Map k a -> Map k b -> Map k a
`M.difference` [((KeyMask, KeySym), ())] -> Map (KeyMask, KeySym) ()
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(KeyMask, KeySym)] -> [()] -> [((KeyMask, KeySym), ())]
forall a b. [a] -> [b] -> [(a, b)]
zip [(KeyMask, KeySym)]
keyList ([()] -> [((KeyMask, KeySym), ())])
-> [()] -> [((KeyMask, KeySym), ())]
forall a b. (a -> b) -> a -> b
$ () -> [()]
forall a. a -> [a]
repeat ()) }
removeKeysP :: XConfig l -> [String] -> XConfig l
removeKeysP :: XConfig l -> [String] -> XConfig l
removeKeysP conf :: XConfig l
conf keyList :: [String]
keyList =
XConfig l
conf { keys :: XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys = \cnf :: XConfig Layout
cnf -> XConfig l -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
forall (l :: * -> *).
XConfig l -> XConfig Layout -> Map (KeyMask, KeySym) (X ())
keys XConfig l
conf XConfig Layout
cnf Map (KeyMask, KeySym) (X ())
-> Map (KeyMask, KeySym) (X ()) -> Map (KeyMask, KeySym) (X ())
forall k a b. Ord k => Map k a -> Map k b -> Map k a
`M.difference` XConfig Layout -> [(String, X ())] -> Map (KeyMask, KeySym) (X ())
forall (l :: * -> *).
XConfig l -> [(String, X ())] -> Map (KeyMask, KeySym) (X ())
mkKeymap XConfig Layout
cnf ([String] -> [X ()] -> [(String, X ())]
forall a b. [a] -> [b] -> [(a, b)]
zip [String]
keyList ([X ()] -> [(String, X ())]) -> [X ()] -> [(String, X ())]
forall a b. (a -> b) -> a -> b
$ X () -> [X ()]
forall a. a -> [a]
repeat (() -> X ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())) }
additionalMouseBindings :: XConfig a -> [((ButtonMask, Button), Window -> X ())] -> XConfig a
additionalMouseBindings :: XConfig a -> [((KeyMask, KeySym), KeySym -> X ())] -> XConfig a
additionalMouseBindings conf :: XConfig a
conf mouseBindingsList :: [((KeyMask, KeySym), KeySym -> X ())]
mouseBindingsList =
XConfig a
conf { mouseBindings :: XConfig Layout -> Map (KeyMask, KeySym) (KeySym -> X ())
mouseBindings = \cnf :: XConfig Layout
cnf -> Map (KeyMask, KeySym) (KeySym -> X ())
-> Map (KeyMask, KeySym) (KeySym -> X ())
-> Map (KeyMask, KeySym) (KeySym -> X ())
forall k a. Ord k => Map k a -> Map k a -> Map k a
M.union ([((KeyMask, KeySym), KeySym -> X ())]
-> Map (KeyMask, KeySym) (KeySym -> X ())
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [((KeyMask, KeySym), KeySym -> X ())]
mouseBindingsList) (XConfig a
-> XConfig Layout -> Map (KeyMask, KeySym) (KeySym -> X ())
forall (l :: * -> *).
XConfig l
-> XConfig Layout -> Map (KeyMask, KeySym) (KeySym -> X ())
mouseBindings XConfig a
conf XConfig Layout
cnf) }
removeMouseBindings :: XConfig a -> [(ButtonMask, Button)] -> XConfig a
removeMouseBindings :: XConfig a -> [(KeyMask, KeySym)] -> XConfig a
removeMouseBindings conf :: XConfig a
conf mouseBindingList :: [(KeyMask, KeySym)]
mouseBindingList =
XConfig a
conf { mouseBindings :: XConfig Layout -> Map (KeyMask, KeySym) (KeySym -> X ())
mouseBindings = \cnf :: XConfig Layout
cnf -> XConfig a
-> XConfig Layout -> Map (KeyMask, KeySym) (KeySym -> X ())
forall (l :: * -> *).
XConfig l
-> XConfig Layout -> Map (KeyMask, KeySym) (KeySym -> X ())
mouseBindings XConfig a
conf XConfig Layout
cnf Map (KeyMask, KeySym) (KeySym -> X ())
-> Map (KeyMask, KeySym) ()
-> Map (KeyMask, KeySym) (KeySym -> X ())
forall k a b. Ord k => Map k a -> Map k b -> Map k a
`M.difference`
[((KeyMask, KeySym), ())] -> Map (KeyMask, KeySym) ()
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(KeyMask, KeySym)] -> [()] -> [((KeyMask, KeySym), ())]
forall a b. [a] -> [b] -> [(a, b)]
zip [(KeyMask, KeySym)]
mouseBindingList ([()] -> [((KeyMask, KeySym), ())])
-> [()] -> [((KeyMask, KeySym), ())]
forall a b. (a -> b) -> a -> b
$ () -> [()]
forall a. a -> [a]
repeat ()) }
mkKeymap :: XConfig l -> [(String, X ())] -> M.Map (KeyMask, KeySym) (X ())
mkKeymap :: XConfig l -> [(String, X ())] -> Map (KeyMask, KeySym) (X ())
mkKeymap c :: XConfig l
c = [((KeyMask, KeySym), X ())] -> Map (KeyMask, KeySym) (X ())
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([((KeyMask, KeySym), X ())] -> Map (KeyMask, KeySym) (X ()))
-> ([(String, X ())] -> [((KeyMask, KeySym), X ())])
-> [(String, X ())]
-> Map (KeyMask, KeySym) (X ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [([(KeyMask, KeySym)], X ())] -> [((KeyMask, KeySym), X ())]
mkSubmaps ([([(KeyMask, KeySym)], X ())] -> [((KeyMask, KeySym), X ())])
-> ([(String, X ())] -> [([(KeyMask, KeySym)], X ())])
-> [(String, X ())]
-> [((KeyMask, KeySym), X ())]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XConfig l -> [(String, X ())] -> [([(KeyMask, KeySym)], X ())]
forall (l :: * -> *) t.
XConfig l -> [(String, t)] -> [([(KeyMask, KeySym)], t)]
readKeymap XConfig l
c
mkNamedKeymap :: XConfig l -> [(String, NamedAction)] -> [((KeyMask, KeySym), NamedAction)]
mkNamedKeymap :: XConfig l
-> [(String, NamedAction)] -> [((KeyMask, KeySym), NamedAction)]
mkNamedKeymap c :: XConfig l
c = [([(KeyMask, KeySym)], NamedAction)]
-> [((KeyMask, KeySym), NamedAction)]
mkNamedSubmaps ([([(KeyMask, KeySym)], NamedAction)]
-> [((KeyMask, KeySym), NamedAction)])
-> ([(String, NamedAction)]
-> [([(KeyMask, KeySym)], NamedAction)])
-> [(String, NamedAction)]
-> [((KeyMask, KeySym), NamedAction)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XConfig l
-> [(String, NamedAction)] -> [([(KeyMask, KeySym)], NamedAction)]
forall (l :: * -> *) t.
XConfig l -> [(String, t)] -> [([(KeyMask, KeySym)], t)]
readKeymap XConfig l
c
mkNamedSubmaps :: [([(KeyMask, KeySym)], NamedAction)] -> [((KeyMask, KeySym), NamedAction)]
mkNamedSubmaps :: [([(KeyMask, KeySym)], NamedAction)]
-> [((KeyMask, KeySym), NamedAction)]
mkNamedSubmaps = ([((KeyMask, KeySym), NamedAction)] -> NamedAction)
-> [([(KeyMask, KeySym)], NamedAction)]
-> [((KeyMask, KeySym), NamedAction)]
forall a c. Ord a => ([(a, c)] -> c) -> [([a], c)] -> [(a, c)]
mkSubmaps' [((KeyMask, KeySym), NamedAction)] -> NamedAction
forall a. HasName a => [((KeyMask, KeySym), a)] -> NamedAction
submapName
mkSubmaps :: [ ([(KeyMask,KeySym)], X ()) ] -> [((KeyMask, KeySym), X ())]
mkSubmaps :: [([(KeyMask, KeySym)], X ())] -> [((KeyMask, KeySym), X ())]
mkSubmaps = ([((KeyMask, KeySym), X ())] -> X ())
-> [([(KeyMask, KeySym)], X ())] -> [((KeyMask, KeySym), X ())]
forall a c. Ord a => ([(a, c)] -> c) -> [([a], c)] -> [(a, c)]
mkSubmaps' (([((KeyMask, KeySym), X ())] -> X ())
-> [([(KeyMask, KeySym)], X ())] -> [((KeyMask, KeySym), X ())])
-> ([((KeyMask, KeySym), X ())] -> X ())
-> [([(KeyMask, KeySym)], X ())]
-> [((KeyMask, KeySym), X ())]
forall a b. (a -> b) -> a -> b
$ Map (KeyMask, KeySym) (X ()) -> X ()
submap (Map (KeyMask, KeySym) (X ()) -> X ())
-> ([((KeyMask, KeySym), X ())] -> Map (KeyMask, KeySym) (X ()))
-> [((KeyMask, KeySym), X ())]
-> X ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [((KeyMask, KeySym), X ())] -> Map (KeyMask, KeySym) (X ())
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList
mkSubmaps' :: (Ord a) => ([(a, c)] -> c) -> [([a], c)] -> [(a, c)]
mkSubmaps' :: ([(a, c)] -> c) -> [([a], c)] -> [(a, c)]
mkSubmaps' subm :: [(a, c)] -> c
subm binds :: [([a], c)]
binds = ([([a], c)] -> (a, c)) -> [[([a], c)]] -> [(a, c)]
forall a b. (a -> b) -> [a] -> [b]
map [([a], c)] -> (a, c)
combine [[([a], c)]]
gathered
where gathered :: [[([a], c)]]
gathered = (([a], c) -> ([a], c) -> Bool) -> [([a], c)] -> [[([a], c)]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy ([a], c) -> ([a], c) -> Bool
forall b. ([a], b) -> ([a], b) -> Bool
fstKey
([([a], c)] -> [[([a], c)]])
-> ([([a], c)] -> [([a], c)]) -> [([a], c)] -> [[([a], c)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([a], c) -> ([a], c) -> Ordering) -> [([a], c)] -> [([a], c)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy ((([a], c) -> [a]) -> ([a], c) -> ([a], c) -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing ([a], c) -> [a]
forall a b. (a, b) -> a
fst)
([([a], c)] -> [[([a], c)]]) -> [([a], c)] -> [[([a], c)]]
forall a b. (a -> b) -> a -> b
$ [([a], c)]
binds
combine :: [([a], c)] -> (a, c)
combine [([k :: a
k],act :: c
act)] = (a
k,c
act)
combine ks :: [([a], c)]
ks = ([a] -> a
forall a. [a] -> a
head ([a] -> a) -> ([([a], c)] -> [a]) -> [([a], c)] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a], c) -> [a]
forall a b. (a, b) -> a
fst (([a], c) -> [a]) -> ([([a], c)] -> ([a], c)) -> [([a], c)] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [([a], c)] -> ([a], c)
forall a. [a] -> a
head ([([a], c)] -> a) -> [([a], c)] -> a
forall a b. (a -> b) -> a -> b
$ [([a], c)]
ks,
[(a, c)] -> c
subm ([(a, c)] -> c) -> ([([a], c)] -> [(a, c)]) -> [([a], c)] -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(a, c)] -> c) -> [([a], c)] -> [(a, c)]
forall a c. Ord a => ([(a, c)] -> c) -> [([a], c)] -> [(a, c)]
mkSubmaps' [(a, c)] -> c
subm ([([a], c)] -> c) -> [([a], c)] -> c
forall a b. (a -> b) -> a -> b
$ (([a], c) -> ([a], c)) -> [([a], c)] -> [([a], c)]
forall a b. (a -> b) -> [a] -> [b]
map (([a] -> [a]) -> ([a], c) -> ([a], c)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first [a] -> [a]
forall a. [a] -> [a]
tail) [([a], c)]
ks)
fstKey :: ([a], b) -> ([a], b) -> Bool
fstKey = a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==) (a -> a -> Bool) -> (([a], b) -> a) -> ([a], b) -> ([a], b) -> Bool
forall a b c. (a -> a -> b) -> (c -> a) -> c -> c -> b
`on` ([a] -> a
forall a. [a] -> a
head ([a] -> a) -> (([a], b) -> [a]) -> ([a], b) -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a], b) -> [a]
forall a b. (a, b) -> a
fst)
on :: (a -> a -> b) -> (c -> a) -> c -> c -> b
op :: a -> a -> b
op on :: (a -> a -> b) -> (c -> a) -> c -> c -> b
`on` f :: c -> a
f = \x :: c
x y :: c
y -> c -> a
f c
x a -> a -> b
`op` c -> a
f c
y
readKeymap :: XConfig l -> [(String, t)] -> [([(KeyMask, KeySym)], t)]
readKeymap :: XConfig l -> [(String, t)] -> [([(KeyMask, KeySym)], t)]
readKeymap c :: XConfig l
c = ((String, t) -> Maybe ([(KeyMask, KeySym)], t))
-> [(String, t)] -> [([(KeyMask, KeySym)], t)]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ((Maybe [(KeyMask, KeySym)], t) -> Maybe ([(KeyMask, KeySym)], t)
forall a b. (Maybe a, b) -> Maybe (a, b)
maybeKeys ((Maybe [(KeyMask, KeySym)], t) -> Maybe ([(KeyMask, KeySym)], t))
-> ((String, t) -> (Maybe [(KeyMask, KeySym)], t))
-> (String, t)
-> Maybe ([(KeyMask, KeySym)], t)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe [(KeyMask, KeySym)])
-> (String, t) -> (Maybe [(KeyMask, KeySym)], t)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first (XConfig l -> String -> Maybe [(KeyMask, KeySym)]
forall (l :: * -> *).
XConfig l -> String -> Maybe [(KeyMask, KeySym)]
readKeySequence XConfig l
c))
where maybeKeys :: (Maybe a, b) -> Maybe (a, b)
maybeKeys (Nothing,_) = Maybe (a, b)
forall a. Maybe a
Nothing
maybeKeys (Just k :: a
k, act :: b
act) = (a, b) -> Maybe (a, b)
forall a. a -> Maybe a
Just (a
k, b
act)
readKeySequence :: XConfig l -> String -> Maybe [(KeyMask, KeySym)]
readKeySequence :: XConfig l -> String -> Maybe [(KeyMask, KeySym)]
readKeySequence c :: XConfig l
c = [[(KeyMask, KeySym)]] -> Maybe [(KeyMask, KeySym)]
forall a. [a] -> Maybe a
listToMaybe ([[(KeyMask, KeySym)]] -> Maybe [(KeyMask, KeySym)])
-> (String -> [[(KeyMask, KeySym)]])
-> String
-> Maybe [(KeyMask, KeySym)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [[(KeyMask, KeySym)]]
parses
where parses :: String -> [[(KeyMask, KeySym)]]
parses = (([(KeyMask, KeySym)], String) -> [(KeyMask, KeySym)])
-> [([(KeyMask, KeySym)], String)] -> [[(KeyMask, KeySym)]]
forall a b. (a -> b) -> [a] -> [b]
map ([(KeyMask, KeySym)], String) -> [(KeyMask, KeySym)]
forall a b. (a, b) -> a
fst ([([(KeyMask, KeySym)], String)] -> [[(KeyMask, KeySym)]])
-> (String -> [([(KeyMask, KeySym)], String)])
-> String
-> [[(KeyMask, KeySym)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([(KeyMask, KeySym)], String) -> Bool)
-> [([(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null(String -> Bool)
-> (([(KeyMask, KeySym)], String) -> String)
-> ([(KeyMask, KeySym)], String)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([(KeyMask, KeySym)], String) -> String
forall a b. (a, b) -> b
snd) ([([(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)])
-> (String -> [([(KeyMask, KeySym)], String)])
-> String
-> [([(KeyMask, KeySym)], String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReadP [(KeyMask, KeySym)]
-> String -> [([(KeyMask, KeySym)], String)]
forall a. ReadP a -> ReadS a
readP_to_S (XConfig l -> ReadP [(KeyMask, KeySym)]
forall (l :: * -> *). XConfig l -> ReadP [(KeyMask, KeySym)]
parseKeySequence XConfig l
c)
parseKeySequence :: XConfig l -> ReadP [(KeyMask, KeySym)]
parseKeySequence :: XConfig l -> ReadP [(KeyMask, KeySym)]
parseKeySequence c :: XConfig l
c = ReadP (KeyMask, KeySym)
-> ReadP String -> ReadP [(KeyMask, KeySym)]
forall a sep. ReadP a -> ReadP sep -> ReadP [a]
sepBy1 (XConfig l -> ReadP (KeyMask, KeySym)
forall (l :: * -> *). XConfig l -> ReadP (KeyMask, KeySym)
parseKeyCombo XConfig l
c) (ReadP Char -> ReadP String
forall a. ReadP a -> ReadP [a]
many1 (ReadP Char -> ReadP String) -> ReadP Char -> ReadP String
forall a b. (a -> b) -> a -> b
$ Char -> ReadP Char
char ' ')
parseKeyCombo :: XConfig l -> ReadP (KeyMask, KeySym)
parseKeyCombo :: XConfig l -> ReadP (KeyMask, KeySym)
parseKeyCombo c :: XConfig l
c = do [KeyMask]
mods <- ReadP KeyMask -> ReadP [KeyMask]
forall a. ReadP a -> ReadP [a]
many (XConfig l -> ReadP KeyMask
forall (l :: * -> *). XConfig l -> ReadP KeyMask
parseModifier XConfig l
c)
KeySym
k <- ReadP KeySym
parseKey
(KeyMask, KeySym) -> ReadP (KeyMask, KeySym)
forall (m :: * -> *) a. Monad m => a -> m a
return ((KeyMask -> KeyMask -> KeyMask) -> KeyMask -> [KeyMask] -> KeyMask
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' KeyMask -> KeyMask -> KeyMask
forall a. Bits a => a -> a -> a
(.|.) 0 [KeyMask]
mods, KeySym
k)
parseModifier :: XConfig l -> ReadP KeyMask
parseModifier :: XConfig l -> ReadP KeyMask
parseModifier c :: XConfig l
c = (String -> ReadP String
string "M-" ReadP String -> ReadP KeyMask -> ReadP KeyMask
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> KeyMask -> ReadP KeyMask
forall (m :: * -> *) a. Monad m => a -> m a
return (XConfig l -> KeyMask
forall (l :: * -> *). XConfig l -> KeyMask
modMask XConfig l
c))
ReadP KeyMask -> ReadP KeyMask -> ReadP KeyMask
forall a. ReadP a -> ReadP a -> ReadP a
+++ (String -> ReadP String
string "C-" ReadP String -> ReadP KeyMask -> ReadP KeyMask
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> KeyMask -> ReadP KeyMask
forall (m :: * -> *) a. Monad m => a -> m a
return KeyMask
controlMask)
ReadP KeyMask -> ReadP KeyMask -> ReadP KeyMask
forall a. ReadP a -> ReadP a -> ReadP a
+++ (String -> ReadP String
string "S-" ReadP String -> ReadP KeyMask -> ReadP KeyMask
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> KeyMask -> ReadP KeyMask
forall (m :: * -> *) a. Monad m => a -> m a
return KeyMask
shiftMask)
ReadP KeyMask -> ReadP KeyMask -> ReadP KeyMask
forall a. ReadP a -> ReadP a -> ReadP a
+++ do Char
_ <- Char -> ReadP Char
char 'M'
Char
n <- (Char -> Bool) -> ReadP Char
satisfy (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ['1'..'5'])
Char
_ <- Char -> ReadP Char
char '-'
KeyMask -> ReadP KeyMask
forall (m :: * -> *) a. Monad m => a -> m a
return (KeyMask -> ReadP KeyMask) -> KeyMask -> ReadP KeyMask
forall a b. (a -> b) -> a -> b
$ Int -> KeyMask
indexMod (String -> Int
forall a. Read a => String -> a
read [Char
n] Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1)
where indexMod :: Int -> KeyMask
indexMod = [KeyMask] -> Int -> KeyMask
forall a. [a] -> Int -> a
(!!) [KeyMask
mod1Mask,KeyMask
mod2Mask,KeyMask
mod3Mask,KeyMask
mod4Mask,KeyMask
mod5Mask]
parseKey :: ReadP KeySym
parseKey :: ReadP KeySym
parseKey = ReadP KeySym
parseRegular ReadP KeySym -> ReadP KeySym -> ReadP KeySym
forall a. ReadP a -> ReadP a -> ReadP a
+++ ReadP KeySym
parseSpecial
parseRegular :: ReadP KeySym
parseRegular :: ReadP KeySym
parseRegular = [ReadP KeySym] -> ReadP KeySym
forall a. [ReadP a] -> ReadP a
choice [ Char -> ReadP Char
char Char
s ReadP Char -> ReadP KeySym -> ReadP KeySym
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> KeySym -> ReadP KeySym
forall (m :: * -> *) a. Monad m => a -> m a
return KeySym
k
| (s :: Char
s,k :: KeySym
k) <- String -> [KeySym] -> [(Char, KeySym)]
forall a b. [a] -> [b] -> [(a, b)]
zip ['!' .. '~' ]
[KeySym
xK_exclam .. KeySym
xK_asciitilde]
[(Char, KeySym)] -> [(Char, KeySym)] -> [(Char, KeySym)]
forall a. [a] -> [a] -> [a]
++ String -> [KeySym] -> [(Char, KeySym)]
forall a b. [a] -> [b] -> [(a, b)]
zip ['\xa0' .. '\xff' ]
[KeySym
xK_nobreakspace .. KeySym
xK_ydiaeresis]
]
parseSpecial :: ReadP KeySym
parseSpecial :: ReadP KeySym
parseSpecial = do Char
_ <- Char -> ReadP Char
char '<'
KeySym
key <- [ReadP KeySym] -> ReadP KeySym
forall a. [ReadP a] -> ReadP a
choice [ String -> ReadP String
string String
name ReadP String -> ReadP KeySym -> ReadP KeySym
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> KeySym -> ReadP KeySym
forall (m :: * -> *) a. Monad m => a -> m a
return KeySym
k
| (name :: String
name,k :: KeySym
k) <- [(String, KeySym)]
keyNames
]
Char
_ <- Char -> ReadP Char
char '>'
KeySym -> ReadP KeySym
forall (m :: * -> *) a. Monad m => a -> m a
return KeySym
key
keyNames :: [(String, KeySym)]
keyNames :: [(String, KeySym)]
keyNames = [(String, KeySym)]
functionKeys [(String, KeySym)] -> [(String, KeySym)] -> [(String, KeySym)]
forall a. [a] -> [a] -> [a]
++ [(String, KeySym)]
specialKeys [(String, KeySym)] -> [(String, KeySym)] -> [(String, KeySym)]
forall a. [a] -> [a] -> [a]
++ [(String, KeySym)]
multimediaKeys
functionKeys :: [(String, KeySym)]
functionKeys :: [(String, KeySym)]
functionKeys = [ ('F' Char -> String -> String
forall a. a -> [a] -> [a]
: Int -> String
forall a. Show a => a -> String
show Int
n, KeySym
k)
| (n :: Int
n,k :: KeySym
k) <- [Int] -> [KeySym] -> [(Int, KeySym)]
forall a b. [a] -> [b] -> [(a, b)]
zip ([1..24] :: [Int]) [KeySym
xK_F1..] ]
specialKeys :: [(String, KeySym)]
specialKeys :: [(String, KeySym)]
specialKeys = [ ("Backspace" , KeySym
xK_BackSpace)
, ("Tab" , KeySym
xK_Tab)
, ("Return" , KeySym
xK_Return)
, ("Pause" , KeySym
xK_Pause)
, ("Scroll_lock", KeySym
xK_Scroll_Lock)
, ("Sys_Req" , KeySym
xK_Sys_Req)
, ("Print" , KeySym
xK_Print)
, ("Escape" , KeySym
xK_Escape)
, ("Esc" , KeySym
xK_Escape)
, ("Delete" , KeySym
xK_Delete)
, ("Home" , KeySym
xK_Home)
, ("Left" , KeySym
xK_Left)
, ("Up" , KeySym
xK_Up)
, ("Right" , KeySym
xK_Right)
, ("Down" , KeySym
xK_Down)
, ("L" , KeySym
xK_Left)
, ("U" , KeySym
xK_Up)
, ("R" , KeySym
xK_Right)
, ("D" , KeySym
xK_Down)
, ("Page_Up" , KeySym
xK_Page_Up)
, ("Page_Down" , KeySym
xK_Page_Down)
, ("End" , KeySym
xK_End)
, ("Insert" , KeySym
xK_Insert)
, ("Break" , KeySym
xK_Break)
, ("Space" , KeySym
xK_space)
, ("KP_Space" , KeySym
xK_KP_Space)
, ("KP_Tab" , KeySym
xK_KP_Tab)
, ("KP_Enter" , KeySym
xK_KP_Enter)
, ("KP_F1" , KeySym
xK_KP_F1)
, ("KP_F2" , KeySym
xK_KP_F2)
, ("KP_F3" , KeySym
xK_KP_F3)
, ("KP_F4" , KeySym
xK_KP_F4)
, ("KP_Home" , KeySym
xK_KP_Home)
, ("KP_Left" , KeySym
xK_KP_Left)
, ("KP_Up" , KeySym
xK_KP_Up)
, ("KP_Right" , KeySym
xK_KP_Right)
, ("KP_Down" , KeySym
xK_KP_Down)
, ("KP_Prior" , KeySym
xK_KP_Prior)
, ("KP_Page_Up" , KeySym
xK_KP_Page_Up)
, ("KP_Next" , KeySym
xK_KP_Next)
, ("KP_Page_Down", KeySym
xK_KP_Page_Down)
, ("KP_End" , KeySym
xK_KP_End)
, ("KP_Begin" , KeySym
xK_KP_Begin)
, ("KP_Insert" , KeySym
xK_KP_Insert)
, ("KP_Delete" , KeySym
xK_KP_Delete)
, ("KP_Equal" , KeySym
xK_KP_Equal)
, ("KP_Multiply", KeySym
xK_KP_Multiply)
, ("KP_Add" , KeySym
xK_KP_Add)
, ("KP_Separator", KeySym
xK_KP_Separator)
, ("KP_Subtract", KeySym
xK_KP_Subtract)
, ("KP_Decimal" , KeySym
xK_KP_Decimal)
, ("KP_Divide" , KeySym
xK_KP_Divide)
, ("KP_0" , KeySym
xK_KP_0)
, ("KP_1" , KeySym
xK_KP_1)
, ("KP_2" , KeySym
xK_KP_2)
, ("KP_3" , KeySym
xK_KP_3)
, ("KP_4" , KeySym
xK_KP_4)
, ("KP_5" , KeySym
xK_KP_5)
, ("KP_6" , KeySym
xK_KP_6)
, ("KP_7" , KeySym
xK_KP_7)
, ("KP_8" , KeySym
xK_KP_8)
, ("KP_9" , KeySym
xK_KP_9)
]
multimediaKeys :: [(String, KeySym)]
multimediaKeys :: [(String, KeySym)]
multimediaKeys = ((String, KeySym) -> Bool)
-> [(String, KeySym)] -> [(String, KeySym)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((KeySym -> KeySym -> Bool
forall a. Eq a => a -> a -> Bool
/= KeySym
noSymbol) (KeySym -> Bool)
-> ((String, KeySym) -> KeySym) -> (String, KeySym) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, KeySym) -> KeySym
forall a b. (a, b) -> b
snd) ([(String, KeySym)] -> [(String, KeySym)])
-> ([String] -> [(String, KeySym)])
-> [String]
-> [(String, KeySym)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> (String, KeySym)) -> [String] -> [(String, KeySym)]
forall a b. (a -> b) -> [a] -> [b]
map (String -> String
forall a. a -> a
id (String -> String)
-> (String -> KeySym) -> String -> (String, KeySym)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& String -> KeySym
stringToKeysym) ([String] -> [(String, KeySym)]) -> [String] -> [(String, KeySym)]
forall a b. (a -> b) -> a -> b
$
[ "XF86ModeLock"
, "XF86MonBrightnessUp"
, "XF86MonBrightnessDown"
, "XF86KbdLightOnOff"
, "XF86KbdBrightnessUp"
, "XF86KbdBrightnessDown"
, "XF86Standby"
, "XF86AudioLowerVolume"
, "XF86AudioMute"
, "XF86AudioRaiseVolume"
, "XF86AudioPlay"
, "XF86AudioStop"
, "XF86AudioPrev"
, "XF86AudioNext"
, "XF86HomePage"
, "XF86Mail"
, "XF86Start"
, "XF86Search"
, "XF86AudioRecord"
, "XF86Calculator"
, "XF86Memo"
, "XF86ToDoList"
, "XF86Calendar"
, "XF86PowerDown"
, "XF86ContrastAdjust"
, "XF86RockerUp"
, "XF86RockerDown"
, "XF86RockerEnter"
, "XF86Back"
, "XF86Forward"
, "XF86Stop"
, "XF86Refresh"
, "XF86PowerOff"
, "XF86WakeUp"
, "XF86Eject"
, "XF86ScreenSaver"
, "XF86WWW"
, "XF86Sleep"
, "XF86Favorites"
, "XF86AudioPause"
, "XF86AudioMedia"
, "XF86MyComputer"
, "XF86VendorHome"
, "XF86LightBulb"
, "XF86Shop"
, "XF86History"
, "XF86OpenURL"
, "XF86AddFavorite"
, "XF86HotLinks"
, "XF86BrightnessAdjust"
, "XF86Finance"
, "XF86Community"
, "XF86AudioRewind"
, "XF86BackForward"
, "XF86Launch0"
, "XF86Launch1"
, "XF86Launch2"
, "XF86Launch3"
, "XF86Launch4"
, "XF86Launch5"
, "XF86Launch6"
, "XF86Launch7"
, "XF86Launch8"
, "XF86Launch9"
, "XF86LaunchA"
, "XF86LaunchB"
, "XF86LaunchC"
, "XF86LaunchD"
, "XF86LaunchE"
, "XF86LaunchF"
, "XF86ApplicationLeft"
, "XF86ApplicationRight"
, "XF86Book"
, "XF86CD"
, "XF86Calculater"
, "XF86Clear"
, "XF86Close"
, "XF86Copy"
, "XF86Cut"
, "XF86Display"
, "XF86DOS"
, "XF86Documents"
, "XF86Excel"
, "XF86Explorer"
, "XF86Game"
, "XF86Go"
, "XF86iTouch"
, "XF86LogOff"
, "XF86Market"
, "XF86Meeting"
, "XF86MenuKB"
, "XF86MenuPB"
, "XF86MySites"
, "XF86New"
, "XF86News"
, "XF86OfficeHome"
, "XF86Open"
, "XF86Option"
, "XF86Paste"
, "XF86Phone"
, "XF86Q"
, "XF86Reply"
, "XF86Reload"
, "XF86RotateWindows"
, "XF86RotationPB"
, "XF86RotationKB"
, "XF86Save"
, "XF86ScrollUp"
, "XF86ScrollDown"
, "XF86ScrollClick"
, "XF86Send"
, "XF86Spell"
, "XF86SplitScreen"
, "XF86Support"
, "XF86TaskPane"
, "XF86Terminal"
, "XF86Tools"
, "XF86Travel"
, "XF86UserPB"
, "XF86User1KB"
, "XF86User2KB"
, "XF86Video"
, "XF86WheelButton"
, "XF86Word"
, "XF86Xfer"
, "XF86ZoomIn"
, "XF86ZoomOut"
, "XF86Away"
, "XF86Messenger"
, "XF86WebCam"
, "XF86MailForward"
, "XF86Pictures"
, "XF86Music"
, "XF86TouchpadToggle"
, "XF86AudioMicMute"
, "XF86_Switch_VT_1"
, "XF86_Switch_VT_2"
, "XF86_Switch_VT_3"
, "XF86_Switch_VT_4"
, "XF86_Switch_VT_5"
, "XF86_Switch_VT_6"
, "XF86_Switch_VT_7"
, "XF86_Switch_VT_8"
, "XF86_Switch_VT_9"
, "XF86_Switch_VT_10"
, "XF86_Switch_VT_11"
, "XF86_Switch_VT_12"
, "XF86_Ungrab"
, "XF86_ClearGrab"
, "XF86_Next_VMode"
, "XF86_Prev_VMode" ]
checkKeymap :: XConfig l -> [(String, a)] -> X ()
checkKeymap :: XConfig l -> [(String, a)] -> X ()
checkKeymap conf :: XConfig l
conf km :: [(String, a)]
km = ([String], [String]) -> X ()
forall (m :: * -> *). MonadIO m => ([String], [String]) -> m ()
warn (XConfig l -> [(String, a)] -> ([String], [String])
forall (l :: * -> *) a.
XConfig l -> [(String, a)] -> ([String], [String])
doKeymapCheck XConfig l
conf [(String, a)]
km)
where warn :: ([String], [String]) -> m ()
warn ([],[]) = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
warn (bad :: [String]
bad,dup :: [String]
dup) = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
spawn (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ "xmessage 'Warning:\n"
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
msg "bad" [String]
bad String -> String -> String
forall a. [a] -> [a] -> [a]
++ "\n"
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
msg "duplicate" [String]
dup String -> String -> String
forall a. [a] -> [a] -> [a]
++ "'"
msg :: String -> [String] -> String
msg _ [] = ""
msg m :: String
m xs :: [String]
xs = String
m String -> String -> String
forall a. [a] -> [a] -> [a]
++ " keybindings detected: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
showBindings [String]
xs
showBindings :: [String] -> String
showBindings = [String] -> String
unwords ([String] -> String)
-> ([String] -> [String]) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (("\""String -> String -> String
forall a. [a] -> [a] -> [a]
++) (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> String
forall a. [a] -> [a] -> [a]
++"\""))
doKeymapCheck :: XConfig l -> [(String,a)] -> ([String], [String])
doKeymapCheck :: XConfig l -> [(String, a)] -> ([String], [String])
doKeymapCheck conf :: XConfig l
conf km :: [(String, a)]
km = ([String]
bad,[String]
dups)
where ks :: [(Maybe [(KeyMask, KeySym)], String)]
ks = ((String, a) -> (Maybe [(KeyMask, KeySym)], String))
-> [(String, a)] -> [(Maybe [(KeyMask, KeySym)], String)]
forall a b. (a -> b) -> [a] -> [b]
map ((XConfig l -> String -> Maybe [(KeyMask, KeySym)]
forall (l :: * -> *).
XConfig l -> String -> Maybe [(KeyMask, KeySym)]
readKeySequence XConfig l
conf (String -> Maybe [(KeyMask, KeySym)])
-> (String -> String)
-> String
-> (Maybe [(KeyMask, KeySym)], String)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& String -> String
forall a. a -> a
id) (String -> (Maybe [(KeyMask, KeySym)], String))
-> ((String, a) -> String)
-> (String, a)
-> (Maybe [(KeyMask, KeySym)], String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String, a) -> String
forall a b. (a, b) -> a
fst) [(String, a)]
km
bad :: [String]
bad = [String] -> [String]
forall a. Eq a => [a] -> [a]
nub ([String] -> [String])
-> ([(Maybe [(KeyMask, KeySym)], String)] -> [String])
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Maybe [(KeyMask, KeySym)], String) -> String)
-> [(Maybe [(KeyMask, KeySym)], String)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Maybe [(KeyMask, KeySym)], String) -> String
forall a b. (a, b) -> b
snd ([(Maybe [(KeyMask, KeySym)], String)] -> [String])
-> ([(Maybe [(KeyMask, KeySym)], String)]
-> [(Maybe [(KeyMask, KeySym)], String)])
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Maybe [(KeyMask, KeySym)], String) -> Bool)
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [(Maybe [(KeyMask, KeySym)], String)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Maybe [(KeyMask, KeySym)] -> Bool
forall a. Maybe a -> Bool
isNothing (Maybe [(KeyMask, KeySym)] -> Bool)
-> ((Maybe [(KeyMask, KeySym)], String)
-> Maybe [(KeyMask, KeySym)])
-> (Maybe [(KeyMask, KeySym)], String)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe [(KeyMask, KeySym)], String) -> Maybe [(KeyMask, KeySym)]
forall a b. (a, b) -> a
fst) ([(Maybe [(KeyMask, KeySym)], String)] -> [String])
-> [(Maybe [(KeyMask, KeySym)], String)] -> [String]
forall a b. (a -> b) -> a -> b
$ [(Maybe [(KeyMask, KeySym)], String)]
ks
dups :: [String]
dups = ([([(KeyMask, KeySym)], String)] -> String)
-> [[([(KeyMask, KeySym)], String)]] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (([(KeyMask, KeySym)], String) -> String
forall a b. (a, b) -> b
snd (([(KeyMask, KeySym)], String) -> String)
-> ([([(KeyMask, KeySym)], String)]
-> ([(KeyMask, KeySym)], String))
-> [([(KeyMask, KeySym)], String)]
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [([(KeyMask, KeySym)], String)] -> ([(KeyMask, KeySym)], String)
forall a. [a] -> a
head)
([[([(KeyMask, KeySym)], String)]] -> [String])
-> ([(Maybe [(KeyMask, KeySym)], String)]
-> [[([(KeyMask, KeySym)], String)]])
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([([(KeyMask, KeySym)], String)] -> Bool)
-> [[([(KeyMask, KeySym)], String)]]
-> [[([(KeyMask, KeySym)], String)]]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>1) (Int -> Bool)
-> ([([(KeyMask, KeySym)], String)] -> Int)
-> [([(KeyMask, KeySym)], String)]
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [([(KeyMask, KeySym)], String)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length)
([[([(KeyMask, KeySym)], String)]]
-> [[([(KeyMask, KeySym)], String)]])
-> ([(Maybe [(KeyMask, KeySym)], String)]
-> [[([(KeyMask, KeySym)], String)]])
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [[([(KeyMask, KeySym)], String)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([(KeyMask, KeySym)], String)
-> ([(KeyMask, KeySym)], String) -> Bool)
-> [([(KeyMask, KeySym)], String)]
-> [[([(KeyMask, KeySym)], String)]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy ([(KeyMask, KeySym)] -> [(KeyMask, KeySym)] -> Bool
forall a. Eq a => a -> a -> Bool
(==) ([(KeyMask, KeySym)] -> [(KeyMask, KeySym)] -> Bool)
-> (([(KeyMask, KeySym)], String) -> [(KeyMask, KeySym)])
-> ([(KeyMask, KeySym)], String)
-> ([(KeyMask, KeySym)], String)
-> Bool
forall a b c. (a -> a -> b) -> (c -> a) -> c -> c -> b
`on` ([(KeyMask, KeySym)], String) -> [(KeyMask, KeySym)]
forall a b. (a, b) -> a
fst)
([([(KeyMask, KeySym)], String)]
-> [[([(KeyMask, KeySym)], String)]])
-> ([(Maybe [(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)])
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [[([(KeyMask, KeySym)], String)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([(KeyMask, KeySym)], String)
-> ([(KeyMask, KeySym)], String) -> Ordering)
-> [([(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy ((([(KeyMask, KeySym)], String) -> [(KeyMask, KeySym)])
-> ([(KeyMask, KeySym)], String)
-> ([(KeyMask, KeySym)], String)
-> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing ([(KeyMask, KeySym)], String) -> [(KeyMask, KeySym)]
forall a b. (a, b) -> a
fst)
([([(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)])
-> ([(Maybe [(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)])
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Maybe [(KeyMask, KeySym)], String)
-> ([(KeyMask, KeySym)], String))
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)]
forall a b. (a -> b) -> [a] -> [b]
map ((Maybe [(KeyMask, KeySym)] -> [(KeyMask, KeySym)])
-> (Maybe [(KeyMask, KeySym)], String)
-> ([(KeyMask, KeySym)], String)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first Maybe [(KeyMask, KeySym)] -> [(KeyMask, KeySym)]
forall a. HasCallStack => Maybe a -> a
fromJust)
([(Maybe [(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)])
-> ([(Maybe [(KeyMask, KeySym)], String)]
-> [(Maybe [(KeyMask, KeySym)], String)])
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [([(KeyMask, KeySym)], String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Maybe [(KeyMask, KeySym)], String) -> Bool)
-> [(Maybe [(KeyMask, KeySym)], String)]
-> [(Maybe [(KeyMask, KeySym)], String)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Maybe [(KeyMask, KeySym)] -> Bool
forall a. Maybe a -> Bool
isJust (Maybe [(KeyMask, KeySym)] -> Bool)
-> ((Maybe [(KeyMask, KeySym)], String)
-> Maybe [(KeyMask, KeySym)])
-> (Maybe [(KeyMask, KeySym)], String)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe [(KeyMask, KeySym)], String) -> Maybe [(KeyMask, KeySym)]
forall a b. (a, b) -> a
fst)
([(Maybe [(KeyMask, KeySym)], String)] -> [String])
-> [(Maybe [(KeyMask, KeySym)], String)] -> [String]
forall a b. (a -> b) -> a -> b
$ [(Maybe [(KeyMask, KeySym)], String)]
ks