Only decrement buttonsDown when the button count is greater than 0.
Device drivers flush their buttons on device init and cause a button down
event to be generated. If we unconditionally decrease the buttons, we won't be
able to ever get a passive device grab.
Format documentation for CheckDeviceGrabs to make it readable.
(cherry picked from commit 3e894974cd)
Conflicts:
	Xi/exevents.c
			
			
This commit is contained in:
		
							parent
							
								
									24ee89fd60
								
							
						
					
					
						commit
						87564543d9
					
				|  | @ -248,7 +248,9 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) | |||
| 	SetMaskForEvent(Motion_Filter(b), DeviceMotionNotify); | ||||
| 	if (!grab) | ||||
| 	    if (CheckDeviceGrabs(other, xE, 0, count)) | ||||
| 		return; | ||||
|                 /* if a passive grab was activated, the event has been sent
 | ||||
|                  * already */ | ||||
|                 return; | ||||
| 
 | ||||
|     } else if (xE->u.u.type == DeviceButtonRelease) { | ||||
|         if (!b) | ||||
|  | @ -258,7 +260,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr other, int count) | |||
| 	*kptr &= ~bit; | ||||
| 	if (other->valuator) | ||||
| 	    other->valuator->motionHintWindow = NullWindow; | ||||
| 	if (!--b->buttonsDown) | ||||
|         if (b->buttonsDown >= 1 && !--b->buttonsDown) | ||||
| 	    b->motionMask = 0; | ||||
| 	xE->u.u.detail = b->map[key]; | ||||
| 	if (xE->u.u.detail == 0) | ||||
|  |  | |||
							
								
								
									
										31
									
								
								dix/events.c
								
								
								
								
							
							
						
						
									
										31
									
								
								dix/events.c
								
								
								
								
							|  | @ -2629,6 +2629,7 @@ BorderSizeNotEmpty(WindowPtr pWin) | |||
| /** 
 | ||||
|  * "CheckPassiveGrabsOnWindow" checks to see if the event passed in causes a | ||||
|  * passive grab set on the window to be activated.  | ||||
|  * If a passive grab is activated, the event will be delivered to the client. | ||||
|  *  | ||||
|  * @param pWin The window that may be subject to a passive grab. | ||||
|  * @param device Device that caused the event. | ||||
|  | @ -2728,16 +2729,26 @@ CheckPassiveGrabsOnWindow( | |||
| } | ||||
| 
 | ||||
| /**
 | ||||
| "CheckDeviceGrabs" handles both keyboard and pointer events that may cause | ||||
| a passive grab to be activated.  If the event is a keyboard event, the | ||||
| ancestors of the focus window are traced down and tried to see if they have | ||||
| any passive grabs to be activated.  If the focus window itself is reached and | ||||
| it's descendants contain they pointer, the ancestors of the window that the | ||||
| pointer is in are then traced down starting at the focus window, otherwise no | ||||
| grabs are activated.  If the event is a pointer event, the ancestors of the | ||||
| window that the pointer is in are traced down starting at the root until | ||||
| CheckPassiveGrabs causes a passive grab to activate or all the windows are | ||||
| tried. PRH | ||||
|  * CheckDeviceGrabs handles both keyboard and pointer events that may cause | ||||
|  * a passive grab to be activated.   | ||||
|  * | ||||
|  * If the event is a keyboard event, the ancestors of the focus window are | ||||
|  * traced down and tried to see if they have any passive grabs to be | ||||
|  * activated.  If the focus window itself is reached and it's descendants | ||||
|  * contain the pointer, the ancestors of the window that the pointer is in | ||||
|  * are then traced down starting at the focus window, otherwise no grabs are | ||||
|  * activated.   | ||||
|  * If the event is a pointer event, the ancestors of the window that the | ||||
|  * pointer is in are traced down starting at the root until CheckPassiveGrabs | ||||
|  * causes a passive grab to activate or all the windows are | ||||
|  * tried. PRH | ||||
|  * | ||||
|  * If a grab is activated, the event has been sent to the client already! | ||||
|  * | ||||
|  * @param device The device that caused the event. | ||||
|  * @param xE The event to handle (most likely {Device}ButtonPress). | ||||
|  * @param count Number of events in list. | ||||
|  * @return TRUE if a grab has been activated or false otherwise. | ||||
| */ | ||||
| 
 | ||||
| Bool | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue