-- |
-- Module: WildBind.Task.X11.Seq.Example
-- Description: An example of WildBind.Seq
-- Maintainer: Toshio Ito <debug.ito@gmail.com>
--
-- This is an example of using "WildBind.Seq" module to build bindings
-- for key sequences. See the source.
--
-- @since 0.2.0.0
module WildBind.Task.X11.Seq.Example
       where

import Data.Monoid ((<>))

-- Following is from wild-bind package
import WildBind (Binding, wildBind, binds, on, run)
import WildBind.Seq
  ( SeqBinding,
    prefix, fromSeq, toSeq, withCancel, withPrefix
  )

-- Following is from wild-bind-x11 package
import WildBind.X11
  ( XKeyEvent, ActiveWindow,
    withFrontEnd, ctrl, press
  )
import qualified WildBind.X11.KeySym as Sym

main :: IO ()
main :: IO ()
main = (FrontEnd ActiveWindow XKeyEvent -> IO ()) -> IO ()
forall i a.
(XKeyInput i, Describable i, Ord i) =>
(FrontEnd ActiveWindow i -> IO a) -> IO a
withFrontEnd ((FrontEnd ActiveWindow XKeyEvent -> IO ()) -> IO ())
-> (FrontEnd ActiveWindow XKeyEvent -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ Binding ActiveWindow XKeyEvent
-> FrontEnd ActiveWindow XKeyEvent -> IO ()
forall i s. Ord i => Binding s i -> FrontEnd s i -> IO ()
wildBind Binding ActiveWindow XKeyEvent
myBinding_simple

-- | 'prefix' is a simple API to build a binding for key sequence.
myBinding_simple :: Binding ActiveWindow XKeyEvent
myBinding_simple :: Binding ActiveWindow XKeyEvent
myBinding_simple = [XKeyEvent]
-> [XKeyEvent]
-> Binding ActiveWindow XKeyEvent
-> Binding ActiveWindow XKeyEvent
forall i fs. Ord i => [i] -> [i] -> Binding fs i -> Binding fs i
prefix [KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_g] [KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_x] (Binding ActiveWindow XKeyEvent -> Binding ActiveWindow XKeyEvent)
-> Binding ActiveWindow XKeyEvent -> Binding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall i r a bs fs.
Ord i =>
Binder i (Action IO r) a -> Binding' bs fs i
binds (Binder XKeyEvent (Action IO ()) ()
 -> Binding ActiveWindow XKeyEvent)
-> Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ do
  XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_f) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-x C-f"
  XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_o) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-x C-o"
  XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_c) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-x C-c"

-- | You can combine 'SeqBinding' objects together to build a complex
-- binding for key sequence.
myBinding_complex :: Binding ActiveWindow XKeyEvent
myBinding_complex :: Binding ActiveWindow XKeyEvent
myBinding_complex = SeqBinding ActiveWindow XKeyEvent -> Binding ActiveWindow XKeyEvent
forall fs i. SeqBinding fs i -> Binding fs i
fromSeq (SeqBinding ActiveWindow XKeyEvent
 -> Binding ActiveWindow XKeyEvent)
-> SeqBinding ActiveWindow XKeyEvent
-> Binding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ [XKeyEvent]
-> SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall i fs. Ord i => [i] -> SeqBinding fs i -> SeqBinding fs i
withCancel [KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_g] SeqBinding ActiveWindow XKeyEvent
seq_binding
  where
    seq_binding :: SeqBinding ActiveWindow XKeyEvent
    seq_binding :: SeqBinding ActiveWindow XKeyEvent
seq_binding = ([XKeyEvent]
-> SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall i fs. Ord i => [i] -> SeqBinding fs i -> SeqBinding fs i
withPrefix [KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_c] SeqBinding ActiveWindow XKeyEvent
c_binding)
                  SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall a. Semigroup a => a -> a -> a
