Xi: if a MD is removed, send a barrier leave event (if applicable)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
This commit is contained in:
		
							parent
							
								
									e2423b627e
								
							
						
					
					
						commit
						2eefa5d6e8
					
				| 
						 | 
					@ -714,12 +714,41 @@ static void remove_master_func(pointer res, XID id, pointer devid)
 | 
				
			||||||
    struct PointerBarrierDevice *pbd;
 | 
					    struct PointerBarrierDevice *pbd;
 | 
				
			||||||
    struct PointerBarrierClient *barrier;
 | 
					    struct PointerBarrierClient *barrier;
 | 
				
			||||||
    struct PointerBarrier *b;
 | 
					    struct PointerBarrier *b;
 | 
				
			||||||
 | 
					    DeviceIntPtr dev;
 | 
				
			||||||
    int *deviceid = devid;
 | 
					    int *deviceid = devid;
 | 
				
			||||||
 | 
					    int rc;
 | 
				
			||||||
 | 
					    Time ms = GetTimeInMillis();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rc = dixLookupDevice(&dev, *deviceid, serverClient, DixSendAccess);
 | 
				
			||||||
 | 
					    if (rc != Success)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    b = res;
 | 
					    b = res;
 | 
				
			||||||
    barrier = container_of(b, struct PointerBarrierClient, barrier);
 | 
					    barrier = container_of(b, struct PointerBarrierClient, barrier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pbd = GetBarrierDevice(barrier, *deviceid);
 | 
					    pbd = GetBarrierDevice(barrier, *deviceid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (pbd->hit) {
 | 
				
			||||||
 | 
					        BarrierEvent ev = {
 | 
				
			||||||
 | 
					            .header = ET_Internal,
 | 
				
			||||||
 | 
					            .type =ET_BarrierLeave,
 | 
				
			||||||
 | 
					            .length = sizeof (BarrierEvent),
 | 
				
			||||||
 | 
					            .time = ms,
 | 
				
			||||||
 | 
					            .deviceid = *deviceid,
 | 
				
			||||||
 | 
					            .sourceid = 0,
 | 
				
			||||||
 | 
					            .dx = 0,
 | 
				
			||||||
 | 
					            .dy = 0,
 | 
				
			||||||
 | 
					            .root = barrier->screen->root->drawable.id,
 | 
				
			||||||
 | 
					            .window = barrier->window,
 | 
				
			||||||
 | 
					            .dt = ms - pbd->last_timestamp,
 | 
				
			||||||
 | 
					            .flags = XIBarrierPointerReleased,
 | 
				
			||||||
 | 
					            .event_id = pbd->barrier_event_id,
 | 
				
			||||||
 | 
					            .barrierid = barrier->id,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mieqEnqueue(dev, (InternalEvent *) &ev);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xorg_list_del(&pbd->entry);
 | 
					    xorg_list_del(&pbd->entry);
 | 
				
			||||||
    free(pbd);
 | 
					    free(pbd);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -731,7 +760,6 @@ void XIBarrierNewMasterDevice(ClientPtr client, int deviceid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void XIBarrierRemoveMasterDevice(ClientPtr client, int deviceid)
 | 
					void XIBarrierRemoveMasterDevice(ClientPtr client, int deviceid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* FIXME: send LeaveNotify */
 | 
					 | 
				
			||||||
    FindClientResourcesByType(client, PointerBarrierType, remove_master_func, &deviceid);
 | 
					    FindClientResourcesByType(client, PointerBarrierType, remove_master_func, &deviceid);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue