Merge branch 'pointer-emulation-fixes-56558-v2' into for-keith
This commit is contained in:
		
						commit
						fa6ab7d9b2
					
				|  | @ -1187,7 +1187,6 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource, | ||||||
|               TouchOwnershipEvent *ev) |               TouchOwnershipEvent *ev) | ||||||
| { | { | ||||||
|     Bool was_owner = (resource == ti->listeners[0].listener); |     Bool was_owner = (resource == ti->listeners[0].listener); | ||||||
|     void *grab; |  | ||||||
|     int i; |     int i; | ||||||
| 
 | 
 | ||||||
|     /* Send a TouchEnd event to the resource being removed, but only if they
 |     /* Send a TouchEnd event to the resource being removed, but only if they
 | ||||||
|  | @ -1202,11 +1201,7 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource, | ||||||
| 
 | 
 | ||||||
|     /* Remove the resource from the listener list, updating
 |     /* Remove the resource from the listener list, updating
 | ||||||
|      * ti->num_listeners, as well as ti->num_grabs if it was a grab. */ |      * ti->num_listeners, as well as ti->num_grabs if it was a grab. */ | ||||||
|     if (TouchRemoveListener(ti, resource)) { |     TouchRemoveListener(ti, resource); | ||||||
|         if (dixLookupResourceByType(&grab, resource, RT_PASSIVEGRAB, |  | ||||||
|                                     serverClient, DixGetAttrAccess) == Success) |  | ||||||
|             ti->num_grabs--; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     /* If the current owner was removed and there are further listeners, deliver
 |     /* If the current owner was removed and there are further listeners, deliver
 | ||||||
|      * the TouchOwnership or TouchBegin event to the new owner. */ |      * the TouchOwnership or TouchBegin event to the new owner. */ | ||||||
|  | @ -1300,34 +1295,19 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
| 
 | 
 | ||||||
|     if (listener->type == LISTENER_GRAB || |     if (listener->type == LISTENER_GRAB || | ||||||
|         listener->type == LISTENER_POINTER_GRAB) { |         listener->type == LISTENER_POINTER_GRAB) { | ||||||
|         rc = dixLookupResourceByType((pointer *) grab, listener->listener, |  | ||||||
|                                      RT_PASSIVEGRAB, |  | ||||||
|                                      serverClient, DixSendAccess); |  | ||||||
|         if (rc != Success) { |  | ||||||
|             /* the grab doesn't exist but we have a grabbing listener - this
 |  | ||||||
|              * is an implicit/active grab */ |  | ||||||
|             rc = dixLookupClient(client, listener->listener, serverClient, |  | ||||||
|                                  DixSendAccess); |  | ||||||
|             if (rc != Success) |  | ||||||
|                 return FALSE; |  | ||||||
| 
 | 
 | ||||||
|             *grab = dev->deviceGrab.grab; |         *grab = listener->grab; | ||||||
|             if (!*grab) | 
 | ||||||
|                 return FALSE; |         BUG_RETURN_VAL(!*grab, FALSE); | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         *client = rClient(*grab); |         *client = rClient(*grab); | ||||||
|         *win = (*grab)->window; |         *win = (*grab)->window; | ||||||
|         *mask = (*grab)->xi2mask; |         *mask = (*grab)->xi2mask; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|         if (listener->level == CORE) |         rc = dixLookupResourceByType((pointer *) win, listener->listener, | ||||||
|             rc = dixLookupWindow(win, listener->listener, |                                      listener->resource_type, | ||||||
|                                  serverClient, DixSendAccess); |                                      serverClient, DixSendAccess); | ||||||
|         else |  | ||||||
|             rc = dixLookupResourceByType((pointer *) win, listener->listener, |  | ||||||
|                                          RT_INPUTCLIENT, |  | ||||||
|                                          serverClient, DixSendAccess); |  | ||||||
|         if (rc != Success) |         if (rc != Success) | ||||||
|             return FALSE; |             return FALSE; | ||||||
| 
 | 
 | ||||||
|  | @ -1467,6 +1447,8 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
|              */ |              */ | ||||||
|             l = &ti->listeners[ti->num_listeners - 1]; |             l = &ti->listeners[ti->num_listeners - 1]; | ||||||
|             l->listener = devgrab->resource; |             l->listener = devgrab->resource; | ||||||
|  |             l->grab = devgrab; | ||||||
|  |             //l->resource_type = RT_NONE;
 | ||||||
| 
 | 
 | ||||||
|             if (devgrab->grabtype != XI2 || devgrab->type != XI_TouchBegin) |             if (devgrab->grabtype != XI2 || devgrab->type != XI_TouchBegin) | ||||||
|                 l->type = LISTENER_POINTER_GRAB; |                 l->type = LISTENER_POINTER_GRAB; | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								dix/events.c
								
								
								
								
							
							
						
						
									
										12
									
								
								dix/events.c
								
								
								
								
							|  | @ -1438,6 +1438,7 @@ UpdateTouchesForGrab(DeviceIntPtr mouse) | ||||||
|                 ti->listeners[0].type = LISTENER_POINTER_GRAB; |                 ti->listeners[0].type = LISTENER_POINTER_GRAB; | ||||||
|             else |             else | ||||||
|                 ti->listeners[0].type = LISTENER_GRAB; |                 ti->listeners[0].type = LISTENER_GRAB; | ||||||
|  |             ti->listeners[0].grab = grab; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -1521,7 +1522,7 @@ DeactivatePointerGrab(DeviceIntPtr mouse) | ||||||
|                emulate a ButtonRelease here. So pretend the listener |                emulate a ButtonRelease here. So pretend the listener | ||||||
|                already has the end event */ |                already has the end event */ | ||||||
|             if (grab->grabtype == CORE || grab->grabtype == XI || |             if (grab->grabtype == CORE || grab->grabtype == XI || | ||||||
|                     !xi2mask_isset(dev->deviceGrab.grab->xi2mask, dev, XI_TouchBegin)) |                     !xi2mask_isset(mouse->deviceGrab.grab->xi2mask, mouse, XI_TouchBegin)) | ||||||
|                 ti->listeners[0].state = LISTENER_HAS_END; |                 ti->listeners[0].state = LISTENER_HAS_END; | ||||||
|             TouchListenerAcceptReject(mouse, ti, 0, XIRejectTouch); |             TouchListenerAcceptReject(mouse, ti, 0, XIRejectTouch); | ||||||
|         } |         } | ||||||
|  | @ -1550,15 +1551,6 @@ DeactivatePointerGrab(DeviceIntPtr mouse) | ||||||
|         ReattachToOldMaster(mouse); |         ReattachToOldMaster(mouse); | ||||||
| 
 | 
 | ||||||
|     ComputeFreezes(); |     ComputeFreezes(); | ||||||
| 
 |  | ||||||
|     /* If an explicit grab was deactivated, we must remove it from the head of
 |  | ||||||
|      * all the touches' listener lists. */ |  | ||||||
|     for (i = 0; mouse->touch && i < mouse->touch->num_touches; i++) { |  | ||||||
|         TouchPointInfoPtr ti = mouse->touch->touches + i; |  | ||||||
| 
 |  | ||||||
|         if (ti->active && TouchResourceIsOwner(ti, grab_resource)) |  | ||||||
|             TouchListenerAcceptReject(mouse, ti, 0, XIRejectTouch); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
							
								
								
									
										38
									
								
								dix/touch.c
								
								
								
								
							
							
						
						
									
										38
									
								
								dix/touch.c
								
								
								
								
							|  | @ -675,15 +675,20 @@ TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource) | ||||||
|  * Add the resource to this touch's listeners. |  * Add the resource to this touch's listeners. | ||||||
|  */ |  */ | ||||||
| void | void | ||||||
| TouchAddListener(TouchPointInfoPtr ti, XID resource, enum InputLevel level, | TouchAddListener(TouchPointInfoPtr ti, XID resource, int resource_type, | ||||||
|                  enum TouchListenerType type, enum TouchListenerState state, |                  enum InputLevel level, enum TouchListenerType type, | ||||||
|                  WindowPtr window) |                  enum TouchListenerState state, WindowPtr window, | ||||||
|  |                  GrabPtr grab) | ||||||
| { | { | ||||||
|     ti->listeners[ti->num_listeners].listener = resource; |     ti->listeners[ti->num_listeners].listener = resource; | ||||||
|  |     ti->listeners[ti->num_listeners].resource_type = resource_type; | ||||||
|     ti->listeners[ti->num_listeners].level = level; |     ti->listeners[ti->num_listeners].level = level; | ||||||
|     ti->listeners[ti->num_listeners].state = state; |     ti->listeners[ti->num_listeners].state = state; | ||||||
|     ti->listeners[ti->num_listeners].type = type; |     ti->listeners[ti->num_listeners].type = type; | ||||||
|     ti->listeners[ti->num_listeners].window = window; |     ti->listeners[ti->num_listeners].window = window; | ||||||
|  |     ti->listeners[ti->num_listeners].grab = grab; | ||||||
|  |     if (grab) | ||||||
|  |         ti->num_grabs++; | ||||||
|     ti->num_listeners++; |     ti->num_listeners++; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -702,6 +707,11 @@ TouchRemoveListener(TouchPointInfoPtr ti, XID resource) | ||||||
|         if (ti->listeners[i].listener == resource) { |         if (ti->listeners[i].listener == resource) { | ||||||
|             int j; |             int j; | ||||||
| 
 | 
 | ||||||
|  |             if (ti->listeners[i].grab) { | ||||||
|  |                 ti->listeners[i].grab = NULL; | ||||||
|  |                 ti->num_grabs--; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             for (j = i; j < ti->num_listeners - 1; j++) |             for (j = i; j < ti->num_listeners - 1; j++) | ||||||
|                 ti->listeners[j] = ti->listeners[j + 1]; |                 ti->listeners[j] = ti->listeners[j + 1]; | ||||||
|             ti->num_listeners--; |             ti->num_listeners--; | ||||||
|  | @ -732,9 +742,9 @@ TouchAddGrabListener(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
|         type = LISTENER_POINTER_GRAB; |         type = LISTENER_POINTER_GRAB; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     TouchAddListener(ti, grab->resource, grab->grabtype, |     /* grab listeners are always RT_NONE since we keep the grab pointer */ | ||||||
|                      type, LISTENER_AWAITING_BEGIN, grab->window); |     TouchAddListener(ti, grab->resource, RT_NONE, grab->grabtype, | ||||||
|     ti->num_grabs++; |                      type, LISTENER_AWAITING_BEGIN, grab->window, grab); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -789,8 +799,8 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
|             if (!xi2mask_isset(iclients->xi2mask, dev, XI_TouchOwnership)) |             if (!xi2mask_isset(iclients->xi2mask, dev, XI_TouchOwnership)) | ||||||
|                 TouchEventHistoryAllocate(ti); |                 TouchEventHistoryAllocate(ti); | ||||||
| 
 | 
 | ||||||
|             TouchAddListener(ti, iclients->resource, XI2, |             TouchAddListener(ti, iclients->resource, RT_INPUTCLIENT, XI2, | ||||||
|                              type, LISTENER_AWAITING_BEGIN, win); |                              type, LISTENER_AWAITING_BEGIN, win, NULL); | ||||||
|             return TRUE; |             return TRUE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -804,9 +814,9 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
|                 continue; |                 continue; | ||||||
| 
 | 
 | ||||||
|             TouchEventHistoryAllocate(ti); |             TouchEventHistoryAllocate(ti); | ||||||
|             TouchAddListener(ti, iclients->resource, XI, |             TouchAddListener(ti, iclients->resource, RT_INPUTCLIENT, XI, | ||||||
|                              LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, |                              LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, | ||||||
|                              win); |                              win, NULL); | ||||||
|             return TRUE; |             return TRUE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -819,9 +829,9 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
|         /* window owner */ |         /* window owner */ | ||||||
|         if (IsMaster(dev) && (win->eventMask & core_filter)) { |         if (IsMaster(dev) && (win->eventMask & core_filter)) { | ||||||
|             TouchEventHistoryAllocate(ti); |             TouchEventHistoryAllocate(ti); | ||||||
|             TouchAddListener(ti, win->drawable.id, CORE, |             TouchAddListener(ti, win->drawable.id, RT_WINDOW, CORE, | ||||||
|                              LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, |                              LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, | ||||||
|                              win); |                              win, NULL); | ||||||
|             return TRUE; |             return TRUE; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -831,8 +841,8 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
|                 continue; |                 continue; | ||||||
| 
 | 
 | ||||||
|             TouchEventHistoryAllocate(ti); |             TouchEventHistoryAllocate(ti); | ||||||
|             TouchAddListener(ti, oclients->resource, CORE, |             TouchAddListener(ti, oclients->resource, RT_OTHERCLIENT, CORE, | ||||||
|                              type, LISTENER_AWAITING_BEGIN, win); |                              type, LISTENER_AWAITING_BEGIN, win, NULL); | ||||||
|             return TRUE; |             return TRUE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -565,9 +565,9 @@ extern void TouchEventHistoryPush(TouchPointInfoPtr ti, const DeviceEvent *ev); | ||||||
| extern void TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, | extern void TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, | ||||||
|                                     XID resource); |                                     XID resource); | ||||||
| extern Bool TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource); | extern Bool TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource); | ||||||
| extern void TouchAddListener(TouchPointInfoPtr ti, XID resource, | extern void TouchAddListener(TouchPointInfoPtr ti, XID resource, int resource_type, | ||||||
|                              enum InputLevel level, enum TouchListenerType type, |                              enum InputLevel level, enum TouchListenerType type, | ||||||
|                              enum TouchListenerState state, WindowPtr window); |                              enum TouchListenerState state, WindowPtr window, GrabPtr grab); | ||||||
| extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource); | extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource); | ||||||
| extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, | extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, | ||||||
|                                 InternalEvent *ev); |                                 InternalEvent *ev); | ||||||
|  |  | ||||||
|  | @ -298,6 +298,17 @@ typedef struct _ValuatorClassRec { | ||||||
|     int v_scroll_axis;          /* vert smooth-scrolling axis */ |     int v_scroll_axis;          /* vert smooth-scrolling axis */ | ||||||
| } ValuatorClassRec; | } ValuatorClassRec; | ||||||
| 
 | 
 | ||||||
|  | typedef struct _TouchListener { | ||||||
|  |     XID listener;           /* grabs/event selection IDs receiving
 | ||||||
|  |                              * events for this touch */ | ||||||
|  |     int resource_type;      /* listener's resource type */ | ||||||
|  |     enum TouchListenerType type; | ||||||
|  |     enum TouchListenerState state; | ||||||
|  |     enum InputLevel level;  /* matters only for emulating touches */ | ||||||
|  |     WindowPtr window; | ||||||
|  |     GrabPtr grab; | ||||||
|  | } TouchListener; | ||||||
|  | 
 | ||||||
| typedef struct _TouchPointInfo { | typedef struct _TouchPointInfo { | ||||||
|     uint32_t client_id;         /* touch ID as seen in client events */ |     uint32_t client_id;         /* touch ID as seen in client events */ | ||||||
|     int sourceid;               /* Source device's ID for this touchpoint */ |     int sourceid;               /* Source device's ID for this touchpoint */ | ||||||
|  | @ -306,14 +317,7 @@ typedef struct _TouchPointInfo { | ||||||
|                                  * but still owned by a grab */ |                                  * but still owned by a grab */ | ||||||
|     SpriteRec sprite;           /* window trace for delivery */ |     SpriteRec sprite;           /* window trace for delivery */ | ||||||
|     ValuatorMask *valuators;    /* last recorded axis values */ |     ValuatorMask *valuators;    /* last recorded axis values */ | ||||||
|     struct _TouchListener { |     TouchListener *listeners;   /* set of listeners */ | ||||||
|         XID listener;           /* grabs/event selection IDs receiving
 |  | ||||||
|                                  * events for this touch */ |  | ||||||
|         enum TouchListenerType type; |  | ||||||
|         enum TouchListenerState state; |  | ||||||
|         enum InputLevel level;  /* matters only for emulating touches */ |  | ||||||
|         WindowPtr window; |  | ||||||
|     } *listeners; |  | ||||||
|     int num_listeners; |     int num_listeners; | ||||||
|     int num_grabs;              /* number of open grabs on this touch
 |     int num_grabs;              /* number of open grabs on this touch
 | ||||||
|                                  * which have not accepted or rejected */ |                                  * which have not accepted or rejected */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue