Difference between revisions of "Xmonad/Config archive/oxymor00n's xmonad.hs"

From HaskellWiki
Jump to navigation Jump to search
(update to current version)
m
 
(4 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
Some of the other scripts I use can be found [http://sec.modprobe.de/hg/?file/ here] (outdated at the moment).
 
Some of the other scripts I use can be found [http://sec.modprobe.de/hg/?file/ here] (outdated at the moment).
 
 
<haskell>
 
<haskell>
  +
-- -*- haskell -*-
  +
import Control.Monad (liftM)
 
import XMonad
 
import XMonad
import System.Exit
 
 
import XMonad.Core
 
import XMonad.Core
  +
import System.Exit
 
import qualified XMonad.StackSet as W
 
import qualified XMonad.StackSet as W
 
import qualified Data.Map as M
 
import qualified Data.Map as M
 
import XMonad.Layout.Tabbed
 
import XMonad.Layout.Tabbed
 
import XMonad.Layout.ResizableTile
 
import XMonad.Layout.ResizableTile
import XMonad.Hooks.DynamicLog
+
import XMonad.Layout.Grid
  +
import XMonad.Layout.Magnifier
  +
import XMonad.Layout.TabBarDecoration
  +
import XMonad.Hooks.DynamicLog hiding (shorten)
 
import XMonad.Actions.CycleWS
 
import XMonad.Actions.CycleWS
import XMonad.Actions.Submap
 
import XMonad.Actions.WindowBringer
 
 
import XMonad.Hooks.ManageDocks
 
import XMonad.Hooks.ManageDocks
  +
import XMonad.Hooks.EwmhDesktops
 
import XMonad.Actions.DwmPromote
 
import XMonad.Actions.DwmPromote
import XMonad.Layout.WindowNavigation
+
import XMonad.Actions.UpdatePointer
 
import XMonad.Hooks.UrgencyHook
 
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.ToggleLayouts
 
import XMonad.Layout.Grid
 
 
import XMonad.Util.Run (spawnPipe)
 
import XMonad.Util.Run (spawnPipe)
import System.IO (Handle, hPutStrLn)
+
import System.IO
import Monad
 
 
import XMonad.Prompt
 
import XMonad.Prompt
 
import XMonad.Prompt.Shell
 
import XMonad.Prompt.Shell
import XMonad.Prompt.Window
 
import XMonad.Layout.SimpleFloat
 
import XMonad.Layout.Decoration
 
import XMonad.Layout.Simplest
 
 
import XMonad.Util.WorkspaceCompare
 
import XMonad.Util.WorkspaceCompare
import XMonad.Prompt.Theme
+
import XMonad.Util.EZConfig
import XMonad.Layout.WindowArranger
+
import XMonad.Actions.Warp
import XMonad.Actions.MouseResize
+
import Data.Ratio
   
 
myTerminal = "urxvt"
 
myTerminal = "urxvt"
  +
myScreenLock = "/usr/bin/gnome-screensaver-command -l"
 
myBorderWidth = 1
 
myBorderWidth = 1
 
myModMask = mod4Mask
 
myModMask = mod4Mask
 
myNumlockMask = mod2Mask
 
myNumlockMask = mod2Mask
myWorkspaces = ["1:web", "2:emacs" ,"3:gnus", "4:music", "5:shells"] ++ map show [6 .. 9 :: Int]
+
myWorkspaces = ["α", "β" ,"γ", "δ", "ε", "ζ", "η", "θ", "ι"]
 
myNormalBorderColor = "#111"
 
myNormalBorderColor = "#111"
myFocusedBorderColor = "aquamarine3"
+
myFocusedBorderColor = "cadetblue3"
myDefaultGaps = [(0,0,0,0),(0,20,0,0)]
 
   
myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
+
myKeys = \conf -> mkKeymap conf $
-- launch a terminal
+
[ ("M-S-<Return>", spawn $ XMonad.terminal conf)
[ ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
+
, ("C-S-<Esc>", spawn $ myScreenLock)
  +
, ("M-C-<Esc>", spawn $ "xkill")
-- close focused window
 
  +
, ("M-<Space>", sendMessage NextLayout)
, ((modMask .|. shiftMask, xK_c ), kill)
 
  +
, ("M-S-<Space>", setLayout $ XMonad.layoutHook conf)
-- Rotate through the available layout algorithms
 
, ((modMask, xK_space ), sendMessage NextLayout)
+
, ("M-n", refresh)
  +
, ("M-S-c", kill)
-- Reset the layouts on the current workspace to default
 
  +
, ("M-<Tab>", windows W.focusDown)
, ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
 
  +
, ("M-j", windows W.focusDown)
-- Resize viewed windows to the correct size
 
, ((modMask, xK_n ), refresh)
+
, ("M-S-<Tab>", windows W.focusUp)
  +
, ("M-k", windows W.focusUp)
-- Move focus to the next window
 
, ((modMask, xK_Tab ), windows W.focusDown)
+
, ("M-m", windows W.focusMaster)
, ((modMask, xK_j ), windows W.focusDown)
+
, ("M-S-k", windows W.swapDown)
  +
, ("M-S-j", windows W.swapUp)
-- Move focus to the previous window
 
  +
, ("M-b", sendMessage ToggleStruts)
, ((modMask .|. shiftMask, xK_Tab ), windows W.focusUp )
 
, ((modMask, xK_k ), windows W.focusUp )
+
, ("M-h", sendMessage Shrink)
  +
, ("M-l", sendMessage Expand)
-- Move focus to the master window
 
, ((modMask, xK_m ), windows W.focusMaster )
+
, ("M-t", withFocused $ windows . W.sink)
  +
, ("M-,", sendMessage (IncMasterN 1))
-- Swap the focused window with the next window
 
  +
, ("M-.", sendMessage (IncMasterN (-1)))
, ((modMask .|. shiftMask, xK_j ), windows W.swapDown )
 
  +
, ("M-S-q", io (exitWith ExitSuccess))
-- Swap the focused window with the previous window
 
, ((modMask .|. shiftMask, xK_k ), windows W.swapUp )
+
, ("M-q", restart "xmonad" True)
  +
, ("M-p", shellPrompt oxyXPConfig)
-- Shrink the master area
 
, ((modMask, xK_h ), sendMessage Shrink)
+
, ("M-o", shellPrompt oxyXPConfig)
  +
, ("M-S-<Right>", shiftToNext >> nextWS)
-- Expand the master area
 
, ((modMask, xK_l ), sendMessage Expand)
+
, ("M-S-<Left>", shiftToPrev >> prevWS)
  +
, ("M-<Down>", nextScreen)
-- Push window back into tiling
 
, ((modMask, xK_t ), withFocused $ windows . W.sink)
+
, ("M-S-<Down>", shiftNextScreen >> nextScreen)
  +
, ("M-<Left>", prevNonEmptyWS )
-- Increment the number of windows in the master area
 
, ((modMask , xK_comma ), sendMessage (IncMasterN 1))
+
, ("M-C-k", prevNonEmptyWS )
  +
, ("M-<Right>", nextNonEmptyWS )
-- Deincrement the number of windows in the master area
 
, ((modMask , xK_period), sendMessage (IncMasterN (-1)))
+
, ("M-C-j", nextNonEmptyWS )
  +
, ("M-s", swapNextScreen)
-- Quit xmonad
 
, ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
+
, ("M-<Up>", swapNextScreen)
  +
, ("M-a", sendMessage MirrorShrink)
-- Restart xmonad
 
, ((modMask , xK_q ), restart "xmonad" True)]
+
, ("M-y", sendMessage MirrorExpand)
  +
, ("M-<Return>", dwmpromote)
++
 
  +
, ("M-x M-c", kill)
-- mod-[1..9], Switch to workspace N
 
  +
, ("M-x c", kill)
-- mod-shift-[1..9], Move client to workspace N
 
[((m .|. modMask, k), windows $ f i)
+
, ("M-x M-x", nextScreen)
| (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
+
, ("M-u M-x M-x", swapNextScreen)
, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
+
, ("M-x e", spawn "emacsclient -c -s emacs")
  +
, ("M-x s", spawn "swiftfox")
++
 
  +
, ("M-x t", spawn "tvbrowser")
-- shell prompt
 
  +
, ("M-x d", spawn "deluge")
[ ((modMask , xK_p), shellPrompt oxyXPConfig)
 
  +
, ("M-x <Return>", spawn $ XMonad.terminal conf)
, ((modMask , xK_o), shellPrompt oxyXPConfig)
 
  +
, ("M-w", sendMessage MagnifyMore)
-- move window to next workspace and follow
 
  +
, ("M-e", sendMessage MagnifyLess)
, ((modMask .|. shiftMask, xK_Right), shiftToNext >> nextWS)
 
  +
, ("M-<", warpToWindow (1%10) (1%10)) -- Move pointer to currently focused window
-- move window to previous workspace and follow
 
  +
]
, ((modMask .|. shiftMask, xK_Left), shiftToPrev >> prevWS)
 
  +
++
-- switch focus between physical screens...
 
, ((modMask, xK_Down), nextScreen)
+
[ (m ++ i, windows $ f j)
  +
| (i, j) <- zip (map show [1..9]) (XMonad.workspaces conf)
-- ...and take the window with it
 
  +
, (m, f) <- [("M-", W.view), ("M-S-", W.shift)]
, ((modMask .|. shiftMask, xK_Down), shiftNextScreen >> nextScreen)
 
-- previous workspace
+
]
  +
where
, ((modMask, xK_Left), moveTo Prev (WSIs (liftM (not .) isVisible)) )
 
, ((modMask .|. controlMask, xK_k), moveTo Prev (WSIs (liftM (not .) isVisible)) )
+
nextNonEmptyWS = moveTo Next (WSIs (liftM (not .) isVisible))
  +
prevNonEmptyWS = moveTo Prev (WSIs (liftM (not .) isVisible))
-- next workspace
 
  +
, ((modMask, xK_Right), moveTo Next (WSIs (liftM (not .) isVisible)) )
 
  +
isVisible :: X (WindowSpace -> Bool)
, ((modMask .|. controlMask, xK_j), moveTo Next (WSIs (liftM (not .) isVisible)) )
 
  +
isVisible = do
-- swap screens
 
  +
vs <- gets (map (W.tag . W.workspace) . W.visible . windowset)
, ((modMask, xK_s), swapNextScreen)
 
  +
return (\w -> (W.tag w) `elem` vs)
, ((modMask, xK_Up), swapNextScreen)
 
-- resize tiled windows vertically
 
, ((modMask, xK_a), sendMessage MirrorShrink)
 
, ((modMask, xK_y), sendMessage MirrorExpand)
 
-- toggle struts
 
, ((modMask .|. shiftMask, xK_b), sendMessage ToggleStruts)
 
, ((modMask , xK_b), modifyGap (\i n -> let x = (XMonad.defaultGaps conf ++ repeat (0,0,0,0)) !! i in if n == x then (0,0,0,0) else x))
 
-- brings the currently focused window to the master area
 
, ((modMask, xK_Return), dwmpromote)
 
, ((modMask .|. controlMask, xK_t), themePrompt oxyXPConfig)
 
, ((modMask .|. controlMask, xK_space), (sendMessage (Toggle "Full")) >> sendMessage (Toggle "Grid"))]
 
++
 
-- custom emacs-style keybindings
 
-- mostly for launching applications
 
[((modMask, xK_x), submap . M.fromList $
 
[ ((0, xK_e), spawn "emacsclient -s emacs -c -d $DISPLAY")
 
, ((0, xK_f), spawn "firefox")
 
, ((0, xK_Return), spawn "urxvt")
 
, ((0, xK_t), spawn "~/bin/tvbrowser")
 
-- mod-x mod-c and mod-x c close a window
 
, ((0, xK_c), kill)
 
, ((modMask, xK_c), kill)
 
-- mod-x mod-x cycles focus between screens
 
, ((modMask, xK_x), nextScreen)
 
-- window bringer emacs-style bindings
 
, ((0, xK_b), windowPromptGoto oxyXPConfig)
 
, ((shiftMask, xK_b) , windowPromptBring oxyXPConfig)
 
])]
 
++
 
-- hm. is this useful?
 
-- anyway, these are basically the same bindings as wind-move in emacs
 
[ ((modMask .|. controlMask, xK_Right), sendMessage $ Go R)
 
, ((modMask .|. controlMask, xK_Left ), sendMessage $ Go L)
 
, ((modMask .|. controlMask, xK_Up ), sendMessage $ Go U)
 
, ((modMask .|. controlMask, xK_Down ), sendMessage $ Go D)]
 
   
 
-- Config for Prompt
 
-- Config for Prompt
 
oxyXPConfig :: XPConfig
 
oxyXPConfig :: XPConfig
oxyXPConfig = defaultXPConfig { font = "-xos4-terminus-*-*-*-*-12-*-*-*-*-*-*-*"
+
oxyXPConfig = defaultXPConfig { font = "xft:Consolas-12"
, bgColor = "#000"
+
, bgColor = "Aquamarine3"
, fgColor = "Aquamarine2"
+
, fgColor = "black"
, fgHLight = "#000000"
+
, fgHLight = "black"
, bgHLight = "Aquamarine2"
+
, bgHLight = "darkslategray4"
, borderColor = "aquamarine2"
+
, borderColor = "black"
 
, promptBorderWidth = 1
 
, promptBorderWidth = 1
 
, position = Top
 
, position = Top
, height = 18
+
, height = 24
-- , historySize = 256
 
 
, defaultText = []
 
, defaultText = []
 
}
 
}
Line 168: Line 129:
 
, ((modMask, button5), (\_ -> windows W.focusDown))
 
, ((modMask, button5), (\_ -> windows W.focusDown))
 
-- cycle through workspaces
 
-- cycle through workspaces
, ((controlMask .|. modMask, button5), (\_ -> moveTo Next (WSIs (liftM (not .) isVisible))))
+
, ((controlMask .|. modMask, button5), nextNonEmptyWS)
, ((controlMask .|. modMask, button4), (\_ -> moveTo Prev (WSIs (liftM (not .) isVisible))))
+
, ((controlMask .|. modMask, button4), prevNonEmptyWS)
 
]
 
]
  +
where
  +
nextNonEmptyWS = \_ -> moveTo Next (WSIs (liftM (not .) isVisible))
  +
prevNonEmptyWS = \_ -> moveTo Prev (WSIs (liftM (not .) isVisible))
   
myLayout = avoidStruts $ windowNavigation $
+
myLayout = avoidStrutsOn[U] $ tabs
toggleLayouts Full tiled
+
||| tiled
||| toggleLayouts Full (Mirror tiled)
+
||| Mirror tiled
||| toggleLayouts Grid tabs
+
||| magnify Grid
||| floating
 
 
 
where
 
where
 
-- default tiling algorithm partitions the screen into two panes
 
-- default tiling algorithm partitions the screen into two panes
Line 184: Line 146:
 
nmaster = 1
 
nmaster = 1
 
-- Default proportion of screen occupied by master pane
 
-- Default proportion of screen occupied by master pane
ratio = 3/5
+
ratio = 8 % 13
 
-- Percent of screen to increment by when resizing panes
 
-- Percent of screen to increment by when resizing panes
delta = 3/100
+
delta = 3 % 100
 
-- tabbed layout
 
-- tabbed layout
tabs = decoration shrinkText oxyTheme Tabbed Simplest
+
tabs = tabbed shrinkText oxyDarkTheme
-- floating layout with mouse resize
+
-- magnification in grid
  +
magnify = magnifiercz (13%10)
floating = simpleFloat' shrinkText oxyTheme
 
 
   
 
-- Configuration for Tabbed
 
-- Configuration for Tabbed
 
oxyTheme :: Theme
 
oxyTheme :: Theme
 
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
 
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
, activeBorderColor = "aquamarine3"
+
, activeBorderColor = myFocusedBorderColor
 
, activeColor = "aquamarine3"
 
, activeColor = "aquamarine3"
 
, inactiveColor = "DarkSlateGray4"
 
, inactiveColor = "DarkSlateGray4"
 
, inactiveTextColor = "#222"
 
, inactiveTextColor = "#222"
 
, activeTextColor = "#222"
 
, activeTextColor = "#222"
, fontName = "xft:Corbel-10"
+
, fontName = "xft:Consolas-10:bold"
-- This font can be found in the package ttf-alee
+
, decoHeight = 18
-- on debian-systems
 
-- , fontName = "-*-Bandal-*-*-*-*-12-*-*-*-*-*-*-*"
 
, decoHeight = 16
 
 
, urgentColor = "#000"
 
, urgentColor = "#000"
 
, urgentTextColor = "#63b8ff"
 
, urgentTextColor = "#63b8ff"
  +
}
  +
  +
oxyDarkTheme :: Theme
  +
oxyDarkTheme = defaultTheme { inactiveBorderColor = "#777"
  +
, activeBorderColor = myFocusedBorderColor
  +
, activeColor = "#000"
  +
, inactiveColor = "#444"
  +
, inactiveTextColor = "aquamarine4"
  +
, activeTextColor = "aquamarine1"
  +
, fontName = "xft:Dejavu Sans Mono-8"
  +
, decoHeight = 15
  +
, urgentColor = "#000"
  +
, urgentTextColor = "#63b8ff"
 
}
 
}
   
 
myManageHook = composeAll
 
myManageHook = composeAll
[ className =? "MPlayer" --> doFloat
+
[ resource =? "desktop_window" --> doIgnore
, className =? "Gimp" --> doFloat
+
, className =? "ClockScreenlet.py" --> doIgnore
  +
, className =? "Deluge" --> doF (W.shift "9")
, resource =? "desktop_window" --> doIgnore
 
, resource =? "kdesktop" --> doIgnore ]
+
, title =? "roottail" --> doIgnore ]
 
<+> manageDocks
 
<+> manageDocks
   
 
-- Status bars and logging
 
-- Status bars and logging
myLogHook h = dynamicLogWithPP $ oxyPP h
+
myLogHook h = do
  +
ewmhDesktopsLogHook
  +
dynamicLogWithPP $ oxyPP h
  +
updatePointer (Relative (1/20) (1/20))
   
 
oxyPP :: Handle -> PP
 
oxyPP :: Handle -> PP
Line 225: Line 199:
 
, ppWsSep = ""
 
, ppWsSep = ""
 
, ppVisible = wrap "<fc=black,DarkSlateGray4> " " </fc>"
 
, ppVisible = wrap "<fc=black,DarkSlateGray4> " " </fc>"
, ppLayout = \x -> "<fc=aquamarine2,black> :: " ++ x ++ " </fc>"
+
, ppLayout = \x -> "<fc=aquamarine2,black>:: "
  +
++ case x of
  +
"Mirror ResizableTall" -> "MTiled"
  +
"ResizableTall" -> "Tiled"
  +
"Tabbed Bottom Simplest" -> "Tabbed"
  +
"Tabbed Simplest" -> "Tabbed"
  +
_ -> x
  +
++ "</fc> "
 
, ppTitle = \x -> case length x of
 
, ppTitle = \x -> case length x of
 
0 -> ""
 
0 -> ""
_ -> "<fc=DarkSlateGray3,black>[ " ++ shorten 40 x ++ " ] </fc>"
+
_ -> "<fc=DarkSlateGray3,black>[" ++ shorten 33 x ++ "]</fc>"
-- if a workspace has a tag, show it, even if it has no windows
+
, ppHiddenNoWindows = wrap "<fc=#aaa,black> " " </fc>"
, ppHiddenNoWindows = \x -> case length x of
 
1 -> ""
 
_ -> wrap "<fc=#aaa,black> " " </fc>" x
 
 
, ppHidden = wrap "<fc=#aaa,black> " " </fc>"
 
, ppHidden = wrap "<fc=#aaa,black> " " </fc>"
--, ppUrgent = wrap "^bg(#ffb90f)^fg(#d02090)" ""
 
 
, ppOutput = hPutStrLn h
 
, ppOutput = hPutStrLn h
 
}
 
}
  +
  +
shorten :: Int -> String -> String
  +
shorten n xs | length xs < n = xs
  +
| otherwise = (take (n - length end) xs) ++ end
  +
where
  +
end = "…"
   
 
myFocusFollowsMouse :: Bool
 
myFocusFollowsMouse :: Bool
Line 260: Line 243:
 
normalBorderColor = myNormalBorderColor,
 
normalBorderColor = myNormalBorderColor,
 
focusedBorderColor = myFocusedBorderColor,
 
focusedBorderColor = myFocusedBorderColor,
defaultGaps = myDefaultGaps,
 
 
-- key bindings
 
-- key bindings
 
keys = myKeys,
 
keys = myKeys,
Line 269: Line 251:
 
logHook = myLogHook pipe
 
logHook = myLogHook pipe
 
}
 
}
  +
   
 
</haskell>
 
</haskell>

Latest revision as of 02:18, 9 October 2011

Some of the other scripts I use can be found here (outdated at the moment).

-- -*- haskell -*-
import Control.Monad (liftM)
import XMonad
import XMonad.Core
import System.Exit
import qualified XMonad.StackSet as W
import qualified Data.Map        as M
import XMonad.Layout.Tabbed
import XMonad.Layout.ResizableTile
import XMonad.Layout.Grid
import XMonad.Layout.Magnifier
import XMonad.Layout.TabBarDecoration
import XMonad.Hooks.DynamicLog hiding (shorten)
import XMonad.Actions.CycleWS
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.EwmhDesktops
import XMonad.Actions.DwmPromote
import XMonad.Actions.UpdatePointer
import XMonad.Hooks.UrgencyHook
import XMonad.Util.Run (spawnPipe)
import System.IO 
import XMonad.Prompt
import XMonad.Prompt.Shell
import XMonad.Util.WorkspaceCompare
import XMonad.Util.EZConfig
import XMonad.Actions.Warp
import Data.Ratio

