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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
| import XMonad
import XMonad.Core
import XMonad.Prompt
import XMonad.Prompt.Shell
import XMonad.Prompt.Man
import XMonad.Prompt.AppLauncher as AL
import XMonad.Layout
import XMonad.Layout.NoBorders
import XMonad.Layout.ResizableTile
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.UrgencyHook
import XMonad.Hooks.SetWMName
import XMonad.Hooks.ManageHelpers
import qualified XMonad.StackSet as W
import XMonad.Util.EZConfig
import XMonad.Util.Run
import XMonad.Util.Loggers
import XMonad.Util.WorkspaceCompare
import XMonad.Util.Scratchpad
import XMonad.Actions.WindowBringer
import Control.Monad (liftM2)
import Graphics.X11.Xlib
import Data.List
import qualified Data.Map as M
import System.IO
main = do
dzenproc <- spawnPipe myStatusBar
conkyproc <- spawnPipe myConkyBar
spawn myTrayer
xmonad $ withUrgencyHook NoUrgencyHook
$ defaultConfig {
manageHook = manageDocks <+> myManageHook <+> manageHook defaultConfig
, layoutHook = avoidStruts $ smartBorders $ layoutHook defaultConfig
, logHook = dynamicLogWithPP $ myDzenPP dzenproc
, modMask = myModKey -- Rebind Mod to the Windows key
, focusFollowsMouse = False
, workspaces = myWorkspaces
, terminal = "urxvt"
} `additionalKeysP` myKeys
myManageHook = scratchpadManageHook (W.RationalRect 0.3 0.2 0.4 0.4) <+>
(composeAll . concat $
[ [ isDialog --> doFloat]
, [className =? c --> doFloat | c <- myCFloats]
, [title =? t --> doFloat | t <- myTFloats]
, [resource =? r --> doFloat | r <- myRFloats]
, [ fmap ( c `isInfixOf`) className --> doFloat | c <- myMatchAnywhereFloatsC ]
, [ fmap ( c `isInfixOf`) title --> doFloat | c <- myMatchAnywhereFloatsT ]
, [resource =? i --> doIgnore | i <- myIgnores]
, [isFullscreen --> (doF W.focusDown <+> doFullFloat)]
, [(className =? x <||> title =? x <||> resource =? x) --> doShift "1:web" | x <- my1Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShift "2:comm" | x <- my2Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShift "3:office" | x <- my3Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShift "4:dev" | x <- my4Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "5:video" | x <- my5Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "6" | x <- my6Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "7" | x <- my7Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "8" | x <- my8Shifts]
, [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "9:misc" | x <- my9Shifts]
] )
where
doShiftAndGo = doF . liftM2 (.) W.greedyView W.shift
myCFloats = ["Nitrogen", "Nvidia-settings", "Transmission-gtk", "Xmessage", "Gimp", "Tracker-search-tool", "Qjackctl"]
myTFloats = ["Downloads", "Firefox Preferences", "Save As..."]
myRFloats = []
myMatchAnywhereFloatsC = ["Ardour"]
myMatchAnywhereFloatsT = []
myIgnores = []
my1Shifts = ["Firefox"]
my2Shifts = ["Thunderbird"]
my3Shifts = ["libreoffice-startcenter", "libreoffice-writer", "Libreoffice"]
my4Shifts = ["emacs"]
my5Shifts = ["Vlc"]
my6Shifts = []
my7Shifts = []
my8Shifts = []
my9Shifts = []
-- Theme settings
myFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-iso8859-*"
myNormalFGColor = "#ffffff"
myNormalBGColor = "#000000"
myFocusedFGColor = "#ff8888"
myFocusedBGColor = "#555555"
myVisibleFGColor = "#ffffff"
myVisibleBGColor = "#555555"
myHiddenFGColor = "#d0d0d0"
myHiddenBGColor = "#000000"
myUrgentFGColor = "#ffffff"
myUrgentBGColor = "#ff0000"
myHighlightedFGColor = "#FFFFFF"
myHighlightedBGColor = "#222222"
mySeperatorColor = "#555555"
myTitleColor = "#9F9FFF"
--Shell prompt settings
myXPConfig = defaultXPConfig {
position = Bottom,
promptBorderWidth = 0,
height = 24,
bgColor = myNormalBGColor,
fgColor = myNormalFGColor,
fgHLight = myHighlightedFGColor,
bgHLight = myHighlightedBGColor,
font = myFont
}
-- Define workspaces
myWorkspaces = ["1:web", "2:comm", "3:office", "4:dev", "5:video", "6", "7", "8", "9:misc"]
-- Modified key bindings
myModKey = mod4Mask
myKeys =
[
-- Use shellPrompt instead of default dmenu
("M-p", shellPrompt myXPConfig)
-- Do not leave useless conky, dzen and trayer after restart
, ("M-q", spawn "killall trayer conky dzen2; xmonad --recompile; xmonad --restart")
, ("M-s", spawn "dbus-send --system --print-reply --dest=\"org.freedesktop.UPower\" /org/freedesktop/UPower org.freedesktop.UPower.Suspend")
, ("M-S-t", scratchpadSpawnAction defaultConfig {terminal = "urxvt"})
, ("<XF86AudioLowerVolume>", spawn "amixer sset Master 3dB- unmute")
, ("<XF86AudioRaiseVolume>", spawn "amixer sset Master 3dB+ unmute")
, ("<XF86Eject>", spawn "eject -T")
, ("M-S-g", gotoMenu)
, ("M-S-b", bringMenu)
, ("M-S-f", focusUrgent)
, ("M-S-x", spawn "transmission-gtk")
, ("M-S-p", spawn "tracker-search-tool")
, ("M-S-s", spawn "setxkbmap se -variant svoraka2")
, ("M-S-o", spawn "setxkbmap se -variant mac")
]
-- PP used to generate log data for dzen
myDzenPP h = defaultPP
{ ppSep = " "
, ppWsSep = ""
, ppCurrent = wrap ("^fg(" ++ myFocusedFGColor ++ ")^bg(" ++ myFocusedBGColor ++ ") ") " ^fg()^bg()^p()" . \wsId -> dropIx wsId
, ppVisible = wrap ("^fg(" ++ myVisibleFGColor ++ ")^bg(" ++ myVisibleBGColor ++ ") ") " ^fg()^bg()^p()" . \wsId -> dropIx wsId
, ppHidden = wrap ("^fg(" ++ myHiddenFGColor ++ ") ") " " . noScratchPad . \wsId -> dropIx wsId
, ppUrgent = wrap ("^bg(" ++ myUrgentBGColor ++ ")") "^bg()"
, ppTitle = dzenColor ("" ++ myTitleColor ++ "") "" . wrap "< " " >"
, ppLayout = dzenColor ("" ++ myNormalFGColor ++ "") "" .
(\x -> case x of
"Full" -> "[ ]"
"Tall" -> "[|]"
"Mirror Tall" -> "[-]"
_ -> x
)
, ppSort = getSortByXineramaRule
, ppOrder = \(ws:l:t:_) -> [ws] ++ [l] ++ [t]
, ppOutput = hPutStrLn h
}
where
dropIx wsId = if (':' `elem` wsId) then drop 2 wsId else wsId --Remove the digit before the workspace name when displaying
noScratchPad ws = if ws == "NSP" then "" else ws --Hide the workspace where the scratchpad is hidden away to
--Set up dzen2 for the status bar on Xinerama screen 1
myStatusBar = "dzen2 -xs 1 -x '0' -y '0' -h '18' -w '1428' -ta 'l' -fg '" ++ myNormalFGColor ++ "' -bg '" ++ myNormalBGColor ++ "' -fn '" ++ myFont ++ "'"
--Conky is piped into a secon instance of dzen2. Conky settings are read from .xmonad/conky_bar
myConkyBar = "conky -c '.xmonad/conky_bar' | dzen2 -xs 1 -x '1428' -y '0' -h '18' -w '300' -ta 'l' -fg '" ++ myNormalFGColor ++ "' -bg '" ++ myNormalBGColor ++ "' -fn '" ++ myFont ++ "'"
--Set up trayer in the top right corner
myTrayer = "trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --widthtype pixel --width 192 --transparent true --alpha 0 --tint 0x000000 --heighttype pixel --height 18" |