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 }