]> code.delx.au - dotfiles/blob - .xmonad/xmonad.hs
xmonad: emacs ediff should float
[dotfiles] / .xmonad / xmonad.hs
1 {-# LANGUAGE FlexibleContexts #-}
2 import System.IO
3 import XMonad
4 import XMonad.Actions.PhysicalScreens
5 import XMonad.Hooks.DynamicLog
6 import XMonad.Hooks.EwmhDesktops
7 import XMonad.Hooks.ICCCMFocus
8 import XMonad.Hooks.ManageDocks
9 import XMonad.Hooks.ManageHelpers
10 import XMonad.Hooks.SetWMName
11 import XMonad.Layout.IM
12 import XMonad.Layout.LayoutHints
13 import qualified XMonad.Layout.Magnifier as Mag
14 import XMonad.Layout.Master
15 import XMonad.Layout.NoBorders
16 import XMonad.Layout.NoFrillsDecoration
17 import XMonad.Layout.PerWorkspace
18 import XMonad.Layout.Renamed
19 import XMonad.Layout.Reflect
20 import XMonad.Layout.Tabbed
21 import XMonad.Layout.ThreeColumns
22 import XMonad.Util.Run(spawnPipe)
23 import qualified Data.Map as M
24 import qualified XMonad.StackSet as W
25
26
27 myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
28 [
29 ((modm .|. shiftMask, xK_h), spawn "xfce4-session-logout"),
30 ((modm .|. shiftMask, xK_l), spawn "xscreensaver-command --lock"),
31 ((modm, xK_f), spawn "xmonad --restart"),
32
33 ((modm, xK_n), spawn "xfce4-terminal"),
34 ((modm, xK_i), spawn "firefox"),
35 ((modm, xK_c), spawn "emacsclient --create-frame --no-wait"),
36 ((modm, xK_p), spawn "kupfer"),
37
38 ((modm .|. shiftMask, xK_c ), kill),
39 ((modm, xK_space ), sendMessage NextLayout),
40 ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf),
41 ((modm, xK_j ), windows W.focusDown),
42 ((modm, xK_k ), windows W.focusUp ),
43 ((modm, xK_m ), windows W.focusMaster ),
44 ((modm, xK_Return), windows W.swapMaster),
45 ((modm .|. shiftMask, xK_j ), windows W.swapDown ),
46 ((modm .|. shiftMask, xK_k ), windows W.swapUp ),
47 ((modm, xK_h ), sendMessage Shrink),
48 ((modm, xK_l ), sendMessage Expand),
49 ((modm, xK_t ), withFocused $ windows . W.sink),
50 ((modm , xK_comma ), sendMessage (IncMasterN 1)),
51 ((modm , xK_period), sendMessage (IncMasterN (-1))),
52 ((modm , xK_b ), sendMessage ToggleStruts),
53 ((modm , xK_z ), sendMessage Mag.Toggle)
54 ]
55 ++
56
57 -- mod-{o,e,u}, Switch to physical/Xinerama screens 1, 2, or 3
58 -- mod-shift-{o,e,u}, Move client to screen 1, 2, or 3
59 [((m .|. modm, key), f sc)
60 | (key, sc) <- zip [xK_o, xK_e, xK_u] [0..]
61 , (f, m) <- [(viewScreen, 0), (sendToScreen, shiftMask)]
62 ]
63 ++
64
65 -- mod-[1..9], Switch to workspace N
66 -- mod-shift-[1..9], Move client to workspace N
67 [((m .|. modm, k), windows $ f i)
68 | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
69 , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]
70 ]
71
72
73 avoidMaster = W.modify' $ \c -> case c of
74 W.Stack t [] (r:rs) -> W.Stack t [r] rs
75 otherwise -> c
76
77 isSkipTaskBar = isInProperty "_NET_WM_STATE" "_NET_WM_STATE_SKIP_TASKBAR"
78
79 myManageHook =
80 manageDocks <+>
81 composeOne [
82 transience,
83 (isSkipTaskBar -?> doFloat),
84 (isDialog -?> doFloatAt 0.1 0.1),
85 (isFullscreen -?> doFullFloat),
86 ((className =? "Emacs" <&&> resource =? "Ediff") -?> doFloat),
87 (fmap Just $ doF avoidMaster)
88 ]
89
90
91 myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
92
93 myPP = xmobarPP
94 {
95 ppCurrent = xmobarColor "#A01010" "" . wrap "[" "]",
96 ppTitle = xmobarColor "#10A010" ""
97 }
98
99 myLogHook hooks = do
100 mapM (\h -> dynamicLogWithPP myPP { ppOutput = hPutStrLn h }) hooks
101 takeTopFocus -- fix for Java Swing apps
102
103 myStartupHook = do
104 setWMName "LG3D" -- fix for Java Swing apps
105 spawn "xfce4-panel --restart" -- ensure it appears on top of xmobar
106
107 goldenRatio = (toRational (2/(1+sqrt(5)::Double)))
108
109 myTitleTheme = defaultTheme {
110 fontName = "xft:sans-serif:size=10",
111 decoHeight = 24
112 }
113
114 createLayout name layout =
115 renamed [Replace name] $
116 layoutHints $
117 smartBorders $
118 layout
119
120 myFullLayout = createLayout "Full" $
121 noBorders $
122 Full
123
124 myTiledLayout = createLayout "Tall" $
125 avoidStruts $
126 Mag.magnifierOff $
127 Tall nMaster ratioIncrement masterRatio
128 where
129 nMaster = 1
130 ratioIncrement = 3/100
131 masterRatio = goldenRatio
132
133 myTabbedLayout = createLayout "Tab" $
134 avoidStruts $
135 tabbed shrinkText myTitleTheme
136
137 myThreeColLayout = createLayout "ThreeCol" $
138 avoidStruts $
139 Mag.magnifierOff $
140 ThreeCol numMaster resizeDelta masterRatio
141 where
142 resizeDelta = 3/100
143 masterRatio = 4/10
144 numMaster = 1
145
146 myMasterTabbedLayout = createLayout "MTab" $
147 avoidStruts $
148 Mag.magnifierOff $
149 mastered resizeDelta masterRatio $
150 tabbed shrinkText myTitleTheme
151 where
152 resizeDelta = 3/100
153 masterRatio = goldenRatio
154
155 myGimpLayout = createLayout "Gimp" $
156 avoidStruts $
157 withIM (1/6) (Role "gimp-toolbox") $
158 reflectHoriz $
159 withIM (1/6) (Role "gimp-dock") $
160 reflectHoriz $
161 tabbed shrinkText myTitleTheme
162
163
164 -- This was the easiest way I found to avoid a compile error when I have
165 -- an unused layout
166 referenceAllLayoutsToAvoidErrors =
167 myFullLayout |||
168 myTiledLayout |||
169 myTabbedLayout |||
170 myThreeColLayout |||
171 myMasterTabbedLayout |||
172 myGimpLayout
173
174
175 myLayout =
176 (
177 onWorkspace "1" (myTabbedLayout ||| myMasterTabbedLayout) $
178 onWorkspace "2" (myTabbedLayout ||| myMasterTabbedLayout) $
179 onWorkspace "9" (myFullLayout ||| myMasterTabbedLayout ||| myTabbedLayout ||| myTiledLayout ||| myGimpLayout) $
180 (myMasterTabbedLayout ||| myTabbedLayout ||| myTiledLayout)
181 )
182
183 main = do
184 xmonadDir <- getXMonadDir
185 xmobars <- mapM (\x -> spawnPipe ("xmobar -x " ++ (show x) ++ " " ++ xmonadDir ++ "/xmobar.hs")) [1, 2]
186 xmonad $ ewmh defaultConfig {
187 manageHook = myManageHook,
188 layoutHook = myLayout,
189 workspaces = myWorkspaces,
190 logHook = myLogHook xmobars,
191 startupHook = myStartupHook,
192 keys = myKeys,
193 modMask = mod4Mask,
194 handleEventHook = handleEventHook defaultConfig <+> fullscreenEventHook,
195 focusFollowsMouse = False
196 }
197