XMonad.Hooks.EwmhDesktops

xmonad-contrib-0.18.1: Community-maintained extensions for xmonad

Copyright | (c) 2007 2008 Joachim Breitner <mail@joachim-breitner.de>
License | BSD
Maintainer | Joachim Breitner <mail@joachim-breitner.de>
Stability | unstable
Portability | unportable
Safe Haskell | None
Language | Haskell2010

XMonad.Hooks.EwmhDesktops

Contents

- Usage
- Customization
  - Sorting/filtering of workspaces
  - Renaming of workspaces
  - Window activation
  - Fullscreen
  - `_NET_DESKTOP_VIEWPORT`
- Standalone hooks (deprecated)

Description

Makes xmonad use the EWMH hints to tell panel applications about its workspaces and the windows therein. It also allows the user to interact with xmonad by clicking on panels and window lists.

Synopsis

- ewmh :: forall (a :: Type -> Type). XConfig a -> XConfig a
- ewmhFullscreen :: forall (a :: Type -> Type). XConfig a -> XConfig a
- ewmhDesktopsManageHook :: ManageHook
- ewmhDesktopsMaybeManageHook :: MaybeManageHook
- addEwmhWorkspaceSort :: forall (l :: Type -> Type). X WorkspaceSort -> XConfig l -> XConfig l
- setEwmhWorkspaceSort :: forall (l :: Type -> Type). X WorkspaceSort -> XConfig l -> XConfig l
- addEwmhWorkspaceRename :: forall (l :: Type -> Type). X (String -> WindowSpace -> String) -> XConfig l -> XConfig l
- setEwmhWorkspaceRename :: forall (l :: Type -> Type). X (String -> WindowSpace -> String) -> XConfig l -> XConfig l
- setEwmhActivateHook :: forall (l :: Type -> Type). ManageHook -> XConfig l -> XConfig l
- setEwmhFullscreenHooks :: forall (l :: Type -> Type). ManageHook -> ManageHook -> XConfig l -> XConfig l
- disableEwmhManageDesktopViewport :: forall (l :: Type -> Type). XConfig l -> XConfig l
- ewmhDesktopsStartup :: X ()
- ewmhDesktopsLogHook :: X ()
- ewmhDesktopsLogHookCustom :: WorkspaceSort -> X ()
- ewmhDesktopsEventHook :: Event -> X All
- ewmhDesktopsEventHookCustom :: WorkspaceSort -> Event -> X All
- fullscreenEventHook :: Event -> X All
- fullscreenStartup :: X ()

# Usage

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

    import XMonad
    import XMonad.Hooks.EwmhDesktops

    main = xmonad $ … . ewmhFullscreen . ewmh . … $ def{…}

or, if fullscreen handling is not desired, just

    main = xmonad $ … . ewmh . … $ def{…}

You may also be interested in `docks` and `withUrgencyHook`, which provide support for other parts of the EWMH specification.

ewmh :: forall (a :: Type -> Type). XConfig a -> XConfig a #

Add EWMH support for workspaces (virtual desktops) to the given `XConfig`. See above for an example.

ewmhFullscreen :: forall (a :: Type -> Type). XConfig a -> XConfig a #

Add EWMH fullscreen functionality to the given config.

ewmhDesktopsManageHook :: ManageHook #

A `ManageHook` that shifts windows to the workspace they want to be in. Useful for restoring browser windows to where they were before restart.

