xkb: restore XKB PtrBtn actions.
Ifdef'd out since the switch to internal events. PtrBtn actions now work again. Instead of generating the event directly, GPE generates the event and it is then posted through the usual event processing routines (mieqProcessDeviceEvent). Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
		
							parent
							
								
									3d3b8babd1
								
							
						
					
					
						commit
						a148d40742
					
				
							
								
								
									
										109
									
								
								xkb/ddxDevBtn.c
								
								
								
								
							
							
						
						
									
										109
									
								
								xkb/ddxDevBtn.c
								
								
								
								
							|  | @ -35,98 +35,43 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
| #include "inputstr.h" | #include "inputstr.h" | ||||||
| #include "scrnintstr.h" | #include "scrnintstr.h" | ||||||
| #include "windowstr.h" | #include "windowstr.h" | ||||||
|  | #include "eventstr.h" | ||||||
| #include <xkbsrv.h> | #include <xkbsrv.h> | ||||||
|  | #include "mi.h" | ||||||
| #include <X11/extensions/XI.h> | #include <X11/extensions/XI.h> | ||||||
| #include <X11/extensions/XIproto.h> | #include <X11/extensions/XIproto.h> | ||||||
| 
 | 
 | ||||||
| extern	int	DeviceValuator; |  | ||||||
| 
 |  | ||||||
| static EventListPtr masterEvents = NULL; |  | ||||||
| 
 |  | ||||||
| void | void | ||||||
| XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) | XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) | ||||||
| { | { | ||||||
| int *			devVal; |     EventListPtr        events; | ||||||
| INT32 *			evVal; |     int                 nevents, i; | ||||||
| xEvent			events[2]; |     DeviceIntPtr        ptr; | ||||||
| deviceKeyButtonPointer *btn; |  | ||||||
| deviceValuator *	val; |  | ||||||
| int			x,y; |  | ||||||
| int			nAxes, i, count; |  | ||||||
| DeviceIntPtr		master = NULL; |  | ||||||
| 
 | 
 | ||||||
|     if (dev == inputInfo.pointer || !dev->public.on) |     /* If dev is a slave device, and the SD is attached, do nothing. If we'd
 | ||||||
| 	return; |      * post through the attached master pointer we'd get duplicate events. | ||||||
| 
 |  | ||||||
|     ErrorF("[xkb] XkbDDXFakeDeviceButton. If you read this message in your " |  | ||||||
|            "log file, Please file a bug on bugs.freedesktop.org.\n"); |  | ||||||
| #if 0 |  | ||||||
|     nAxes = (dev->valuator?dev->valuator->numAxes:0); |  | ||||||
|     if (nAxes > 6) |  | ||||||
| 	nAxes = 6; |  | ||||||
| 
 |  | ||||||
|     GetSpritePosition(dev, &x,&y); |  | ||||||
|     btn= (deviceKeyButtonPointer *) &events[0]; |  | ||||||
|     val= (deviceValuator *) &events[1]; |  | ||||||
|     if (press)		btn->type= DeviceButtonPress; |  | ||||||
|     else		btn->type= DeviceButtonRelease; |  | ||||||
|     btn->detail= 	button; |  | ||||||
|     btn->time= 		GetTimeInMillis(); |  | ||||||
|     btn->root_x=	x; |  | ||||||
|     btn->root_y=	y; |  | ||||||
|     btn->deviceid= 	dev->id; |  | ||||||
|     count= 1; |  | ||||||
|     if (nAxes>0) { |  | ||||||
| 	btn->deviceid|=	0x80; |  | ||||||
| 	val->type = DeviceValuator; |  | ||||||
| 	val->deviceid = dev->id; |  | ||||||
| 	val->first_valuator = 0; |  | ||||||
| 
 |  | ||||||
| 	evVal=	&val->valuator0; |  | ||||||
| 	devVal= dev->valuator->axisVal; |  | ||||||
| 	for (i=nAxes;i>0;i--) { |  | ||||||
| 	    *evVal++ = *devVal++; |  | ||||||
| 	    if (evVal > &val->valuator5) { |  | ||||||
| 		int	tmp = val->first_valuator+6; |  | ||||||
| 		val->num_valuators = 6; |  | ||||||
| 		val++; |  | ||||||
| 		evVal= &val->valuator0; |  | ||||||
| 		val->first_valuator= tmp; |  | ||||||
| 	    } |  | ||||||
| 	} |  | ||||||
| 	if ((nAxes % 6) != 0) { |  | ||||||
| 	    val->num_valuators = (nAxes % 6); |  | ||||||
| 	} |  | ||||||
| 	count= 1+((nAxes+5)/6); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* XXX: This is obnoxious. ProcessOtherEvent updates the DIX device state,
 |  | ||||||
|      * but may not do anything if the device state is invalid. This happens if |  | ||||||
|      * we post a mouse event from a pure keyboard device. So we need to hack |  | ||||||
|      * around that by getting the master, then posting the event for the |  | ||||||
|      * pointer paired with the master. |  | ||||||
|      * |      * | ||||||
|      * Note:the DeviceButtonEvent on the SD itself will do nothing in most |      * if dev is a master keyboard, post through the master pointer. | ||||||
|      * cases, unless dev is both a keyboard and a mouse. |      * | ||||||
|  |      * if dev is a floating slave, post through the device itself. | ||||||
|      */ |      */ | ||||||
|     if (!dev->isMaster && dev->u.master) { |  | ||||||
|         if (!masterEvents) |  | ||||||
|         { |  | ||||||
|             masterEvents = InitEventList(1); |  | ||||||
|             SetMinimumEventSize(masterEvents, 1, (1 + MAX_VALUATOR_EVENTS) * sizeof(xEvent)); |  | ||||||
|         } |  | ||||||
|         master = dev->u.master; |  | ||||||
|         if (!IsPointerDevice(master)) |  | ||||||
|             master = GetPairedDevice(dev->u.master); |  | ||||||
| 
 | 
 | ||||||
|         CopyGetMasterEvent(master, dev, events, masterEvents, count); |     if (IsMaster(dev)) | ||||||
|     } |         ptr = GetMaster(dev, MASTER_POINTER); | ||||||
| 
 |     else if (!dev->u.master) | ||||||
|     (*dev->public.processInputProc)((xEventPtr)btn, dev, count); |         ptr = dev; | ||||||
| 
 |     else | ||||||
|     if (master) { |  | ||||||
|         (*master->public.processInputProc)(masterEvents->event, master, count); |  | ||||||
|     } |  | ||||||
|         return; |         return; | ||||||
| #endif | 
 | ||||||
|  |     events = InitEventList(GetMaximumEventsNum()); | ||||||
|  |     nevents = GetPointerEvents(events, ptr, | ||||||
|  |                                press ? ButtonPress : ButtonRelease, button, | ||||||
|  |                                0 /* flags */, 0 /* first */, | ||||||
|  |                                0 /* num_val */, NULL); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     for (i = 0; i < nevents; i++) | ||||||
|  |         mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); | ||||||
|  | 
 | ||||||
|  |     FreeEventList(events, GetMaximumEventsNum()); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue