aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Rahm/Desktop/Keys.hs34
-rw-r--r--src/Rahm/Desktop/Layout.hs8
-rw-r--r--src/Rahm/Desktop/Layout/Hole.hs30
3 files changed, 51 insertions, 21 deletions
diff --git a/src/Rahm/Desktop/Keys.hs b/src/Rahm/Desktop/Keys.hs
index 8945201..9b72494 100644
--- a/src/Rahm/Desktop/Keys.hs
+++ b/src/Rahm/Desktop/Keys.hs
@@ -675,6 +675,25 @@ bindings = do
altMod $ spawnX "sudo -A systemctl suspend && xsecurelock"
+ bind xK_x $ do
+ shiftMod $
+ doc "Reset the holes" $ do
+ logs Debug "reset hole"
+ sendMessage resetHole
+ logs Debug "/reset hole"
+
+ justMod $
+ doc "Add hole next to the current window" $ do
+ logs Debug "Add hole"
+ withFocused $ \foc ->
+ withWindowSet $ \ws -> do
+ logs Debug "/Add hole at %s" (show foc)
+ whenJust (W.windowTilePosition foc ws) $ \tp -> do
+ logs Debug "Tile position: %s" (show tp)
+ (X.broadcastMessage . addHole) tp
+ refresh
+ logs Debug "/Add hole"
+
bind xK_space $ do
justMod $
doc "Layout-related bindings" $
@@ -719,12 +738,10 @@ bindings = do
doc "Jump to the middle layout." $
sendMessage (toIndexedLayout (nLayouts `div` 2))
- bind xK_x $
- (noMod -|- justMod) $
- doc "Toggle the hole" $ do
- logs Debug "reset hole"
- sendMessage resetHole
- logs Debug "/reset hole"
+ bind xK_x $ do
+ justMod $
+ doc "Toggles respect for struts." $
+ sendMessage ToggleStruts
bind xK_g
$ (noMod -|- justMod)
@@ -777,11 +794,6 @@ bindings = do
doc "Spawn a floating terminal" $
spawnX =<< asks ((++ " -t Floating\\ Term") . terminal . config)
- bind xK_x $ do
- justMod $
- doc "Toggles respect for struts." $
- sendMessage ToggleStruts
-
bind xK_z $ do
justMod $
doc "Less often used keybindings." $
diff --git a/src/Rahm/Desktop/Layout.hs b/src/Rahm/Desktop/Layout.hs
index 17a7b1e..8c2daf7 100644
--- a/src/Rahm/Desktop/Layout.hs
+++ b/src/Rahm/Desktop/Layout.hs
@@ -41,10 +41,10 @@ import XMonad.Layout.Spacing (Border (..), spacingRaw)
import XMonad.Layout.Spiral (spiral)
myLayout =
- fullscreenFull $
- hole $
- pinnable $
- avoidStruts myLayoutList
+ fullscreenFull $
+ hole $
+ pinnable $
+ avoidStruts myLayoutList
mySpacing = spacingRaw True (Border 5 5 5 5) True (Border 5 5 5 5) True
diff --git a/src/Rahm/Desktop/Layout/Hole.hs b/src/Rahm/Desktop/Layout/Hole.hs
index 8bebb36..4b7eefc 100644
--- a/src/Rahm/Desktop/Layout/Hole.hs
+++ b/src/Rahm/Desktop/Layout/Hole.hs
@@ -8,6 +8,7 @@ module Rahm.Desktop.Layout.Hole
addHoleForWindow,
removeHoleForWindow,
resetHole,
+ addHole,
)
where
@@ -29,7 +30,7 @@ import XMonad
)
data Hole (l :: * -> *) (a :: *)
- = Hole (Map WorkspaceId [(W.TilePosition WorkspaceId, Window)]) (l a)
+ = Hole (Map WorkspaceId [(W.TilePosition WorkspaceId, Maybe Window)]) (l a)
deriving instance Show (l a) => Show (Hole l a)
@@ -46,7 +47,19 @@ addHoleForWindow p@(W.TilePosition wid _) win = ManageHole $ \(Hole m l) ->
Hole
( Map.alter
( \(fromMaybe [] -> existing) ->
- Just $ (p, win) : existing
+ Just $ (p, Just win) : existing
+ )
+ wid
+ m
+ )
+ l
+
+addHole :: W.TilePosition WorkspaceId -> ManageHole
+addHole p@(W.TilePosition wid _) = ManageHole $ \(Hole m l) ->
+ Hole
+ ( Map.alter
+ ( \(fromMaybe [] -> existing) ->
+ Just $ (p, Nothing) : existing
)
wid
m
@@ -57,7 +70,7 @@ removeHoleForWindow :: Window -> ManageHole
removeHoleForWindow win = ManageHole $ \(Hole m l) ->
Hole
( Map.mapMaybe
- (Just . filter ((/= win) . snd))
+ (Just . filter ((/= Just win) . snd))
m
)
l
@@ -85,6 +98,11 @@ instance (LayoutClass l a, a ~ Window) => LayoutClass (Hole l) a where
(rects, maybeNewLayout) <- runLayout (app holes $ W.Workspace t l a) rect
return (filter ((> 0) . fst) rects, fmap (Hole holes) maybeNewLayout)
where
+ app ::
+ (Ord i1) =>
+ Map i1 [(TilePosition i, Maybe Window)] ->
+ W.Workspace i1 l1 Window ->
+ W.Workspace i1 l1 Window
app mp (W.Workspace t l (Just s))
| Just positions <- sortIt <$> Map.lookup t mp =
let integrated = W.integrate s
@@ -96,11 +114,11 @@ instance (LayoutClass l a, a ~ Window) => LayoutClass (Hole l) a where
( \((idx, pos, fakeid), ret) w ->
case pos of
((TilePosition _ n, win) : tpos)
- | n == idx && win `notElem` integrated ->
+ | n == idx && maybe True (`notElem` integrated) win ->
((idx + 1, tpos, fakeid - 1), w : fakeid : ret)
_ -> ((idx + 1, pos, fakeid), w : ret)
)
- ((0, positions, -1), [])
+ ((0, positions, 10000000), [])
integrated
app _ w = w
@@ -108,7 +126,7 @@ instance (LayoutClass l a, a ~ Window) => LayoutClass (Hole l) a where
addr integrated ((idx, pos, fakeid), ret) =
case pos of
- ((TilePosition _ n, win) : _) | n == idx && win `notElem` integrated -> fakeid : ret
+ ((TilePosition _ n, win) : _) | n == idx && maybe True (`notElem` integrated) win -> fakeid : ret
_ -> ret
handleMessage h (fromMessage -> Just (ManageHole f)) =