From c6b4e69f39159b07e0de7c75e6d15bfccb9fbc0a Mon Sep 17 00:00:00 2001 From: Tomas Janousek <tomi@nomi.cz> Date: Wed, 3 Feb 2021 00:41:15 +0000 Subject: [PATCH] X.U.ClickableWorkspaces: Add integrations with X.L.IndependentScreens and X.A.WorkspaceNames Having these work together isn't entirely trivial so let's provide the integrations. Related: https://github.com/xmonad/xmonad-contrib/pull/390 --- XMonad/Util/ClickableWorkspaces.hs | 47 +++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 7 deletions(-) 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 }