aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/Lib.hs
blob: 3b4ee9c86955c02a676cf9df1c77d916d20d456c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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