xmonad- A tiling window manager
Copyright(c) Spencer Janssen 2007
LicenseBSD3-style (see LICENSE)
Portabilitynot portable, mtl, posix
Safe HaskellSafe-Inferred



Operations. A module for functions that don't cleanly fit anywhere else.


Manage One Window

manage :: Window -> X () Source #

Add a new window to be managed in the current workspace. Bring it into focus.

Whether the window is already managed, or not, it is mapped, has its border set, and its event mask set.

unmanage :: Window -> X () Source #

A window no longer exists; remove it from the window list, on whatever workspace it is.

killWindow :: Window -> X () Source #

Kill the specified window. If we do kill it, we'll get a delete notify back from X.

There are two ways to delete a window. Either just kill it, or if it supports the delete protocol, send a delete event (e.g. firefox)

kill :: X () Source #

Kill the currently focused client.

isClient :: Window -> X Bool Source #

Is the window is under management by xmonad?

setInitialProperties :: Window -> X () Source #

Set some properties when we initially gain control of a window.

setWMState :: Window -> Int -> X () Source #

Set a window's WM_STATE property.

setWindowBorderWithFallback :: Display -> Window -> String -> Pixel -> X () Source #

Set the border color using the window's color map, if possible; otherwise fall back to the color in Pixel.

hide :: Window -> X () Source #

Hide a window by unmapping it and setting Iconified.

reveal :: Window -> X () Source #

Show a window by mapping it and setting Normal. This is harmless if the window was already visible.

tileWindow :: Window -> Rectangle -> X () Source #

Move and resize w such that it fits inside the given rectangle, including its border.

setTopFocus :: X () Source #

Set the focus to the window on top of the stack, or root

focus :: Window -> X () Source #

Set focus explicitly to window w if it is managed by us, or root. This happens if X notices we've moved the mouse (and perhaps moved the mouse to a new screen).

isFixedSizeOrTransient :: Display -> Window -> X Bool Source #

Detect whether a window has fixed size or is transient. This check can be used to determine whether the window should be floating or not

Manage Windows

windows :: (WindowSet -> WindowSet) -> X () Source #

Modify the current window list with a pure function, and refresh

refresh :: X () Source #

Render the currently visible workspaces, as determined by the StackSet. Also, set focus to the focused window.

This is our view operation (MVC), in that it pretty prints our model with X calls.

rescreen :: X () Source #

The screen configuration may have changed (due to -- xrandr), update the state and refresh the screen, and reset the gap.

modifyWindowSet :: (WindowSet -> WindowSet) -> X () Source #

Modify the WindowSet in state with no special handling.

windowBracket :: (a -> Bool) -> X a -> X a Source #

Perform an X action and check its return value against a predicate p. If p holds, unwind changes to the WindowSet and replay them using windows.

windowBracket_ :: X Any -> X () Source #

Perform an X action. If it returns Any True, unwind the changes to the WindowSet and replay them using windows. This is a version of windowBracket that discards the return value and handles an X action that reports its need for refresh via Any.

clearEvents :: EventMask -> X () Source #

Remove all events of a given type from the event queue.

getCleanedScreenInfo :: MonadIO m => Display -> m [Rectangle] Source #

Clean the list of screens according to the rules documented for nubScreens.

withFocused :: (Window -> X ()) -> X () Source #

Apply an X operation to the currently focused window, if there is one.

withUnfocused :: (Window -> X ()) -> X () Source #

Apply an X operation to all unfocused windows on the current workspace, if there are any.

Keyboard and Mouse

cleanMask :: KeyMask -> X KeyMask Source #

Strip numlock/capslock from a mask.

extraModifiers :: X [KeyMask] Source #

Combinations of extra modifier masks we need to grab keys/buttons for. (numlock and capslock)

mouseDrag :: (Position -> Position -> X ()) -> X () -> X () Source #

Accumulate mouse motion events

mouseMoveWindow :: Window -> X () Source #

Drag the window under the cursor with the mouse while it is dragged.

mouseResizeWindow :: Window -> X () Source #

Resize the window under the cursor with the mouse while it is dragged.

setButtonGrab :: Bool -> Window -> X () Source #

Tell whether or not to intercept clicks on a given window

setFocusX :: Window -> X () Source #

Call X to set the keyboard focus details.

mkGrabs :: [(KeyMask, KeySym)] -> X [(KeyMask, KeyCode)] Source #

Given a list of keybindings, turn the given KeySyms into actual KeyCodes and prepare them for grabbing.

