91 lines
2.7 KiB
Plaintext
91 lines
2.7 KiB
Plaintext
XTestGenerateEvent is supposed to cause the server to generate a key or
|
|
button event, exactly as one would be generated if a user pressed a key
|
|
or pushed a mouse button. Without knowing how your server does that for
|
|
normal input events, I can't tell you exactly how that should look, but
|
|
it would be something like:
|
|
|
|
void
|
|
XTestGenerateEvent (dev_type, key_or_button_code, direction, x, y)
|
|
int dev_type; /* MOUSE = X pointer, KEYBOARD = X keyboard */
|
|
int key_or_button_code; /* code to stash in event */
|
|
int direction; /* XTestKEY_UP or XTestKEY_DOWN */
|
|
int x,y; /* location of event */
|
|
{
|
|
int type;
|
|
xEvent *xE;
|
|
|
|
if (key_or_button_code < 8) /* must be a button */
|
|
if (direction == XTestKEY_UP) /* it's a release event*/
|
|
type = ButtonRelease;
|
|
else
|
|
type = ButtonPress;
|
|
else /* must be a key */
|
|
if (direction == XTestKEY_UP) /* it's a release event*/
|
|
type = KeyRelease;
|
|
else
|
|
type = KeyPress;
|
|
|
|
/* get an xEvent from some place where ProcessInputEvents can find it. */
|
|
/* I don't know how your implementation does this. */
|
|
|
|
xE = somehow_get_xEvent();
|
|
|
|
xE->u.u.type = type;
|
|
xE->u.u.detail = key_or_button_code;
|
|
xE->u.keyButtonPointer.time = GetTimeInMillis();
|
|
xE->u.keyButtonPointer.rootX = x;
|
|
xE->u.keyButtonPointer.rootY = y;
|
|
|
|
/* now call ProcessInputEvents to send the event to DIX for routing to the
|
|
appropriate client(s). */
|
|
|
|
ProcessInputEvents();
|
|
}
|
|
|
|
|
|
XTestJumpPointer performs the equivalent function for pointer events.
|
|
|
|
void
|
|
XTestJumpPointer (x, y, dev_type)
|
|
int x,y;
|
|
int dev_type;
|
|
{
|
|
/* get an xEvent from some place where ProcessInputEvents can find it. */
|
|
/* I don't know how your implementation does this. */
|
|
|
|
xE = somehow_get_xEvent();
|
|
|
|
xE->u.u.type = MotionNotify;
|
|
xE->u.keyButtonPointer.time = GetTimeInMillis();
|
|
xE->u.keyButtonPointer.rootX = x;
|
|
xE->u.keyButtonPointer.rootY = y;
|
|
|
|
/* Call some place in your server code that takes care of acceleration and
|
|
threshold. Also constrain the move to the screen bounds. You
|
|
may also have a motion history buffer that should be updated with
|
|
the information in this event.
|
|
*/
|
|
|
|
deal_with_acceleration ();
|
|
constrainxy();
|
|
update_motion_history();
|
|
|
|
/* now call ProcessInputEvents to send the event to DIX for routing to the
|
|
appropriate client(s). */
|
|
|
|
ProcessInputEvents();
|
|
}
|
|
|
|
XTestGetPointerPos returns the server's notion of where the X pointer currently
|
|
is. This is probably kept by ddx in some implementation-specific structure:
|
|
|
|
Implementation_Specific_Struct *i;
|
|
|
|
void
|
|
XTestGetPointerPos (x,y)
|
|
short *x,*y;
|
|
{
|
|
*x = i->x;
|
|
*y = i->y;
|
|
}
|