##### Views

(Difference between revisions)

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

```-- -*- haskell -*-
import System.Exit
import qualified Data.Map        as M
import System.IO (Handle)
import System.IO.UTF8

myTerminal      = "urxvt"
myScreenLock    = "/usr/bin/slock"
myBorderWidth   = 1
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-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
--
-- >  , ((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       = []
}

-- 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
]
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,
workspaces         = myWorkspaces,
normalBorderColor  = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor,
defaultGaps        = myDefaultGaps,
-- key bindings
keys               = myKeys,
mouseBindings      = myMouseBindings,
-- hooks, layouts
layoutHook         = myLayout,
manageHook         = myManageHook,
logHook            = myLogHook pipe
}```