aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad/Actions
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--XMonad/Actions/OnScreen.hs118
1 files changed, 118 insertions, 0 deletions
diff --git a/XMonad/Actions/OnScreen.hs b/XMonad/Actions/OnScreen.hs
new file mode 100644
index 0000000..3b37300
--- /dev/null
+++ b/XMonad/Actions/OnScreen.hs
@@ -0,0 +1,118 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : XMonad.Actions.OnScreen
+-- Copyright : (c) 2009 Nils Schweinsberg
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : Nils Schweinsberg <mail@n-sch.de>
+-- Stability : unstable
+-- Portability : unportable
+--
+-- Control workspaces on different screens (in xinerama mode).
+--
+-----------------------------------------------------------------------------
+
+module XMonad.Actions.OnScreen (
+ -- * Usage
+ -- $usage
+ onScreen
+ , viewOnScreen
+ , greedyViewOnScreen
+ , onlyOnScreen
+ ) where
+
+import XMonad.StackSet
+import Data.List
+
+-- $usage
+--
+-- This module provides an easy way to control, what you see on other screens in
+-- xinerama mode without having to focus them. Put this into your
+-- @~\/.xmonad\/xmonad.hs@:
+--
+-- > import XMonad.Actions.OnScreen
+--
+-- Then add the appropriate keybindings, for example replace your current keys
+-- to switch the workspaces with this at the bottom of your keybindings:
+--
+-- > ++
+-- > [ ((m .|. modMask, k), windows (f i))
+-- > | (i, k) <- zip (workspaces conf) ([xK_1 .. xK_9] ++ [xK_0])
+-- > , (f, m) <- [ (viewOnScreen 0, 0)
+-- > , (viewOnScreen 1, controlMask)
+-- > , (greedyView, controlMask .|. shiftMask) ]
+-- > ]
+--
+-- This will provide you with the following keybindings:
+--
+-- * modkey + 1-0:
+-- Switch to workspace 1-0 on screen 0
+--
+-- * modkey + control + 1-0:
+-- Switch to workspace 1-0 on screen 1
+--
+-- * modkey + control + shift + 1-0:
+-- Default greedyView behaviour
+--
+--
+-- A more basic version inside the default keybindings would be:
+--
+-- > , ((modMask .|. controlMask, xK_1) windows (viewOnScreen 0 "1"))
+--
+-- where 0 is the first screen and "1" the workspace with the tag "1".
+--
+-- For detailed instructions on editing your key bindings, see
+-- "XMonad.Doc.Extending#Editing_key_bindings".
+
+-- | Switch to the (hidden) workspace with index 'i' on the screen 'sc'.
+-- A default function (for example 'view' or 'greedyView') will be run if 'sc' is
+-- the current screen, no valid screen id or workspace 'i' is already visible.
+onScreen :: (Eq sid, Eq i)
+ => (i -> StackSet i l a sid sd -> StackSet i l a sid sd) -- ^ default action
+ -> sid -- ^ screen id
+ -> i -- ^ index of the workspace
+ -> StackSet i l a sid sd -- ^ current stack
+ -> StackSet i l a sid sd
+onScreen defFunc sc i st
+ | screen (current st) /= sc =
+ case ( find ((i==) . tag) (hidden st)
+ , find ((sc==) . screen) (screens st)
+ , find ((sc==) . screen) (visible st)) of
+
+ (Just x, Just s, Just o) ->
+ let newScreen = s { workspace = x }
+ in st { visible = newScreen : (deleteBy (equating screen) newScreen (visible st))
+ , hidden = (workspace o) : (deleteBy (equating tag) x (hidden st))
+ }
+ _ -> defFunc i st -- no valid screen id/workspace already visible
+
+ | otherwise = defFunc i st -- on current screen
+
+ where equating f x y = f x == f y
+
+-- | Switch to workspace 'i' on screen 'sc'. If 'i' is visible use 'greedyView'
+-- to switch the current workspace with workspace 'i'.
+greedyViewOnScreen :: (Eq sid, Eq i)
+ => sid -- ^ screen id
+ -> i -- ^ index of the workspace
+ -> StackSet i l a sid sd -- ^ current stack
+ -> StackSet i l a sid sd
+greedyViewOnScreen = onScreen greedyView
+
+-- | Switch to workspace 'i' on screen 'sc'. If 'i' is visible use 'view' to
+-- switch focus to the workspace 'i'.
+viewOnScreen :: (Eq sid, Eq i)
+ => sid -- ^ screen id
+ -> i -- ^ index of the workspace
+ -> StackSet i l a sid sd -- ^ current stack
+ -> StackSet i l a sid sd
+viewOnScreen = onScreen view
+
+-- | Switch to workspace 'i' on screen 'sc'. If 'i' is visible do nothing.
+onlyOnScreen :: (Eq sid, Eq i)
+ => sid -- ^ screen id
+ -> i -- ^ index of the workspace
+ -> StackSet i l a sid sd -- ^ current stack
+ -> StackSet i l a sid sd
+onlyOnScreen = onScreen doNothing
+ where doNothing _ st = st