------------------------------------------------------------------------------ -- | -- Module : Obsolete -- Copyright : (c) Mads N Noe 2009 -- Maintainer : mntnoe (@) gmail.com -- License : as-is -- -- Functions not used anymore, but might be useful later. -- ------------------------------------------------------------------------------ module Obsolete ( ) where -- Haskell modules import Data.Char (toLower, toUpper) import qualified Data.Map as M -- XMonad modules import XMonad import XMonad.Prompt import qualified XMonad.StackSet as W import XMonad.Util.NamedWindows (getName) import XMonad.Util.Run (runProcessWithInput) -- My modules import DMenu (dmenuArgs) -- DMENU FUNCTIONS -- | Spawn dmenu with the given prompt and completion list. Return what the -- user typed (which might not be an item in the list). dmenu :: XPConfig -> String -> [String] -> X String dmenu xpc prompt opts = io $ runProcessWithInput "dmenu" (dmenuArgs xpc prompt) (unlines opts) -- | Like 'dzen', but look up the return value in a map. dmenuMap :: XPConfig -> String -> M.Map String a -> X (Maybe a) dmenuMap xpc prompt selectionMap = do selection <- (dmenu xpc prompt) (M.keys selectionMap) return $ M.lookup selection selectionMap -- | Prompt for a window and focus it. gotoMenu :: XPConfig -> X () gotoMenu xpc = actionMenu xpc "Window:" W.focusWindow -- | Prompt for a window and perform an 'WindowSet' operation on it. actionMenu :: XPConfig -> String -> (Window -> WindowSet -> WindowSet) -> X() actionMenu xpc prompt action = windowMap >>= (dmenuMap xpc prompt) >>= flip whenJust (windows . action) -- | Map from a formatted name to the corresponding 'Window' for use in a prompt. windowMap :: X (M.Map String Window) windowMap = do ws <- gets 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 `fmap` formatWindowName ws w -- | Return a formatted string representation of a 'Window'. formatWindowName :: WindowSpace -> Window -> X String formatWindowName ws w = do name <- fmap (take 15 . map toLower . show) $ getName w return $ name ++ " [" ++ [head $ W.tag ws] ++ "]" -- FOCUS SLAVES -- Cycle focus between \"slave windows\" in an XMonad workspace. I found it -- more confusing than helpful, though. -- | Focus the previous window which is not the master window. Wrap around the -- end. focusUpSlave :: WindowSet -> WindowSet focusUpSlave = W.modify' focusUpSlave' where focusUpSlave' :: W.Stack a -> W.Stack a focusUpSlave' (W.Stack t (l:[]) rs) = W.Stack x xs [] where (x:xs) = reverse (l:t:rs) focusUpSlave' (W.Stack t (l:ls) rs) = W.Stack l ls (t:rs) focusUpSlave' (W.Stack t [] rs) = W.Stack x xs [] where (x:xs) = reverse (t:rs) -- | Focus the next window which is not the master window. Wrap around the -- end. focusDownSlave :: WindowSet -> WindowSet focusDownSlave = W.modify' focusDownSlave' where focusDownSlave' s@(W.Stack _ [] []) = s focusDownSlave' (W.Stack t ls (r:rs)) = W.Stack r (t:ls) rs focusDownSlave' (W.Stack t ls []) = W.Stack x [m] xs where (m:x:xs) = reverse (t:ls) -- | Swap position with the previous window which is not the master window. -- Wrap around the end. swapUpSlave :: WindowSet -> WindowSet swapUpSlave = W.modify' swapUpSlave' where swapUpSlave' (W.Stack t (l:[]) rs) = W.Stack t (reverse (l:rs)) [] swapUpSlave' (W.Stack t (l:ls) rs) = W.Stack t ls (l:rs) swapUpSlave' (W.Stack t [] rs) = W.Stack t (reverse rs) [] -- | Swap position with the next window which is not the master window. Wrap -- around the end. swapDownSlave :: WindowSet -> WindowSet swapDownSlave = W.modify' swapDownSlave' where swapDownSlave' s@(W.Stack _ [] []) = s swapDownSlave' (W.Stack t ls (r:rs)) = W.Stack t (r:ls) rs swapDownSlave' (W.Stack t ls@(_:_) []) = W.Stack t [x] xs where (x:xs) = (reverse ls)