myTerminal      = "urxvt"
myScreenLock    = "/usr/bin/gnome-screensaver-command -l"
myBorderWidth   = 1
myModMask       = mod4Mask
myNumlockMask   = mod2Mask
myWorkspaces    = ["α", "β" ,"γ", "δ", "ε", "ζ", "η", "θ", "ι"] 
myNormalBorderColor  = "#111"
myFocusedBorderColor = "cadetblue3"

myKeys = \conf -> mkKeymap conf $
                [ ("M-S-<Return>", spawn $ XMonad.terminal conf)
                , ("C-S-<Esc>",    spawn $ myScreenLock)
                , ("M-C-<Esc>",    spawn $ "xkill")
                , ("M-<Space>",    sendMessage NextLayout)
                , ("M-S-<Space>",  setLayout $ XMonad.layoutHook conf)
                , ("M-n",          refresh)
                , ("M-S-c",        kill)
                , ("M-<Tab>",      windows W.focusDown)
                , ("M-j",          windows W.focusDown)
                , ("M-S-<Tab>",    windows W.focusUp)
                , ("M-k",          windows W.focusUp)
                , ("M-m",          windows W.focusMaster)
                , ("M-S-k",        windows W.swapDown)
                , ("M-S-j",        windows W.swapUp)
                , ("M-b",          sendMessage ToggleStruts)
                , ("M-h",          sendMessage Shrink)
                , ("M-l",          sendMessage Expand)
                , ("M-t",          withFocused $ windows . W.sink)
                , ("M-,",          sendMessage (IncMasterN 1))
                , ("M-.",          sendMessage (IncMasterN (-1)))
                , ("M-S-q",        io (exitWith ExitSuccess))
                , ("M-q",          restart "xmonad" True)
                , ("M-p",          shellPrompt oxyXPConfig)
                , ("M-o",          shellPrompt oxyXPConfig)
                , ("M-S-<Right>",  shiftToNext >> nextWS)
                , ("M-S-<Left>",   shiftToPrev >> prevWS) 
                , ("M-<Down>",     nextScreen)
                , ("M-S-<Down>",   shiftNextScreen >> nextScreen)
                , ("M-<Left>",     prevNonEmptyWS )
                , ("M-C-k",        prevNonEmptyWS )
                , ("M-<Right>",    nextNonEmptyWS )
                , ("M-C-j",        nextNonEmptyWS )
                , ("M-s",          swapNextScreen)
                , ("M-<Up>",       swapNextScreen)
                , ("M-a",          sendMessage MirrorShrink)
                , ("M-y",          sendMessage MirrorExpand)
                , ("M-<Return>",   dwmpromote)
                , ("M-x M-c",      kill)
                , ("M-x c",        kill)
                , ("M-x M-x",      nextScreen)
                , ("M-u M-x M-x",  swapNextScreen)
                , ("M-x e",        spawn "emacsclient -c -s emacs")
                , ("M-x s",        spawn "swiftfox")
                , ("M-x t",        spawn "tvbrowser")
                , ("M-x d",        spawn "deluge")
                , ("M-x <Return>", spawn $ XMonad.terminal conf)
                , ("M-w",          sendMessage MagnifyMore)
                , ("M-e",          sendMessage MagnifyLess)
                , ("M-<",          warpToWindow (1%10) (1%10)) -- Move pointer to currently focused window
                ]
                ++
                [ (m ++ i, windows $ f j)
                    | (i, j) <- zip (map show [1..9]) (XMonad.workspaces conf)
                    , (m, f) <- [("M-", W.view), ("M-S-", W.shift)]
                ]
    where 
      nextNonEmptyWS = moveTo Next (WSIs (liftM (not .) isVisible))
      prevNonEmptyWS = moveTo Prev (WSIs (liftM (not .) isVisible))

