
On Fri, Sep 19, 2008 at 02:33:00PM -0400, Gwern Branwen wrote:
Ah, I see. I was searching for the wrong type signature after all.
So I've been working up a basic XPaste module, and here's what I have thus far"
-------------------------------- sendSelection :: KeyMask -> X () sendSelection m = getSelection >>= (sendString m)
sendString :: KeyMask -> String -> X () sendString mo = mapM_ (sendChar mo)
sendChar :: KeyMask -> Char -> X () sendChar modm c = sendKeyScreen modm (stringToKeysym [c])
sendKeyScreen :: KeyMask -> KeySym -> X () sendKeyScreen modmk key = withFocused (sendKeysym modmk key)
sendKeysym :: KeyMask -> KeySym -> Window -> X () sendKeysym 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 --------------------------------
If I might suggest a few name changes: - change sendKeyScreen to sendKey - change sendKeysym to sendKeyWindow
My first question is, is there any way to scrap all the KeyMask plumbing? I looked at the X11 docs, but there doesn't seem to be any null modmask - mod1Mask is Alt, Shift is Shift, and so on.
KeyMask is a bitmask, so 0 is the no modifiers pressed state. I'd also leave the KeyMask argument on sendKeysym and sendKeyscreen -- some users want to send keys with modifiers (eg. the person that started this thread).
My second question is, why does 'keysymToKeycode' take a String? I manually played around with it in GHCi and it seems every String which isn't a Char always gets evaluated to '0'.
I assume you mean stringToKeysym. Try: stringToKeysym "F1". You should probably filter out the 0 results when sending a string, or perhaps throw an error. Cheers, Spencer Janssen