-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxmonad.hs
109 lines (91 loc) · 3.33 KB
/
xmonad.hs
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Util.EZConfig(additionalKeys)
import XMonad.Util.SpawnOnce
import XMonad.Layout.MultiToggle
import XMonad.Layout.MultiToggle.Instances
import XMonad.ManageHook
import Control.Monad(liftM2)
import XMonad.Hooks.EwmhDesktops
import XMonad.Actions.CycleWS
import qualified XMonad.StackSet as W
import XMonad.Actions.CycleRecentWS
import XMonad.Util.Paste
import XMonad.Util.WorkspaceCompare
import XMonad.Actions.DynamicWorkspaces
import Data.Maybe ( isNothing, isJust )
-- import XMonad.Config.Desktop
-- baseConfig = desktopConfig
main = xmonad =<< statusBar moBar printer toggleStrutsKey myConfig
moBar = "xmobar"
printer = xmobarPP {
ppCurrent = xmobarColor "#429942" "" . wrap "<" ">"
, ppOrder = \(ws:_) -> [ws]
}
toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)
myWorkspaces = ["Emacs", "Terminal", "WebBrowser", "Messages", "Hidden"]
myConfig = (ewmh . ewmhFullscreen $ def) {
terminal = "urxvt"
, borderWidth = 3
, startupHook = myStartupHook
, manageHook = myManageHook
, layoutHook = myLayoutHook
, workspaces = myWorkspaces
} `additionalKeys`
[ ((mod1Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock")
-- , ((mod1Mask, xK_space), sendMessage $ Toggle FULL)
, ((mod1Mask, xK_bracketleft), prevNonEmptyWS)
, ((mod1Mask, xK_bracketright), nextNonEmptyWS)
, ((mod1Mask, xK_Right), nextScreen)
, ((mod1Mask, xK_Left), prevScreen)
, ((mod1Mask, xK_Tab), nextScreen)
, ((mod1Mask, xK_i), toggleWS' ["Hidden"])
, ((mod1Mask .|. shiftMask, xK_Tab), prevScreen)
, ((mod1Mask .|. shiftMask, xK_c), kill)
, ((0, xK_Insert), pasteSelection)
, ((mod1Mask, xK_p), spawn "dmenu_run -l 10 -fn 'HackGen:size=14'")
]
myStartupHook = do
spawnOnce "feh ~/Downloads/Xmbindings.png"
myManageHook = composeAll
[ className =? "Emacs" --> doShift "Emacs"
, className =? "URxvt" --> doShift "Terminal"
, className =? "feh" --> doShift "Terminal"
, className =? "Google-chrome" --> doShift "WebBrowser"
, className =? "Electron" --> doShift "WebBrowser"
, className =? "MPlayer" --> doShift "Hidden"
, className =? "mplayer2" --> doShift "Hidden"
, className =? "Wine" --> doShift "Hidden"
, className =? "Genymotion" --> doShift "Hidden"
, className =? "Genymotion Player" --> doShift "Hidden"
, className =? "Slack" --> doShift "Messages"
]
myLayoutHook = tiled ||| Full
where
tiled = Tall nmaster delta ratio
nmaster = 1
ratio = 1/2
delta = 3/100
visibleWs :: X (WindowSpace -> Bool)
visibleWs = do
hs <- gets (map W.tag . W.hidden . windowset)
return (\w -> (not ((W.tag w) `elem` hs)))
visibleNonEmptyWs :: X (WindowSpace -> Bool)
visibleNonEmptyWs = do ne <- isNonEmptyWs
vi <- visibleWs
return (\w -> ne w && vi w)
where isNonEmptyWs = return (isJust . W.stack)
nonEmptyWsBy :: Int -> X (WorkspaceId)
nonEmptyWsBy = findWorkspace getSortByIndex Next (Not emptyWS)
switchNonEmptyWorkspace :: Int -> X ()
switchNonEmptyWorkspace d = do
id <- nonEmptyWsBy d
if id == "Hidden"
then if d < 0
then switchNonEmptyWorkspace (d - 1)
else switchNonEmptyWorkspace (d + 1)
else (windows . W.greedyView) id
nextNonEmptyWS :: X ()
nextNonEmptyWS = switchNonEmptyWorkspace 1
prevNonEmptyWS :: X ()
prevNonEmptyWS = switchNonEmptyWorkspace (-1)