isVisible :: X (WindowSpace -> Bool)
isVisible = do
  vs <- gets (map (W.tag . W.workspace) . W.visible . windowset)
  return (\w -> (W.tag w) `elem` vs)

-- Config for Prompt
oxyXPConfig :: XPConfig
oxyXPConfig = defaultXPConfig { font              = "xft:Consolas-12"
                              , bgColor           = "Aquamarine3"
                              , fgColor           = "black"
                              , fgHLight          = "black"
                              , bgHLight          = "darkslategray4"
                              , borderColor       = "black"
                              , promptBorderWidth = 1
                              , position          = Top
                              , height            = 24
                              , defaultText       = []
                              }

myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
    -- mod-button1, Set the window to floating mode and move by dragging
    [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w))
    -- mod-button2, Raise the window to the top of the stack
    , ((modMask, button2), (\w -> focus w >> windows W.swapMaster))
    -- mod-button3, Set the window to floating mode and resize by dragging
    , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w))
    -- you may also bind events to the mouse scroll wheel (button4 and button5)
    -- cycle focus
    , ((modMask, button4), (\_ -> windows W.focusUp))
    , ((modMask, button5), (\_ -> windows W.focusDown))
    -- cycle through workspaces
    , ((controlMask .|. modMask, button5), nextNonEmptyWS)
    , ((controlMask .|. modMask, button4), prevNonEmptyWS)
    ]
    where 
      nextNonEmptyWS = \_ -> moveTo Next (WSIs (liftM (not .) isVisible))
      prevNonEmptyWS = \_ -> moveTo Prev (WSIs (liftM (not .) isVisible))

