mirror of
https://github.com/Horhik/dotfiles.git
synced 2024-11-30 03:51:28 +00:00
117 lines
4.3 KiB
Haskell
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 ++ "'"
|
|
|