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

From HaskellWiki
Jump to navigation Jump to search
(update)
(update)
Line 2: Line 2:
 
<haskell>
 
<haskell>
 
-- -*- haskell -*-
 
-- -*- haskell -*-
 
import 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 qualified XMonad.Layout.Decoration as D
 
import XMonad.Layout.Tabbed
 
import XMonad.Layout.Tabbed
 
import XMonad.Layout.ResizableTile
 
import XMonad.Layout.ResizableTile
 
import XMonad.Hooks.DynamicLog
 
import XMonad.Hooks.DynamicLog
 
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.Actions.DwmPromote
 
import XMonad.Actions.DwmPromote
import XMonad.Layout.WindowNavigation
 
 
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)
 
import System.IO (Handle)
 
import System.IO.UTF8
 
import System.IO.UTF8
import Monad
 
 
import XMonad.Prompt
 
import XMonad.Prompt
 
import XMonad.Prompt.Shell
 
import XMonad.Prompt.Shell
 
import XMonad.Prompt.Window
 
import XMonad.Prompt.Window
 
import XMonad.Layout.SimpleFloat
 
import XMonad.Layout.SimpleFloat
import qualified XMonad.Layout.Decoration as D
 
 
import XMonad.Layout.Simplest
 
import XMonad.Layout.Simplest
 
import XMonad.Util.WorkspaceCompare
 
import XMonad.Util.WorkspaceCompare
import XMonad.Prompt.Theme
 
 
import XMonad.Layout.WindowArranger
 
import XMonad.Layout.WindowArranger
 
import XMonad.Actions.MouseResize
 
import XMonad.Actions.MouseResize
Line 44: Line 38:
 
myNormalBorderColor = "#111"
 
myNormalBorderColor = "#111"
 
myFocusedBorderColor = "aquamarine3"
 
myFocusedBorderColor = "aquamarine3"
myDefaultGaps = [(0,0,0,0),(0,20,0,0)]
+
myDefaultGaps = [(0,0,0,0),(0,0,0,0)]
   
 
myKeys = \conf -> mkKeymap conf $
 
myKeys = \conf -> mkKeymap conf $
Line 74: Line 68:
 
, ("M-<Down>", nextScreen)
 
, ("M-<Down>", nextScreen)
 
, ("M-S-<Down>", shiftNextScreen >> nextScreen)
 
, ("M-S-<Down>", shiftNextScreen >> nextScreen)
, ("M-<Left>", moveTo Prev (WSIs (liftM (not .) isVisible)) )
+
, ("M-<Left>", prevNonEmptyWS )
, ("M-<Right>", moveTo Next (WSIs (liftM (not .) isVisible)) )
+
, ("M-C-k", prevNonEmptyWS )
  +
, ("M-<Right>", nextNonEmptyWS )
  +
, ("M-C-j", nextNonEmptyWS )
 
, ("M-s", swapNextScreen)
 
, ("M-s", swapNextScreen)
 
, ("M-<Up>", swapNextScreen)
 
, ("M-<Up>", swapNextScreen)
Line 85: Line 81:
 
, ("M-x M-x", nextScreen)
 
, ("M-x M-x", nextScreen)
 
, ("M-x e", spawn "emacsclient -c -s emacs")
 
, ("M-x e", spawn "emacsclient -c -s emacs")
 
, ("M-x s", spawn "swiftfox")
 
]
 
]
 
++
 
++
Line 91: Line 88:
 
, (m, f) <- [("M-", W.view), ("M-S-", W.shift)]
 
, (m, f) <- [("M-", W.view), ("M-S-", W.shift)]
 
]
 
]
  +
where
  +
nextNonEmptyWS = moveTo Next (WSIs (liftM (not .) isVisible))
  +
prevNonEmptyWS = moveTo Prev (WSIs (liftM (not .) isVisible))
  +
  +
-- (thanks to byorgey for that)
  +
-- | A predicate on workspaces that returns whether or not the workspace
  +
-- is currently visible. Useful for cycling through workspaces in a
  +
-- Xinerama context. For example, to cycle through all non-visible
  +
-- workspaces, you could add to your keybindings
  +
--
  +
