input: move DeviceChangedEvent conversion into eventconvert.c
The version in eventconvert.c was half broken and for some reason we ended up with a second version in exevents.c (which works). Move it over to where it belongs and call EventToXI2 instad of having a custom function for it. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
		
							parent
							
								
									33eb6f7081
								
							
						
					
					
						commit
						fe045820f1
					
				
							
								
								
									
										123
									
								
								Xi/exevents.c
								
								
								
								
							
							
						
						
									
										123
									
								
								Xi/exevents.c
								
								
								
								
							|  | @ -674,69 +674,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to, DeviceChangedEvent *dc | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static int |  | ||||||
| AppendKeyInfo(DeviceChangedEvent *dce, xXIKeyInfo* info) |  | ||||||
| { |  | ||||||
|     uint32_t *kc; |  | ||||||
|     int i; |  | ||||||
| 
 |  | ||||||
|     info->type = KeyClass; |  | ||||||
|     info->num_keycodes = dce->keys.max_keycode - dce->keys.min_keycode + 1; |  | ||||||
|     info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes; |  | ||||||
|     info->sourceid = dce->deviceid; |  | ||||||
| 
 |  | ||||||
|     kc = (uint32_t*)&info[1]; |  | ||||||
|     for (i = 0; i < info->num_keycodes; i++) |  | ||||||
|         *kc++ = i + dce->keys.min_keycode; |  | ||||||
| 
 |  | ||||||
|     return info->length * 4; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int |  | ||||||
| AppendButtonInfo(DeviceChangedEvent *dce, xXIButtonInfo *info) |  | ||||||
| { |  | ||||||
|     unsigned char *bits; |  | ||||||
|     int mask_len; |  | ||||||
| 
 |  | ||||||
|     mask_len = bytes_to_int32(bits_to_bytes(dce->buttons.num_buttons)); |  | ||||||
| 
 |  | ||||||
|     info->type = ButtonClass; |  | ||||||
|     info->num_buttons = dce->buttons.num_buttons; |  | ||||||
|     info->length = bytes_to_int32(sizeof(xXIButtonInfo)) + |  | ||||||
|                    info->num_buttons + mask_len; |  | ||||||
|     info->sourceid = dce->deviceid; |  | ||||||
| 
 |  | ||||||
|     bits = (unsigned char*)&info[1]; |  | ||||||
|     memset(bits, 0, mask_len * 4); |  | ||||||
|     /* FIXME: is_down? */ |  | ||||||
| 
 |  | ||||||
|     bits += mask_len * 4; |  | ||||||
|     memcpy(bits, dce->buttons.names, dce->buttons.num_buttons * sizeof(Atom)); |  | ||||||
| 
 |  | ||||||
|     return info->length * 4; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static int |  | ||||||
| AppendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumber) |  | ||||||
| { |  | ||||||
|     info->type = ValuatorClass; |  | ||||||
|     info->length = sizeof(xXIValuatorInfo)/4; |  | ||||||
|     info->label = dce->valuators[axisnumber].name; |  | ||||||
|     info->min.integral = dce->valuators[axisnumber].min; |  | ||||||
|     info->min.frac = 0; |  | ||||||
|     info->max.integral = dce->valuators[axisnumber].max; |  | ||||||
|     info->max.frac = 0; |  | ||||||
|     /* FIXME: value */ |  | ||||||
|     info->value.integral = 0; |  | ||||||
|     info->value.frac = 0; |  | ||||||
|     info->resolution = dce->valuators[axisnumber].resolution; |  | ||||||
|     info->number = axisnumber; |  | ||||||
|     info->mode = dce->valuators[axisnumber].mode; /* Server doesn't have per-axis mode yet */ |  | ||||||
|     info->sourceid = dce->deviceid; |  | ||||||
| 
 |  | ||||||
|     return info->length * 4; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /**
 | /**
 | ||||||
|  * Send an XI2 DeviceChangedEvent to all interested clients. |  * Send an XI2 DeviceChangedEvent to all interested clients. | ||||||
|  */ |  */ | ||||||
|  | @ -744,69 +681,19 @@ void | ||||||
| XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce) | XISendDeviceChangedEvent(DeviceIntPtr device, DeviceIntPtr master, DeviceChangedEvent *dce) | ||||||
| { | { | ||||||
|     xXIDeviceChangedEvent *dcce; |     xXIDeviceChangedEvent *dcce; | ||||||
|     int len = sizeof(xXIDeviceChangedEvent); |     int rc; | ||||||
|     int nkeys; |  | ||||||
|     char *ptr; |  | ||||||
| 
 | 
 | ||||||
|     if (dce->buttons.num_buttons) |     rc = EventToXI2((InternalEvent*)dce, (xEvent**)&dcce); | ||||||
|  |     if (rc != Success) | ||||||
|     { |     { | ||||||
|         len += sizeof(xXIButtonInfo); |         ErrorF("[Xi] event conversion from DCE failed with code %d\n", rc); | ||||||
|         len += dce->buttons.num_buttons * sizeof(Atom); /* button names */ |  | ||||||
|         len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons)); |  | ||||||
|     } |  | ||||||
|     if (dce->num_valuators) |  | ||||||
|         len += sizeof(xXIValuatorInfo) * dce->num_valuators; |  | ||||||
| 
 |  | ||||||
|     nkeys = (dce->keys.max_keycode > 0) ? |  | ||||||
|                 dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0; |  | ||||||
|     if (nkeys > 0) |  | ||||||
|     { |  | ||||||
|         len += sizeof(xXIKeyInfo); |  | ||||||
|         len += sizeof(CARD32) * nkeys; /* keycodes */ |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     dcce = xcalloc(1, len); |  | ||||||
|     if (!dcce) |  | ||||||
|     { |  | ||||||
|         ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n"); |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     dcce->type         = GenericEvent; |  | ||||||
|     dcce->extension    = IReqCode; |  | ||||||
|     dcce->evtype       = XI_DeviceChanged; |  | ||||||
|     dcce->time         = GetTimeInMillis(); |  | ||||||
|     dcce->deviceid     = master->id; |  | ||||||
|     dcce->sourceid     = device->id; |  | ||||||
|     dcce->reason       = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch; |  | ||||||
|     dcce->num_classes  = 0; |  | ||||||
|     dcce->length = bytes_to_int32(len - sizeof(xEvent)); |  | ||||||
| 
 |  | ||||||
|     ptr = (char*)&dcce[1]; |  | ||||||
|     if (dce->buttons.num_buttons) |  | ||||||
|     { |  | ||||||
|         dcce->num_classes++; |  | ||||||
|         ptr += AppendButtonInfo(dce, (xXIButtonInfo*)ptr); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (nkeys) |  | ||||||
|     { |  | ||||||
|         dcce->num_classes++; |  | ||||||
|         ptr += AppendKeyInfo(dce, (xXIKeyInfo*)ptr); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (dce->num_valuators) |  | ||||||
|     { |  | ||||||
|         int i; |  | ||||||
| 
 |  | ||||||
|         dcce->num_classes += dce->num_valuators; |  | ||||||
|         for (i = 0; i < dce->num_valuators; i++) |  | ||||||
|             ptr += AppendValuatorInfo(dce, (xXIValuatorInfo*)ptr, i); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* we don't actually swap if there's a NullClient, swapping is done
 |     /* we don't actually swap if there's a NullClient, swapping is done
 | ||||||
|      * later when event is delivered. */ |      * later when event is delivered. */ | ||||||
|     SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1); |     SendEventToAllWindows(master, XI_DeviceChangedMask, (xEvent*)dcce, 1); | ||||||
|  |     xfree(dcce); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  |  | ||||||
|  | @ -340,38 +340,135 @@ getValuatorEvents(DeviceEvent *ev, deviceValuator *xv) | ||||||
|     return (num_valuators + 5) / 6; |     return (num_valuators + 5) / 6; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| static int | static int | ||||||
| eventToDeviceChanged(DeviceChangedEvent *ev, xEvent **xi) | appendKeyInfo(DeviceChangedEvent *dce, xXIKeyInfo* info) | ||||||
| { | { | ||||||
|     int len = sizeof(xEvent); |     uint32_t *kc; | ||||||
|     DeviceIntPtr slave; |     int i; | ||||||
|     int rc; |  | ||||||
|     xXIDeviceChangedEvent *dce; |  | ||||||
| 
 | 
 | ||||||
|     rc = dixLookupDevice(&slave, ev->new_slaveid, |     info->type = KeyClass; | ||||||
|                          serverClient, DixReadAccess); |     info->num_keycodes = dce->keys.max_keycode - dce->keys.min_keycode + 1; | ||||||
|  |     info->length = sizeof(xXIKeyInfo)/4 + info->num_keycodes; | ||||||
|  |     info->sourceid = dce->deviceid; | ||||||
| 
 | 
 | ||||||
|     if (rc != Success) |     kc = (uint32_t*)&info[1]; | ||||||
|         return rc; |     for (i = 0; i < info->num_keycodes; i++) | ||||||
|  |         *kc++ = i + dce->keys.min_keycode; | ||||||
| 
 | 
 | ||||||
|     len += SizeDeviceClasses(slave); |     return info->length * 4; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|     *xi = xcalloc(1, len); | static int | ||||||
|     if (!(*xi)) | appendButtonInfo(DeviceChangedEvent *dce, xXIButtonInfo *info) | ||||||
|  | { | ||||||
|  |     unsigned char *bits; | ||||||
|  |     int mask_len; | ||||||
|  | 
 | ||||||
|  |     mask_len = bytes_to_int32(bits_to_bytes(dce->buttons.num_buttons)); | ||||||
|  | 
 | ||||||
|  |     info->type = ButtonClass; | ||||||
|  |     info->num_buttons = dce->buttons.num_buttons; | ||||||
|  |     info->length = bytes_to_int32(sizeof(xXIButtonInfo)) + | ||||||
|  |                    info->num_buttons + mask_len; | ||||||
|  |     info->sourceid = dce->deviceid; | ||||||
|  | 
 | ||||||
|  |     bits = (unsigned char*)&info[1]; | ||||||
|  |     memset(bits, 0, mask_len * 4); | ||||||
|  |     /* FIXME: is_down? */ | ||||||
|  | 
 | ||||||
|  |     bits += mask_len * 4; | ||||||
|  |     memcpy(bits, dce->buttons.names, dce->buttons.num_buttons * sizeof(Atom)); | ||||||
|  | 
 | ||||||
|  |     return info->length * 4; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int | ||||||
|  | appendValuatorInfo(DeviceChangedEvent *dce, xXIValuatorInfo *info, int axisnumber) | ||||||
|  | { | ||||||
|  |     info->type = ValuatorClass; | ||||||
|  |     info->length = sizeof(xXIValuatorInfo)/4; | ||||||
|  |     info->label = dce->valuators[axisnumber].name; | ||||||
|  |     info->min.integral = dce->valuators[axisnumber].min; | ||||||
|  |     info->min.frac = 0; | ||||||
|  |     info->max.integral = dce->valuators[axisnumber].max; | ||||||
|  |     info->max.frac = 0; | ||||||
|  |     /* FIXME: value */ | ||||||
|  |     info->value.integral = 0; | ||||||
|  |     info->value.frac = 0; | ||||||
|  |     info->resolution = dce->valuators[axisnumber].resolution; | ||||||
|  |     info->number = axisnumber; | ||||||
|  |     info->mode = dce->valuators[axisnumber].mode; /* Server doesn't have per-axis mode yet */ | ||||||
|  |     info->sourceid = dce->deviceid; | ||||||
|  | 
 | ||||||
|  |     return info->length * 4; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int | ||||||
|  | eventToDeviceChanged(DeviceChangedEvent *dce, xEvent **xi) | ||||||
|  | { | ||||||
|  |     xXIDeviceChangedEvent *dcce; | ||||||
|  |     int len = sizeof(xXIDeviceChangedEvent); | ||||||
|  |     int nkeys; | ||||||
|  |     char *ptr; | ||||||
|  | 
 | ||||||
|  |     if (dce->buttons.num_buttons) | ||||||
|  |     { | ||||||
|  |         len += sizeof(xXIButtonInfo); | ||||||
|  |         len += dce->buttons.num_buttons * sizeof(Atom); /* button names */ | ||||||
|  |         len += pad_to_int32(bits_to_bytes(dce->buttons.num_buttons)); | ||||||
|  |     } | ||||||
|  |     if (dce->num_valuators) | ||||||
|  |         len += sizeof(xXIValuatorInfo) * dce->num_valuators; | ||||||
|  | 
 | ||||||
|  |     nkeys = (dce->keys.max_keycode > 0) ? | ||||||
|  |                 dce->keys.max_keycode - dce->keys.min_keycode + 1 : 0; | ||||||
|  |     if (nkeys > 0) | ||||||
|  |     { | ||||||
|  |         len += sizeof(xXIKeyInfo); | ||||||
|  |         len += sizeof(CARD32) * nkeys; /* keycodes */ | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     dcce = xcalloc(1, len); | ||||||
|  |     if (!dcce) | ||||||
|  |     { | ||||||
|  |         ErrorF("[Xi] BadAlloc in SendDeviceChangedEvent.\n"); | ||||||
|         return BadAlloc; |         return BadAlloc; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     dce = (xXIDeviceChangedEvent*)(*xi); |     dcce->type         = GenericEvent; | ||||||
|     dce->type = GenericEvent; |     dcce->extension    = IReqCode; | ||||||
|     dce->extension = IReqCode; |     dcce->evtype       = XI_DeviceChanged; | ||||||
|     dce->evtype = XI_DeviceChanged; |     dcce->time         = dce->time; | ||||||
|     dce->time = GetTimeInMillis(); |     dcce->deviceid     = dce->deviceid; | ||||||
|     dce->sourceid = slave->id; |     dcce->sourceid     = dce->deviceid; | ||||||
|     dce->reason = XISlaveSwitch; |     dcce->reason       = (dce->flags & DEVCHANGE_DEVICE_CHANGE) ? XIDeviceChange : XISlaveSwitch; | ||||||
|     dce->length = (len - sizeof(xEvent))/4; |     dcce->num_classes  = 0; | ||||||
|  |     dcce->length = bytes_to_int32(len - sizeof(xEvent)); | ||||||
| 
 | 
 | ||||||
|     /* FIXME: this should come from the event, not from the device. See
 |     ptr = (char*)&dcce[1]; | ||||||
|      * CreateClassesChangedEvent */ |     if (dce->buttons.num_buttons) | ||||||
|     ListDeviceClasses(slave, (char*)&dce[1], &dce->num_classes); |     { | ||||||
|  |         dcce->num_classes++; | ||||||
|  |         ptr += appendButtonInfo(dce, (xXIButtonInfo*)ptr); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (nkeys) | ||||||
|  |     { | ||||||
|  |         dcce->num_classes++; | ||||||
|  |         ptr += appendKeyInfo(dce, (xXIKeyInfo*)ptr); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (dce->num_valuators) | ||||||
|  |     { | ||||||
|  |         int i; | ||||||
|  | 
 | ||||||
|  |         dcce->num_classes += dce->num_valuators; | ||||||
|  |         for (i = 0; i < dce->num_valuators; i++) | ||||||
|  |             ptr += appendValuatorInfo(dce, (xXIValuatorInfo*)ptr, i); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     *xi = (xEvent*)dcce; | ||||||
| 
 | 
 | ||||||
|     return Success; |     return Success; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue