-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | X11-specific implementation for WildBind
--   
--   X11-specific implementation for WildBind. See
--   <a>https://github.com/debug-ito/wild-bind</a>
@package wild-bind-x11
@version 0.2.0.6


-- | <b>This is an internal module. Package users should not rely on
--   this.</b>
module WildBind.X11.Internal.Key

-- | Class of data types that can be handled by X11. The data type can tell
--   X11 to grab key with optional modifiers, and it can be extracted from
--   a X11 Event object.
class XKeyInput k

-- | Get the X11 keysym for this input.
toKeySym :: XKeyInput k => k -> KeySym

-- | Get modifer masks to grab the keysym. The grab action is repeated for
--   all modifier masks. By default, it just returns 0.
toModifierMasks :: XKeyInput k => KeyMaskMap -> k -> NonEmpty KeyMask

-- | Create the input object from a key event type, a keysym and a modifier
--   (got from XEvent.)
fromKeyEvent :: XKeyInput k => KeyMaskMap -> KeyEventType -> KeySym -> KeyMask -> Maybe k

-- | Extract the <a>XKeyInput</a> from the XKeyEvent.
xKeyEventToXKeyInput :: XKeyInput k => KeyMaskMap -> KeyEventType -> XKeyEventPtr -> MaybeT IO k

-- | Whether the key is pressed or released.
data KeyEventType
KeyPress :: KeyEventType
KeyRelease :: KeyEventType

-- | <a>KeyMask</a> values assigned to each modifier keys/states. If the
--   modifier doesn't exist, the mask is 0.
data KeyMaskMap
KeyMaskMap :: KeyMask -> KeyMask -> KeyMask -> KeyMask -> KeyMask -> KeyMask -> KeyMask -> KeyMask -> KeyMaskMap
[maskShift] :: KeyMaskMap -> KeyMask
[maskControl] :: KeyMaskMap -> KeyMask
[maskAlt] :: KeyMaskMap -> KeyMask
[maskSuper] :: KeyMaskMap -> KeyMask
[maskNumLock] :: KeyMaskMap -> KeyMask
[maskCapsLock] :: KeyMaskMap -> KeyMask
[maskShiftLock] :: KeyMaskMap -> KeyMask
[maskScrollLock] :: KeyMaskMap -> KeyMask

-- | Get current <a>KeyMaskMap</a>.
getKeyMaskMap :: Display -> IO KeyMaskMap

-- | High-level X11 key event.
data XKeyEvent
XKeyEvent :: KeyEventType -> Set XMod -> KeySym -> XKeyEvent
[xKeyEventType] :: XKeyEvent -> KeyEventType

-- | set of key modifiers enabled.
[xKeyEventMods] :: XKeyEvent -> Set XMod

-- | X11 KeySym for the key. <a>WildBind.X11.KeySym</a> re-exports
--   <tt>KeySym</tt> values.
[xKeyEventKeySym] :: XKeyEvent -> KeySym

-- | X11 key modifiers.
data XMod
Shift :: XMod
Ctrl :: XMod
Alt :: XMod
Super :: XMod

-- | Something that can converted to <a>XKeyEvent</a>.
class ToXKeyEvent k
toXKeyEvent :: ToXKeyEvent k => k -> XKeyEvent

-- | Add a <a>XMod</a> to <a>xKeyEventMods</a>.
addXMod :: ToXKeyEvent k => XMod -> k -> XKeyEvent

-- | Set <a>KeyPress</a> to <a>xKeyEventType</a>.
press :: ToXKeyEvent k => k -> XKeyEvent

-- | Set <a>KeyRelease</a> to <a>xKeyEventType</a>.
release :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Shift</a> modifier to <a>xKeyEventMods</a>.
shift :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Ctrl</a> modifier to <a>xKeyEventMods</a>.
ctrl :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Alt</a> modifier to <a>xKeyEventMods</a>.
alt :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Super</a> modifier to <a>xKeyEventMods</a>.
super :: ToXKeyEvent k => k -> XKeyEvent

-- | Grab the specified key on the specified window. The key is captured
--   from now on, so the window won't get that.
xGrabKey :: Display -> Window -> KeySym -> KeyMask -> IO ()

-- | Release the grab on the specified key.
xUngrabKey :: Display -> Window -> KeySym -> KeyMask -> IO ()

-- | Send a <a>XKeyEvent</a> to the window.
xSendKeyEvent :: KeyMaskMap -> Display -> Window -> XKeyEvent -> IO ()
instance GHC.Classes.Ord WildBind.X11.Internal.Key.XKeyEvent
instance GHC.Classes.Eq WildBind.X11.Internal.Key.XKeyEvent
instance GHC.Show.Show WildBind.X11.Internal.Key.XKeyEvent
instance GHC.Enum.Bounded WildBind.X11.Internal.Key.XMod
instance GHC.Enum.Enum WildBind.X11.Internal.Key.XMod
instance GHC.Classes.Ord WildBind.X11.Internal.Key.XMod
instance GHC.Classes.Eq WildBind.X11.Internal.Key.XMod
instance GHC.Show.Show WildBind.X11.Internal.Key.XMod
instance GHC.Classes.Ord WildBind.X11.Internal.Key.KeyMaskMap
instance GHC.Classes.Eq WildBind.X11.Internal.Key.KeyMaskMap
instance GHC.Show.Show WildBind.X11.Internal.Key.KeyMaskMap
instance GHC.Enum.Enum WildBind.X11.Internal.Key.KeyEventType
instance GHC.Enum.Bounded WildBind.X11.Internal.Key.KeyEventType
instance GHC.Classes.Ord WildBind.X11.Internal.Key.KeyEventType
instance GHC.Classes.Eq WildBind.X11.Internal.Key.KeyEventType
instance GHC.Show.Show WildBind.X11.Internal.Key.KeyEventType
instance WildBind.X11.Internal.Key.ToXKeyEvent WildBind.X11.Internal.Key.XKeyEvent
instance WildBind.X11.Internal.Key.ToXKeyEvent Graphics.X11.Types.KeySym
instance (WildBind.X11.Internal.Key.ToXKeyEvent a, WildBind.X11.Internal.Key.ToXKeyEvent b) => WildBind.X11.Internal.Key.ToXKeyEvent (Data.Either.Either a b)
instance WildBind.X11.Internal.Key.XKeyInput WildBind.X11.Internal.Key.XKeyEvent
instance WildBind.Description.Describable WildBind.X11.Internal.Key.XKeyEvent
instance WildBind.X11.Internal.Key.XKeyInput WildBind.Input.NumPad.NumPadUnlocked
instance WildBind.X11.Internal.Key.XKeyInput WildBind.Input.NumPad.NumPadLocked
instance (WildBind.X11.Internal.Key.XKeyInput a, WildBind.X11.Internal.Key.XKeyInput b) => WildBind.X11.Internal.Key.XKeyInput (Data.Either.Either a b)


-- | <b>This is an internal module. End-users should not rely on it.</b>
--   
--   WildBind.X11 module receives some notification events to update the
--   current state of the desktop (usually it is the active window).
--   However, there are some problems in updating the state every time it
--   receives a notification event.
--   
--   <ul>
--   <li>Notification events can come too fast. It can make siginificant
--   overhead to the system.</li>
--   <li>The active window obtained at the very moment a notification
--   arrives is often unstable. It can become invalid soon. In addition,
--   Xlib is notorious for being bad at handling that kind of exceptions
--   (it just crashes the entire process and it's practically impossible to
--   catch the exceptions).</li>
--   </ul>
--   
--   Personally, I have experienced even weirder behaviors when I did some
--   X11 operations at arrivals of notification events.
--   
--   <ul>
--   <li>Sometimes I could not obtain the current active window. Instead, I
--   ended up with getting the previous active window.</li>
--   <li>Sometimes GetWindowProperty blocked forever.</li>
--   </ul>
--   
--   So, as a workaround, we debounce the raw notification events and
--   generate a ClientMessage X11 event. When we get the ClientMessage, we
--   update the state.
module WildBind.X11.Internal.NotificationDebouncer
data Debouncer

-- | Create a Debouncer and run the specified action.
withDebouncer :: Display -> (Debouncer -> IO a) -> IO a

-- | Notify the <a>Debouncer</a> that a notification event arrives. After a
--   while, the <a>Debouncer</a> emits a ClientMessage X11 event.
notify :: Debouncer -> IO ()

-- | The Xlib EventMask for sending the ClientMessage. You have to select
--   this mask by <tt>selectInput</tt> function to receive the
--   ClientMessage.
xEventMask :: EventMask

-- | Check if the given event is the debounced ClientMessage X11 event.
isDebouncedEvent :: Debouncer -> XEventPtr -> IO Bool


-- | <b>This is an internal module. Package users should not rely on
--   this.</b>
module WildBind.X11.Internal.Window

-- | Information about window. You can inspect properties
--   <a>winInstance</a> and <a>winClass</a> by <tt>wmctrl</tt> command.
--   
--   <pre>
--   $ wmctrl -lx
--   0x01400004 -1 xfce4-panel.Xfce4-panel  mydesktop xfce4-panel
--   0x01800003 -1 xfdesktop.Xfdesktop   mydesktop desktop
--   0x03800004  0 xfce4-terminal.Xfce4-terminal  mydesktop Terminal - toshio@mydesktop - byobu
--   0x03a000a7  0 emacs.Emacs23         mydesktop emacs@mydesktop
--   0x03e010fc  0 Navigator.Firefox     mydesktop debug-ito (Toshio Ito) - Mozilla Firefox
--   0x02600003  0 totem.Totem           mydesktop Movie Player
--   </pre>
--   
--   In the above example, the third column shows
--   <tt>winInstance.winClass</tt>.
data Window

-- | Use this type especially when the <a>Window</a> is active.
type ActiveWindow = Window

-- | An empty Window instance used for fallback and/or default value.
emptyWindow :: Window

-- | Create <a>Window</a> from X11's <a>Window</a>. Only for testing.
fromWinID :: Window -> Window

-- | name of the application instance (part of <tt>WM_CLASS</tt> property)
winInstance :: Window -> Text

-- | name of the application class (part of <tt>WM_CLASS</tt> property)
winClass :: Window -> Text

-- | what's shown in the title bar
winName :: Window -> Text

-- | X11 window ID.
winID :: Window -> Window

-- | Get currently active <a>Window</a>.
getActiveWindow :: Display -> IO ActiveWindow

-- | Get the default root window of the display.
defaultRootWindowForDisplay :: Display -> Window
instance GHC.Show.Show WildBind.X11.Internal.Window.Window
instance GHC.Classes.Ord WildBind.X11.Internal.Window.Window
instance GHC.Classes.Eq WildBind.X11.Internal.Window.Window


-- | This module defines functions to emulate key inputs.
--   
--   See <a>WildBind.X11.Emulate.Example</a> for an example.
module WildBind.X11.Emulate

-- | Send a X11 key event to a <a>Window</a>.
sendKeyTo :: (ToXKeyEvent k, MonadIO m) => X11Front i -> Window -> k -> m ()

-- | Same as <a>sendKeyTo</a>, but the target window is obtained from
--   <a>MonadReader</a>.
sendKey :: (ToXKeyEvent k, MonadIO m, MonadReader Window m) => X11Front i -> k -> m ()

-- | Send a "key push" event to a <a>Window</a>, that is, send
--   <a>KeyPress</a> and <a>KeyRelease</a> events.
pushTo :: (ToXKeyEvent k, MonadIO m) => X11Front i -> Window -> k -> m ()

-- | Same as <a>pushTo</a>, but the target window is obtained from
--   <a>MonadReader</a>.
push :: (ToXKeyEvent k, MonadIO m, MonadReader Window m) => X11Front i -> k -> m ()

