Speakup in userspace

Doug Sutherland doug at proficio.ca
Wed Jun 20 08:40:32 EDT 2007


Samuel said:
What we want is stealing some keypresses, but not all of
them.  The way to achieve this with input is currently to grab the
physical device, and re-emulate the keypresses we don't want in a uinput
device, which is quite tedious.

Fair enough. But it would seem that the components that make up a 
specialized system like this need to be decoupled rather than monolithic,
for many reasons, one being allowance for alternative modalities. What 
would be very useful I think, would be if those "stolen" keypresses could
land in a  /dev/input event queue. This decouples the input device from 
what is done what those stolen keypresses. It would also allow for some
other modality, not PC keyboard, to generate those same events by 
some other means. Consider someone who cannot type for whatever
reason, who needs an alternative interface other than the keyboard.

The Input Driver may be tedious but it's uniform and modular. If we are 
talking about potential user space versus kernel space, then it would make 
some sense to dissect the overall functionality into layers and separate 
them, then figure out what needs to remain in the kernel, ideally as 
somewhat "atomic" functionality, probably as several drivers instead of 
one, then think about how in user space an application might use those. 
The approach of putting it all in the kernel has quite a few detriments, 
probably the largest being the need for constant maintenance as the kernel 
changes. One small example, although it may be tedious to steal key
presses and then re-implement them, once that is done as a separate 
driver on its own, then very little should change from kernel to kernel 
version. One the other end of things, console output, there is even 
greater need for layering and atomicity of function, since what used 
to be a serial port is functionally the same now but the protocols and 
hardware to implement it (usb serial) is completely different. 

It might be a good idea to think in terms of what I would call 
vertical protoype if we want to explore user space versus kernel.
What I mean by that is rather than thinking of how the entire new 
design would work, take a small cross-section of the whole and 
try re-designing a simple example that traverses from input to output. 
In commercial, in-house, or contract software this approach is 
essential (vertical prototype) to ensure that the architecture is 
sound before attempting to re-design the whole mess. 

The need to steal keypresses is not new or unique. It makes a lot
of sense to pay close attention to the re-architecture of linux input
method and console projects. Even if it's tedious or we don't like 
how some things are done, throwing it out and going direct to 
hardware digs a hole that makes it hardware specific to x86 and
most likely a never ending cycle of maintenance so it doesn't 
break as the kernel evolves. 

Thinking about the whole process in abstraction somewhat like
the model-view-controller design pattern would make sense.
Stealing the keypresses should be independent and atomically
abstracted from what those keypresses do.

  -- Doug




More information about the Speakup mailing list