unGrab :: X () Source #

Release XMonad's keyboard grab, so other grabbers can do their thing.

Start a keyboard action with this if it is going to run something that needs to do a keyboard, pointer, or server grab. For example,

, ((modm .|. controlMask, xK_p), unGrab >> spawn "scrot")

(Other examples are certain screen lockers and "gksu".) This avoids needing to insert a pause/sleep before running the command.

XMonad retains the keyboard grab during key actions because if they use a submap, they need the keyboard to be grabbed, and if they had to assert their own grab then the asynchronous nature of X11 allows race conditions between XMonad, other clients, and the X server that would cause keys to sometimes be "leaked" to the focused window.


sendMessage :: Message a => a -> X () Source #

Throw a message to the current LayoutClass possibly modifying how we layout the windows, in which case changes are handled through a refresh.

broadcastMessage :: Message a => a -> X () Source #

Send a message to all layouts, without refreshing.

sendMessageWithNoRefresh :: Message a => a -> WindowSpace -> X () Source #

Send a message to a layout, without refreshing.

sendRestart :: IO () Source #

Signal xmonad to restart itself.

sendReplace :: IO () Source #

Signal compliant window managers to exit.

Save and Restore State

data StateFile Source #

A type to help serialize xmonad's state to a file.


Instances details
Read StateFile Source # 
Instance details

Defined in XMonad.Operations

Show StateFile Source # 
Instance details

Defined in XMonad.Operations

writeStateToFile :: X () Source #

Write the current window state (and extensible state) to a file so that xmonad can resume with that state intact.

readStateFile :: (LayoutClass l Window, Read (l Window)) => XConfig l -> X (Maybe XState) Source #

Read the state of a previous xmonad instance from a file and return that state. The state file is removed after reading it.

restart :: String -> Bool -> X () Source #

restart name resume attempts to restart xmonad by executing the program name. If resume is True, restart with the current window state. When executing another window manager, resume should be False.

Floating Layer

float :: Window -> X () Source #

Make a tiled window floating, using its suggested rectangle

floatLocation :: Window -> X (ScreenId, RationalRect) Source #

Given a window, find the screen it is located on, and compute the geometry of that window WRT that screen.

Window Size Hints

type D = (Dimension, Dimension) Source #

An alias for a (width, height) pair

mkAdjust :: Window -> X (D -> D) Source #

Given a window, build an adjuster function that will reduce the given dimensions according to the window's border width and size hints.

applySizeHints :: Integral a => Dimension -> SizeHints -> (a, a) -> D Source #

Reduce the dimensions if needed to comply to the given SizeHints, taking window borders into account.

applySizeHints' :: SizeHints -> D -> D Source #

Use X11 size hints to scale a pair of dimensions.

applySizeHintsContents :: Integral a => SizeHints -> (a, a) -> D Source #

Reduce the dimensions if needed to comply to the given SizeHints.

applyAspectHint :: (D, D) -> D -> D Source #

Reduce the dimensions so their aspect ratio falls between the two given aspect ratios.

applyResizeIncHint :: D -> D -> D Source #

Reduce the dimensions so they are a multiple of the size increments.

applyMaxSizeHint :: D -> D -> D Source #

Reduce the dimensions if they exceed the given maximum dimensions.


containedIn :: Rectangle -> Rectangle -> Bool Source #

Returns True if the first rectangle is contained within, but not equal to the second.

nubScreens :: [Rectangle] -> [Rectangle] Source #

Given a list of screens, remove all duplicated screens and screens that are entirely contained within another.

pointWithin :: Position -> Position -> Rectangle -> Bool Source #

pointWithin x y r returns True if the (x, y) co-ordinate is within r.

scaleRationalRect :: Rectangle -> RationalRect -> Rectangle Source #

Produce the actual rectangle from a screen and a ratio on that screen.

Other Utilities

initColor :: Display -> String -> IO (Maybe Pixel) Source #

Get the Pixel value for a named color.

pointScreen :: Position -> Position -> X (Maybe (Screen WorkspaceId (Layout Window) Window ScreenId ScreenDetail)) Source #

Given a point, determine the screen (if any) that contains it.

screenWorkspace :: ScreenId -> X (Maybe WorkspaceId) Source #

Return workspace visible on screen sc, or Nothing.

setLayout :: Layout Window -> X () Source #

Set the layout of the currently viewed workspace.

updateLayout :: WorkspaceId -> Maybe (Layout Window) -> X () Source #

Update the layout field of a workspace.