diff --git a/XMonad/Util/ClickableWorkspaces.hs b/XMonad/Util/ClickableWorkspaces.hs index 65833922..746983cc 100644 --- a/XMonad/Util/ClickableWorkspaces.hs +++ b/XMonad/Util/ClickableWorkspaces.hs @@ -18,12 +18,20 @@ module XMonad.Util.ClickableWorkspaces ( -- * Usage -- $usage clickablePP, - clickableWrap + clickableRenamedPP, + clickableWrap, + + -- * Integrations + clickableWorkspaceNamesPP, + clickableMarshallPP, + clickableMarshallWorkspaceNamesPP ) where import XMonad -import XMonad.Util.WorkspaceCompare (getWsIndex) +import XMonad.Actions.WorkspaceNames import XMonad.Hooks.DynamicLog (xmobarAction, xmobarRaw, PP(..)) +import XMonad.Layout.IndependentScreens +import XMonad.Util.WorkspaceCompare (getWsIndex) -- $usage -- However you have set up your PP, apply @clickablePP@ to it, and bind the result @@ -41,17 +49,24 @@ clickableWrap :: Int -> String -> String clickableWrap i ws = xmobarAction ("xdotool set_desktop " ++ show i) "1" $ xmobarRaw ws -- | Use index of workspace in users config to target workspace with @xdotool@ switch. -getClickable :: X (WorkspaceId -> String) -getClickable = do +getClickable :: (WorkspaceId -> String) -> X (WorkspaceId -> String) +getClickable ren = do wsIndex <- getWsIndex return $ \ws -> case wsIndex ws of - Just idx -> clickableWrap idx ws + Just idx -> clickableWrap idx (ren ws) Nothing -> ws -- | Apply clickable wrapping to all workspace fields in given PP. clickablePP :: PP -> X PP -clickablePP pp = do - clickable <- getClickable +clickablePP = clickableRenamedPP id + +-- | Alternative to 'clickablePP' that allows changing the visible workspace +-- name. Useful for integration with modules that change workspace names, such +-- as "XMonad.Layout.IndependentScreens" and "XMonad.Actions.WorkspaceNames". +-- See "XMonad.Util.ClickableWorkspaces.Integrations". +clickableRenamedPP :: (WorkspaceId -> String) -> PP -> X PP +clickableRenamedPP ren pp = do + clickable <- getClickable ren return $ pp { ppCurrent = ppCurrent pp . clickable , ppVisible = ppVisible pp . clickable @@ -59,3 +74,21 @@ clickablePP pp = do , ppHiddenNoWindows = ppHiddenNoWindows pp . clickable , ppUrgent = ppUrgent pp . clickable } + +-- | Integration with "XMonad.Actions.WorkspaceNames". +clickableWorkspaceNamesPP :: PP -> X PP +clickableWorkspaceNamesPP pp = do + rename <- getWorkspaceNames + clickableRenamedPP rename pp + +-- | Integration with "XMonad.Layout.IndependentScreens". +clickableMarshallPP :: ScreenId -> PP -> X PP +clickableMarshallPP s pp = + clickableRenamedPP unmarshallW pp{ ppSort = marshallSort s <$> ppSort pp } + +-- | Integration with both "XMonad.Actions.WorkspaceNames" and +-- "XMonad.Layout.IndependentScreens". +clickableMarshallWorkspaceNamesPP :: ScreenId -> PP -> X PP +clickableMarshallWorkspaceNamesPP s pp = do + rename <- getWorkspaceNames + clickableRenamedPP (unmarshallW . rename) pp{ ppSort = marshallSort s <$> ppSort pp }