summaryrefslogtreecommitdiffstats
path: root/MetaTile/Config.hs
diff options
context:
space:
mode:
Diffstat (limited to 'MetaTile/Config.hs')
-rw-r--r--MetaTile/Config.hs321
1 files changed, 321 insertions, 0 deletions
diff --git a/MetaTile/Config.hs b/MetaTile/Config.hs
new file mode 100644
index 0000000..71706d8
--- /dev/null
+++ b/MetaTile/Config.hs
@@ -0,0 +1,321 @@
+{-# OPTIONS -fno-warn-missing-signatures -fno-warn-orphans #-}
+{-# LANGUAGE TypeFamilies #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module : MetaTile.Config
+-- Copyright : (c) Spencer Janssen 2007
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : dons@galois.com
+-- Stability : stable
+-- Portability : portable
+--
+-- This module specifies the default configuration values for xmonad.
+--
+-- DO NOT MODIFY THIS FILE! It won't work. You may configure xmonad
+-- by providing your own @~\/.metatile\/metatile.hs@ that overrides
+-- specific fields in the default config, 'def'. For a starting point, you can
+-- copy the @metatile.hs@ found in the @man@ directory, or look at
+-- examples on the xmonad wiki.
+--
+------------------------------------------------------------------------
+
+module MetaTile.Config (defaultConfig, Default(..)) where
+
+--
+-- Useful imports
+--
+import MetaTile.Core as MetaTile hiding
+ (workspaces,manageHook,keys,logHook,startupHook,mouseBindings
+ ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,defaultBorderWidth,focusFollowsMouse
+ ,handleEventHook,clickJustFocuses,rootMask,frameMask,clientMask)
+import qualified MetaTile.Core as MetaTile
+ (workspaces,manageHook,keys,logHook,startupHook,mouseBindings
+ ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,defaultBorderWidth,focusFollowsMouse
+ ,handleEventHook,clickJustFocuses,rootMask,frameMask,clientMask)
+
+import MetaTile.Layout
+import MetaTile.Operations
+import qualified MetaTile.StackSet as W
+import Data.Bits ((.|.))
+import Data.Default
+import Data.Monoid
+import qualified Data.Map as M
+import System.Exit
+import Graphics.X11.Xlib
+import Graphics.X11.Xlib.Extras
+
+-- | The default number of workspaces (virtual screens) and their names.
+-- By default we use numeric strings, but any string may be used as a
+-- workspace name. The number of workspaces is determined by the length
+-- of this list.
+--
+-- A tagging example:
+--
+-- > workspaces = ["web", "irc", "code" ] ++ map show [4..9]
+--
+workspaces :: [WorkspaceId]
+workspaces = map show [1 .. 9 :: Int]
+
+-- | modMask lets you specify which modkey you want to use. The default
+-- is mod1Mask ("left alt"). You may also consider using mod3Mask
+-- ("right alt"), which does not conflict with emacs keybindings. The
+-- "windows key" is usually mod4Mask.
+--
+defaultModMask :: KeyMask
+defaultModMask = mod1Mask
+
+-- | Border colors for unfocused and focused windows, respectively.
+--
+normalBorderColor, focusedBorderColor :: String
+normalBorderColor = "gray" -- "#dddddd"
+focusedBorderColor = "red" -- "#ff0000" don't use hex, not <24 bit safe
+
+defaultBorderWidth :: BorderWidth
+defaultBorderWidth = BorderWidth 1 1 1 1
+
+------------------------------------------------------------------------
+-- Window rules
+
+-- | Execute arbitrary actions and WindowSet manipulations when managing
+-- a new window. You can use this to, for example, always float a
+-- particular program, or have a client always appear on a particular
+-- workspace.
+--
+-- To find the property name associated with a program, use
+-- xprop | grep WM_CLASS
+-- and click on the client you're interested in.
+--
+manageHook :: ManageHook
+manageHook = mempty
+
+------------------------------------------------------------------------
+-- Logging
+
+-- | Perform an arbitrary action on each internal state change or X event.
+-- Examples include:
+--
+-- * do nothing
+--
+-- * log the state to stdout
+--
+-- See the 'DynamicLog' extension for examples.
+--
+logHook :: X ()
+logHook = return ()
+
+------------------------------------------------------------------------
+-- Event handling
+
+-- | Defines a custom handler function for X Events. The function should
+-- return (All True) if the default handler is to be run afterwards.
+-- To combine event hooks, use mappend or mconcat from Data.Monoid.
+handleEventHook :: Event -> X All
+handleEventHook _ = return (All True)
+
+-- | Perform an arbitrary action at xmonad startup.
+startupHook :: X ()
+startupHook = return ()
+
+------------------------------------------------------------------------
+-- Extensible layouts
+--
+-- You can specify and transform your layouts by modifying these values.
+-- If you change layout bindings be sure to use 'mod-shift-space' after
+-- restarting (with 'mod-q') to reset your layout state to the new
+-- defaults, as xmonad preserves your old layout settings by default.
+--
+
+-- | The available layouts. Note that each layout is separated by |||, which
+-- denotes layout choice.
+layout = tiled ||| Mirror tiled ||| Full
+ where
+ -- default tiling algorithm partitions the screen into two panes
+ tiled = Tall nmaster delta ratio
+
+ -- The default number of windows in the master pane
+ nmaster = 1
+
+ -- Default proportion of screen occupied by master pane
+ ratio = 1/2
+
+ -- Percent of screen to increment by when resizing panes
+ delta = 3/100
+
+------------------------------------------------------------------------
+-- Event Masks:
+
+-- | The client events that xmonad is interested in
+clientMask :: EventMask
+clientMask = structureNotifyMask .|. enterWindowMask .|. propertyChangeMask
+
+-- | The frame events that xmonad is interested in
+frameMask :: EventMask
+frameMask = substructureRedirectMask .|. substructureNotifyMask
+
+-- | The root events that xmonad is interested in
+rootMask :: EventMask
+rootMask = substructureRedirectMask .|. substructureNotifyMask
+ .|. enterWindowMask .|. leaveWindowMask .|. structureNotifyMask
+ .|. buttonPressMask
+
+------------------------------------------------------------------------
+-- Key bindings:
+
+-- | The preferred terminal program, which is used in a binding below and by
+-- certain contrib modules.
+terminal :: String
+terminal = "xterm"
+
+-- | Whether focus follows the mouse pointer.
+focusFollowsMouse :: Bool
+focusFollowsMouse = True
+
+-- | Whether a mouse click select the focus or is just passed to the window
+clickJustFocuses :: Bool
+clickJustFocuses = True
+
+
+-- | The xmonad key bindings. Add, modify or remove key bindings here.
+--
+-- (The comment formatting character is used when generating the manpage)
+--
+keys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ())
+keys conf@(XConfig {MetaTile.modMask = modMask}) = M.fromList $
+ -- launching and killing programs
+ [ ((modMask .|. shiftMask, xK_Return), spawn $ MetaTile.terminal conf) -- %! Launch terminal
+ , ((modMask, xK_p ), spawn "dmenu_run") -- %! Launch dmenu
+ , ((modMask .|. shiftMask, xK_p ), spawn "gmrun") -- %! Launch gmrun
+ , ((modMask .|. shiftMask, xK_c ), kill) -- %! Close the focused window
+
+ , ((modMask, xK_space ), sendMessage NextLayout) -- %! Rotate through the available layout algorithms
+ , ((modMask .|. shiftMask, xK_space ), setLayout $ MetaTile.layoutHook conf) -- %! Reset the layouts on the current workspace to default
+
+ , ((modMask, xK_n ), refresh) -- %! Resize viewed windows to the correct size
+
+ -- move focus up or down the window stack
+ , ((modMask, xK_Tab ), windows W.focusDown) -- %! Move focus to the next window
+ , ((modMask .|. shiftMask, xK_Tab ), windows W.focusUp ) -- %! Move focus to the previous window
+ , ((modMask, xK_j ), windows W.focusDown) -- %! Move focus to the next window
+ , ((modMask, xK_k ), windows W.focusUp ) -- %! Move focus to the previous window
+ , ((modMask, xK_m ), windows W.focusMaster ) -- %! Move focus to the master window
+
+ -- modifying the window order
+ , ((modMask, xK_Return), windows W.swapMaster) -- %! Swap the focused window and the master window
+ , ((modMask .|. shiftMask, xK_j ), windows W.swapDown ) -- %! Swap the focused window with the next window
+ , ((modMask .|. shiftMask, xK_k ), windows W.swapUp ) -- %! Swap the focused window with the previous window
+
+ -- resizing the master/slave ratio
+ , ((modMask, xK_h ), sendMessage Shrink) -- %! Shrink the master area
+ , ((modMask, xK_l ), sendMessage Expand) -- %! Expand the master area
+
+ -- increase or decrease number of windows in the master area
+ , ((modMask , xK_comma ), sendMessage (IncMasterN 1)) -- %! Increment the number of windows in the master area
+ , ((modMask , xK_period), sendMessage (IncMasterN (-1))) -- %! Deincrement the number of windows in the master area
+
+ -- quit, or restart
+ , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) -- %! Quit metatile
+ , ((modMask , xK_q ), spawn "if type metatile; then metatile --recompile && metatile --restart; else xmessage metatile not in \\$PATH: \"$PATH\"; fi") -- %! Restart metatile
+
+ , ((modMask .|. shiftMask, xK_slash ), spawn ("echo \"" ++ help ++ "\" | xmessage -file -")) -- %! Run xmessage with a summary of the default keybindings (useful for beginners)
+ -- repeat the binding for non-American layout keyboards
+ , ((modMask , xK_question), spawn ("echo \"" ++ help ++ "\" | xmessage -file -"))
+ ]
+ ++
+ -- mod-[1..9] %! Switch to workspace N
+ -- mod-shift-[1..9] %! Move client to workspace N
+ [((m .|. modMask, k), windows $ f i)
+ | (i, k) <- zip (MetaTile.workspaces conf) [xK_1 .. xK_9]
+ , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
+ ++
+ -- 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 .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f))
+ | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
+ , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
+
+-- | Mouse bindings: default actions bound to mouse events
+mouseBindings :: XConfig Layout -> M.Map (KeyMask, Button) (Window -> X ())
+mouseBindings (XConfig {MetaTile.modMask = modMask}) = M.fromList
+ -- mod-button2 %! Raise the window to the top of the stack
+ [ ((modMask, button2), windows . (W.shiftMaster .) . W.focusWindow)
+ -- you may also bind events to the mouse scroll wheel (button4 and button5)
+ ]
+
+instance (a ~ Choose Tall (Choose (Mirror Tall) Full)) => Default (XConfig a) where
+ def = XConfig
+ { MetaTile.workspaces = workspaces
+ , MetaTile.layoutHook = layout
+ , MetaTile.terminal = terminal
+ , MetaTile.normalBorderColor = normalBorderColor
+ , MetaTile.focusedBorderColor = focusedBorderColor
+ , MetaTile.defaultBorderWidth = defaultBorderWidth
+ , MetaTile.modMask = defaultModMask
+ , MetaTile.keys = keys
+ , MetaTile.logHook = logHook
+ , MetaTile.startupHook = startupHook
+ , MetaTile.mouseBindings = mouseBindings
+ , MetaTile.manageHook = manageHook
+ , MetaTile.handleEventHook = handleEventHook
+ , MetaTile.focusFollowsMouse = focusFollowsMouse
+ , MetaTile.clickJustFocuses = clickJustFocuses
+ , MetaTile.clientMask = clientMask
+ , MetaTile.frameMask = frameMask
+ , MetaTile.rootMask = rootMask
+ }
+
+-- | The default set of configuration values itself
+{-# DEPRECATED defaultConfig "Use def (from Data.Default, and re-exported by MetaTile and MetaTile.Config) instead." #-}
+defaultConfig :: XConfig (Choose Tall (Choose (Mirror Tall) Full))
+defaultConfig = def
+
+-- | Finally, a copy of the default bindings in simple textual tabular format.
+help :: String
+help = unlines ["The default modifier key is 'alt'. Default keybindings:",
+ "",
+ "-- launching and killing programs",
+ "mod-Shift-Enter Launch xterminal",
+ "mod-p Launch dmenu",
+ "mod-Shift-p Launch gmrun",
+ "mod-Shift-c Close/kill the focused window",
+ "mod-Space Rotate through the available layout algorithms",
+ "mod-Shift-Space Reset the layouts on the current workSpace to default",
+ "mod-n Resize/refresh viewed windows to the correct size",
+ "",
+ "-- move focus up or down the window stack",
+ "mod-Tab Move focus to the next window",
+ "mod-Shift-Tab Move focus to the previous window",
+ "mod-j Move focus to the next window",
+ "mod-k Move focus to the previous window",
+ "mod-m Move focus to the master window",
+ "",
+ "-- modifying the window order",
+ "mod-Return Swap the focused window and the master window",
+ "mod-Shift-j Swap the focused window with the next window",
+ "mod-Shift-k Swap the focused window with the previous window",
+ "",
+ "-- resizing the master/slave ratio",
+ "mod-h Shrink the master area",
+ "mod-l Expand the master area",
+ "",
+ "-- floating layer support",
+ "mod-t Push window back into tiling; unfloat and re-tile it",
+ "",
+ "-- increase or decrease number of windows in the master area",
+ "mod-comma (mod-,) Increment the number of windows in the master area",
+ "mod-period (mod-.) Deincrement the number of windows in the master area",
+ "",
+ "-- quit, or restart",
+ "mod-Shift-q Quit metatile",
+ "mod-q Restart metatile",
+ "mod-[1..9] Switch to workSpace N",
+ "",
+ "-- Workspaces & screens",
+ "mod-Shift-[1..9] Move client to workspace N",
+ "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",
+ "",
+ "-- Mouse bindings: default actions bound to mouse events",
+ "mod-button1 Set the window to floating mode and move by dragging",
+ "mod-button2 Raise the window to the top of the stack",
+ "mod-button3 Set the window to floating mode and resize by dragging"]