+XMonad.Util.XPaste: a module for pasting strings to windows

This commit is contained in:
gwern0
2008-09-20 15:21:06 +00:00
parent 9dd5fff540
commit 4ae4a7ec07
3 changed files with 78 additions and 0 deletions

View File

@@ -490,6 +490,9 @@ A non complete list with a brief description:
workspaces in various ways, used by several other modules which need workspaces in various ways, used by several other modules which need
to sort workspaces (e.g. "XMonad.Hooks.DynamicLog"). to sort workspaces (e.g. "XMonad.Hooks.DynamicLog").
* "XMonad.Util.XPaste" provides utilities for pasting or sending keys and
strings to windows;
* "XMonad.Util.XSelection" provide utilities for using the mouse * "XMonad.Util.XSelection" provide utilities for using the mouse
selection; selection;

74
XMonad/Util/XPaste.hs Normal file
View File

@@ -0,0 +1,74 @@
{- |
Module : XMonad.Util.XPaste
Copyright : (C) 2008
License : BSD3
Maintainer : <gwern0@gmail.com
Stability : unstable
Portability : unportable
A module for sending key presses to windows. This modules provides generalized
and specialized functions for this task.
-}
module XMonad.Util.XPaste where
import XMonad (io, theRoot, withDisplay, X ())
import Graphics.X11
import Graphics.X11.Xlib.Extras (none, setEventType, setKeyEvent)
import Control.Monad.Reader (asks)
import XMonad.Operations (withFocused)
import Data.Char (isUpper)
import Graphics.X11.Xlib.Misc (stringToKeysym)
import XMonad.Util.XSelection (getSelection)
{- $usage
Import this module into your xmonad.hs as usual:
> import XMonad.Util.XPaste
And use the functions. They all return "X ()", and so are appropriate for use as keybindings.
Example:
> , ((m, xK_d), pasteString "foo bar") ]
Don't expect too much of the functions; they probably don't work on complex
texts.
-}
-- | Paste the current X mouse selection. Note that this uses 'getSelection' from "XMonad.Util.XSelection" and so is heir to its flaws.
pasteSelection :: X ()
pasteSelection = getSelection >>= pasteString
-- | Send a string to the window with current focus. This function correctly handles capitalization.
pasteString :: String -> X ()
pasteString = mapM_ (\x -> if isUpper x then pasteChar shiftMask x else pasteChar 0 x)
{- | Send a character to the current window. This is more low-level.
Remember that you must handle the case of capitalization appropriately. That is, from the window's perspective:
> pasteChar mod2Mask 'F' ~> "f"
You would want to do something like:
> pasteChar shiftMask 'F'
-}
pasteChar :: KeyMask -> Char -> X ()
pasteChar m c = pasteKey m $ stringToKeysym [c]
pasteKey :: KeyMask -> KeySym -> X ()
pasteKey = (withFocused .) . pasteKeyWindow
pasteKeyWindow :: KeyMask -> KeySym -> Window -> X ()
pasteKeyWindow mods key w = withDisplay $ \d -> do
rootw <- asks theRoot
keycode <- io $ keysymToKeycode d key
io $ allocaXEvent $ \ev -> do
setEventType ev keyPress
setKeyEvent ev w rootw none mods keycode True
sendEvent d w True keyPressMask ev
setEventType ev keyRelease
sendEvent d w True keyReleaseMask ev

View File

@@ -197,5 +197,6 @@ library
XMonad.Util.Timer XMonad.Util.Timer
XMonad.Util.WindowProperties XMonad.Util.WindowProperties
XMonad.Util.WorkspaceCompare XMonad.Util.WorkspaceCompare
XMonad.Util.XPaste
XMonad.Util.XSelection XMonad.Util.XSelection
XMonad.Util.XUtils XMonad.Util.XUtils