1 {-# LANGUAGE FlexibleContexts #-}
4 import XMonad.Actions.CycleRecentWS
5 import XMonad.Actions.PhysicalScreens
6 import XMonad.Config.Desktop
7 import XMonad.Hooks.DynamicLog
8 import XMonad.Hooks.EwmhDesktops
9 import XMonad.Hooks.ICCCMFocus
10 import XMonad.Hooks.ManageDocks
11 import XMonad.Hooks.ManageHelpers
12 import XMonad.Hooks.SetWMName
13 import XMonad.Layout.IM
14 import XMonad.Layout.LayoutHints
15 import qualified XMonad.Layout.Magnifier as Mag
16 import XMonad.Layout.Master
17 import XMonad.Layout.NoBorders
18 import XMonad.Layout.NoFrillsDecoration
19 import XMonad.Layout.PerWorkspace
20 import XMonad.Layout.Renamed
21 import XMonad.Layout.Reflect
22 import XMonad.Layout.Tabbed
23 import XMonad.Util.Run(spawnPipe)
24 import qualified Data.Map as M
25 import qualified XMonad.StackSet as W
28 myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
30 ((modm .|. shiftMask, xK_h), spawn "xfce4-session-logout"),
31 ((modm .|. shiftMask, xK_l), spawn "xscreensaver-command --lock"),
32 ((modm .|. shiftMask, xK_r), spawn "xmonad --restart"),
34 ((modm, xK_n), spawn "xfce4-terminal"),
35 ((modm, xK_i), spawn "firefox"),
36 ((modm .|. shiftMask, xK_i), spawn "firefox --private-window"),
37 ((modm, xK_c), spawn "emacsclient --create-frame --no-wait"),
38 ((modm, xK_p), spawn "kupfer"),
40 ((modm .|. shiftMask, xK_c ), kill),
41 ((modm, xK_space ), sendMessage NextLayout),
42 ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf),
43 ((modm, xK_j ), windows W.focusDown),
44 ((modm, xK_k ), windows W.focusUp ),
45 ((modm, xK_m ), windows W.focusMaster ),
46 ((modm, xK_Return), windows W.swapMaster),
47 ((modm .|. shiftMask, xK_j ), windows W.swapDown ),
48 ((modm .|. shiftMask, xK_k ), windows W.swapUp ),
49 ((modm, xK_h ), sendMessage Shrink),
50 ((modm, xK_l ), sendMessage Expand),
51 ((modm, xK_t ), withFocused $ windows . W.sink),
52 ((modm , xK_comma ), sendMessage (IncMasterN 1)),
53 ((modm , xK_period), sendMessage (IncMasterN (-1))),
54 ((modm , xK_b ), sendMessage ToggleStruts),
55 ((modm , xK_z ), sendMessage Mag.Toggle),
56 ((modm , xK_a), cycleRecentWorkspaceOnSingleScreen [xK_Super_L] xK_a xK_a)
60 -- mod-{o,e,u}, Switch to physical/Xinerama screens 1, 2, or 3
61 -- mod-shift-{o,e,u}, Move client to screen 1, 2, or 3
62 [((m .|. modm, key), f sc)
63 | (key, sc) <- zip [xK_o, xK_e, xK_u] [0..]
64 , (f, m) <- [(viewScreen def, 0), (sendToScreen def, shiftMask)]]
67 -- mod-[1..9], Switch to workspace N
68 -- mod-shift-[1..9], Move client to workspace N
69 [((m .|. modm, k), windows $ f i)
70 | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
71 , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]
74 cycleRecentWorkspaceOnSingleScreen = cycleWindowSets options
76 options w = map (W.view `flip` w) (recentTags w)
77 recentTags w = map W.tag $ W.hidden w ++ [W.workspace (W.current w)]
79 avoidMaster = W.modify' $ \c -> case c of
80 W.Stack t [] (r:rs) -> W.Stack t [r] rs
83 isSkipTaskBar = isInProperty "_NET_WM_STATE" "_NET_WM_STATE_SKIP_TASKBAR"
89 (isSkipTaskBar -?> doFloat),
90 (isDialog -?> doFloatAt 0.1 0.1),
91 (isFullscreen -?> doFullFloat),
92 (fmap Just $ doF avoidMaster)
96 myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
100 ppCurrent = xmobarColor "#A01010" "" . wrap "[" "]",
101 ppTitle = xmobarColor "#10A010" ""
105 mapM (\h -> dynamicLogWithPP myPP { ppOutput = hPutStrLn h }) hooks
106 takeTopFocus -- fix for Java Swing apps
109 setWMName "LG3D" -- fix for Java Swing apps
110 spawn "xfce4-panel --restart" -- ensure it appears on top of xmobar
112 goldenRatio = (toRational (2/(1+sqrt(5)::Double)))
114 myTitleTheme = defaultTheme {
115 fontName = "xft:sans-serif:size=10",
119 createLayout name layout =
120 renamed [Replace name] $
125 myFullLayout = createLayout "Full" $
129 myTiledLayout = createLayout "Tall" $
132 Tall nMaster ratioIncrement masterRatio
135 ratioIncrement = 3/100
136 masterRatio = goldenRatio
138 myTabbedLayout = createLayout "Tab" $
140 tabbed shrinkText myTitleTheme
142 myMasterTabbedLayout = createLayout "MTab" $
145 mastered resizeDelta masterRatio $
146 tabbed shrinkText myTitleTheme
149 masterRatio = goldenRatio
151 myGimpLayout = createLayout "Gimp" $
153 withIM (1/6) (Role "gimp-toolbox") $
155 withIM (1/6) (Role "gimp-dock") $
157 tabbed shrinkText myTitleTheme
161 onWorkspace "9" (myTabbedLayout ||| myFullLayout ||| myGimpLayout) $
162 (myTabbedLayout ||| myMasterTabbedLayout ||| myTiledLayout)
166 xmonadDir <- getXMonadDir
167 xmobars <- mapM (\x -> spawnPipe ("xmobar -x " ++ (show x) ++ " " ++ xmonadDir ++ "/xmobar.hs")) [1, 2]
168 xmonad $ desktopConfig {
169 manageHook = myManageHook,
170 layoutHook = myLayout,
171 workspaces = myWorkspaces,
172 logHook = myLogHook xmobars,
173 startupHook = myStartupHook,
176 handleEventHook = handleEventHook desktopConfig <+> fullscreenEventHook,
177 focusFollowsMouse = False