<> ([XKeyEvent]
-> SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall i fs. Ord i => [i] -> SeqBinding fs i -> SeqBinding fs i
withPrefix [KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_x] SeqBinding ActiveWindow XKeyEvent
x_binding)
    c_binding :: SeqBinding ActiveWindow XKeyEvent
    c_binding :: SeqBinding ActiveWindow XKeyEvent
c_binding = Binding ActiveWindow XKeyEvent -> SeqBinding ActiveWindow XKeyEvent
forall i fs. Eq i => Binding fs i -> SeqBinding fs i
toSeq (Binding ActiveWindow XKeyEvent
 -> SeqBinding ActiveWindow XKeyEvent)
-> Binding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall i r a bs fs.
Ord i =>
Binder i (Action IO r) a -> Binding' bs fs i
binds (Binder XKeyEvent (Action IO ()) ()
 -> Binding ActiveWindow XKeyEvent)
-> Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ do
      XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_n) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-c C-n"
      XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_p) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-c C-p"
    x_binding :: SeqBinding ActiveWindow XKeyEvent
    x_binding :: SeqBinding ActiveWindow XKeyEvent
x_binding = ([XKeyEvent]
-> SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall i fs. Ord i => [i] -> SeqBinding fs i -> SeqBinding fs i
withPrefix [KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_Return] SeqBinding ActiveWindow XKeyEvent
xret_binding)
                SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall a. Semigroup a => a -> a -> a
<> SeqBinding ActiveWindow XKeyEvent
plain_x_binding
    plain_x_binding :: SeqBinding ActiveWindow XKeyEvent
    plain_x_binding :: SeqBinding ActiveWindow XKeyEvent
plain_x_binding = Binding ActiveWindow XKeyEvent -> SeqBinding ActiveWindow XKeyEvent
forall i fs. Eq i => Binding fs i -> SeqBinding fs i
toSeq (Binding ActiveWindow XKeyEvent
 -> SeqBinding ActiveWindow XKeyEvent)
-> Binding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall i r a bs fs.
Ord i =>
Binder i (Action IO r) a -> Binding' bs fs i
binds (Binder XKeyEvent (Action IO ()) ()
 -> Binding ActiveWindow XKeyEvent)
-> Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ do
      XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
ctrl KeySym
Sym.xK_f) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-x C-f"
    xret_binding :: SeqBinding ActiveWindow XKeyEvent
    xret_binding :: SeqBinding ActiveWindow XKeyEvent
xret_binding = Binding ActiveWindow XKeyEvent -> SeqBinding ActiveWindow XKeyEvent
forall i fs. Eq i => Binding fs i -> SeqBinding fs i
toSeq (Binding ActiveWindow XKeyEvent
 -> SeqBinding ActiveWindow XKeyEvent)
-> Binding ActiveWindow XKeyEvent
-> SeqBinding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall i r a bs fs.
Ord i =>
Binder i (Action IO r) a -> Binding' bs fs i
binds (Binder XKeyEvent (Action IO ()) ()
 -> Binding ActiveWindow XKeyEvent)
-> Binder XKeyEvent (Action IO ()) ()
-> Binding ActiveWindow XKeyEvent
forall a b. (a -> b) -> a -> b
$ do
      XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
press KeySym
Sym.xK_f) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-x RET f"
      XKeyEvent -> Action IO () -> Binder XKeyEvent (Action IO ()) ()
forall i v. i -> v -> Binder i v ()
on (KeySym -> XKeyEvent
forall k. ToXKeyEvent k => k -> XKeyEvent
press KeySym
Sym.xK_c) (Action IO () -> Binder XKeyEvent (Action IO ()) ())
-> IO () -> Binder XKeyEvent (Action IO ()) ()
forall (m :: * -> *) b a.
Functor m =>
(Action m () -> b) -> m a -> b
`run` String -> IO ()
putStrLn String
"C-x RET c"