1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
module XMonad.Local.GridSelect (
gsConfig
, gsw
, gswShift
) where
import Control.Monad
import Data.List (subsequences)
import XMonad
import qualified Data.Map as M
import XMonad.Actions.GridSelect
import qualified XMonad.Actions.TopicSpace as TS
import qualified XMonad.StackSet as W
-- local modules **************************************************************
import qualified XMonad.Local.TopicSpace as Local
gsConfig :: HasColorizer a => GSConfig a
gsConfig = def
{ gs_cellheight = 40
, gs_cellwidth = 100
, gs_navigate = navigation'
}
where
navigation' :: TwoD a (Maybe a)
navigation' = makeXEventhandler
$ shadowWithKeymap navKeyMap navHandler
navKeyMap = M.fromList (allowModifs modifs
[ ((0, xK_Escape) , cancel)
, ((0, xK_Return) , select)
, ((0, xK_slash) , substringSearch navigation')
, ((0, xK_question), substringSearch navigation')
, ((0, xK_Left) , move (-1, 0) >> navigation')
, ((0, xK_h) , move (-1, 0) >> navigation')
, ((0, xK_H) , move (-1, 0) >> navigation')
, ((0, xK_Right) , move (1 , 0) >> navigation')
, ((0, xK_l) , move (1 , 0) >> navigation')
, ((0, xK_L) , move (1 , 0) >> navigation')
, ((0, xK_Down) , move (0 , 1) >> navigation')
, ((0, xK_j) , move (0 , 1) >> navigation')
, ((0, xK_J) , move (0 , 1) >> navigation')
, ((0, xK_Up) , move (0 , -1) >> navigation')
, ((0, xK_k) , move (0 , -1) >> navigation')
, ((0, xK_K) , move (0 , -1) >> navigation')
, ((0, xK_n) , moveNext >> navigation')
, ((0, xK_N) , moveNext >> navigation')
, ((0, xK_p) , movePrev >> navigation')
, ((0, xK_P) , movePrev >> navigation')
]
++ allowModifs (drop 1 modifs)
[ ((0, xK_Tab) , moveNext >> navigation')
, ((shiftMask, xK_Tab), moveNext >> navigation')
]
)
modifs :: [KeyMask]
modifs = [ shiftMask, lockMask, mod1Mask, mod2Mask
, mod3Mask, mod4Mask, mod5Mask ]
allowModifs :: [ KeyMask ] -> [((KeyMask, a), b)] -> [((KeyMask, a), b)]
allowModifs mods keymap =
[ ((m .|. o, k), a)
| m <- map (foldl (.|.) 0) $ subsequences mods
, ((o, k), a) <- keymap
]
-- The navigation handler ignores unknown key symbols
navHandler = const navigation'
gsw :: X()
gsw = gsw' W.greedyView
where
gsw' :: (WorkspaceId -> WindowSet -> WindowSet) -> X ()
gsw' viewFunc = withWindowSet $ \ws -> do
let wss = map W.tag $ fHidden ws ++ map W.workspace (W.current ws : W.visible ws)
gridselect gsConfig (zip wss wss) >>= flip whenJust (switchTopic' viewFunc)
fHidden = filter ((/=) "NSP" . W.tag) . W.hidden
gswShift :: X()
gswShift = gridselectWorkspace gsConfig (\ws -> W.greedyView ws . W.shift ws)
switchTopic' :: (WorkspaceId -> WindowSet -> WindowSet)
-> TS.Topic -> X ()
switchTopic' viewMethod topic = do
windows $ viewMethod topic
wins <- gets (W.integrate' . W.stack . W.workspace . W.current . windowset)
when (null wins) $ TS.topicAction Local.topicConfig topic
|