xmonad-contrib-0.9.1: Third party extensions for xmonad

Portabilityunportable
Stabilityunstable
MaintainerRoman Cheplyaka <roma@ro-che.info>

XMonad.Layout.Monitor

Contents

Description

Layout modfier for displaying some window (monitor) above other windows

Synopsis

Usage

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

 import XMonad.Layout.Monitor

Define Monitor record. monitor can be used as a template. At least prop and rect should be set here. Also consider setting persistent to True.

Minimal example:

 myMonitor = monitor
     { prop = ClassName "SomeClass"
     , rect = Rectangle 0 0 40 20 -- rectangle 40x20 in upper left corner
     }

More interesting example:

 clock = monitor {
      -- Cairo-clock creates 2 windows with the same classname, thus also using title
      prop = ClassName "Cairo-clock" `And` Title "MacSlow's Cairo-Clock"
      -- rectangle 150x150 in lower right corner, assuming 1280x800 resolution
    , rect = Rectangle (1280-150) (800-150) 150 150
      -- avoid flickering
    , persistent = True
      -- make the window transparent
    , opacity = 0.6
      -- hide on start
    , visible = False
      -- assign it a name to be able to toggle it independently of others
    , name = "clock"
    }

Add ManageHook to de-manage monitor windows and apply opacity settings.

 manageHook = myManageHook <+> manageMonitor clock

Apply layout modifier.

 myLayout = ModifiedLayout clock $ tall ||| Full ||| ...

After that, if there exists a window with specified properties, it will be displayed on top of all tiled (not floated) windows on specified position.

It's also useful to add some keybinding to toggle monitor visibility:

 , ((mod1Mask, xK_u     ), broadcastMessage ToggleMonitor >> refresh)

Screenshot: http://www.haskell.org/haskellwiki/Image:Xmonad-clock.png

Hints and issues

  • This module assumes that there is only one window satisfying property exists.
  • If your monitor is available on all layouts, set persistent to True to avoid unnecessary flickering. You can still toggle monitor with a keybinding.
  • You can use several monitors with nested modifiers. Give them names

data Monitor a Source

Constructors

Monitor 

Fields

prop :: Property

property which uniquely identifies monitor window

rect :: Rectangle

specifies where to put monitor

visible :: Bool

is it visible by default?

name :: String

name of monitor (useful when we have many of them)

persistent :: Bool

is it shown on all layouts?

opacity :: Rational

opacity level

monitor :: Monitor aSource

Template for Monitor record. At least prop and rect should be redefined. Default settings: visible is True, persistent is False.

data Property Source

Most of the property constructors are quite self-explaining.

Constructors

Title String 
ClassName String 
Resource String 
Role String

WM_WINDOW_ROLE property

Machine String

WM_CLIENT_MACHINE property

And Property Property 
Or Property Property 
Not Property 
Const Bool 

data MonitorMessage Source

Messages without names affect all monitors. Messages with names affect only monitors whose names match.

doHideIgnore :: ManageHookSource

Hides window and ignores it.

manageMonitor :: Monitor a -> ManageHookSource

ManageHook which demanages monitor window and applies opacity settings.

TODO

  • make Monitor remember the window it manages
  • specify position relative to the screen