module Rahm.Desktop.Lib where import Prelude hiding ((!!)) import XMonad.Actions.DynamicWorkspaces import XMonad.Util.Run import XMonad.Prompt import XMonad.Prompt.Input import XMonad.Prompt.Shell import Rahm.Desktop.PromptConfig import Data.Char import Data.List hiding ((!!)) import Data.List.Safe ((!!)) import Data.Maybe import Rahm.Desktop.Marking import Text.Printf import XMonad hiding (workspaces, Screen) import XMonad.StackSet hiding (filter, focus) import qualified Data.Map as Map import Rahm.Desktop.DMenu import Data.Ord (comparing) import qualified XMonad.StackSet as S import Rahm.Desktop.Windows data WinPrompt = WinPrompt instance XPrompt WinPrompt where showXPrompt _ = "[Window] " commandToComplete _ = id fuzzyCompletion :: String -> String -> Bool fuzzyCompletion str0 str1 = all (`isInfixOf`l0) ws where ws = filter (not . all isSpace) $ words (map toLower str0) l0 = map toLower str1 getString :: Window -> X String getString = runQuery $ do t <- title a <- appName return $ if map toLower a `isInfixOf` map toLower t then t else printf "%s - %s" t a askWindowId :: X (Maybe Window) askWindowId = pushHistory $ do windowTitlesToWinId <- withWindowSet $ \ss -> Map.fromList <$> mapM (\wid -> (,) <$> getString wid <*> return wid) (allWindows ss) runDMenuPromptWithMap "Window" (Just "#f542f5") windowTitlesToWinId windowJump :: X () windowJump = pushHistory $ do windowId <- askWindowId case windowId of Nothing -> return () Just wid -> focus wid