1 {-# LANGUAGE FlexibleContexts #-}
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
27 myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
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"),
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"),
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)
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)]
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)]
73 avoidMaster = W.modify' $ \c -> case c of
74 W.Stack t [] (r:rs) -> W.Stack t [r] rs
77 isSkipTaskBar = isInProperty "_NET_WM_STATE" "_NET_WM_STATE_SKIP_TASKBAR"
83 (isSkipTaskBar -?> doFloat),
84 (isDialog -?> doFloatAt 0.1 0.1),
85 (isFullscreen -?> doFullFloat),
86 ((className =? "Emacs" <&&> resource =? "Ediff") -?> doFloat),
87 (fmap Just $ doF avoidMaster)
91 myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
95 ppCurrent = xmobarColor "#A01010" "" . wrap "[" "]",
96 ppTitle = xmobarColor "#10A010" ""
100 mapM (\h -> dynamicLogWithPP myPP { ppOutput = hPutStrLn h }) hooks
101 takeTopFocus -- fix for Java Swing apps
104 setWMName "LG3D" -- fix for Java Swing apps
105 spawn "xfce4-panel --restart" -- ensure it appears on top of xmobar
107 goldenRatio = (toRational (2/(1+sqrt(5)::Double)))
109 myTitleTheme = defaultTheme {
110 fontName = "xft:sans-serif:size=10",
114 createLayout name layout =
115 renamed [Replace name] $
120 myFullLayout = createLayout "Full" $
124 myTiledLayout = createLayout "Tall" $
127 Tall nMaster ratioIncrement masterRatio
130 ratioIncrement = 3/100
131 masterRatio = goldenRatio
133 myTabbedLayout = createLayout "Tab" $
135 tabbed shrinkText myTitleTheme
137 myThreeColLayout = createLayout "ThreeCol" $
140 ThreeCol numMaster resizeDelta masterRatio
146 myMasterTabbedLayout = createLayout "MTab" $
149 mastered resizeDelta masterRatio $
150 tabbed shrinkText myTitleTheme
153 masterRatio = goldenRatio
155 myGimpLayout = createLayout "Gimp" $
157 withIM (1/6) (Role "gimp-toolbox") $
159 withIM (1/6) (Role "gimp-dock") $
161 tabbed shrinkText myTitleTheme
164 -- This was the easiest way I found to avoid a compile error when I have
166 referenceAllLayoutsToAvoidErrors =
171 myMasterTabbedLayout |||
177 onWorkspace "1" (myTabbedLayout ||| myMasterTabbedLayout) $
178 onWorkspace "2" (myTabbedLayout ||| myMasterTabbedLayout) $
179 onWorkspace "9" (myFullLayout ||| myMasterTabbedLayout ||| myTabbedLayout ||| myTiledLayout ||| myGimpLayout) $
180 (myMasterTabbedLayout ||| myTabbedLayout ||| myTiledLayout)
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,
194 handleEventHook = handleEventHook defaultConfig <+> fullscreenEventHook,
195 focusFollowsMouse = False