XMonad.Hooks.Rescreen

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

Copyright | (c) 2021 Tomáš Janoušek <tomi@nomi.cz>
License | BSD3
Maintainer | Tomáš Janoušek <tomi@nomi.cz>
Safe Haskell | None
Language | Haskell2010

XMonad.Hooks.Rescreen

Contents

- Usage

Description

Custom hooks for screen (xrandr) configuration changes.

Synopsis

- addAfterRescreenHook :: forall (l :: Type -> Type). X () -> XConfig l -> XConfig l
- addRandrChangeHook :: forall (l :: Type -> Type). X () -> XConfig l -> XConfig l
- data RescreenConfig = RescreenConfig {
  - afterRescreenHook :: X ()
  - randrChangeHook :: X ()
  }
- rescreenHook :: forall (l :: Type -> Type). RescreenConfig -> XConfig l -> XConfig l

# Usage

This module provides a replacement for the screen configuration change handling in core that enables attaching custom hooks to screen (xrandr) configuration change events. These can be used to restart/reposition status bars or systrays automatically after xrandr (`dynamicSBs` uses this module internally), as well as to actually invoke xrandr or autorandr when an output is (dis)connected.

To use this, include the following in your `xmonad.hs`:

    import XMonad.Hooks.Rescreen

define your custom hooks:

    myAfterRescreenHook :: X ()
    myAfterRescreenHook = spawn "fbsetroot -solid red"

    myRandrChangeHook :: X ()
    myRandrChangeHook = spawn "autorandr --change"

and hook them into your `xmonad` config:

    main = xmonad $ …
                  . addAfterRescreenHook myAfterRescreenHook
                  . addRandrChangeHook myRandrChangeHook
                  . …
                  $ def{…}

See documentation of `rescreenHook` for details about when these hooks are called.

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

Shortcut for `rescreenHook`.

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

Shortcut for `rescreenHook`.

data RescreenConfig #

Hook configuration for `rescreenHook`.

Constructors

RescreenConfig |
Fields afterRescreenHook :: X () hook to invoke after `rescreen` randrChangeHook :: X () hook for other randr changes, e.g. (dis)connects

#### Instances

Instances details

Default RescreenConfig # |
Instance details Defined in XMonad.Hooks.Rescreen Methods def :: RescreenConfig #
Monoid RescreenConfig # |
Instance details Defined in XMonad.Hooks.Rescreen Methods mempty :: RescreenConfig # mappend :: RescreenConfig -> RescreenConfig -> RescreenConfig # mconcat :: [RescreenConfig] -> RescreenConfig #
Semigroup RescreenConfig # |
Instance details Defined in XMonad.Hooks.Rescreen Methods (<>) :: RescreenConfig -> RescreenConfig -> RescreenConfig # sconcat :: NonEmpty RescreenConfig -> RescreenConfig # stimes :: Integral b => b -> RescreenConfig -> RescreenConfig #

rescreenHook :: forall (l :: Type -> Type). RescreenConfig -> XConfig l -> XConfig l #

Attach custom hooks to screen (xrandr) configuration change events. Replaces the built-in rescreen handling of xmonad core with:

1. listen to `RRScreenChangeNotifyEvent` in addition to `ConfigureEvent` on the root window
2. whenever such event is received:
3. clear any other similar events (Xorg server emits them in bunches)
4. if any event was `ConfigureEvent`, `rescreen` and invoke `afterRescreenHook`
5. if there was no `ConfigureEvent`, invoke `randrChangeHook` only

`afterRescreenHook` is useful for restarting/repositioning status bars and systray.

`randrChangeHook` may be used to automatically trigger xrandr (or perhaps autorandr) when outputs are (dis)connected.

Note that `rescreenHook` is safe to use several times, `rescreen` is still done just once and hooks are invoked in sequence, also just once.