myLayout = avoidStrutsOn[U] $ tabs
           ||| tiled
           ||| Mirror tiled
           ||| magnify Grid
  where
     -- default tiling algorithm partitions the screen into two panes
     tiled   = ResizableTall nmaster delta ratio []
     -- The default number of windows in the master pane
     nmaster = 1
     -- Default proportion of screen occupied by master pane
     ratio   = 8 % 13
     -- Percent of screen to increment by when resizing panes
     delta   = 3 % 100
     -- tabbed layout
     tabs = tabbed shrinkText oxyDarkTheme
     -- magnification in grid
     magnify = magnifiercz (13%10)

-- Configuration for Tabbed
oxyTheme :: Theme
oxyTheme = defaultTheme { inactiveBorderColor = "#000"
                        , activeBorderColor = myFocusedBorderColor
                        , activeColor = "aquamarine3"
                        , inactiveColor = "DarkSlateGray4"
                        , inactiveTextColor = "#222"
                        , activeTextColor = "#222"
                        , fontName = "xft:Consolas-10:bold"
                        , decoHeight = 18
                        , urgentColor = "#000"
                        , urgentTextColor = "#63b8ff"
                        }

oxyDarkTheme :: Theme
oxyDarkTheme = defaultTheme { inactiveBorderColor = "#777"
                            , activeBorderColor = myFocusedBorderColor
                            , activeColor = "#000"
                            , inactiveColor = "#444"
                            , inactiveTextColor = "aquamarine4"
                            , activeTextColor = "aquamarine1"
                            , fontName = "xft:Dejavu Sans Mono-8"
                            , decoHeight = 15 
                            , urgentColor = "#000"
                            , urgentTextColor = "#63b8ff"
                        }