-- > , ((modMask x, xK_Left), 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
 
-- Config for Prompt
Line 96: Line 110:
 
oxyXPConfig = defaultXPConfig { font = "-xos4-terminus-*-*-*-*-12-*-*-*-*-*-*-*"
 
oxyXPConfig = defaultXPConfig { font = "-xos4-terminus-*-*-*-*-12-*-*-*-*-*-*-*"
 
, bgColor = "#000"
 
, bgColor = "#000"
, fgColor = "Aquamarine2"
+
, fgColor = "LightSkyBlue"
 
, fgHLight = "#000000"
 
, fgHLight = "#000000"
 
, bgHLight = "Aquamarine2"
 
, bgHLight = "Aquamarine2"
Line 119: Line 133:
 
, ((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 = avoidStruts $ tiled
toggleLayouts Full tiled
+
||| Mirror tiled
||| toggleLayouts Full (Mirror tiled)
+
||| tabs
||| toggleLayouts Grid tabs
 
 
||| floating
 
||| floating
 
 
where
 
where
 
-- default tiling algorithm partitions the screen into two panes
 
-- default tiling algorithm partitions the screen into two panes
Line 154: Line 169:
 
, activeTextColor = "#222"
 
, activeTextColor = "#222"
 
, fontName = "xft:Corbel-10"
 
, fontName = "xft:Corbel-10"
-- This font can be found in the package ttf-alee
 
-- on debian-systems
 
-- , fontName = "-*-Bandal-*-*-*-*-12-*-*-*-*-*-*-*"
 
 
, decoHeight = 16
 
, decoHeight = 16
 
, urgentColor = "#000"
 
, urgentColor = "#000"
Line 163: Line 175:
   
 
myManageHook = composeAll
 
myManageHook = composeAll
[ className =? "MPlayer" --> doFloat
+
[ resource =? "desktop_window" --> doIgnore ]
, className =? "Gimp" --> doFloat
 
, resource =? "desktop_window" --> doIgnore
 
, resource =? "kdesktop" --> doIgnore ]
 
 
<+> manageDocks
 
<+> manageDocks
   
Line 221: Line 230:
 
logHook = myLogHook pipe
 
logHook = myLogHook pipe
 
}
 
}
 
 
</haskell>
 
</haskell>

Revision as of 10:08, 28 February 2008

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

-- -*- haskell -*-
import Monad (liftM)
import XMonad
import XMonad.Core
import System.Exit
import qualified XMonad.StackSet as W
import qualified Data.Map        as M
import qualified XMonad.Layout.Decoration as D
import XMonad.Layout.Tabbed
import XMonad.Layout.ResizableTile
import XMonad.Hooks.DynamicLog
import XMonad.Actions.CycleWS
import XMonad.Hooks.ManageDocks
import XMonad.Actions.DwmPromote
import XMonad.Hooks.UrgencyHook
import XMonad.Util.Run (spawnPipe)
import System.IO (Handle)
import System.IO.UTF8
import XMonad.Prompt
import XMonad.Prompt.Shell
import XMonad.Prompt.Window
import XMonad.Layout.SimpleFloat
import XMonad.Layout.Simplest
import XMonad.Util.WorkspaceCompare
import XMonad.Layout.WindowArranger
import XMonad.Actions.MouseResize
import XMonad.Util.EZConfig


myTerminal      = "urxvt"
myScreenLock    = "/usr/bin/slock"
myBorderWidth   = 1
myModMask       = mod4Mask
myNumlockMask   = mod2Mask
myWorkspaces    = ["1:web", "2:emacs" ,"3:gnus", "4:music", "5:shells"] ++ map show [6 .. 9 :: Int]
myNormalBorderColor  = "#111"
myFocusedBorderColor = "aquamarine3"
myDefaultGaps   = [(0,0,0,0),(0,0,0,0)]

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-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-x e",        spawn "emacsclient -c -s emacs")
                , ("M-x s",        spawn "swiftfox")
                ]
                ++
                [ (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))

-- (thanks to byorgey for that)
-- | A predicate on workspaces that returns whether or not the workspace
--   is currently visible.  Useful for cycling through workspaces in a
--   Xinerama context.  For example, to cycle through all non-visible
--   workspaces, you could add to your keybindings
--
-- >  , ((modMask x,  xK_Left), 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              = "-xos4-terminus-*-*-*-*-12-*-*-*-*-*-*-*"
                              , bgColor           = "#000"
                              , fgColor           = "LightSkyBlue"
                              , fgHLight          = "#000000"
                              , bgHLight          = "Aquamarine2"
                              , borderColor       = "aquamarine2"
                              , promptBorderWidth = 1
                              , position          = Top
                              , height            = 18
                              -- , historySize       = 256
                              , 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 = avoidStruts $ tiled
           ||| Mirror tiled
           ||| tabs
           ||| floating 
  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   = 3/5
     -- Percent of screen to increment by when resizing panes
     delta   = 3/100
     -- tabbed layout
     tabs = D.decoration shrinkText oxyTheme Tabbed Simplest
     -- floating layout with mouse resize
     -- floating = simpleFloat' shrinkText oxyTheme
     floating = D.decoration shrinkText oxyTheme D.DefaultDecoration (mouseResize $ windowArrangeAll $ SF 20)


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

myManageHook = composeAll
    [ resource  =? "desktop_window" --> doIgnore ]
    <+> manageDocks

-- Status bars and logging
myLogHook h = dynamicLogWithPP $ oxyPP h

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> :: " ++ x ++ " </fc>"
                     , ppTitle = \x -> case length x of
                                         0 -> ""
                                         _ -> "<fc=DarkSlateGray3,black>[ " ++ shorten 40 x ++ " ] </fc>"
                     -- if a workspace has a tag, show it, even if it has no windows
                     , ppHiddenNoWindows = \x -> case length x of
                                                   1 -> ""
                                                   _ -> wrap "<fc=#aaa,black> " " </fc>" x
                     , ppHidden = wrap "<fc=#aaa,black> " " </fc>"
                     --, ppUrgent = wrap "^bg(#ffb90f)^fg(#d02090)" ""
                     , ppOutput = hPutStrLn h
                     }

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,
        defaultGaps        = myDefaultGaps,
      -- key bindings
        keys               = myKeys,
        mouseBindings      = myMouseBindings,
      -- hooks, layouts
        layoutHook         = myLayout,
        manageHook         = myManageHook,
        logHook            = myLogHook pipe
    }