| xmonad-contrib-0.9.1: Third party extensions for xmonad | Source code | Contents | Index

XMonad.Layout.IndependentScreens

Portability | unportable
Stability | unstable
Maintainer | <daniel@wagner-home.com>

Contents

Usage

Description
Utility functions for simulating independent sets of workspaces on each screen (like dwm's workspace model), using internal tags to distinguish workspaces associated with each screen.
Synopsis

type VirtualWorkspace = WorkspaceId
type PhysicalWorkspace = WorkspaceId
workspaces' :: XConfig l -> [VirtualWorkspace]
withScreens :: ScreenId -> [VirtualWorkspace] -> [PhysicalWorkspace]
onCurrentScreen :: (VirtualWorkspace -> WindowSet -> a) -> PhysicalWorkspace -> WindowSet -> a
countScreens :: (MonadIO m, Integral i) => m i
marshall :: ScreenId -> VirtualWorkspace -> PhysicalWorkspace
unmarshall :: PhysicalWorkspace -> (ScreenId, VirtualWorkspace)

Usage

You can use this module with the following in your `~/.xmonad/xmonad.hs`:

     import XMonad.Layout.IndependentScreens

You can define your workspaces by calling `withScreens`:

     myConfig = defaultConfig { workspaces = withScreens 2 ["web", "email", "irc"] }

This will create "physical" workspaces with distinct internal names for each (screen, virtual workspace) pair.

Then edit any keybindings that use the list of workspaces or refer to specific workspace names. In the default configuration, only the keybindings for changing workspace do this:

     [((m .|. modm, k), windows $ f i)
         | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
         , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]

This should change to

     [((m .|. modm, k), windows $ onCurrentScreen f i)
         | (i, k) <- zip (workspaces' conf) [xK_1 .. xK_9]
         , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]

In particular, the analogue of `XMonad.workspaces` is `workspaces'`, and you can use `onCurrentScreen` to convert functions of virtual workspaces to functions of physical workspaces, which work by marshalling the virtual workspace name and the currently focused screen into a physical workspace name.

type VirtualWorkspace = WorkspaceId | Source

type PhysicalWorkspace = WorkspaceId | Source

workspaces' :: XConfig l -> [VirtualWorkspace] | Source

withScreens | Source

:: ScreenId | The number of screens to make workspaces for
-> [VirtualWorkspace] | The desired virtual workspace names
-> [PhysicalWorkspace] | A list of all internal physical workspace names

onCurrentScreen :: (VirtualWorkspace -> WindowSet -> a) -> PhysicalWorkspace -> WindowSet -> a | Source

countScreens :: (MonadIO m, Integral i) => m i | Source

In case you don't know statically how many screens there will be, you can call this in main before starting xmonad. For example, part of my config reads

     main = do
       nScreens <- countScreens
       xmonad $ defaultConfig {
         ...
         workspaces = withScreens nScreens (workspaces defaultConfig),
         ...
         }

marshall :: ScreenId -> VirtualWorkspace -> PhysicalWorkspace | Source

unmarshall :: PhysicalWorkspace -> (ScreenId, VirtualWorkspace) | Source

You shouldn't need to use `marshall` and `unmarshall` very much. They simply convert between the physical and virtual worlds. For example, you might want to use them as part of a status bar configuration. The function `snd . unmarshall` would discard the screen information from an otherwise unsightly workspace name.
Produced by Haddock version 2.4.2