diff options
Diffstat (limited to 'src/Rahm/Desktop')
| -rw-r--r-- | src/Rahm/Desktop/Theater.hs | 28 | ||||
| -rw-r--r-- | src/Rahm/Desktop/XMobarLog.hs | 27 |
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 |