Riccardo Murri <riccardo.murri at ...> writes:
> 1) Since I have no modifier keys left on my laptop, and I'm an Emacs
> user (which takes away many C- and M- keybindings), I'd like to bind
> most XMonad actions with "C-z" as a prefix (using EZConfig).
>> Is there a way to bind a key so that "C-z C-z" sends a C-z to the
> currently focused window? (Ratpoison has a similar feature for C-t)
>
I did some googling and found out that:
1) the quickest solution is to use "xdotool"
[http://www.semicomplete.com/projects/xdotool/], which can (among
other nifty things), send a fake keypress to the currently focused
window::
("C-z C-z", spawn "xdotool key ctrl+z")
2) According to:
http://www.handhelds.org/moin/moin.cgi/GeneratingSyntheticX11Events
there are two Xlib programmatic solution, one using the XTest
extension (recommended), and one using XSendEvent(). As far as I
understand, there are no bindings for XTest in the Graphics.X11
module, so one has to code using sendEvent...
With the following code, I have been able to send a Ctrl+Z to urxvt
and "xev" windows directly from XMonad::
-- send Ctrl+Z to focused window
sendCtrlZ = sendKey controlMask xK_z
sendKey modmask keysym = withDisplay $ \d -> do
keycode <- io $ keysymToKeycode d keysym
root <- asks theRoot
let subw = none -- FIXME: should this be the subwindow which the pointer is in?
withFocused $ \w -> do
io $ allocaXEvent $ \ev -> do
setEventType ev keyPress
setKeyEvent ev w root subw modmask keycode True
sendEvent d w False noEventMask ev
io $ allocaXEvent $ \ev -> do
setEventType ev keyRelease
setKeyEvent ev w root subw modmask keycode True
sendEvent d w False noEventMask ev
return ()
Thanks to all those who replied with suggestions to my original post!
Cheers,
Riccardo