aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/Common.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Rahm/Desktop/Common.hs')
-rw-r--r--src/Rahm/Desktop/Common.hs42
1 files changed, 28 insertions, 14 deletions
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