----------------------------------------------------------------------------- -- | -- Module : XMonadContrib.WindowPrompt -- Copyright : Devin Mullins -- Andrea Rossato -- License : BSD-style (see LICENSE) -- -- Maintainer : Devin Mullins -- Andrea Rossato -- Stability : unstable -- Portability : unportable -- -- xprompt operations to bring windows to you, and bring you to windows. -- ----------------------------------------------------------------------------- module XMonadContrib.WindowPrompt ( -- * Usage -- $usage windowPromptGoto, windowPromptBring ) where import qualified Data.Map as M import Data.List import qualified XMonad.StackSet as W import XMonad import XMonad.Operations (windows) import XMonadContrib.XPrompt import XMonadContrib.WindowBringer -- $usage -- WindowPrompt brings windows to you and you to windows. -- That is to say, it pops up a prompt with window names, in case you forgot -- where you left your XChat. -- -- Place in your Config.hs: -- -- > import XMonadContrib.XPrompt -- > import XMonadContrib.WindowPrompt -- -- and in the keys definition: -- -- > , ((modMask .|. shiftMask, xK_g ), windowPromptGoto defaultXPConfig) -- > , ((modMask .|. shiftMask, xK_b ), windowPromptBring defaultXPConfig) -- %import XMonadContrib.XPrompt -- %import XMonadContrib.WindowPrompt -- %keybind , ((modMask .|. shiftMask, xK_g ), windowPromptGoto defaultXPConfig) -- %keybind , ((modMask .|. shiftMask, xK_b ), windowPromptBring defaultXPConfig) data WindowPrompt = Goto | Bring instance XPrompt WindowPrompt where showXPrompt Goto = "Go to window: " showXPrompt Bring = "Bring me here: " windowPromptGoto, windowPromptBring :: XPConfig -> X () windowPromptGoto c = doPrompt Goto c windowPromptBring c = doPrompt Bring c -- | Pops open a prompt with window titles. Choose one, and you will be -- taken to the corresponding workspace. doPrompt :: WindowPrompt -> XPConfig -> X () doPrompt t c = do a <- case t of Goto -> return . gotoAction =<< windowMapWith (W.tag . fst) Bring -> return . bringAction =<< windowMapWith snd wm <- windowMapWith id mkXPrompt t c (compList wm) a where winAction a m = flip whenJust (windows . a) . flip M.lookup m . unescape gotoAction = winAction W.greedyView bringAction = winAction bringWindow bringWindow w ws = W.shiftWin (W.tag . W.workspace . W.current $ ws) w ws compList m s = return . filter (isPrefixOf s) . map (escape . fst) . M.toList $ m escape [] = [] escape (' ':xs) = "\\ " ++ escape xs escape (x :xs) = x : escape xs unescape [] = [] unescape ('\\':' ':xs) = ' ' : unescape xs unescape (x:xs) = x : unescape xs