-- | Create a binding that remaps key event "<tt>from</tt>" to
--   "<tt>to</tt>".
--   
--   This binding captures <a>KeyPress</a> and <a>KeyRelease</a> events of
--   "<tt>from</tt>", and sends respective events of "<tt>to</tt>" to the
--   active window.
--   
--   Sometimes <a>remap</a> doesn't work as you expect, because the
--   <a>KeyPress</a> event is sent to the window while it doesn't have
--   keyboard focus. In that case, try using <a>remapR</a>.
remap :: (ToXKeyEvent from, ToXKeyEvent to) => X11Front i -> from -> to -> Binding' bs ActiveWindow XKeyEvent

-- | remap on Release. Like <a>remap</a>, but this binding captures only
--   <a>KeyRelease</a> event and sends a pair of <a>KeyPress</a> and
--   <a>KeyRelease</a> events.
--   
--   Because the original <a>KeyRelease</a> event occurs after the focus
--   returns to the window, the emulated events are sent to the window with
--   focus.
remapR :: (ToXKeyEvent from, ToXKeyEvent to) => X11Front i -> from -> to -> Binding' bs ActiveWindow XKeyEvent


-- | This module exports a <a>FrontEnd</a> for X11 environments.
module WildBind.X11

-- | Initialize and obtain <a>FrontEnd</a> for X11, and run the given
--   action.
--   
--   The X11 <a>FrontEnd</a> watches and provides <a>ActiveWindow</a> as
--   the front-end state. <a>ActiveWindow</a> keeps information about the
--   window currently active. As for the input type <tt>i</tt>, this
--   <a>FrontEnd</a> gets keyboard events from the X server.
--   
--   CAVEATS
--   
--   Code using this function must be compiled <b>with <tt>-threaded</tt>
--   option enabled</b> in <tt>ghc</tt>. Otherwise, it aborts.
--   
--   Because this <a>FrontEnd</a> currently uses <tt>XGrabKey(3)</tt> to
--   get the input, it may cause some weird behavior such as:
--   
--   <ul>
--   <li>Every input event makes the active window lose focus temporarily.
--   This may result in flickering cursor, for example. See also:
--   <a>https://stackoverflow.com/questions/15270420/</a></li>
--   <li>Key input is captured only while the first grabbed key is pressed.
--   For example, if <tt>(release xK_a)</tt> and <tt>(release xK_b)</tt>
--   are bound, and you input <tt>(press xK_a)</tt>, <tt>(press xK_b)</tt>,
--   <tt>(release xK_a)</tt>, <tt>(release xK_b)</tt>, the last
--   <tt>(release xK_b)</tt> is NOT captured because key grab ends with
--   <tt>(release xK_a)</tt>.</li>
--   </ul>
withFrontEnd :: (XKeyInput i, Describable i, Ord i) => (FrontEnd ActiveWindow i -> IO a) -> IO a

-- | Class of data types that can be handled by X11. The data type can tell
--   X11 to grab key with optional modifiers, and it can be extracted from
--   a X11 Event object.
class XKeyInput k

-- | Get the X11 keysym for this input.
toKeySym :: XKeyInput k => k -> KeySym

-- | Get modifer masks to grab the keysym. The grab action is repeated for
--   all modifier masks. By default, it just returns 0.
toModifierMasks :: XKeyInput k => KeyMaskMap -> k -> NonEmpty KeyMask

-- | Create the input object from a key event type, a keysym and a modifier
--   (got from XEvent.)
fromKeyEvent :: XKeyInput k => KeyMaskMap -> KeyEventType -> KeySym -> KeyMask -> Maybe k

-- | Information about window. You can inspect properties
--   <a>winInstance</a> and <a>winClass</a> by <tt>wmctrl</tt> command.
--   
--   <pre>
--   $ wmctrl -lx
--   0x01400004 -1 xfce4-panel.Xfce4-panel  mydesktop xfce4-panel
--   0x01800003 -1 xfdesktop.Xfdesktop   mydesktop desktop
--   0x03800004  0 xfce4-terminal.Xfce4-terminal  mydesktop Terminal - toshio@mydesktop - byobu
--   0x03a000a7  0 emacs.Emacs23         mydesktop emacs@mydesktop
--   0x03e010fc  0 Navigator.Firefox     mydesktop debug-ito (Toshio Ito) - Mozilla Firefox
--   0x02600003  0 totem.Totem           mydesktop Movie Player
--   </pre>
--   
--   In the above example, the third column shows
--   <tt>winInstance.winClass</tt>.
data Window

-- | Use this type especially when the <a>Window</a> is active.
type ActiveWindow = Window

-- | name of the application instance (part of <tt>WM_CLASS</tt> property)
winInstance :: Window -> Text

-- | name of the application class (part of <tt>WM_CLASS</tt> property)
winClass :: Window -> Text

-- | what's shown in the title bar
winName :: Window -> Text

-- | High-level X11 key event.
data XKeyEvent
XKeyEvent :: KeyEventType -> Set XMod -> KeySym -> XKeyEvent
[xKeyEventType] :: XKeyEvent -> KeyEventType

-- | set of key modifiers enabled.
[xKeyEventMods] :: XKeyEvent -> Set XMod

-- | X11 KeySym for the key. <a>WildBind.X11.KeySym</a> re-exports
--   <tt>KeySym</tt> values.
[xKeyEventKeySym] :: XKeyEvent -> KeySym

-- | X11 key modifiers.
data XMod
Shift :: XMod
Ctrl :: XMod
Alt :: XMod
Super :: XMod

-- | Whether the key is pressed or released.
data KeyEventType
KeyPress :: KeyEventType
KeyRelease :: KeyEventType

-- | Something that can converted to <a>XKeyEvent</a>.
class ToXKeyEvent k
toXKeyEvent :: ToXKeyEvent k => k -> XKeyEvent

-- | Set <a>KeyPress</a> to <a>xKeyEventType</a>.
press :: ToXKeyEvent k => k -> XKeyEvent

-- | Set <a>KeyRelease</a> to <a>xKeyEventType</a>.
release :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Shift</a> modifier to <a>xKeyEventMods</a>.
shift :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Ctrl</a> modifier to <a>xKeyEventMods</a>.
ctrl :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Alt</a> modifier to <a>xKeyEventMods</a>.
alt :: ToXKeyEvent k => k -> XKeyEvent

-- | Add <a>Super</a> modifier to <a>xKeyEventMods</a>.
super :: ToXKeyEvent k => k -> XKeyEvent

-- | Add a <a>XMod</a> to <a>xKeyEventMods</a>.
addXMod :: ToXKeyEvent k => XMod -> k -> XKeyEvent

-- | The X11 front-end. <tt>k</tt> is the input key type.
--   
--   This is the implementation of the <a>FrontEnd</a> given by
--   <a>withFrontEnd</a> function. With this object, you can do more
--   advanced actions. See <a>WildBind.X11.Emulate</a>.
--   
--   <a>X11Front</a> is relatively low-level interface, so it's more likely
--   for this API to change in the future than <a>FrontEnd</a>.
data X11Front k

-- | Same as <a>withFrontEnd</a>, but it creates <a>X11Front</a>. To create
--   <a>FrontEnd</a>, use <a>makeFrontEnd</a>.
withX11Front :: (X11Front k -> IO a) -> IO a

-- | Create <a>FrontEnd</a> from <a>X11Front</a> object.
makeFrontEnd :: (XKeyInput k, Describable k, Ord k) => X11Front k -> FrontEnd ActiveWindow k

-- | Get the default root window.
defaultRootWindow :: X11Front k -> Window


-- | This module re-exports X11 <a>KeySym</a>s.
module WildBind.X11.KeySym
type KeySym = XID
xK_a :: KeySym
xK_b :: KeySym
xK_c :: KeySym
xK_d :: KeySym
xK_e :: KeySym
xK_f :: KeySym
xK_g :: KeySym
xK_h :: KeySym
xK_i :: KeySym
xK_j :: KeySym
xK_k :: KeySym
xK_l :: KeySym
xK_m :: KeySym
xK_n :: KeySym
xK_o :: KeySym
xK_p :: KeySym
xK_q :: KeySym
xK_r :: KeySym
xK_s :: KeySym
xK_t :: KeySym
xK_u :: KeySym
xK_v :: KeySym
xK_w :: KeySym
xK_x :: KeySym
xK_y :: KeySym
xK_z :: KeySym
xK_A :: KeySym
xK_B :: KeySym
xK_C :: KeySym
xK_D :: KeySym
xK_E :: KeySym
xK_F :: KeySym
xK_G :: KeySym
xK_H :: KeySym
xK_I :: KeySym
xK_J :: KeySym
xK_K :: KeySym
xK_L :: KeySym
xK_M :: KeySym
xK_N :: KeySym
xK_O :: KeySym
xK_P :: KeySym
xK_Q :: KeySym
xK_R :: KeySym
xK_S :: KeySym
xK_T :: KeySym
xK_U :: KeySym
xK_V :: KeySym
xK_W :: KeySym
xK_X :: KeySym
xK_Y :: KeySym
xK_Z :: KeySym
xK_0 :: KeySym
xK_1 :: KeySym
xK_2 :: KeySym
xK_3 :: KeySym
xK_4 :: KeySym
xK_5 :: KeySym
xK_6 :: KeySym
xK_7 :: KeySym
xK_8 :: KeySym
xK_9 :: KeySym
xK_space :: KeySym
xK_exclam :: KeySym
xK_quotedbl :: KeySym
xK_numbersign :: KeySym
xK_dollar :: KeySym
xK_percent :: KeySym
xK_ampersand :: KeySym
xK_apostrophe :: KeySym
xK_quoteright :: KeySym
xK_parenleft :: KeySym
xK_parenright :: KeySym
xK_asterisk :: KeySym
xK_plus :: KeySym
xK_comma :: KeySym
xK_minus :: KeySym
xK_period :: KeySym
xK_slash :: KeySym
xK_colon :: KeySym
xK_semicolon :: KeySym
xK_less :: KeySym
xK_equal :: KeySym
xK_greater :: KeySym
xK_question :: KeySym
xK_at :: KeySym
xK_bracketleft :: KeySym
xK_backslash :: KeySym
xK_bracketright :: KeySym
xK_asciicircum :: KeySym
xK_underscore :: KeySym
xK_grave :: KeySym
xK_quoteleft :: KeySym
xK_braceleft :: KeySym
xK_bar :: KeySym
xK_braceright :: KeySym
xK_asciitilde :: KeySym
xK_BackSpace :: KeySym
xK_Tab :: KeySym
xK_Linefeed :: KeySym
xK_Clear :: KeySym
xK_Return :: KeySym
xK_Pause :: KeySym
xK_Scroll_Lock :: KeySym
xK_Sys_Req :: KeySym
xK_Escape :: KeySym
xK_Delete :: KeySym
xK_Multi_key :: KeySym
xK_Codeinput :: KeySym
xK_SingleCandidate :: KeySym
xK_MultipleCandidate :: KeySym
xK_PreviousCandidate :: KeySym
xK_Home :: KeySym
xK_Left :: KeySym
xK_Up :: KeySym
xK_Right :: KeySym
xK_Down :: KeySym
xK_Prior :: KeySym
xK_Page_Up :: KeySym
xK_Next :: KeySym
xK_Page_Down :: KeySym
xK_End :: KeySym
xK_Begin :: KeySym
xK_Select :: KeySym
xK_Print :: KeySym
xK_Execute :: KeySym
xK_Insert :: KeySym
xK_Undo :: KeySym
xK_Redo :: KeySym
xK_Menu :: KeySym
xK_Find :: KeySym
xK_Cancel :: KeySym
xK_Help :: KeySym
xK_Break :: KeySym
xK_Mode_switch :: KeySym
xK_script_switch :: KeySym
xK_Num_Lock :: KeySym
xK_KP_Space :: KeySym
xK_KP_Tab :: KeySym
xK_KP_Enter :: KeySym
xK_KP_F1 :: KeySym
xK_KP_F2 :: KeySym
xK_KP_F3 :: KeySym
xK_KP_F4 :: KeySym
xK_KP_Home :: KeySym
xK_KP_Left :: KeySym
xK_KP_Up :: KeySym
xK_KP_Right :: KeySym
xK_KP_Down :: KeySym
xK_KP_Prior :: KeySym
xK_KP_Page_Up :: KeySym
xK_KP_Next :: KeySym
xK_KP_Page_Down :: KeySym
xK_KP_End :: KeySym
xK_KP_Begin :: KeySym
xK_KP_Insert :: KeySym
xK_KP_Delete :: KeySym
xK_KP_Equal :: KeySym
xK_KP_Multiply :: KeySym
xK_KP_Add :: KeySym
xK_KP_Separator :: KeySym
xK_KP_Subtract :: KeySym
xK_KP_Decimal :: KeySym
xK_KP_Divide :: KeySym
xK_KP_0 :: KeySym
xK_KP_1 :: KeySym
xK_KP_2 :: KeySym
xK_KP_3 :: KeySym
xK_KP_4 :: KeySym
xK_KP_5 :: KeySym
xK_KP_6 :: KeySym
xK_KP_7 :: KeySym
xK_KP_8 :: KeySym
xK_KP_9 :: KeySym
xK_F1 :: KeySym
xK_F2 :: KeySym
xK_F3 :: KeySym
xK_F4 :: KeySym
xK_F5 :: KeySym
xK_F6 :: KeySym
xK_F7 :: KeySym
xK_F8 :: KeySym
xK_F9 :: KeySym
xK_F10 :: KeySym
xK_F11 :: KeySym
xK_L1 :: KeySym
xK_F12 :: KeySym
xK_L2 :: KeySym
xK_F13 :: KeySym
xK_L3 :: KeySym
xK_F14 :: KeySym
xK_L4 :: KeySym
xK_F15 :: KeySym
xK_L5 :: KeySym
xK_F16 :: KeySym
xK_L6 :: KeySym
xK_F17 :: KeySym
xK_L7 :: KeySym
xK_F18 :: KeySym
xK_L8 :: KeySym
xK_F19 :: KeySym
xK_L9 :: KeySym
xK_F20 :: KeySym
xK_L10 :: KeySym
xK_F21 :: KeySym
xK_R1 :: KeySym
xK_F22 :: KeySym
xK_R2 :: KeySym
xK_F23 :: KeySym
xK_R3 :: KeySym
xK_F24 :: KeySym
xK_R4 :: KeySym
xK_F25 :: KeySym
xK_R5 :: KeySym
xK_F26 :: KeySym
xK_R6 :: KeySym
xK_F27 :: KeySym
xK_R7 :: KeySym
xK_F28 :: KeySym
xK_R8 :: KeySym
xK_F29 :: KeySym
xK_R9 :: KeySym
xK_F30 :: KeySym
xK_R10 :: KeySym
xK_F31 :: KeySym
xK_R11 :: KeySym
xK_F32 :: KeySym
xK_R12 :: KeySym
xK_F33 :: KeySym
xK_R13 :: KeySym
xK_F34 :: KeySym
xK_R14 :: KeySym
xK_F35 :: KeySym
xK_R15 :: KeySym
xK_Shift_L :: KeySym
xK_Shift_R :: KeySym
xK_Control_L :: KeySym
xK_Control_R :: KeySym
xK_Caps_Lock :: KeySym
xK_Shift_Lock :: KeySym
xK_Meta_L :: KeySym
xK_Meta_R :: KeySym
xK_Alt_L :: KeySym
xK_Alt_R :: KeySym
xK_Super_L :: KeySym
xK_Super_R :: KeySym
xK_Hyper_L :: KeySym
xK_Hyper_R :: KeySym
xK_Agrave :: KeySym
xK_Aacute :: KeySym
xK_Acircumflex :: KeySym
xK_Atilde :: KeySym
xK_Adiaeresis :: KeySym
xK_Aring :: KeySym
xK_AE :: KeySym
xK_Ccedilla :: KeySym
xK_Egrave :: KeySym
xK_Eacute :: KeySym
xK_Ecircumflex :: KeySym
xK_Ediaeresis :: KeySym
xK_Igrave :: KeySym
xK_Iacute :: KeySym
xK_Icircumflex :: KeySym
xK_Idiaeresis :: KeySym
xK_ETH :: KeySym
xK_Eth :: KeySym
xK_Ntilde :: KeySym
xK_Ograve :: KeySym
xK_Oacute :: KeySym
xK_Ocircumflex :: KeySym
xK_Otilde :: KeySym
xK_Odiaeresis :: KeySym
xK_multiply :: KeySym
xK_Ooblique :: KeySym
xK_Ugrave :: KeySym
xK_Uacute :: KeySym
xK_Ucircumflex :: KeySym
xK_Udiaeresis :: KeySym
xK_Yacute :: KeySym
xK_THORN :: KeySym
xK_Thorn :: KeySym
xK_ssharp :: KeySym
xK_agrave :: KeySym
xK_aacute :: KeySym
xK_acircumflex :: KeySym
xK_atilde :: KeySym
xK_adiaeresis :: KeySym
xK_aring :: KeySym
xK_ae :: KeySym
xK_ccedilla :: KeySym
xK_egrave :: KeySym
xK_eacute :: KeySym
xK_ecircumflex :: KeySym
xK_ediaeresis :: KeySym
xK_igrave :: KeySym
xK_iacute :: KeySym
xK_icircumflex :: KeySym
xK_idiaeresis :: KeySym
xK_eth :: KeySym
xK_ntilde :: KeySym
xK_ograve :: KeySym
xK_oacute :: KeySym
xK_ocircumflex :: KeySym
xK_otilde :: KeySym
xK_odiaeresis :: KeySym
xK_division :: KeySym
xK_oslash :: KeySym
xK_ugrave :: KeySym
xK_uacute :: KeySym
xK_ucircumflex :: KeySym
xK_udiaeresis :: KeySym
xK_yacute :: KeySym
xK_thorn :: KeySym
xK_ydiaeresis :: KeySym
xK_nobreakspace :: KeySym
xK_exclamdown :: KeySym
xK_cent :: KeySym
xK_sterling :: KeySym
xK_currency :: KeySym
xK_yen :: KeySym
xK_brokenbar :: KeySym
xK_section :: KeySym
xK_diaeresis :: KeySym
xK_copyright :: KeySym
xK_ordfeminine :: KeySym
xK_guillemotleft :: KeySym
xK_notsign :: KeySym
xK_hyphen :: KeySym
xK_registered :: KeySym
xK_macron :: KeySym
xK_degree :: KeySym
xK_plusminus :: KeySym
xK_twosuperior :: KeySym
xK_threesuperior :: KeySym
xK_acute :: KeySym
xK_mu :: KeySym
xK_paragraph :: KeySym
xK_periodcentered :: KeySym
xK_cedilla :: KeySym
xK_onesuperior :: KeySym
xK_masculine :: KeySym
xK_guillemotright :: KeySym
xK_onequarter :: KeySym
xK_onehalf :: KeySym
xK_threequarters :: KeySym
xK_questiondown :: KeySym
xK_VoidSymbol :: KeySym


-- | This is an example of using <a>WildBind.X11.Emulate</a>. See the
--   source.
module WildBind.X11.Emulate.Example
main :: IO ()

-- | To use emulation functions, you need to obtain an <a>X11Front</a>
--   object by <a>withX11Front</a>, and call emulation functions on it.
--   
--   <a>bindsF</a> function is useful to send keyboard events to the
--   current <a>ActiveWindow</a>.
myBinding :: X11Front XKeyEvent -> Binding ActiveWindow XKeyEvent
