int SProcXSendExtensionEvent(ClientPtr client) { CARD32 *p; int i; xEvent eventT; xEvent *eventP; EventSwapPtr proc; REQUEST(xSendExtensionEventReq); swaps(&stuff->length); REQUEST_AT_LEAST_SIZE(xSendExtensionEventReq); swapl(&stuff->destination); swaps(&stuff->count); if (stuff->length != bytes_to_int32(sizeof(xSendExtensionEventReq)) + stuff->count + bytes_to_int32(stuff->num_events * sizeof(xEvent))) return BadLength; eventP = (xEvent *) & stuff[1]; for (i = 0; i < stuff->num_events; i++, eventP++) { proc = EventSwapVector[eventP->u.u.type & 0177]; if (proc == NotImplemented) /* no swapping proc; invalid event type? */ return BadValue; (*proc) (eventP, &eventT); *eventP = eventT; } p = (CARD32 *)(((xEvent *) & stuff[1]) + stuff->num_events); SwapLongs(p, stuff->count); return (ProcXSendExtensionEvent(client)); }
int ProcIDispatch(register ClientPtr client) { REQUEST(xReq); if (stuff->data == X_GetExtensionVersion) return (ProcXGetExtensionVersion(client)); if (stuff->data == X_ListInputDevices) return (ProcXListInputDevices(client)); else if (stuff->data == X_OpenDevice) return (ProcXOpenDevice(client)); else if (stuff->data == X_CloseDevice) return (ProcXCloseDevice(client)); else if (stuff->data == X_SetDeviceMode) return (ProcXSetDeviceMode(client)); else if (stuff->data == X_SelectExtensionEvent) return (ProcXSelectExtensionEvent(client)); else if (stuff->data == X_GetSelectedExtensionEvents) return (ProcXGetSelectedExtensionEvents(client)); else if (stuff->data == X_ChangeDeviceDontPropagateList) return (ProcXChangeDeviceDontPropagateList(client)); else if (stuff->data == X_GetDeviceDontPropagateList) return (ProcXGetDeviceDontPropagateList(client)); else if (stuff->data == X_GetDeviceMotionEvents) return (ProcXGetDeviceMotionEvents(client)); else if (stuff->data == X_ChangeKeyboardDevice) return (ProcXChangeKeyboardDevice(client)); else if (stuff->data == X_ChangePointerDevice) return (ProcXChangePointerDevice(client)); else if (stuff->data == X_GrabDevice) return (ProcXGrabDevice(client)); else if (stuff->data == X_UngrabDevice) return (ProcXUngrabDevice(client)); else if (stuff->data == X_GrabDeviceKey) return (ProcXGrabDeviceKey(client)); else if (stuff->data == X_UngrabDeviceKey) return (ProcXUngrabDeviceKey(client)); else if (stuff->data == X_GrabDeviceButton) return (ProcXGrabDeviceButton(client)); else if (stuff->data == X_UngrabDeviceButton) return (ProcXUngrabDeviceButton(client)); else if (stuff->data == X_AllowDeviceEvents) return (ProcXAllowDeviceEvents(client)); else if (stuff->data == X_GetDeviceFocus) return (ProcXGetDeviceFocus(client)); else if (stuff->data == X_SetDeviceFocus) return (ProcXSetDeviceFocus(client)); else if (stuff->data == X_GetFeedbackControl) return (ProcXGetFeedbackControl(client)); else if (stuff->data == X_ChangeFeedbackControl) return (ProcXChangeFeedbackControl(client)); else if (stuff->data == X_GetDeviceKeyMapping) return (ProcXGetDeviceKeyMapping(client)); else if (stuff->data == X_ChangeDeviceKeyMapping) return (ProcXChangeDeviceKeyMapping(client)); else if (stuff->data == X_GetDeviceModifierMapping) return (ProcXGetDeviceModifierMapping(client)); else if (stuff->data == X_SetDeviceModifierMapping) return (ProcXSetDeviceModifierMapping(client)); else if (stuff->data == X_GetDeviceButtonMapping) return (ProcXGetDeviceButtonMapping(client)); else if (stuff->data == X_SetDeviceButtonMapping) return (ProcXSetDeviceButtonMapping(client)); else if (stuff->data == X_QueryDeviceState) return (ProcXQueryDeviceState(client)); else if (stuff->data == X_SendExtensionEvent) return (ProcXSendExtensionEvent(client)); else if (stuff->data == X_DeviceBell) return (ProcXDeviceBell(client)); else if (stuff->data == X_SetDeviceValuators) return (ProcXSetDeviceValuators(client)); else if (stuff->data == X_GetDeviceControl) return (ProcXGetDeviceControl(client)); else if (stuff->data == X_ChangeDeviceControl) return (ProcXChangeDeviceControl(client)); else { SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest); } return (BadRequest); }
int _X_COLD SProcXSendExtensionEvent(ClientPtr client) { CARD32 *p; int i; xEvent eventT = { .u.u.type = 0 }; xEvent *eventP; EventSwapPtr proc; REQUEST(xSendExtensionEventReq); swaps(&stuff->length); REQUEST_AT_LEAST_SIZE(xSendExtensionEventReq); swapl(&stuff->destination); swaps(&stuff->count); if (stuff->length != bytes_to_int32(sizeof(xSendExtensionEventReq)) + stuff->count + bytes_to_int32(stuff->num_events * sizeof(xEvent))) return BadLength; eventP = (xEvent *) &stuff[1]; for (i = 0; i < stuff->num_events; i++, eventP++) { if (eventP->u.u.type == GenericEvent) { client->errorValue = eventP->u.u.type; return BadValue; } proc = EventSwapVector[eventP->u.u.type & 0177]; /* no swapping proc; invalid event type? */ if (proc == NotImplemented) { client->errorValue = eventP->u.u.type; return BadValue; } (*proc) (eventP, &eventT); *eventP = eventT; } p = (CARD32 *) (((xEvent *) &stuff[1]) + stuff->num_events); SwapLongs(p, stuff->count); return (ProcXSendExtensionEvent(client)); } /*********************************************************************** * * Send an event to some client, as if it had come from an extension input * device. * */ int ProcXSendExtensionEvent(ClientPtr client) { int ret, i; DeviceIntPtr dev; xEvent *first; XEventClass *list; struct tmask tmp[EMASKSIZE]; REQUEST(xSendExtensionEventReq); REQUEST_AT_LEAST_SIZE(xSendExtensionEventReq); if (stuff->length != bytes_to_int32(sizeof(xSendExtensionEventReq)) + stuff->count + (stuff->num_events * bytes_to_int32(sizeof(xEvent)))) return BadLength; ret = dixLookupDevice(&dev, stuff->deviceid, client, DixWriteAccess); if (ret != Success) return ret; if (stuff->num_events == 0) return ret; /* The client's event type must be one defined by an extension. */ first = ((xEvent *) &stuff[1]); for (i = 0; i < stuff->num_events; i++) { if (!((EXTENSION_EVENT_BASE <= first[i].u.u.type) && (first[i].u.u.type < lastEvent))) { client->errorValue = first[i].u.u.type; return BadValue; } } list = (XEventClass *) (first + stuff->num_events); if ((ret = CreateMaskFromList(client, list, stuff->count, tmp, dev, X_SendExtensionEvent)) != Success) return ret; ret = (SendEvent(client, dev, stuff->destination, stuff->propagate, (xEvent *) &stuff[1], tmp[stuff->deviceid].mask, stuff->num_events)); return ret; }