dix: deliver device enter/leave events.
This commit is contained in:
		
							parent
							
								
									04ed0bcb25
								
							
						
					
					
						commit
						87ff1159b4
					
				| 
						 | 
					@ -624,6 +624,10 @@ SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
 | 
				
			||||||
    swaps(&to->event_y.integral, n);
 | 
					    swaps(&to->event_y.integral, n);
 | 
				
			||||||
    swaps(&to->event_y.frac, n);
 | 
					    swaps(&to->event_y.frac, n);
 | 
				
			||||||
    swaps(&to->sourceid, n);
 | 
					    swaps(&to->sourceid, n);
 | 
				
			||||||
 | 
					    swaps(&to->buttons_len, n);
 | 
				
			||||||
 | 
					    swapl(&to->mods.base_mods, n);
 | 
				
			||||||
 | 
					    swapl(&to->mods.latched_mods, n);
 | 
				
			||||||
 | 
					    swapl(&to->mods.locked_mods, n);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										91
									
								
								dix/events.c
								
								
								
								
							
							
						
						
									
										91
									
								
								dix/events.c
								
								
								
								
							| 
						 | 
					@ -4015,57 +4015,62 @@ DeviceEnterLeaveEvent(
 | 
				
			||||||
    Window child)
 | 
					    Window child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GrabPtr             grab = mouse->deviceGrab.grab;
 | 
					    GrabPtr             grab = mouse->deviceGrab.grab;
 | 
				
			||||||
    xXIEnterEvent       event;
 | 
					    xXIEnterEvent       *event;
 | 
				
			||||||
    int                 mskidx;
 | 
					 | 
				
			||||||
    OtherInputMasks     *inputMasks;
 | 
					 | 
				
			||||||
    Mask                mask;
 | 
					    Mask                mask;
 | 
				
			||||||
    xEvent              dummy;
 | 
					    int                 filter;
 | 
				
			||||||
 | 
					    int                 btlen, len, i;
 | 
				
			||||||
 | 
					    DeviceIntPtr        kbd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (grab) {
 | 
					    btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
 | 
				
			||||||
        mask = (pWin == grab->window) ? grab->eventMask : 0;
 | 
					    btlen = (btlen + 3)/4;
 | 
				
			||||||
        if (grab->ownerEvents)
 | 
					    len = sizeof(xXIEnterEvent) + btlen * 4;
 | 
				
			||||||
            mask |= EventMaskForClient(pWin, rClient(grab));
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        mask = pWin->eventMask | wOtherEventMasks(pWin);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memset(&event, 0, sizeof(event));
 | 
					    event = xcalloc(1, len);
 | 
				
			||||||
    event.type        = GenericEvent;
 | 
					    event->type         = GenericEvent;
 | 
				
			||||||
    event.extension   = IReqCode;
 | 
					    event->extension    = IReqCode;
 | 
				
			||||||
    event.evtype      = type;
 | 
					    event->evtype       = type;
 | 
				
			||||||
    event.detail      = detail;
 | 
					    event->length       = (len - sizeof(xEvent))/4;
 | 
				
			||||||
    event.time        = currentTime.milliseconds;
 | 
					    event->buttons_len  = btlen;
 | 
				
			||||||
    event.deviceid    = mouse->id;
 | 
					    event->detail       = detail;
 | 
				
			||||||
    event.sourceid    = 0; /*XXX */
 | 
					    event->time         = currentTime.milliseconds;
 | 
				
			||||||
    event.mode        = mode;
 | 
					    event->deviceid     = mouse->id;
 | 
				
			||||||
    event.root_x.integral      = mouse->spriteInfo->sprite->hot.x;
 | 
					    event->sourceid     = 0; /*XXX */
 | 
				
			||||||
    event.root_y.integral      = mouse->spriteInfo->sprite->hot.y;
 | 
					    event->mode         = mode;
 | 
				
			||||||
 | 
					    event->root_x.integral      = mouse->spriteInfo->sprite->hot.x;
 | 
				
			||||||
 | 
					    event->root_y.integral      = mouse->spriteInfo->sprite->hot.y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* We use FUEFW to fill in dummy, then copy the values */
 | 
					    for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
 | 
				
			||||||
    FixUpEventFromWindow(mouse, &dummy, pWin, None, FALSE);
 | 
					        if (BitIsOn(mouse->button->down, i))
 | 
				
			||||||
 | 
					            SetBit(&event[1], i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    event.same_screen = dummy.u.keyButtonPointer.sameScreen;
 | 
					    kbd = (mouse->isMaster || mouse->u.master) ? GetPairedDevice(mouse) : NULL;
 | 
				
			||||||
    event.child       = dummy.u.keyButtonPointer.child;
 | 
					    if (kbd && kbd->key)
 | 
				
			||||||
    event.event_x.integral     = dummy.u.keyButtonPointer.eventX;
 | 
					 | 
				
			||||||
    event.event_y.integral     = dummy.u.keyButtonPointer.eventY;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    mskidx = mouse->id;
 | 
					 | 
				
			||||||
    inputMasks = wOtherInputMasks(pWin);
 | 
					 | 
				
			||||||
    if (inputMasks &&
 | 
					 | 
				
			||||||
       (GetEventFilter(mouse, (xEvent*)&event) &
 | 
					 | 
				
			||||||
            inputMasks->deliverableEvents[mskidx]))
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (grab)
 | 
					        event->mods.base_mods = kbd->key->xkbInfo->state.base_mods;
 | 
				
			||||||
            TryClientEvents(rClient(grab), mouse,
 | 
					        event->mods.latched_mods = kbd->key->xkbInfo->state.latched_mods;
 | 
				
			||||||
                            (xEvent*)&event, 1, mask,
 | 
					        event->mods.locked_mods = kbd->key->xkbInfo->state.locked_mods;
 | 
				
			||||||
                            GetEventFilter(mouse, (xEvent*)&event),
 | 
					
 | 
				
			||||||
                            grab);
 | 
					        event->group.base_group = kbd->key->xkbInfo->state.base_group;
 | 
				
			||||||
        else
 | 
					        event->group.latched_group = kbd->key->xkbInfo->state.latched_group;
 | 
				
			||||||
            DeliverEventsToWindow(mouse, pWin, (xEvent*)&event, 1,
 | 
					        event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
 | 
				
			||||||
                                  GetEventFilter(mouse, (xEvent*)&event),
 | 
					 | 
				
			||||||
                                  NullGrab, mouse->id);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FixUpEventFromWindow(mouse, (xEvent*)event, pWin, None, FALSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!GetWindowXI2Mask(mouse, pWin, (xEvent*)event))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    filter = GetEventFilter(mouse, (xEvent*)event);
 | 
				
			||||||
 | 
					    mask = 0x0; /* FIXME: we should handle grabs, once we can */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (grab)
 | 
				
			||||||
 | 
					        TryClientEvents(rClient(grab), mouse, (xEvent*)event, 1, mask,
 | 
				
			||||||
 | 
					                        filter, grab);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        DeliverEventsToWindow(mouse, pWin, (xEvent*)event, 1, filter,
 | 
				
			||||||
 | 
					                              NullGrab, mouse->id);
 | 
				
			||||||
 | 
					    xfree(event);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue