diff --git a/CHANGES.md b/CHANGES.md index e2848bf4..bc4c9a47 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -62,6 +62,12 @@ A version of `XMonad.Prompt.Shell` that lets you use completions supplied by zsh. + * `XMonad.Util.ClickableWorkspaces` + + Provides clickablePP, which when applied to the PP pretty-printer used by + `XMonad.Hooks.DynamicLog.dynamicLogWithPP`, will make the workspace tags + clickable in XMobar (for switching focus). + ### Bug Fixes and Minor Changes * `XMonad.Util.NamedScratchpad` diff --git a/XMonad/Doc/Extending.hs b/XMonad/Doc/Extending.hs index a0afda32..2f20c88a 100644 --- a/XMonad/Doc/Extending.hs +++ b/XMonad/Doc/Extending.hs @@ -1111,6 +1111,11 @@ external utilities. A non complete list with a brief description: +* "XMonad.Util.ClickableWorkspaces": + Provides clickablePP, which when applied to the PP pretty-printer used by + 'XMonad.Hooks.DynamicLog.dynamicLogWithPP', will make the workspace tags + clickable in XMobar (for switching focus). + * "XMonad.Util.Cursor": configure the default cursor/pointer glyph. * "XMonad.Util.CustomKeys": configure key bindings (see diff --git a/XMonad/Util/ClickableWorkspaces.hs b/XMonad/Util/ClickableWorkspaces.hs new file mode 100644 index 00000000..b3e60be8 --- /dev/null +++ b/XMonad/Util/ClickableWorkspaces.hs @@ -0,0 +1,60 @@ +------------------------------------------------------------------------------- +-- | +-- Module : XMonad.Util.ClickableWorkspaces +-- Copyright : (c) Geoff deRosenroll +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : Geoff deRosenroll +-- Stability : unstable +-- Portability : unportable +-- +-- Provides @clickablePP@, which when applied to the PP pretty-printer used by +-- the "XMonad.Hooks.DynamicLog" hook, will make the workspace tags clickable in +-- XMobar (for switching focus). +-- +----------------------------------------------------------------------------- + +module XMonad.Util.ClickableWorkspaces ( + -- * Usage + -- $usage + clickablePP + ) where + +import XMonad +import XMonad.Util.WorkspaceCompare (getWsIndex) +import XMonad.Hooks.DynamicLog (xmobarAction, xmobarRaw, PP(..)) + +-- $usage +-- However you have set up your PP, apply @clickablePP@ to it, and bind the result +-- to "XMonad.Hooks.DynamicLog"\'s dynamicLogWithPP like so: +-- +-- > logHook = clickablePP xmobarPP { ... } >>= dynamicLogWithPP +-- +-- * Requirements: +-- * wmctrl on system (in path) +-- * "XMonad.Hooks.EwmhDesktops" for wmctrl support (see Hackage docs for setup) +-- * use of UnsafeStdinReader in xmobarrc (rather than StdinReader) + + +clickableWrap :: Int -> String -> String +clickableWrap i ws = xmobarAction ("wmctrl -s " ++ show i) "1" $ xmobarRaw ws + +-- Use index of workspace in users config to target workspace with wmctrl switch. +getClickable :: X (WorkspaceId -> String) +getClickable = do + wsIndex <- getWsIndex + return $ \ws -> case wsIndex ws of + Just idx -> clickableWrap idx ws + Nothing -> ws + +-- | Apply clickable wrapping to all workspace fields in given PP. +clickablePP :: PP -> X PP +clickablePP pp = do + clickable <- getClickable + return $ + pp { ppCurrent = ppCurrent pp . clickable + , ppVisible = ppVisible pp . clickable + , ppHidden = ppHidden pp . clickable + , ppHiddenNoWindows = ppHiddenNoWindows pp . clickable + , ppUrgent = ppUrgent pp . clickable + }