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"),
32 ((modm, xK_n), spawn "xfce4-terminal"),
33 ((modm, xK_i), spawn "firefox"),
34 ((modm, xK_p), spawn "kupfer"),
36 ((modm .|. shiftMask, xK_c ), kill),
37 ((modm, xK_space ), sendMessage NextLayout),
38 ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf),
39 ((modm, xK_j ), windows W.focusDown),
40 ((modm, xK_k ), windows W.focusUp ),
41 ((modm, xK_m ), windows W.focusMaster ),
42 ((modm, xK_Return), windows W.swapMaster),
43 ((modm .|. shiftMask, xK_j ), windows W.swapDown ),
44 ((modm .|. shiftMask, xK_k ), windows W.swapUp ),
45 ((modm, xK_h ), sendMessage Shrink),
46 ((modm, xK_l ), sendMessage Expand),
47 ((modm, xK_t ), withFocused $ windows . W.sink),
48 ((modm , xK_comma ), sendMessage (IncMasterN 1)),
49 ((modm , xK_period), sendMessage (IncMasterN (-1))),
50 ((modm , xK_b ), sendMessage ToggleStruts),
51 ((modm , xK_z ), sendMessage Mag.Toggle)
55 -- mod-{o,e,u}, Switch to physical/Xinerama screens 1, 2, or 3
56 -- mod-shift-{o,e,u}, Move client to screen 1, 2, or 3
57 [((m .|. modm, key), f sc)
58 | (key, sc) <- zip [xK_o, xK_e, xK_u] [0..]
59 , (f, m) <- [(viewScreen, 0), (sendToScreen, shiftMask)]
63 -- mod-[1..9], Switch to workspace N
64 -- mod-shift-[1..9], Move client to workspace N
65 [((m .|. modm, k), windows $ f i)
66 | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
67 , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]
71 avoidMaster = W.modify' $ \c -> case c of
72 W.Stack t [] (r:rs) -> W.Stack t [r] rs
75 isSkipTaskBar = isInProperty "_NET_WM_STATE" "_NET_WM_STATE_SKIP_TASKBAR"
81 (isSkipTaskBar -?> doFloat),
82 (isDialog -?> doFloatAt 0.1 0.1),
83 (isFullscreen -?> doFullFloat),
84 (fmap Just $ doF avoidMaster)
88 myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
92 ppCurrent = xmobarColor "#A01010" "" . wrap "[" "]",
93 ppTitle = xmobarColor "#10A010" ""
97 mapM (\h -> dynamicLogWithPP myPP { ppOutput = hPutStrLn h }) hooks
98 takeTopFocus -- fix for Java Swing apps
101 setWMName "LG3D" -- fix for Java Swing apps
104 goldenRatio = (toRational (2/(1+sqrt(5)::Double)))
106 myTitleTheme = defaultTheme {
107 fontName = "xft:sans-serif:size=10",
111 createLayout name layout =
112 renamed [Replace name] $
117 myFullLayout = createLayout "Full" $
121 myTiledLayout = createLayout "Tall" $
124 Tall nMaster ratioIncrement masterRatio
127 ratioIncrement = 3/100
128 masterRatio = goldenRatio
130 myTabbedLayout = createLayout "Tab" $
132 tabbed shrinkText myTitleTheme
134 myThreeColLayout = createLayout "ThreeCol" $
137 ThreeCol numMaster resizeDelta masterRatio
143 myMasterTabbedLayout = createLayout "MTab" $
146 mastered resizeDelta masterRatio $
147 tabbed shrinkText myTitleTheme
150 masterRatio = goldenRatio
152 myGimpLayout = createLayout "Gimp" $
154 withIM (1/6) (Role "gimp-toolbox") $
156 withIM (1/6) (Role "gimp-dock") $
158 tabbed shrinkText myTitleTheme
161 -- This was the easiest way I found to avoid a compile error when I have
163 referenceAllLayoutsToAvoidErrors =
168 myMasterTabbedLayout |||
174 onWorkspace "1" (myTabbedLayout ||| myMasterTabbedLayout) $
175 onWorkspace "2" (myTabbedLayout ||| myMasterTabbedLayout) $
176 onWorkspace "9" (myFullLayout ||| myMasterTabbedLayout ||| myTabbedLayout ||| myTiledLayout ||| myGimpLayout) $
177 (myMasterTabbedLayout ||| myTabbedLayout ||| myTiledLayout)
181 xmonadDir <- getXMonadDir
182 xmobars <- mapM (\x -> spawnPipe ("xmobar -x " ++ (show x) ++ " " ++ xmonadDir ++ "/xmobar.hs")) [1, 2]
183 xmonad $ ewmh defaultConfig {
184 manageHook = myManageHook,
185 layoutHook = myLayout,
186 workspaces = myWorkspaces,
187 logHook = myLogHook xmobars,
188 startupHook = myStartupHook,
191 handleEventHook = handleEventHook defaultConfig <+> fullscreenEventHook,
192 focusFollowsMouse = False