Copyright | (c) 2013 Ben Weitzman <benweitzman@gmail.com> 2015 Anton Pirogov <anton.pirogov@gmail.com> 2019 Mateusz Karbowy <obszczymucha@gmail.com |
---|---|
License | BSD3-style (see LICENSE) |
Maintainer | Ben Weitzman <benweitzman@gmail.com> |
Stability | unstable |
Portability | unportable |
Safe Haskell | None |
Language | Haskell2010 |
Layout where new windows will split the focused window in half, based off of BSPWM
Synopsis
- emptyBSP :: BinarySpacePartition a
- data BinarySpacePartition a
- data Rotate = Rotate
- data Swap = Swap
- data ResizeDirectional where
- ExpandTowardsBy Direction2D Rational
- ShrinkFromBy Direction2D Rational
- MoveSplitBy Direction2D Rational
- pattern ExpandTowards :: Direction2D -> ResizeDirectional
- pattern ShrinkFrom :: Direction2D -> ResizeDirectional
- pattern MoveSplit :: Direction2D -> ResizeDirectional
- data TreeRotate
- data TreeBalance
- data FocusParent = FocusParent
- data SelectMoveNode
- data Direction2D
- newtype SplitShiftDirectional = SplitShift Direction1D
Usage
You can use this module with the following in your ~/.xmonad/xmonad.hs
:
import XMonad.Layout.BinarySpacePartition
Then add the layout, using the default BSP (BinarySpacePartition)
myLayout = emptyBSP ||| etc ..
It may be a good idea to use XMonad.Actions.Navigation2D to move between the windows.
This layout responds to SetGeometry and is compatible with e.g. XMonad.Actions.MouseResize or XMonad.Layout.BorderResize. You should probably try both to decide which is better for you, if you want to be able to resize the splits with the mouse.
If you don't want to use the mouse, add the following key bindings to resize the splits with the keyboard:
, ((modm .|. altMask, xK_l ), sendMessage $ ExpandTowards R) , ((modm .|. altMask, xK_h ), sendMessage $ ExpandTowards L) , ((modm .|. altMask, xK_j ), sendMessage $ ExpandTowards D) , ((modm .|. altMask, xK_k ), sendMessage $ ExpandTowards U) , ((modm .|. altMask .|. ctrlMask , xK_l ), sendMessage $ ShrinkFrom R) , ((modm .|. altMask .|. ctrlMask , xK_h ), sendMessage $ ShrinkFrom L) , ((modm .|. altMask .|. ctrlMask , xK_j ), sendMessage $ ShrinkFrom D) , ((modm .|. altMask .|. ctrlMask , xK_k ), sendMessage $ ShrinkFrom U) , ((modm, xK_r ), sendMessage Rotate) , ((modm, xK_s ), sendMessage Swap) , ((modm, xK_n ), sendMessage FocusParent) , ((modm .|. ctrlMask, xK_n ), sendMessage SelectNode) , ((modm .|. shiftMask, xK_n ), sendMessage MoveNode) , ((modm .|. shiftMask .|. ctrlMask , xK_j ), sendMessage $ SplitShift Prev) , ((modm .|. shiftMask .|. ctrlMask , xK_k ), sendMessage $ SplitShift Next)
Here's an alternative key mapping, this time using additionalKeysP, arrow keys, and slightly different behavior when resizing windows
, ("M-M1-<Left>", sendMessage $ ExpandTowards L) , ("M-M1-<Right>", sendMessage $ ShrinkFrom L) , ("M-M1-<Up>", sendMessage $ ExpandTowards U) , ("M-M1-<Down>", sendMessage $ ShrinkFrom U) , ("M-M1-C-<Left>", sendMessage $ ShrinkFrom R) , ("M-M1-C-<Right>", sendMessage $ ExpandTowards R) , ("M-M1-C-<Up>", sendMessage $ ShrinkFrom D) , ("M-M1-C-<Down>", sendMessage $ ExpandTowards D) , ("M-s", sendMessage $ Swap) , ("M-M1-s", sendMessage $ Rotate) , ("M-S-C-j", sendMessage $ SplitShift Prev) , ("M-S-C-k", sendMessage $ SplitShift Next)
Note that ExpandTowards x
, ShrinkFrom x
, and MoveSplit x
are
the same as respectively ExpandTowardsBy x 0.05
, ShrinkFromBy x 0.05
and MoveSplitBy x 0.05
.
If you have many windows open and the layout begins to look too hard to manage, you can Balance
the layout, so that the current splittings are discarded and windows are tiled freshly in a way that
the split depth is minimized. You can combine this with Equalize
, which does not change your tree,
but tunes the split ratios in a way that each window gets the same amount of space:
, ((myModMask, xK_a), sendMessage Balance) , ((myModMask .|. shiftMask, xK_a), sendMessage Equalize)
emptyBSP :: BinarySpacePartition a Source #
an empty BinarySpacePartition to use as a default for adding windows to.
data BinarySpacePartition a Source #
Instances
Message for rotating a split (horizontal/vertical) in the BSP
Instances
Message Rotate Source # | |
Defined in XMonad.Layout.BinarySpacePartition |
Message for swapping the left child of a split with the right child of split
Instances
Message Swap Source # | |
Defined in XMonad.Layout.BinarySpacePartition |
data ResizeDirectional Source #
Message for resizing one of the cells in the BSP
ExpandTowardsBy Direction2D Rational | |
ShrinkFromBy Direction2D Rational | |
MoveSplitBy Direction2D Rational |
pattern ExpandTowards :: Direction2D -> ResizeDirectional |
|
pattern ShrinkFrom :: Direction2D -> ResizeDirectional |
|
pattern MoveSplit :: Direction2D -> ResizeDirectional |
|
Instances
data TreeRotate Source #
Message for rotating the binary tree around the parent node of the window to the left or right
Instances
Message TreeRotate Source # | |
Defined in XMonad.Layout.BinarySpacePartition |
data TreeBalance Source #
Message to balance the tree in some way (Balance retiles the windows, Equalize changes ratios)
Instances
Message TreeBalance Source # | |
Defined in XMonad.Layout.BinarySpacePartition |
data FocusParent Source #
Message to cyclically select the parent node instead of the leaf
Instances
Message FocusParent Source # | |
Defined in XMonad.Layout.BinarySpacePartition |
data Direction2D Source #
Two-dimensional directions:
Instances
newtype SplitShiftDirectional Source #
Message for shifting window by splitting its neighbour