From 215182bbb8f3cf8e92b56371e24e1bc45ab22f88 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Wed, 5 Mar 2025 12:53:40 -0700 Subject: Ability to move multiple windows at once. --- src/Rahm/Desktop/Common.hs | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) (limited to 'src/Rahm/Desktop/Common.hs') diff --git a/src/Rahm/Desktop/Common.hs b/src/Rahm/Desktop/Common.hs index ae4f531..6fe9364 100644 --- a/src/Rahm/Desktop/Common.hs +++ b/src/Rahm/Desktop/Common.hs @@ -19,14 +19,15 @@ module Rahm.Desktop.Common pointerLocation, pointerWindow, getDisplayAndRoot, + floatAll, Location (..), - Xish(..), + Xish (..), ) where import Control.Applicative ((<*)) import Control.Exception (SomeException (SomeException), catch) -import Control.Monad (forM_, void, when) +import Control.Monad (forM_, guard, void, when) import Control.Monad.Trans.Class import Control.Monad.Trans.Except (ExceptT (..), catchE, runExceptT, throwE) import Control.Monad.Trans.Identity (IdentityT (..)) @@ -37,23 +38,13 @@ import Data.List (concatMap, isInfixOf, map, (++)) import Data.List.Safe (head, tail) import Data.List.Split (splitOn) import qualified Data.Map as Map (fromListWith) -import Data.Maybe (Maybe (..), maybe) +import Data.Maybe (Maybe (..), fromMaybe, maybe) +import Data.Monoid (Endo (..)) import Data.Void (Void (..), absurd) import Data.Word (Word32) import Rahm.Desktop.DMenu (runDMenuPromptWithMap, runDMenuPromptWithMapMulti) import Rahm.Desktop.Logger import qualified Rahm.Desktop.StackSet as S - ( Screen (Screen, workspace), - StackSet (StackSet, current), - Workspace (Workspace, stack, tag), - allWindows, - focusWindow, - greedyView, - integrate', - peek, - shiftWin, - workspaces, - ) import Text.Printf (printf) import XMonad ( ScreenId, @@ -248,6 +239,29 @@ duplWindow = runQuery $ do _ -> return () Left err -> logs Info "%s" (err :: String) +floatAll :: [Window] -> X () +floatAll ws = do + -- (sc, rr) <- X.floatLocation w + locs <- mapM (\w -> (w,) <$> X.floatLocation w) ws + + let (Endo endo) = + mconcat $ + map + ( \(w, (sc, rr)) -> + Endo + ( \ws -> + S.float w rr . fromMaybe ws $ do + i <- S.findTag w ws + guard $ i `elem` map (S.tag . S.workspace) (S.screens ws) + f <- S.peek ws + sw <- S.lookupWorkspace sc ws + return (S.focusWindow f . S.shiftWin sw w $ ws) + ) + ) + locs + + windows endo + class (Monad m) => Xish m where liftFromX :: X a -> m a -- cgit