myManageHook = composeAll
 [ resource  =? "desktop_window"    --> doIgnore
 , className =? "ClockScreenlet.py" --> doIgnore
 , className =? "Deluge"            --> doF (W.shift "9")
 , title     =? "roottail"          --> doIgnore ]
    <+> manageDocks

-- Status bars and logging
myLogHook h = do
  ewmhDesktopsLogHook
  dynamicLogWithPP $ oxyPP h 
  updatePointer (Relative (1/20) (1/20))

oxyPP :: Handle -> PP
oxyPP h = defaultPP  { ppCurrent = wrap "<fc=black,aquamarine3> " " </fc>" 
                     , ppSep     = ""
                     , ppWsSep = ""
                     , ppVisible = wrap "<fc=black,DarkSlateGray4> " " </fc>" 
                     , ppLayout = \x -> "<fc=aquamarine2,black>:: "
                                  ++ case x of
                                       "Mirror ResizableTall"   -> "MTiled"
                                       "ResizableTall"          -> "Tiled"
                                       "Tabbed Bottom Simplest" -> "Tabbed"
                                       "Tabbed Simplest"        -> "Tabbed"
                                       _                        -> x
                                  ++ "</fc> "
                     , ppTitle = \x -> case length x of
                                         0 -> ""
                                         _ -> "<fc=DarkSlateGray3,black>[" ++ shorten 33 x ++ "]</fc>"
                     , ppHiddenNoWindows = wrap "<fc=#aaa,black> " " </fc>"
                     , ppHidden = wrap "<fc=#aaa,black> " " </fc>"
                     , ppOutput = hPutStrLn h
                     }

shorten :: Int -> String -> String
shorten n xs | length xs < n = xs
             | otherwise     = (take (n - length end) xs) ++ end
 where
    end = "…"

myFocusFollowsMouse :: Bool
myFocusFollowsMouse = True

------------------------------------------------------------------------
-- Now run xmonad with all the defaults we set up.

-- Run xmonad with the settings you specify. No need to modify this.
--
main = do
  pipe <- spawnPipe "xmobar"
  xmonad $ withUrgencyHook NoUrgencyHook $ defaults pipe

defaults pipe = defaultConfig {
      -- simple stuff
        terminal           = myTerminal,
        focusFollowsMouse  = myFocusFollowsMouse,
        borderWidth        = myBorderWidth,
        modMask            = myModMask,
        numlockMask        = myNumlockMask,
        workspaces         = myWorkspaces,
        normalBorderColor  = myNormalBorderColor,
        focusedBorderColor = myFocusedBorderColor,
      -- key bindings
        keys               = myKeys,
        mouseBindings      = myMouseBindings,
      -- hooks, layouts
        layoutHook         = myLayout,
        manageHook         = myManageHook,
        logHook            = myLogHook pipe
    }