XMonad.Hooks.DynamicLog

Usage

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

import XMonad
import XMonad.Hooks.DynamicLog

If you just want a quick-and-dirty status bar with zero effort, try the xmobar or dzen functions:

main = xmonad =<< xmobar myConfig

myConfig = def { ... }

There is also statusBar if you'd like to use another status bar, or would like to use different formatting options. The xmobar, dzen, and statusBar functions are preferred over the other options listed below, as they take care of all the necessary plumbing -- no shell scripting required!

Alternatively, you can choose among several default status bar formats (dynamicLog or dynamicLogXinerama) by simply setting your logHook to the appropriate function, for instance:

main = xmonad $ def {
   ...
   logHook = dynamicLog
   ...
 }

For more flexibility, you can also use dynamicLogWithPP and supply your own pretty-printing format (by either defining one from scratch, or customizing one of the provided examples). For example:

   -- use sjanssen's pretty-printer format, but with the sections
   -- in reverse
   logHook = dynamicLogWithPP $ sjanssenPP { ppOrder = reverse }

Note that setting the logHook only sets up xmonad's output; you are responsible for starting your own status bar program (e.g. dzen or xmobar) and making sure xmonad's output is piped into it appropriately, either by putting it in your .xsession or similar file, or by using spawnPipe in your main function, for example:

import XMonad.Util.Run   -- for spawnPipe and hPutStrLn

main = do
    h <- spawnPipe "xmobar -options -foo -bar"
    xmonad $ def {
      ...
      logHook = dynamicLogWithPP $ def { ppOutput = hPutStrLn h }

If you use spawnPipe, be sure to redefine the ppOutput field of your pretty-printer as in the example above; by default the status will be printed to stdout rather than the pipe you create.

Even if you don't use a statusbar, you can still use dynamicLogString to show on-screen notifications in response to some events. For example, to show the current layout when it changes, you could make a keybinding to cycle the layout and display the current status:

   , ((mod1Mask, xK_a     ), sendMessage NextLayout >> (dynamicLogString myPP >>= xmessage))

Drop-in loggers

xmobarProp Source #

Run xmonad with a property-based xmobar status bar set to some nice defaults.

main = xmonad $ xmobarProp myConfig

myConfig = def { ... }

The intent is that the above config file should provide a nice status bar with minimal effort. Note that you still need to configure xmobar to use the XMonadLog plugin instead of the default StdinReader, see above.

If you wish to customize the status bar format at all, use the modernized interface provided by the XMonad.Hooks.StatusBar and XMonad.Hooks.StatusBar.PP modules instead.

The binding uses the XMonad.Hooks.ManageDocks module to automatically handle screen placement for xmobar, and enables 'mod-b' for toggling the menu bar.

statusBar Source #

Like statusBarProp, but uses pipes instead of property-based logging. Only use this function if your status bar does not support reading from a property of the root window.

dzen Source #

Run xmonad with a dzen status bar set to some nice defaults.

main = xmonad =<< dzen myConfig

myConfig = def { ... }

This works pretty much the same as the xmobar function.

dzenWithFlags Source #

Run xmonad with a dzen status bar with specified dzen command line arguments.

main = xmonad =<< dzenWithFlags flags myConfig

myConfig = def { ... }

flags = "-e onstart lower -w 800 -h 24 -ta l -fg #a8a3f7 -bg #3f3c6d"

This function works much in the same way as the dzen function, only that it can also be used to customize the arguments passed to dzen2, e.g changing the default width and height of dzen2.

You should use this function only when the default dzen function does not serve your purpose.

dynamicLog :: X () Source #

An example log hook, which prints status information to stdout in the default format:

1 2 [3] 4 7 : full : title

That is, the currently populated workspaces, the current workspace layout, and the title of the focused window.

To customize the output format, see dynamicLogWithPP.

dynamicLogXinerama :: X () Source #

Workspace logger with a format designed for Xinerama:

[1 9 3] 2 7

where 1, 9, and 3 are the workspaces on screens 1, 2 and 3, respectively, and 2 and 7 are non-visible, non-empty workspaces.

At the present time, the current layout and window title are not shown. The xinerama workspace format shown above can be (mostly) replicated using dynamicLogWithPP by setting ppSort to getSortByXineramaRule from XMonad.Util.WorkspaceCompare. For example,

def { ppCurrent = dzenColor "red" "#efebe7"
    , ppVisible = wrap "[" "]"
    , ppSort    = getSortByXineramaRule
    }

xmonadPropLog' Source #

Arguments

:: String

Property name

-> String

Message to be written to the property

-> X () 

Write a string to a property on the root window. This property is of type UTF8_STRING.

Build your own formatter

dynamicLogWithPP :: PP -> X () Source #

Format the current status using the supplied pretty-printing format, and write it to stdout.

dynamicLogString :: PP -> X String Source #

The same as dynamicLogWithPP, except it simply returns the status as a formatted string without actually printing it to stdout, to allow for further processing, or use in some application other than a status bar.

data PP Source #

The PP type allows the user to customize the formatting of status information.

Constructors

PP 

Fields

Instances

Instances details
Default PP Source #

The default pretty printing options:

1 2 [3] 4 7 : full : title

That is, the currently populated workspaces, the current workspace layout, and the title of the focused window.

Instance details

Defined in XMonad.Hooks.StatusBar.PP

def :: Default a => a #

The default value for this type.

Example formatters

byorgeyPP :: PP Source #

The options that byorgey likes to use with dzen, as another example.

Formatting utilities

wrap Source #

Wrap a string in delimiters, unless it is empty.

xmobarColor Source #

Use xmobar escape codes to output a string with given foreground and background colors.

xmobarAction Source #

Arguments

:: String

Command. Use of backticks (`) will cause a parse error.

-> String

Buttons 1-5, such as "145". Other characters will cause a parse error.

-> String

Displayed/wrapped text.

-> String 

Encapsulate text with an action. The text will be displayed, and the action executed when the displayed text is clicked. Illegal input is not filtered, allowing xmobar to display any parse errors. Uses xmobar's new syntax wherein the command is surrounded by backticks.

xmobarBorder Source #

Arguments

:: String

Border type. Possible values: VBoth, HBoth, Full, Top, Bottom, Left or Right

-> String

color: a color name, or #rrggbb format

-> Int

width in pixels

-> String

output string

-> String 

Use xmobar box to add a border to an arbitrary string.

xmobarRaw :: String -> String Source #

Encapsulate arbitrary text for display only, i.e. untrusted content if wrapped (perhaps from window titles) will be displayed only, with all tags ignored. Introduced in xmobar 0.21; see their documentation. Be careful not to shorten the result.

dzenColor Source #

Use dzen escape codes to output a string with given foreground and background colors.

filterOutWsPP :: [WorkspaceId] -> PP -> PP Source #

Transforms a pretty-printer into one not displaying the given workspaces.

For example, filtering out the NSP workspace before giving the PP to dynamicLogWithPP:

logHook = dynamicLogWithPP . filterOutWsPP [scratchpadWorkspaceTag] $ def

Here is another example, when using XMonad.Layout.IndependentScreens. If you have handles hLeft and hRight for bars on the left and right screens, respectively, and pp is a pretty-printer function that takes a handle, you could write

logHook = let log screen handle = dynamicLogWithPP . filterOutWsPP [scratchpadWorkspaceTag] . marshallPP screen . pp $ handle
          in log 0 hLeft >> log 1 hRight

Internal formatting functions