From c6b40ac8593a0c260fa3291e3858852b58c16f56 Mon Sep 17 00:00:00 2001 From: Devin Mullins Date: Sun, 7 Oct 2007 23:55:32 +0200 Subject: add bringMenu, and extract duplication darcs-hash:20071007215532-78224-9daa16d67848da64eaf6a58508d8ac86cb58e8f2.gz --- WindowBringer.hs | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'WindowBringer.hs') diff --git a/WindowBringer.hs b/WindowBringer.hs index 4200065..d0c95be 100644 --- a/WindowBringer.hs +++ b/WindowBringer.hs @@ -13,10 +13,10 @@ ----------------------------------------------------------------------------- module XMonadContrib.WindowBringer ( - -- * Usage - -- $usage - gotoMenu - ) where + -- * Usage + -- $usage + gotoMenu, bringMenu + ) where import Control.Monad.State (gets) import Data.Char (toLower) @@ -38,23 +38,38 @@ import XMonadContrib.NamedWindows (getName) -- > import XMonadContrib.WindowBringer -- and in the keys definition: -- > , ((modMask .|. shiftMask, xK_g ), gotoMenu) +-- > , ((modMask .|. shiftMask, xK_b ), bringMenu) -- -- %import XMonadContrib.WindowBringer -- %keybind ((modMask .|. shiftMask, xK_g ), gotoMenu) +-- %keybind ((modMask .|. shiftMask, xK_b ), bringMenu) -- | Pops open a dmenu with window titles. Choose one, and you will be -- taken to the corresponding workspace. gotoMenu :: X () -gotoMenu = do - workspaceMap >>= dmenuMap >>= flip X.whenJust (windows . W.greedyView) +gotoMenu = workspaceMap >>= actionMenu (windows . W.greedyView) + where workspaceMap = windowMapWith (W.tag . fst) --- | A map from decorated window name to target workspace ID, for use by gotoMenu. -workspaceMap :: X (M.Map String X.WorkspaceId) -workspaceMap = do +-- | Pops open a dmenu with window titles. Choose one, and it will be +-- dragged, kicking and screaming, into your current workspace. +bringMenu :: X () +bringMenu = windowMap >>= actionMenu (windows . bringWindow) + where windowMap = windowMapWith snd + bringWindow w ws = W.shiftWin (W.tag . W.workspace . W.current $ ws) w ws + +-- | Calls dmenuMap to grab the appropriate element from the Map, and hands it +-- off to action if found. +actionMenu :: (a -> X ()) -> M.Map String a -> X () +actionMenu action windowMap = dmenuMap windowMap >>= flip X.whenJust action + +-- | Generates a Map from window name to . For use with +-- dmenuMap. TODO: extract the pure, creamy center. +windowMapWith :: ((X.WindowSpace, Window) -> a) -> X (M.Map String a) +windowMapWith value = do ws <- gets X.windowset M.fromList `fmap` concat `fmap` mapM keyValuePairs (W.workspaces ws) where keyValuePairs ws = mapM (keyValuePair ws) $ W.integrate' (W.stack ws) - keyValuePair ws w = flip (,) (W.tag ws) `fmap` decorateName ws w + keyValuePair ws w = flip (,) (value (ws, w)) `fmap` decorateName ws w -- | Returns the window name as will be listed in dmenu. -- Lowercased, for your convenience (since dmenu is case-sensitive). -- cgit v1.2.3