aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-04-19 22:45:32 -0600
committerJosh Rahm <joshuarahm@gmail.com>2022-10-09 12:19:46 -0600
commitc2d0c6b0b699513ede65ecef40d7afaccff53ee4 (patch)
treeb78366ce6f9eaf0b0b2f37e39a398209f79835a8 /src
parent29d59e1dbbf3d47247c10813432895cb60a458ab (diff)
downloadrde-c2d0c6b0b699513ede65ecef40d7afaccff53ee4.tar.gz
rde-c2d0c6b0b699513ede65ecef40d7afaccff53ee4.tar.bz2
rde-c2d0c6b0b699513ede65ecef40d7afaccff53ee4.zip
Add :: object to tile windows onto a workspace
Diffstat (limited to 'src')
-rw-r--r--src/Rahm/Desktop/Keys/Wml.hs33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/Rahm/Desktop/Keys/Wml.hs b/src/Rahm/Desktop/Keys/Wml.hs
index babf3b5..0dfb852 100644
--- a/src/Rahm/Desktop/Keys/Wml.hs
+++ b/src/Rahm/Desktop/Keys/Wml.hs
@@ -17,9 +17,10 @@ module Rahm.Desktop.Keys.Wml where
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.State as S
import Control.Monad.Trans.Class
-import Control.Monad (join, forM_)
+import Control.Monad (join, forM_, unless)
import Data.List (sortOn, intercalate)
import Data.Ord (Down(..))
+import Data.Typeable (cast)
import qualified Data.Map as Map
import Data.Char (isAlphaNum, isAlpha, isDigit, ord)
@@ -43,10 +44,11 @@ import Text.Printf
import XMonad
data Workspace =
- Workspace {
+ forall a. (Typeable a) => Workspace {
moveLocationToWorkspaceFn :: Location -> X ()
, gotoWorkspaceFn :: X ()
, workspaceName :: String
+ , extraWorkspaceData :: a
}
justWorkspace :: String -> Workspace
@@ -55,6 +57,7 @@ justWorkspace s =
moveLocationToWorkspaceFn = flip moveLocationToWorkspace s
, gotoWorkspaceFn = gotoWorkspace s
, workspaceName = s
+ , extraWorkspaceData = ()
}
blackHoleWorkspace :: Workspace
@@ -63,6 +66,7 @@ blackHoleWorkspace =
moveLocationToWorkspaceFn = mapM_ killWindow . locationWindow
, gotoWorkspaceFn = return () -- can't navigate to black hole
, workspaceName = "blackhole"
+ , extraWorkspaceData = ()
}
alternateWorkspace :: Workspace
@@ -85,19 +89,32 @@ alternateWorkspace =
mapM_ gotoWorkspace =<< getAlternateWorkspace win
, workspaceName = "@"
+ , extraWorkspaceData = ()
}
+newtype FloatWorkspace = FloatWorkspace Workspace
+
floatWorkspace :: Workspace -> Workspace
-floatWorkspace ws =
+floatWorkspace ws@Workspace { extraWorkspaceData = d } =
Workspace {
moveLocationToWorkspaceFn = \location -> do
+
forM_ (locationWindow location) $ \win -> do
- logs $ "Float " ++ show win
- windows $ W.float win (W.RationalRect 0 0 100 100)
- withWindowSet $ logs . show . W.floating
- moveLocationToWorkspaceFn ws location
+ case cast d of
+ Just (FloatWorkspace ws') -> do
+ windows $ W.sink win
+ moveLocationToWorkspaceFn ws' location
+ Nothing -> do
+ windows $ \ss ->
+ if win `Map.member` W.floating ss
+ then ss -- win is already floating
+ else W.float win (W.RationalRect (1/8) (1/8) (6/8) (6/8)) ss
+ moveLocationToWorkspaceFn ws location
+
+
, gotoWorkspaceFn = gotoWorkspaceFn ws
, workspaceName = workspaceName ws
+ , extraWorkspaceData = FloatWorkspace ws
}
joinMaybe :: (Monad m) => MaybeT m (Maybe a) -> MaybeT m a
@@ -248,7 +265,7 @@ readNextLocationSet =
ret <- mapM windowLocation =<< lift (withWindowSet (return . sortOn Down . W.allWindows))
lift $ logs $ "allWindows " ++ intercalate "\n" (map show ret)
return ret
- (_, _, "@") ->
+ (_, _, s) | s == "\t" || s == "@" || s == "\n" ->
(mt . windowsInWorkspace . workspaceName) =<< readNextWorkspace
(_, _, "!") -> (:[]) <$> joinMaybe (head <$> readNextLocationSet)
(_, _, ",") -> tail <$> readNextLocationSet