Dotfiles/home/xmonad/.xmonad/lib/TaskMonad/Prompt.hs

117 lines
4.3 KiB
Haskell

{-# LANGUAGE ScopedTypeVariables, TypeSynonymInstances, FlexibleInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : TaskMonad.Prompt
-- Copyright : Max Magorsch <max@magorsch.de>
-- License : BSD-style (see LICENSE)
--
-- Maintainer : Max Magorsch <max@magorsch.de>
-- Stability : unstable
-- Portability : unportable
--
-- TaskMonad.Prompt provides wrappers around [XMonad.Prompt.Input]
-- (https://hackage.haskell.org/package/xmonad-contrib/docs/XMonad-Prompt-Input.html)
-- for usage with taskwarrior
--
-----------------------------------------------------------------------------
module TaskMonad.Prompt
( taskwarriorPrompt
,
-- * Screenshots
-- $screenshots
customPrompt
)
where
import Data.List
import Data.Maybe
import System.Process
import System.IO
import Control.Monad ( filterM )
import XMonad hiding ( liftX )
import XMonad.Util.Font
import qualified XMonad.StackSet as W
import XMonad.Layout.Decoration
import XMonad.Prompt
import XMonad.Prompt.Input
import XMonad.Util.Image
import XMonad.Util.NamedWindows
import XMonad.Util.XUtils
import XMonad.Util.NamedScratchpad
import XMonad.Util.Run
import qualified GridSelect.Extras
import TaskMonad.ScratchPad
import TaskMonad.Utils
import TaskMonad.GridSelect ( togglePriority
, defaultTWGSExtraConfig
)
-- $screenshots
--
-- TaskMonad.Prompt in action:
--
-- <<https://raw.githubusercontent.com/mmagorsc/taskmonad/master/docs/images/taskmonad-prompt.png>>
-- | A wrapper around [XMonad.Prompt.Input]
-- (https://hackage.haskell.org/package/xmonad-contrib/docs/XMonad-Prompt-Input.html)
-- using a custom 'XPconfig'
customPrompt
:: String -- ^ title that will be displayed in the prompt
-> [String] -- ^ completion list
-> (String -> X ()) -- ^ action that takes the input of the prompt and returns and X ()
-> X () -- ^ the action that shows the prompt
customPrompt name completeList action =
inputPromptWithCompl myXPConfig name (mkComplFunFromList completeList)
?+ action
where
myXPConfig = def { position = CenteredAt 0.5 0.4
, alwaysHighlight = True
, height = 60
, promptBorderWidth = 1
, font = "xft:Inconsolata:size=14"
, borderColor = "#555555"
, bgColor = "#111111"
}
-- | A wrapper around 'customPrompt' that can be used to execute taskwarrior
-- as well as custom commands.
--
-- You can specify a list of tuples which contain
-- custom actions as well as conditions for the custom actions, like this:
--
-- > taskwarriorPrompt [(\x -> x == "processInput", processInput)]
--
-- However, if none of the specified actions is true, a default action will be executed.
-- The default action shows taskwarrior reports in a scratchpad and executes all the other commands silently.
taskwarriorPrompt
:: [(String -> Bool, X ())] -- ^ a list of tuples which contain a condition for an action as well as the action
-> X () -- ^ the resulting TaskWarrior prompt
taskwarriorPrompt possibleActions =
customPrompt "task" defaulttwreports (possiblePromptAction possibleActions)
-- | Recursively goes through a list of conditional actions. If a condition is fulfilled, the
-- related action will be executed, otherwise the next condition in the list will be evaluated.
-- In case no condition is fulfilled the 'defaultTWPromptAction' will finally be executed.
possiblePromptAction [] command = defaultTWPromptAction command
possiblePromptAction (p : ps) command =
if fst p command then snd p else possiblePromptAction ps command
-- | The default action that will be execute in the 'taskwarriorPrompt', if no other action was executed.
defaultTWPromptAction :: String -> X ()
defaultTWPromptAction command = if isTWReport command
then twscratchpad command
else twcommand command
where
twcommand command = io (execCommandWithOutput "task" command)
>>= \bs -> unsafeSpawn $ "notify-send '" ++ bs ++ "'"