To only use this for browsers (which might be a good idea, as many apps try to restore their window to their original position, but it's rarely desirable outside of security updates of multi-window apps like a browser), use this:

    stringProperty "WM_WINDOW_ROLE" =? "browser" --> ewmhDesktopsManageHook

ewmhDesktopsMaybeManageHook :: MaybeManageHook #

`ewmhDesktopsManageHook` as a `MaybeManageHook` for use with `composeOne`. Returns `Nothing` if the window didn't indicate any desktop preference, otherwise `Just` (even if the preferred desktop was out of bounds).

# Customization

It's possible to customize the behaviour of `ewmh` in several ways:

## Sorting/filtering of workspaces

The list of workspaces exposed to EWMH pagers (like taffybar and polybar) and clients (such as wmctrl and xdotool) may be sorted and/or filtered via a user-defined function.

To show visible workspaces first, one may switch to a Xinerama-aware sorting function:

    import XMonad.Util.WorkspaceCompare

    mySort = getSortByXineramaRule
    main = xmonad $ … . setEwmhWorkspaceSort mySort . ewmh . … $ def{…}

Another useful example is not exposing the hidden scratchpad workspace:

    import XMonad.Util.NamedScratchpad
    import XMonad.Util.WorkspaceCompare

    myFilter = filterOutWs [scratchpadWorkspaceTag]
    main = xmonad $ … . addEwmhWorkspaceSort (pure myFilter) . ewmh . … $ def{…}

addEwmhWorkspaceSort :: forall (l :: Type -> Type). X WorkspaceSort -> XConfig l -> XConfig l #

Add (compose after) an arbitrary user-specified function to sort/filter the workspace list. The default/initial function is `getSortByIndex`. This can be used to e.g. filter out scratchpad workspaces. Workspaces must not be renamed here.

setEwmhWorkspaceSort :: forall (l :: Type -> Type). X WorkspaceSort -> XConfig l -> XConfig l #

Like `addEwmhWorkspaceSort`, but replace it instead of adding/composing.

## Renaming of workspaces

The workspace names exposed to EWMH pagers and other clients (e.g. arbtt) may be altered using a similar interface to `ppRename`. To configure workspace renaming, use `addEwmhWorkspaceRename`.

As an example, to expose workspaces uppercased:

    import Data.Char

    myRename :: String -> WindowSpace -> String
    myRename s _w = map toUpper s

    main = xmonad $ … . addEwmhWorkspaceRename (pure myRename) . ewmh . … $ def{…}

Some modules like XMonad.Actions.WorkspaceNames provide ready-made integrations:

    import XMonad.Actions.WorkspaceNames

    main = xmonad $ … . workspaceNamesEwmh . ewmh . … $ def{…}

The above ensures workspace names are exposed through EWMH.

addEwmhWorkspaceRename :: forall (l :: Type -> Type). X (String -> WindowSpace -> String) -> XConfig l -> XConfig l #

Add (compose after) an arbitrary user-specified function to rename each workspace. This works just like `ppRename`: the `WindowSpace -> …` acts as a Reader monad. Useful with XMonad.Actions.WorkspaceNames, XMonad.Layout.IndependentScreens, XMonad.Hooks.DynamicIcons.

setEwmhWorkspaceRename :: forall (l :: Type -> Type). X (String -> WindowSpace -> String) -> XConfig l -> XConfig l #

Like `addEwmhWorkspaceRename`, but replace it instead of adding/composing.

## Window activation

When a client sends a `_NET_ACTIVE_WINDOW` request to activate a window, by default that window is activated by invoking the `doFocus` `ManageHook`. The EWMH specification suggests that a window manager may instead just mark the window as urgent, and this can be achieved using the following:

    import XMonad.Hooks.UrgencyHook

    main = xmonad $ … . setEwmhActivateHook doAskUrgent . ewmh . … $ def{…}

One may also wish to ignore activation requests from certain applications entirely:

    import XMonad.Hooks.ManageHelpers

    myActivateHook :: ManageHook
    myActivateHook =
      className /=? "Google-chrome" <&&> className /=? "google-chrome" --> doFocus

    main = xmonad $ … . setEwmhActivateHook myActivateHook . ewmh . … $ def{…}

Arbitrarily complex hooks can be used. This last example marks Chrome windows as urgent and focuses everything else:

    myActivateHook :: ManageHook
    myActivateHook = composeOne
      [ className =? "Google-chrome" <||> className =? "google-chrome" -?> doAskUrgent
      , pure True -?> doFocus ]

See XMonad.ManageHook, XMonad.Hooks.ManageHelpers and XMonad.Hooks.Focus for functions that can be useful here.

setEwmhActivateHook :: forall (l :: Type -> Type). ManageHook -> XConfig l -> XConfig l #

Set (replace) the hook which is invoked when a client sends a `_NET_ACTIVE_WINDOW` request to activate a window. The default is `doFocus` which focuses the window immediately, switching workspace if necessary. `doAskUrgent` is a less intrusive alternative.

More complex hooks can be constructed using combinators from XMonad.ManageHook, XMonad.Hooks.ManageHelpers and XMonad.Hooks.Focus.

## Fullscreen

When a client sends a `_NET_WM_STATE` request to add/remove/toggle the `_NET_WM_STATE_FULLSCREEN` state, `ewmhFullscreen` uses a pair of hooks to make the window fullscreen and revert its state. The default hooks are stateless: windows are fullscreened by turning them into fullscreen floats, and reverted by sinking them into the tiling layer. This behaviour can be configured by supplying a pair of `ManageHook`s to `setEwmhFullscreenHooks`.

See XMonad.Actions.ToggleFullFloat for a pair of hooks that store the original state of floating windows.

setEwmhFullscreenHooks :: forall (l :: Type -> Type). ManageHook -> ManageHook -> XConfig l -> XConfig l #

## `_NET_DESKTOP_VIEWPORT`

Setting `_NET_DESKTOP_VIEWPORT` is typically desired but can lead to a confusing workspace list in polybar, where this information is used to re-group the workspaces by monitor. See polybar#2603.

To avoid this, you can use:

    main = xmonad $ … . disableEwmhManageDesktopViewport . ewmh . … $ def{…}

Note that if you apply this configuration in an already running environment, the property may remain at its previous value. It can be removed by running:

    xprop -root -remove _NET_DESKTOP_VIEWPORT

Which should immediately fix your bar.

disableEwmhManageDesktopViewport :: forall (l :: Type -> Type). XConfig l -> XConfig l #

# Standalone hooks (deprecated)

ewmhDesktopsStartup :: X () #

Deprecated: Use ewmh instead.

Initializes EwmhDesktops and advertises EWMH support to the X server.

ewmhDesktopsLogHook :: X () #

Deprecated: Use ewmh instead.

Notifies pagers and window lists, such as those in the gnome-panel of the current state of workspaces and windows.

ewmhDesktopsLogHookCustom :: WorkspaceSort -> X () #

Deprecated: Use ewmh and addEwmhWorkspaceSort instead.

Generalized version of ewmhDesktopsLogHook that allows an arbitrary user-specified function to sort/filter the workspace list (post-sorting).

ewmhDesktopsEventHook :: Event -> X All #

Deprecated: Use ewmh instead.

Intercepts messages from pagers and similar applications and reacts on them.

Currently supports:

- _NET_CURRENT_DESKTOP (switching desktops)
- _NET_WM_DESKTOP (move windows to other desktops)
- _NET_ACTIVE_WINDOW (activate another window, changing workspace if needed)
- _NET_CLOSE_WINDOW (close window)

ewmhDesktopsEventHookCustom :: WorkspaceSort -> Event -> X All #

Deprecated: Use ewmh and addEwmhWorkspaceSort instead.

Generalized version of ewmhDesktopsEventHook that allows an arbitrary user-specified function to sort/filter the workspace list (post-sorting).

fullscreenEventHook :: Event -> X All #

Deprecated: Use ewmhFullscreen instead.

An event hook to handle applications that wish to fullscreen using the `_NET_WM_STATE` protocol. This includes users of the `gtk_window_fullscreen()` function, such as Totem, Evince and OpenOffice.org.

Note this is not included in `ewmh`.

fullscreenStartup :: X () #

Deprecated: Use ewmhFullscreen instead.

Advertises EWMH fullscreen support to the X server.