When activating an explicit grab, update owning listener
Pointer passive grabs may be changed by the grabbing client. This allows for a selecting client to change an implicit grab to an active grab, which is the mechanism used for pop-up windows like application menus. We need to do the same thing with touches. If the grabbing client is the owner of a touch sequence, change the listener record to reflect the new grab. If the grabbing client is not the owner, nothing changes for the touch. Signed-off-by: Chase Douglas <chase.douglas@canonical.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
		
							parent
							
								
									ef64b5ee97
								
							
						
					
					
						commit
						2efbed23c2
					
				
							
								
								
									
										33
									
								
								dix/events.c
								
								
								
								
							
							
						
						
									
										33
									
								
								dix/events.c
								
								
								
								
							|  | @ -1408,6 +1408,38 @@ ReattachToOldMaster(DeviceIntPtr dev) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Update touch records when an explicit grab is activated. Any touches owned by | ||||
|  * the grabbing client are updated so the listener state reflects the new grab. | ||||
|  */ | ||||
| static void | ||||
| UpdateTouchesForGrab(DeviceIntPtr mouse) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     if (!mouse->touch || mouse->deviceGrab.fromPassiveGrab) | ||||
|         return; | ||||
| 
 | ||||
|     for (i = 0; i < mouse->touch->num_touches; i++) { | ||||
|         TouchPointInfoPtr ti = mouse->touch->touches + i; | ||||
|         GrabPtr grab = mouse->deviceGrab.grab; | ||||
| 
 | ||||
|         if (ti->active && | ||||
|             CLIENT_BITS(ti->listeners[0].listener) == grab->resource) { | ||||
|             ti->listeners[0].listener = grab->resource; | ||||
|             ti->listeners[0].level = grab->grabtype; | ||||
|             ti->listeners[0].state = LISTENER_IS_OWNER; | ||||
|             ti->listeners[0].window = grab->window; | ||||
| 
 | ||||
|             if (grab->grabtype == CORE || grab->grabtype == XI || | ||||
|                 !xi2mask_isset(grab->xi2mask, mouse, XI_TouchBegin)) | ||||
|                 ti->listeners[0].type = LISTENER_POINTER_GRAB; | ||||
|             else | ||||
|                 ti->listeners[0].type = LISTENER_GRAB; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Activate a pointer grab on the given device. A pointer grab will cause all | ||||
|  * core pointer events of this device to be delivered to the grabbing client only. | ||||
|  | @ -1457,6 +1489,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab, | |||
|     grabinfo->fromPassiveGrab = isPassive; | ||||
|     grabinfo->implicitGrab = autoGrab & ImplicitGrabMask; | ||||
|     PostNewCursor(mouse); | ||||
|     UpdateTouchesForGrab(mouse); | ||||
|     CheckGrabForSyncs(mouse, (Bool) grab->pointerMode, | ||||
|                       (Bool) grab->keyboardMode); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue