workflow-types-0.0.1: Automate keyboard\/mouse\/clipboard\/application interaction.

Safe HaskellNone
LanguageHaskell2010

Workflow.Keys

Synopsis

Documentation

press :: (MonadWorkflow m, MonadThrow m) => String -> m () Source #

Parses and executes a keyboard shortcut. (via readKeySequence and sendKeyChord).

  • more convenient than manually constructing Modifiers and Keys.
  • but, (safely) partial

e.g. compare:

press "H-S-t H-l"

to:

traverse_ sendKeyChord'
 [ KeyChord [HyperModifier, ShiftModifier] TKey
 , KeyChord [HyperModifier) LKey
 ]

(a keyboard shortcut to "re-open tab, then jump to url bar")

throwMs on a "syntax error"

The default syntax is inspired by Emacs:

press = press' defaultKeyChordSyntax

readEmacsKeySequence :: String -> Maybe KeySequence Source #

>>> readEmacsKeySequence "H-S-t H-l"
Just [([HyperModifier,ShiftModifier],TKey),([HyperModifier],LKey)]
=readEmacsKeySequence emacsKeyChordSyntax

readEmacsKeyChord :: String -> Maybe KeySequence Source #

>>> readEmacsKeyChord "H-S-t"
Just ([HyperModifier,ShiftModifier],TKey)
=readEmacsKeyChord emacsKeyChordSyntax

readEmacsModifier :: String -> Maybe Modifier Source #

>>> readEmacsModifier "H"
Just HyperModifier
=readModifier emacsModifierSyntax

readEmacsKey :: String -> Maybe KeyChord Source #

>>> readEmacsKey "<tab>"
Just TabKey
=readKey emacsKeySyntax

press' :: (MonadWorkflow m, MonadThrow m) => KeyChordSyntax -> String -> m () Source #

Build your own press. e.g.

import Workflow.Core hiding (press)

press = press' KeyChordSyntax{..}

modifierSyntax :: ModifierSyntax
modifierSyntax = defaultModifierSyntax -- defaulting

keySyntax :: KeySyntax     -- overriding
keySyntax = Map.fromList
 [ ...
 ]

readModifier :: ModifierSyntax -> String -> Maybe Modifier Source #

surjective, non-injective.

data KeyChordSyntax Source #

A table for parsing strings of modifiers and keys.

Instances

Eq KeyChordSyntax Source # 
Data KeyChordSyntax Source # 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> KeyChordSyntax -> c KeyChordSyntax #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c KeyChordSyntax #

toConstr :: KeyChordSyntax -> Constr #

dataTypeOf :: KeyChordSyntax -> DataType #

dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c KeyChordSyntax) #

dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c KeyChordSyntax) #

gmapT :: (forall b. Data b => b -> b) -> KeyChordSyntax -> KeyChordSyntax #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> KeyChordSyntax -> r #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> KeyChordSyntax -> r #

gmapQ :: (forall d. Data d => d -> u) -> KeyChordSyntax -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> KeyChordSyntax -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> KeyChordSyntax -> m KeyChordSyntax #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> KeyChordSyntax -> m KeyChordSyntax #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> KeyChordSyntax -> m KeyChordSyntax #

Ord KeyChordSyntax Source # 
Read KeyChordSyntax Source # 
Show KeyChordSyntax Source # 
Generic KeyChordSyntax Source # 

Associated Types

type Rep KeyChordSyntax :: * -> * #

Monoid KeyChordSyntax Source #

<> overrides (i.e. right-biased i.e. pick the last).

NFData KeyChordSyntax Source # 

Methods

rnf :: KeyChordSyntax -> () #

type Rep KeyChordSyntax Source # 
type Rep KeyChordSyntax = D1 (MetaData "KeyChordSyntax" "Workflow.Keys" "workflow-types-0.0.1-JGyare4oGoo9KhFQEKiUml" False) (C1 (MetaCons "KeyChordSyntax" PrefixI True) ((:*:) (S1 (MetaSel (Just Symbol "modifierSyntax") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 ModifierSyntax)) (S1 (MetaSel (Just Symbol "keySyntax") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 KeySyntax))))

emacsKeySyntax :: KeySyntax Source #

follows Emacs keybinding syntax, with some differences:

  • non-modifier uppercase alphabetic characters are not shifted, for consistency:

    • e.g. use M-S-a, not M-A
    • e.g. but M-: and "M-S-;" can both be used
  • non-alphanumeric characters can be in angle brackets:

(see source)

addMods :: [Modifier] -> KeyChord -> KeyChord Source #

appends modifiers

addMod :: Modifier -> KeyChord -> KeyChord Source #

appends a modifier