summaryrefslogtreecommitdiffstats
path: root/src/XMonad/Local/GridSelect.hs
blob: 20dde76f72fbda4c404e474a8fe831a779b52fcc (plain)
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 = defaultGSConfig
    { 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