On Fri Mar 20 03:58:26 EDT 2009, [email protected] wrote:
> I am also looking for advice on what people might like for the
> interface, right now I am using:
>
> struct InputEvent {
> int msec;
> unsigned short type;
> unsigned short code;
> int value;
> };
the old objections notwithstanding, i think this is a good idea.
one can easily emulate the old interface with a combined kbd/mouse
interface in libary with the added bonus that it's harder to get misordered
kbd/mouse events which can be a problem on lossy wireless networks
(don't you hate it when your acme clicks and types get out-of-wack?)
and the ability to see more of the kbd state.
if you want to do this, think it terms of a devce, say /dev/input.
most plan 9 devices of this type have a text interface. see mouse(3).
this format could easily be extended so that mouse is as before
and keyboard events are presented as 'k ' char[11] ' ' scancode[11] ' '
msec[1 - 24]. one would imagine mod being a bit vector of
the normal mode keys encoding plus a bit for key press/release.
<mouse.h> already has a reasonable definition for mouse events.
by analogy,
typedef struct Keyboard Keyboard;
struct Keyboard {
Rune c;
uint sc;
uvlong msec;
};
then
typedef struct Input Input
struct Input {
int type; /* 'k' or 'm' */
union{
Keyboard
Mouse
};
};
and finally
typedef struct Inputctl Inputctl;
struct Inputctl
{
Channel *c; /* chan(Input[20]) */
char *file;
int inputfd; /* to input file */
int ctlfd; /* to ctl file */
int pid; /* of slave proc */
};
i'm glossing over dealing with mouse vs keyboard control
events.
the work is building this into the kernel and rio. i think
it would make sense for keyboard(2) and mouse(2) to
be emulated in terms of the new interface for syncronization
reasons.
once you've torn all that up, it will be a trivial undertaking to
get your shift release event. ☺
- erik