<div class="gmail_quote">On Sat, Sep 25, 2010 at 10:26 PM,  <span dir="ltr"><<a href="mailto:wettstein509@solnet.ch" target="_blank">wettstein509@solnet.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div>> I would like to have permanent exclusive access to keyboard events and<br>
> the possibility to drop arriving events and create new ones before<br>
> they are finally delivered to the application over the normal X<br>
> channels (window with keyboard focus, grabs).<br>
<br>
</div>I believe I have a solution, but it is not simple, and currently<br>
requires a small bug in the X-server to be fixed before it can work<br>
(#28575 in the freedesktop bugzilla).  It goes as follows:<br>
<br>
We create an XKB keymap in which all physical keys we want to intercept<br>
have a message action mapped to them, for example:<br>
<br>
    key <AE07> {<br>
        type= "ONE_LEVEL",<br>
        repeat= No,<br>
        symbols[Group1]= [        NoSymbol ],<br>
        actions[Group1]= [ ActionMessage(report=all, data="Hello") ]<br>
    };<br>
<br>
Message actions have two important benefits: Applications which ask for<br>
them get them all (presses and releases, when 'report=all' is used as<br>
above), and applications that do not ask for them do not get anything,<br>
not even a usual key event (by default; this can be changed by an option<br>
to ActionMessage).<br>
<br>
The intercepting client uses the extension XTest to generate artificial<br>
key events for keycodes that have no physical keys associated to them.<br>
These keycodes have normal keysyms mapped to them, and these artificial<br>
key events is all usual clients see from keyboard activity.<br>
<br>
I have been using this approach with a patched X-server for a couple of<br>
months (for a trivial tool that admittedly could be implemented easier<br>
using the XRecord extension), and it works.<br>
<br>
In principle, applications other than the intercepting client could ask<br>
for message actions.  However, as usual keymaps do not use message<br>
actions, the odds that this really happens are low.  Practically, I<br>
believe the greatest problem in this modern world with all its<br>
multimedia keyboards is to find keycodes that are guaranteed not to be<br>
taken by real keys.<br></blockquote><div><br></div><div>This looks very intriguing and could indeed solve my problem. But please clarify something for me. I need to intercept *all* keys with a main interest keys that normally print characters. So when you mention "Practically, I believe the greatest problem in this modern world with all its multimedia keyboards is to find keycodes that are guaranteed not to be taken by real keys.", are you talking about a limitation in this approach for my problem, or is it possible to override already taken keys with an action binding? (I think it's the latter, but just to make sure before I start patching my X server).</div>


<div><br></div><div>Apart from that what is the core teams stance on the bug report? Is there a defined behavior and this is a bug, or is there some deeper reason behind the current implementation? Running permanently with patched versions is acceptable, but if it would be fixed, it would obviously be better.</div>


<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><br>
> So what do people do in similar situations? I think that input<br>
> methods, and accessibility related projects need to solve a similar<br>
> problem. Although I feel that both problem areas are a lot more<br>
> complex than mine, as they need to provide UI interaction, which I<br>
> don't.<br>
<br>
</div>As far as I can tell (but I am not an expert), input methods do not<br>
allow to create events with modifiers (such as Control-X).  Some input<br>
methods allow to create events such as a keysym Backspace, but not all<br>
applications treat this event as they would treat hitting the backspace<br>
key.  This might or might not be relevant for you.<br>
<br>
Apart from UI, one thing that input methods can do that the proposal<br>
above can not is to create arbitrary input characters; the proposed<br>
approach is restricted to what is in the keymap.<br></blockquote><div><br></div><div>Hmm, I think this would actually not work for me, because I'm trying to recognize more key combinations (by analyzing the key event stream) than the standard modifiers give me out of the box, and then to execute actions on different programs based on it. A bit like system wide shortcuts on steroids. This means that either I need between detecting the combination patterns and executing the actions a communication channel that allows to carry that many distinct signals, or both aspects must be implemented in the same place and I need to be able to invoke all actions directly. Your approach with action messages gives me the ability to do the processing in the WM, so I could implement the second version in a comfortable way. Right now it looks like this is the better approach to pursue.</div>

<div><br></div><div>Thanks for the detailed response, it helped a lot.</div><div><br></div><div>Daniel</div></div><br>