-import XMonad hiding ( (|||) )
+import System.IO
+import XMonad
import XMonad.Hooks.DynamicLog
+import XMonad.Hooks.EwmhDesktops
+import XMonad.Hooks.ICCCMFocus
import XMonad.Hooks.ManageDocks
-import XMonad.Util.Run(spawnPipe)
-import XMonad.Util.EZConfig(additionalKeysP)
-
+import XMonad.Hooks.Script
+import XMonad.Hooks.SetWMName
import XMonad.Layout.IM
-import XMonad.Layout.LayoutCombinators
import XMonad.Layout.LayoutHints
-import XMonad.Layout.Renamed
+import qualified XMonad.Layout.Magnifier as Mag
+import XMonad.Hooks.ManageHelpers
import XMonad.Layout.NoBorders
+import XMonad.Layout.NoFrillsDecoration
import XMonad.Layout.PerWorkspace
+import XMonad.Layout.Renamed
import XMonad.Layout.Tabbed
+import XMonad.Layout.ThreeColumns
+import XMonad.Layout.TwoPane
+import XMonad.Util.Run(spawnPipe)
+import qualified Data.Map as M
+import qualified XMonad.StackSet as W
-import System.IO
-myKeys =
+myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
[
- ("C-S-l", spawn "gnome-screensaver-command --lock"),
- ("M-S-q", spawn "gnome-session-quit"),
- ("M-S-h", spawn "gnome-session-quit --power-off"),
- ("M-p", spawn "dmenu_run"),
- ("M-i", spawn "firefox")
+ ((modm .|. shiftMask, xK_q), spawn "gnome-session-quit"),
+ ((modm .|. shiftMask, xK_h), spawn "gnome-session-quit --power-off"),
+-- ((modm .|. shiftMask, xK_q), spawn "gnome-session-save --logout-dialog"),
+-- ((modm .|. shiftMask, xK_h), spawn "gnome-session-save --shutdown-dialog"),
+ ((modm .|. shiftMask, xK_l), spawn "gnome-screensaver-command --lock"),
+
+ ((modm, xK_n), spawn "gnome-terminal"),
+ ((modm, xK_i), spawn "firefox"),
+
+ ((modm .|. shiftMask, xK_c ), kill),
+ ((modm, xK_space ), sendMessage NextLayout),
+ ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf),
+ ((modm, xK_Tab ), windows W.focusDown),
+ ((modm, xK_j ), windows W.focusDown),
+ ((modm, xK_k ), windows W.focusUp ),
+ ((modm, xK_m ), windows W.focusMaster ),
+ ((modm, xK_Return), windows W.swapMaster),
+ ((modm .|. shiftMask, xK_j ), windows W.swapDown ),
+ ((modm .|. shiftMask, xK_k ), windows W.swapUp ),
+ ((modm, xK_h ), sendMessage Shrink),
+ ((modm, xK_l ), sendMessage Expand),
+ ((modm, xK_t ), withFocused $ windows . W.sink),
+ ((modm , xK_comma ), sendMessage (IncMasterN 1)),
+ ((modm , xK_period), sendMessage (IncMasterN (-1))),
+ ((modm , xK_b ), sendMessage ToggleStruts),
+ ((modm , xK_z ), sendMessage Mag.Toggle)
+ ]
+ ++
+
+ -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3
+ -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3
+ [((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
+ | (key, sc) <- zip [xK_o, xK_e, xK_u] [0..]
+ , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]
+ ]
+ ++
+
+ -- mod-[1..9], Switch to workspace N
+ -- mod-shift-[1..9], Move client to workspace N
+ [((m .|. modm, k), windows $ f i)
+ | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
+ , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]
]
-myXMobarStatus = "xmobar /home/jamesbunton/.xmonad/xmobar.hs"
+
myManageHook = composeAll [
(className =? "Gnome-fallback-mount-helper" <&&> resource =? "gnome-fallback-mount-helper") --> doFloat,
+ (className =? "Gdu-notification-daemon" <&&> resource =? "gdu-notification-daemon") --> doFloat,
(className =? "Firefox" <&&> resource =? "Dialog") --> doFloat,
+ (className =? "Screenruler" <&&> resource =? "screenruler") --> doFloat,
+ (className =? "Plugin-container" <&&> resource =? "plugin-container") --> doFullFloat,
manageDocks
]
myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
-myLogHook xmobar = dynamicLogWithPP xmobarPP
+myPP = xmobarPP
{
- ppOutput = hPutStrLn xmobar,
- ppTitle = xmobarColor "green" "" . shorten 50
+ ppTitle = xmobarColor "green" ""
}
+myLogHook h1 =
+ dynamicLogWithPP myPP { ppOutput = hPutStrLn h1 } >>
+ takeTopFocus -- fix for Java Swing apps
+
+myStartupHook =
+ setWMName "LG3D" -- fix for Java Swing apps
+
goldenRatio = (toRational (2/(1+sqrt(5)::Double)))
-myFullLayout = Full
-myTiledLayout = Tall nMaster ratioIncrement ratio where
- nMaster = 1
- ratioIncrement = 3/100
- ratio = goldenRatio
-myMirrorTiledLayout = Mirror myTiledLayout
-myTabbedLayout = simpleTabbed
-myImLayout = IM ratio roster where
- ratio = 1/4
- roster = (Or (Title "Buddy List") (And (Resource "main") (ClassName "psi")))
-
-myLayouts = renamed [CutWordsLeft 1] $ avoidStruts $ layoutHints $ smartBorders $
+createLayout name layout =
+ renamed [Replace name] $
+ layoutHints $
+ smartBorders $
+ layout
+
+myFullLayout = createLayout "Full" $
+ Full
+
+myTiledLayout = createLayout "Tall" $
+ avoidStruts $
+ Mag.magnifierOff $
+ Tall nMaster ratioIncrement masterRatio
+ where
+ nMaster = 1
+ ratioIncrement = 3/100
+ masterRatio = goldenRatio
+
+myTabbedLayout = createLayout "Tab" $
+ avoidStruts $
+ simpleTabbed
+
+myThreeColLayout = createLayout "ThreeCol" $
+ avoidStruts $
+ Mag.magnifierOff $
+ ThreeCol numMaster resizeDelta masterRatio
+ where
+ resizeDelta = 3/100
+ masterRatio = 4/10
+ numMaster = 1
+
+myTwoPaneLayout = createLayout "TwoPane" $
+ avoidStruts $
+ Mag.magnifierOff $
+ TwoPane resizeDelta masterRatio
+ where
+ resizeDelta = 3/100
+ masterRatio = goldenRatio
+
+myImLayout = createLayout "IM" $
+ avoidStruts $
+ noFrillsDeco shrinkText defaultTheme $
+ withIM rosterRatio roster $
+ myTiledLayout
+--- myThreeColLayout -- use this on wider screens
+ where
+ rosterRatio = 1/8
+ roster = (Or (Title "Buddy List") (And (Resource "main") (ClassName "psi")))
+
+-- This was the easiest way I found to avoid a compile error when I have
+-- an unused layout
+referenceAllLayoutsToAvoidErrors =
+ myFullLayout |||
+ myTiledLayout |||
+ myTabbedLayout |||
+ myThreeColLayout |||
+ myTwoPaneLayout |||
+ myImLayout
+
+
+myLayout =
(
onWorkspace "1" (myImLayout) $
- onWorkspace "2" (myTabbedLayout) $
- (myTiledLayout ||| myFullLayout ||| myTabbedLayout ||| myMirrorTiledLayout)
+ onWorkspace "2" (myTabbedLayout ||| myFullLayout) $
+ (myTiledLayout ||| myTabbedLayout)
)
main = do
- xmobar <- spawnPipe myXMobarStatus
- xmonad $ defaultConfig {
- manageHook = manageDocks <+> myManageHook <+> manageHook defaultConfig,
- layoutHook = myLayouts,
+ xmonadDir <- getXMonadDir
+ xmobar <- spawnPipe ("xmobar " ++ xmonadDir ++ "/xmobar.hs")
+ xmonad $ ewmh defaultConfig {
+ manageHook = myManageHook <+> manageHook defaultConfig,
+ layoutHook = myLayout,
workspaces = myWorkspaces,
- logHook = myLogHook xmobar
- } `additionalKeysP` myKeys
+ logHook = myLogHook xmobar,
+ startupHook = myStartupHook,
+ keys = myKeys
+ }