aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Rahm/Desktop/Theater.hs28
-rw-r--r--src/Rahm/Desktop/XMobarLog.hs27
2 files changed, 42 insertions, 13 deletions
diff --git a/src/Rahm/Desktop/Theater.hs b/src/Rahm/Desktop/Theater.hs
index 5c324ab..d000f75 100644
--- a/src/Rahm/Desktop/Theater.hs
+++ b/src/Rahm/Desktop/Theater.hs
@@ -10,7 +10,7 @@ import qualified XMonad.StackSet as W
import qualified XMonad.Util.ExtensibleState as XS
import XMonad (X)
-import Data.List ((\\))
+import Data.List ((\\), sortOn)
import Data.Typeable
import Data.Proxy
import Data.Maybe
@@ -19,6 +19,8 @@ import Control.Monad (forM_)
import Data.Map (Map)
import qualified Data.Map as Map
+import Rahm.Desktop.Logger
+
type WinSet = W.StackSet X.WorkspaceId String X.Window X.ScreenId X.ScreenDetail
newtype Theater = Theater WinSet
@@ -41,10 +43,22 @@ instance X.ExtensionClass Theaters where
getCurrentTheaterName :: X TheaterName
getCurrentTheaterName = currentTheater <$> XS.get
+getTheaters :: X [(TheaterName, Theater, Bool)]
+getTheaters = do
+ (Theaters cur theaters) <- XS.get
+ return $
+ sortOn (\(s, _, _) -> s) $
+ map (\(name, theater) -> (name, theater, name == cur)) $
+ filter (\(name, Theater ws) -> not (isStackSetEmpty "*" ws) || name == cur) $
+ Map.toList theaters
+
saveTheater :: TheaterName -> X.WindowSet -> X ()
-saveTheater name ws =
+saveTheater name ws = do
XS.modify $ \(Theaters cur map) ->
- Theaters cur $ Map.insert name (Theater $ unboxLayout ws) map
+ Theaters cur $ do
+ if isStackSetEmpty "*" ws && not (name == cur)
+ then Map.delete name map
+ else Map.insert name (Theater $ unboxLayout ws) map
where
unboxLayout = W.mapLayout show
@@ -79,11 +93,17 @@ restoreTheater name = do
let newStackSet = updateStateWithWindows (W.allWindows currentWindowset) "*" newStackSet'
saveTheater Nothing currentWindowset
- saveTheater name newStackSet
XS.modify $ \(Theaters _ m) -> Theaters name m
+ saveTheater name newStackSet
X.windows $ const newStackSet
+isStackSetEmpty ::
+ (Eq i, Eq a) => i -> W.StackSet i l a si sd -> Bool
+isStackSetEmpty hiddenWorkspace = all (
+ \(W.Workspace t l s) -> isNothing s || t == hiddenWorkspace ) . W.workspaces
+
+
updateStateWithWindows ::
(Eq i, Eq a) => [a] -> i -> W.StackSet i l a si sd -> W.StackSet i l a si sd
updateStateWithWindows allWindows hiddenWorkspace ss =
diff --git a/src/Rahm/Desktop/XMobarLog.hs b/src/Rahm/Desktop/XMobarLog.hs
index 9ea8bad..e419739 100644
--- a/src/Rahm/Desktop/XMobarLog.hs
+++ b/src/Rahm/Desktop/XMobarLog.hs
@@ -4,7 +4,7 @@ import Control.Arrow (second)
import Control.Monad (forM_)
import Control.Monad.Writer (tell, execWriter)
import Data.List (sortBy)
-import Data.Maybe (mapMaybe)
+import Data.Maybe (mapMaybe, isJust)
import Data.Ord (comparing)
import Data.Char (isAsciiLower, isAsciiUpper, isDigit)
import Rahm.Desktop.Layout.Draw (drawLayout)
@@ -15,7 +15,7 @@ import XMonad (X)
import Rahm.Desktop.Workspaces (getPopulatedWorkspaces, WorkspaceState(..))
import Text.Printf
import Rahm.Desktop.Logger
-import Rahm.Desktop.Theater (getCurrentTheaterName)
+import Rahm.Desktop.Theater (getTheaters)
import qualified XMonad as X
import qualified Rahm.Desktop.StackSet as S
@@ -42,7 +42,7 @@ xMobarLogHook (XMobarLog xmproc) = do
(_, _, layoutXpm) <- drawLayout
loglevel <- getLogLevel
- currentTheater <- getCurrentTheaterName
+ theaters <- filter (\(j, _, _) -> isJust j) <$> getTheaters
winset <- X.gets X.windowset
title <- maybe (pure "") (fmap show . getName) . S.peek $ winset
@@ -54,13 +54,22 @@ xMobarLogHook (XMobarLog xmproc) = do
tell " "
tell $ logLevelToXMobar loglevel
- case currentTheater of
- Just theater -> do
- tell "<fn=1><fc=#ffffff>["
- tell theater
- tell "] </fc></fn>"
+ forM_ theaters $ \theater -> case theater of
+ (Just n, _, True) -> do
+ tell "<fn=1><fc=#ffffff>"
+ tell n
+ tell " </fc></fn>"
- Nothing -> tell " "
+ (Just n, _, False) -> do
+ tell "<fn=2><fc=#888888>"
+ tell n
+ tell " </fc></fn>"
+
+ _ -> return ()
+
+ if not (null theaters)
+ then tell "| "
+ else return ()
forM_ wss $ \(t, ws) -> do
case t of