aboutsummaryrefslogtreecommitdiff
path: root/.xmonad/xmonad.hs
diff options
context:
space:
mode:
authorRyan Kavanagh <ryanakca@kubuntu.org>2011-08-14 17:16:55 -0400
committerRyan Kavanagh <ryanakca@kubuntu.org>2011-08-25 07:42:57 -0400
commit1c019761dfaf6be82de9284fa5e2b9dbfbdec27d (patch)
tree7ed6bd2f437d3a334bd7a81f62e6dfa63689272b /.xmonad/xmonad.hs
Initial import
Diffstat (limited to '.xmonad/xmonad.hs')
-rw-r--r--.xmonad/xmonad.hs449
1 files changed, 449 insertions, 0 deletions
diff --git a/.xmonad/xmonad.hs b/.xmonad/xmonad.hs
new file mode 100644
index 0000000..861640f
--- /dev/null
+++ b/.xmonad/xmonad.hs
@@ -0,0 +1,449 @@
+{-# OPTIONS_GHC -W -fwarn-unused-imports -fno-warn-missing-signatures #-}
+import XMonad
+-- import XMonad.Config.Kde
+import XMonad.Actions.CycleWS
+import XMonad.Actions.GridSelect
+import XMonad.Actions.PerWorkspaceKeys
+import XMonad.Actions.RotSlaves
+import XMonad.Actions.UpdatePointer
+import XMonad.Config.Desktop
+-- import XMonad.Config.Kde
+import XMonad.Hooks.DynamicLog hiding (xmobar, xmobarPP, xmobarColor, sjanssenPP, byorgeyPP)
+import XMonad.Hooks.EwmhDesktops
+import XMonad.Hooks.ManageDocks (avoidStruts)
+import XMonad.Hooks.ManageHelpers
+import XMonad.Hooks.UrgencyHook
+import XMonad.Layout.Accordion
+import XMonad.Layout.Combo
+import XMonad.Layout.Cross
+import XMonad.Layout.Dishes
+import XMonad.Layout.FixedColumn
+import XMonad.Layout.Grid
+import XMonad.Layout.IM
+import XMonad.Layout.LimitWindows
+import XMonad.Layout.Magnifier
+import XMonad.Layout.NoBorders
+import XMonad.Layout.NoFrillsDecoration
+import XMonad.Layout.PerWorkspace
+import XMonad.Layout.PerWorkspace
+import XMonad.Layout.Reflect
+import XMonad.Layout.ResizableTile
+import XMonad.Layout.SimpleDecoration
+import XMonad.Layout.Tabbed
+import XMonad.Layout.ThreeColumns
+import XMonad.Layout.ToggleLayouts
+import XMonad.Layout.TwoPane
+import XMonad.Layout.WindowNavigation
+import XMonad.Prompt
+import XMonad.Prompt.Shell
+import XMonad.Util.EZConfig (additionalKeys)
+import XMonad.Util.Loggers
+import XMonad.Util.Run -- for spawnPipe
+import XMonad.Util.Themes
+import qualified XMonad.Actions.FlexibleResize as Flex
+import qualified XMonad.StackSet as W
+import qualified Data.Map as M
+import Control.Monad
+import Data.Ratio ((%))
+import Data.Maybe
+import Data.List
+import IO (hPutStrLn)
+
+myMod = mod4Mask -- windows key
+myCtrl = controlMask
+myTerminal = "urxvtc"
+
+-- My workspaces
+
+myWorkspaces = ["term", "web", "chatter", "code", "K/D", "music", "plasma", "LaTeX", "web-nb"]
+
+-- Mouse bindings: default actions bound to mouse events
+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
+ >> windows W.shiftMaster))
+ -- mod-button2 %! Raise the window to the top of the stack
+ , ((modMask, button2), (\w -> focus w >> windows W.shiftMaster))
+ -- mod-button3 %! Set the window to floating mode and resize by dragging
+ , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w
+ >> windows W.shiftMaster))
+ -- you may also bind events to the mouse scroll wheel (button4 and button5)
+ , ((modMask, button5), (\_ -> moveTo Next NonEmptyWS))
+ , ((modMask, button4), (\_ -> moveTo Prev NonEmptyWS ))
+
+ , ((modMask .|. shiftMask, button5), (\w -> focus w >> kill ))
+ ]
+
+-- Theme {{{
+-- Color names are easier to remember:
+colorOrange = "#ff7701"
+colorDarkGray = "#171717"
+colorPink = "#e3008d"
+colorGreen = "#00aa4a"
+colorBlue = "#008dd5"
+colorYellow = "#fee100"
+colorWhite = "#cfbfad"
+colorBrightGreen = "#00FF00"
+
+colorNormalBorder = "#1c2636"
+colorFocusedBorder = "#2797d8"
+barFont = "terminus"
+barXFont = "terminus"
+xftFont = "xft: inconsolata-14"
+--}}}
+statusBarCmd = "dzen2" ++
+ " -bg '" ++ colorDarkGray ++ "'" ++
+ " -fg '" ++ colorBlue ++ "'" ++
+ " -sa c" ++
+ --" -fn '" ++ barXFont ++ "'" ++
+ " -w XMONAD_DZEN_W -x XMONAD_DZEN_X -y XMONAD_DZEN_Y -ta l -e ''"
+
+
+-- Color theme for the window decorations
+myTheme = defaultTheme {
+ activeColor = blue
+ , inactiveColor = grey
+ , activeBorderColor = blue
+ , inactiveBorderColor = grey
+ , activeTextColor = "white"
+ , inactiveTextColor = "black"
+ , decoHeight = 12
+ }
+ where
+ blue = "#4a708b" -- same color used by gnome pager
+ grey = "#cccccc"
+
+myXPConfig = defaultXPConfig {
+ fgColor = "white"
+ , bgColor = "black"
+ , promptBorderWidth = 0
+ , position = Bottom
+ , height = 25
+ }
+
+
+myLayout = smartBorders $ toggleLayouts Full perWS
+ where
+ -- Per workspace layout selection.
+ perWS = onWorkspace "web" (noTitles $ (simpleTabbed ||| mySplit ||| myWide)) $
+ onWorkspace "term" (noTitles $ (Full ||| myTall2 ||| customRyan)) $
+ onWorkspace "chatter" (noTitles $ myChat gridFirst) $
+ onWorkspace "code" (noTitles $ codeFirst) $
+ onWorkspace "LaTeX" (noTitles $ latexFirst) $
+ (noTitles $ customRyan)
+
+ -- Modifies a layout to be desktop friendly with title bars
+ -- and avoid the panel.
+ withTitles l = noFrillsDeco shrinkText myTheme (desktopLayoutModifiers l)
+ -- Modifies a layout to be desktop friendly, but with no title bars
+ -- and avoid the panel.
+ noTitles l = desktopLayoutModifiers l
+
+ -- Each of these allows toggling through a set of layouts
+ -- in the same logical order, but from a different starting point.
+ codeFirst = myCode ||| myWide ||| myGrid ||| myDish
+ gridFirst = myGrid ||| myDish ||| myCode ||| myWide
+ customRyan = myGrid ||| myDish ||| Accordion ||| myCode ||| myWide ||| simpleCross ||| myFixed ||| myTall
+ latexFirst = myLaTeX ||| myFixed ||| myGrid ||| myTall
+
+ -- This is a tall-like layout with magnification.
+ -- The master window is fixed at 80 columns wide, making this good
+ -- for coding. Limited to 3 visible windows at a time to ensure all
+ -- are a good size.
+ myCode = limitWindows 3 $ magnifiercz' 1.4 $ FixedColumn 1 20 80 10
+
+ -- Stack with one large master window.
+ -- It's easy to overflow a stack to the point that windows are too
+ -- small, so only show first 5.
+ myDish = limitWindows 5 $ Dishes nmaster ratio
+ where
+ -- The default number of windows in the master pane
+ nmaster = 1
+ -- Default proportion of screen occupied by other panes
+ ratio = 1/5
+
+ -- Wide layout with subwindows at the bottom.
+ myWide = Mirror $ Tall nmaster delta ratio
+ where
+ -- The default number of windows in the master pane
+ nmaster = 1
+ -- Percent of screen to increment by when resizing panes
+ delta = 3/100
+ -- Default proportion of screen occupied by master pane
+ ratio = 80/100
+
+ -- Split screen, optimized for web browsing.
+ mySplit = magnifiercz' 1.4 $ Tall nmaster delta ratio
+ where
+ -- The default number of windows in the master pane
+ nmaster = 1
+ -- Percent of screen to increment by when resizing panes
+ delta = 3/100
+ -- Default proportion of screen occupied by master pane
+ ratio = 60/100
+
+ -- Standard grid.
+ myGrid = Grid
+
+ myFixed = FixedColumn 1 20 80 10
+
+ -- The chat workspace has a roster on the right.
+ myChat base = reflectHoriz $ withIM (1%5) ((And (ClassName "Pidgin") (Role "buddy_list")) `Or` (And (Title "Kopete") (Role "MainWindow#1"))) base
+ where
+ role = stringProperty "WM_WINDOW_ROLE"
+ command = stringProperty "WM_COMMAND"
+
+ -- LaTeX layout with a XPDF, vim window and small console to run pdflatex
+ -- From
+ -- http://www.haskell.org/haskellwiki/Xmonad/Config_archive/iderrick_xmonad.hs
+ myLaTeX = windowNavigation (
+ combineTwo
+ (TwoPane delta 0.45)
+ (Full)
+ (combineTwo
+ (Mirror (TwoPane delta 0.85))
+ (Full)
+ (Full)
+ )
+ )
+ where
+ -- Percent of the screen to increment by when resizing panes
+ delta = 3/100
+
+ myTall = ResizableTall nmaster delta ratio [50/100]
+ where
+ nmaster = 1
+ delta = 3/100
+ ratio = 55/100
+
+ myTall2 = ResizableTall nmaster delta ratio [50/100]
+ where
+ nmaster = 1
+ delta = 3/100
+ ratio = 1/2
+
+
+-- Pretty printer {{{
+-- dynamiclog pretty printer for dzen
+mPP h = defaultPP
+ { ppCurrent = wrap ("^fg(" ++ colorOrange ++ ")^bg(" ++ colorDarkGray ++ ")^p(2)") "^p(2)^fg()^bg()"
+ , ppVisible = wrap ("^fg(" ++ colorBlue ++ ")^bg(" ++ colorDarkGray ++ ")^p(2)") "^p(2)^fg()^bg()"
+ , ppSep = " ^fg(grey60)^r(1x8)^fg() "
+ , ppLayout = dzenColor colorWhite "" . (\x -> case x of
+ "myCode" -> pad "^i(/home/ryan/.dzen/icons/layout-threecol.xbm)"
+ "myDish" -> pad "^i(/home/ryan/.dzen/icons/layout-im-gimp.xbm)"
+ "myWide" -> pad "^i(/home/ryan/.dzen/icons/layout-mirror-black.xbm)"
+ "mySplit" -> pad "^i(/home/ryan/.dzen/icons/layout-tall-black.xbm)"
+ "myGrid" -> pad "^i(/home/ryan/.dzen/icons/layout-gimp.xbm)"
+ "myChat" -> pad "^i(/home/ryan/.dzen/icons/layout-im.xbm)"
+ "myLaTeX" -> pad "^i(/home/ryan/.dzen/icons/layoput-gimp.xbm)"
+ _ -> pad $ shorten 10 x
+ )
+ , ppUrgent = dzenColor colorDarkGray colorYellow . wrap "[" "]"
+ , ppTitle = dzenColor colorWhite "" . trim
+ , ppExtras = [dzenColorL colorYellow "". wrapL mailIcon "" . padL $ gmailCheck, dzenColorL colorBrightGreen "" . wrapL mailIcon "" . padL $ queensuCheck]
+ , ppOutput = hPutStrLn h
+ }
+ where
+ -- logMail = dzenColorL colorPink "" . wrapL mailIcon "". padL $ maildirNew mailDir
+ mailCheck = mailIcon -- <$> gmailCheck <$> queensuCheck
+ mailIcon = "^i(/home/ryan/.dzen/icons/mail.xbm)"
+ --gmailCheck = padL $ (dzenColorL colorRed "" . logCmd "cat /home/ryan/.xmonad/gmailcheck")
+ --queensuCheck = padL $ (dzenColorL colorYellow "" . logCmd "cat /home/ryan/.xmonad/queensucheck")
+ gmailCheck = logCmd "cat /home/ryan/.xmonad/gmailcheck"
+ queensuCheck = logCmd "cat /home/ryan/.xmonad/queensucheck"
+
+--}}}
+
+-- Commented out because it exposes a bug in xmonad-contrib:
+--myLogHook = ewmhDesktopsLogHookCustom $ filter $ \w -> W.tag w /= "SP"
+
+
+dk :: KeySym -> KeySym
+dk k | k == xK_grave = xK_dollar
+ | k == xK_asciitilde = xK_asciitilde
+
+ | k == xK_1 = xK_ampersand
+ | k == xK_exclam = xK_percent
+
+ | k == xK_2 = xK_bracketleft
+ | k == xK_at = xK_7
+
+ | k == xK_3 = xK_braceleft
+ | k == xK_numbersign = xK_5
+
+ | k == xK_4 = xK_braceright
+ | k == xK_dollar = xK_3
+
+ | k == xK_5 = xK_parenleft
+ | k == xK_percent = xK_1
+
+ | k == xK_6 = xK_equal
+ | k == xK_asciicircum = xK_9
+
+ | k == xK_7 = xK_asterisk
+ | k == xK_ampersand = xK_0
+
+ | k == xK_8 = xK_parenright
+ | k == xK_asterisk = xK_2
+
+ | k == xK_9 = xK_plus
+ | k == xK_parenleft = xK_4
+
+ | k == xK_0 = xK_bracketright
+ | k == xK_parenright = xK_6
+
+ | k == xK_minus = xK_exclam
+ | k == xK_underscore = xK_8
+
+ | k == xK_equal = xK_numbersign
+ | k == xK_plus = xK_grave
+
+ | k == xK_q = xK_semicolon -- upper row, left side
+ | k == xK_Q = xK_colon
+
+ | k == xK_w = xK_comma
+ | k == xK_W = xK_less
+
+ | k == xK_e = xK_period
+ | k == xK_E = xK_greater
+
+ | k == xK_bracketleft = xK_slash -- upper row, top right
+ | k == xK_braceleft = xK_question
+
+ | k == xK_bracketright = xK_at
+ | k == xK_braceright = xK_asciicircum
+
+
+ | k == xK_R = xK_P
+ | k == xK_T = xK_Y
+ | k == xK_Y = xK_F
+ | k == xK_U = xK_G
+ | k == xK_I = xK_C
+ | k == xK_O = xK_R
+ | k == xK_P = xK_L
+ | k == xK_A = xK_A
+ | k == xK_S = xK_O
+ | k == xK_D = xK_E
+ | k == xK_F = xK_U
+ | k == xK_G = xK_I
+ | k == xK_H = xK_D
+ | k == xK_J = xK_H
+ | k == xK_K = xK_T
+ | k == xK_L = xK_N
+ | k == xK_Z = xK_quotedbl
+ | k == xK_X = xK_Q
+ | k == xK_C = xK_J
+ | k == xK_V = xK_K
+ | k == xK_B = xK_X
+ | k == xK_N = xK_B
+ | k == xK_M = xK_M
+
+ | k == xK_r = xK_p
+ | k == xK_t = xK_y
+ | k == xK_y = xK_f
+ | k == xK_u = xK_g
+ | k == xK_i = xK_c
+ | k == xK_o = xK_r
+ | k == xK_p = xK_l
+ | k == xK_a = xK_a
+ | k == xK_s = xK_o
+ | k == xK_d = xK_e
+ | k == xK_f = xK_u
+ | k == xK_g = xK_i
+ | k == xK_h = xK_d
+ | k == xK_j = xK_h
+ | k == xK_k = xK_t
+ | k == xK_l = xK_n
+ | k == xK_z = xK_apostrophe
+ | k == xK_x = xK_q
+ | k == xK_c = xK_j
+ | k == xK_v = xK_k
+ | k == xK_b = xK_x
+ | k == xK_n = xK_b
+ | k == xK_m = xK_m
+
+ | k == xK_comma = xK_w -- bottom right
+ | k == xK_less = xK_W
+
+ | k == xK_period = xK_v
+ | k == xK_greater = xK_V
+
+ | k == xK_slash = xK_z
+ | k == xK_question = xK_Z
+
+ | otherwise = k
+
+
+main = do
+ dzenpipe <- spawnPipe statusBarCmd
+ xmonad $ withUrgencyHookC dzenUrgencyHook { args = ["-bg", "red", "-fg", "yellow", "-x", "1"] } urgencyConfig { remindWhen = Every 30 } --NoUrgencyHook
+ $ defaultConfig { -- kde4Config {
+ workspaces = myWorkspaces
+ , modMask = myMod -- use the Windows button as mod
+ , terminal = myTerminal
+ , normalBorderColor = inactiveBorderColor myTheme
+ , focusedBorderColor = activeBorderColor myTheme
+ , borderWidth = 1
+ , layoutHook = myLayout
+ , manageHook = manageHook defaultConfig <+> myManageHook -- kde4Config <+> myManageHook
+ , mouseBindings = myMouseBindings
+ , keys = \x -> (M.fromList $ mykeys x) `M.union` dvorakify (keys defaultConfig x)
+ --, logHook = (dynamicLogWithPP $ mPP dzenpipe) >> updatePointer (Relative 0.95 0.95)
+ , logHook = dynamicLogWithPP $ mPP dzenpipe
+ -- , logHook = myLogHook
+ }
+ where
+ myManageHook = composeAll . concat $
+ [
+ --[ [ className =? c --> doFloat | c <- myFloats]
+ [ title =? t --> doFloat | t <- myOtherFloats]
+ , [ title =? c --> viewShift "term" | c <- term]
+ , [ className =? c --> viewShift "term" | c <- term2]
+ , [ className =? c --> viewShift "web" | c <- web]
+ , [ className =? c --> viewShift "chatter" | c <- chatter]
+ -- , [ className =? c --> doF (W.shift "plasma") | c <- plasmaD ]
+ , [ className =? c --> doIgnore | c <- panel ]
+ , [ isFullscreen --> doFullFloat ]
+ ]
+ viewShift = doF . liftM2 (.) W.greedyView W.shift
+ mykeys x = [
+ -- ((myMod, xK_x), spawn myTerminal)
+ -- , ((myMod, xK_c), kill)
+ ((myMod, xK_Left), prevWS)
+ , ((myMod, xK_Right), nextWS)
+ , ((myMod, xK_a), myToggle)
+ , ((myMod, xK_z), shellPrompt myXPConfig)
+ , ((myMod, xK_g), goToSelected defaultGSConfig)
+ , ((myMod, xK_F4), spawn "sleep 0.5 && xset dpms force suspend")
+ , ((myMod, xK_F5), spawn "sleep 0.5 && xset dpms force off")
+ , ((myMod, xK_l), spawn "xautolock -locknow")
+ , ((myMod .|. shiftMask, xK_l), spawn "xautolock -toggle")
+ , ((myMod .|. myCtrl .|. shiftMask, xK_Right), sendMessage $ Move R)
+ , ((myMod .|. myCtrl .|. shiftMask, xK_Left), sendMessage $ Move L)
+ , ((myMod .|. myCtrl .|. shiftMask, xK_Up), sendMessage $ Move U)
+ , ((myMod .|. myCtrl .|. shiftMask, xK_Down), sendMessage $ Move D)
+ , ((myMod, xK_BackSpace), focusUrgent)
+ -- , ((myMod, xK_Tab), bindOn [("chat", rotSlavesDown), ("", rotAllDown)])
+ -- , ((myMod .|. shiftMask, xK_Tab), bindOn [("chat", rotSlavesUp), ("", rotAllUp)])
+ , ((myMod, xK_s), sendMessage $ ToggleLayout)]
+ dvorakify kl = M.fromList $ map (\((m, k), d) -> ((m, dk k), d)) $ M.toList kl
+ myFloats = ["MPlayer", "Plasma-netbook", "Plasma-desktop", "plasma-netbook", "plasma-desktop"]
+ plasmaD = ["Plasma"]
+ myOtherFloats = ["alsamixer"]
+ term = ["ryan@localhost", "root@localhost", "ryan@lambda", "ryan@kappa", "ryan@sho", "Konsole"] -- open on desktop 1
+ term2 = ["Konsole"]
+ web = ["Firefox", "Iceweasel", "Opera", "Akregator", "Konqueror", "Chromium-browser"] -- open on desktop 2
+ chatter = ["Ksirc", "Krusader", "xchat", "Quassel", "Pidgin", "Kopete", "kopete"] -- open on desktop 3
+ games = ["Bzflag"]
+ panel = ["panel", "trayer"]
+
+-- Avoid the master window, but otherwise manage new windows normally.
+avoidMaster :: W.StackSet i l a s sd -> W.StackSet i l a s sd
+avoidMaster = W.modify' $ \c -> case c of
+ W.Stack t [] (r:rs) -> W.Stack t [r] rs
+ otherwise -> c
+
+-- A version of toggleWS that ignores the scratchPad workspaces.
+myToggle = windows $ W.view =<< W.tag . head . filter ((\x -> x /= "NSP" && x /= "SP") . W.tag) . W.hidden