mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-08-05 22:51:52 -07:00
Added XMonad.Actions.OnScreen
This commit is contained in:
118
XMonad/Actions/OnScreen.hs
Normal file
118
XMonad/Actions/OnScreen.hs
Normal file
@@ -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
|
@@ -84,6 +84,7 @@ library
|
|||||||
XMonad.Actions.MouseGestures
|
XMonad.Actions.MouseGestures
|
||||||
XMonad.Actions.MouseResize
|
XMonad.Actions.MouseResize
|
||||||
XMonad.Actions.NoBorders
|
XMonad.Actions.NoBorders
|
||||||
|
XMonad.Actions.OnScreen
|
||||||
XMonad.Actions.PerWorkspaceKeys
|
XMonad.Actions.PerWorkspaceKeys
|
||||||
XMonad.Actions.PhysicalScreens
|
XMonad.Actions.PhysicalScreens
|
||||||
XMonad.Actions.Plane
|
XMonad.Actions.Plane
|
||||||
|
Reference in New Issue
Block a user