aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/StackSet.hs
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2023-12-05 13:38:30 -0700
committerJosh Rahm <rahm@google.com>2023-12-05 13:38:30 -0700
commit12db6e459520f78cfa07cedbc45015f4090066a1 (patch)
tree1fc4baf37038d7c287a6914aecd1542602bbd73a /src/Rahm/Desktop/StackSet.hs
parent3c6488cc3d976fe47dda946b1a5c09828a86f4ec (diff)
downloadrde-12db6e459520f78cfa07cedbc45015f4090066a1.tar.gz
rde-12db6e459520f78cfa07cedbc45015f4090066a1.tar.bz2
rde-12db6e459520f78cfa07cedbc45015f4090066a1.zip
Add ability to tile-drag
Diffstat (limited to 'src/Rahm/Desktop/StackSet.hs')
-rw-r--r--src/Rahm/Desktop/StackSet.hs98
1 files changed, 52 insertions, 46 deletions
diff --git a/src/Rahm/Desktop/StackSet.hs b/src/Rahm/Desktop/StackSet.hs
index 9b027d6..36d41a4 100644
--- a/src/Rahm/Desktop/StackSet.hs
+++ b/src/Rahm/Desktop/StackSet.hs
@@ -1,5 +1,6 @@
module Rahm.Desktop.StackSet
( masterWindow,
+ allVisibleWindows,
windowsOnWorkspace,
findWorkspace,
dbgStackSet,
@@ -16,6 +17,9 @@ module Rahm.Desktop.StackSet
WindowLocation (..),
windowMemberOfWorkspace,
findWindow,
+ sinkBy,
+ modifyWorkspace,
+ getFocusedWindow,
module W,
)
where
@@ -32,52 +36,7 @@ import qualified Data.Map as Map
import Data.Maybe (catMaybes, fromMaybe, listToMaybe)
import Text.Printf (printf)
import XMonad (Rectangle (..), ScreenDetail (..), WindowSet)
-import XMonad.StackSet as W
- ( RationalRect (..),
- Screen (..),
- Stack (..),
- StackSet (..),
- Workspace (..),
- abort,
- allWindows,
- currentTag,
- delete,
- delete',
- differentiate,
- ensureTags,
- filter,
- findTag,
- float,
- focusDown,
- focusDown',
- focusMaster,
- focusUp,
- focusUp',
- focusWindow,
- index,
- insertUp,
- integrate,
- integrate',
- lookupWorkspace,
- mapLayout,
- mapWorkspace,
- member,
- modify,
- modify',
- new,
- peek,
- renameTag,
- screens,
- shift,
- shiftMaster,
- sink,
- swapDown,
- swapMaster,
- swapUp,
- tagMember,
- view,
- workspaces,
- )
+import XMonad.StackSet as W hiding (greedyView, shiftWin)
import qualified XMonad.StackSet (shiftWin)
import Prelude hiding (head)
@@ -91,6 +50,10 @@ getLocationWorkspace (OnScreen (Screen w _ _)) = Just w
getLocationWorkspace (OnHiddenWorkspace w) = Just w
getLocationWorkspace _ = Nothing
+allVisibleWindows :: StackSet i l a s sd -> [a]
+allVisibleWindows =
+ concatMap (W.integrate' . W.stack . W.workspace) <$> W.screens
+
mapWindows :: (Ord a, Ord b) => (a -> b) -> StackSet i l a s sd -> StackSet i l b s sd
mapWindows fn (StackSet cur vis hid float) =
StackSet
@@ -251,3 +214,46 @@ findWindow (StackSet cur vis hid float) win =
windowMemberOfWorkspace :: (Eq a) => Workspace i l a -> a -> Bool
windowMemberOfWorkspace (Workspace _ _ s) w = w `elem` integrate' s
+
+modifyWorkspace :: (Eq i) => i -> (Workspace i l a -> Workspace i l a) -> StackSet i l a s sd -> StackSet i l a s sd
+modifyWorkspace tag fn =
+ mapWorkspace
+ ( \ws ->
+ if W.tag ws == tag
+ then fn ws
+ else ws
+ )
+
+getFocusedWindow :: StackSet i l a s sd -> Maybe a
+getFocusedWindow (StackSet cur _ _ _) = W.focus <$> (W.stack . W.workspace) cur
+
+sinkBy :: (Eq a, Eq i, Ord a) => a -> a -> StackSet i l a s sd -> StackSet i l a s sd
+sinkBy win toSinkBy ss =
+ case (findTag win ss, findTag toSinkBy ss) of
+ (Nothing, _) -> ss
+ (Just w1, Just w2)
+ | w1 == w2 ->
+ modifyWorkspace
+ w1
+ ( \(W.Workspace t l s) ->
+ W.Workspace t l (Just $ insertBy win toSinkBy s)
+ )
+ $ W.delete win ss
+ _ -> W.sink win ss
+ where
+ insertBy win to Nothing = W.Stack win [] []
+ insertBy win to (Just (W.Stack foc down up)) =
+ case () of
+ ()
+ | to `elem` down ->
+ W.Stack
+ foc
+ (concatMap (\e -> if e == to then [e, win] else [e]) down)
+ up
+ ()
+ | to `elem` up ->
+ W.Stack
+ foc
+ down
+ (concatMap (\e -> if e == to then [win, e] else [e]) up)
+ () -> W.Stack win (foc : down) up