diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2007-01-10 14:52:13 +1030 |
---|---|---|
committer | Peter Hutterer <whot@hyena.localdomain> | 2007-01-10 14:52:13 +1030 |
commit | ea82333dc1799a7e013205adbc89874bc8d273cb (patch) | |
tree | c15a5279fb1ff93830420d378ea25e98d534981f | |
parent | a7ab7932938820a795bb6fb8e0444e0824433b99 (diff) |
Xi: add missing call for SProcXChangeDeviceCursor
add DeviceEnterNotify and DeviceLeaveNotify
fix: QueryDevicePointer crashed if called with keyboard device
-rw-r--r-- | Changelog | 575 | ||||
-rw-r--r-- | Xi/exglobals.h | 2 | ||||
-rw-r--r-- | Xi/extinit.c | 52 | ||||
-rw-r--r-- | Xi/querydp.c | 2 | ||||
-rw-r--r-- | dix/events.c | 79 | ||||
-rw-r--r-- | include/extinit.h | 12 |
6 files changed, 120 insertions, 602 deletions
diff --git a/Changelog b/Changelog deleted file mode 100644 index 17ee9c5e8..000000000 --- a/Changelog +++ /dev/null @@ -1,575 +0,0 @@ -== 08.01.06 == -Xi: Adding ChangeDeviceCursor request - -Files: - dix/window.c - dix/events.c - include/window.h - include/windowstr.h - Xi/extinit.c - Xi/chdevcur.c - Xi/chdevcur.h - Xi/Makefile.am - -____________________________________________________________ - -xfree86: fix XI86_SHARED_POINTER flag setting - -File: - hw/xfree86/common/xf86Xinput.c - -== 20.12.06 == -xfree86: Changing "IsMPDevice" to "SharedPointer" option. Devices will default - to MP devices. - -Xi: Adding QueryDevicePointer request/reply - Adding WarpDevicePointer request/reply - -Files: - hw/xfree86/common/xf86Xinput.c - hw/xfree86/common/xf86Cursor.c - hw/xfree86/common/xf86Xinput.h - Xi/extinit.c - Xi/querydp.c - Xi/querydp.h - Xi/Makefile.am - Xi/warpdevp.c - Xi/warpdevp.h - dix/cursor.c - dix/events.c - dix/dix.h - -Note: This commit requires libXi additions to use the new functions. - -____________________________________________________________ - -xfree86: fix xf86ActivateDevice(): only set to MP device if not a keyboard - -Files: - hw/xfree86/common/xf86Xinput.c - include/extinit.h - Xi/extinit.c - -____________________________________________________________ -removing MPX extension files - -Files: - mpx/ - include/mpxevents.h - include/mpxextinit.h - -____________________________________________________________ -xfree86: fix xf86ProcessCommonOptions() core and shared pointer assignment - -Files: - hw/xfree86/common/xf86Xinput.c - -TAG: mpx-0.3.0 - - -== 18.12.06 == -mi: removing MPX ifdefs - global sprite renaming in mipointer and misprite - fixed: multiple remove cursor call in miSpriteInstallColormap - fixed: wrong core pointer usage in miSpriteStoreColors - -dix: bugfix in CheckCursorConfinement - removing MPX ifdefs - removing MPX event generation (using Xi solely now) - bugfix GrabDevice: uninitialized field in grab struct caused segfault - -xfree86: removing MPX fdefs - -Xi: removing MPX protocol events - -Files: - include/inputstr.h - mi/midispcur.c - mi/mieq.c - mi/mipointer.c - mi/misprite.c - dix/events.c - dix/cursor.c - dix/devices.c - hw/xfree86/common/xf86Events.c - hw/xfree86/common/xf86Input.h - Xi/exevents.c - -____________________________________________________________ - -Cleaning up #ifdef MPX from remaining files, removing it from configure.ac. -Removing building mpx extension from Makefile.am - -Files: - Makefile.am - configure.ac - hw/xfree86/ramdac/xf86HWCurs.c - include/dix-config.h.in - include/dix.h - include/globals.h - include/xorg-server.h.in - mi/mieq.c - mi/miinitext.c - mi/mipointer.c - os/utils.c - -== 12.12.06 == -dix: Moving SpriteRec into DeviceIntRec - removing global sprite structure - beginning to remove MPX ifdefs - -xnest: Fix to make xnest compile again - -Files: - dix/getevents.c - dix/events.c - dix/devices.c - hw/xfree86/common/xf86Xinput.c - include/cursor.h - include/dix.h - include/dixevents.h - include/input.h - include/inputstr.h - XTrap/xtrapdi.c - Xext/xtest.c - hw/xnest/Events.c - record/record.c - -== 05.12.06 == -Xi: adding MPX checks to ProcessOtherEvents - -mpx: adding QueryPointer request and reply - adjusting names of requests to Xlib compatible naming (xMPX*** instead of - mpx***) - - -Files: - Xi/exevents.c - mpx/Makefile.am - mpx/extinit.c - mpx/getevbase.c - mpx/getvers.c - mpx/queryptr.c - mpx/queryptr.h - mpx/selectev.c - mpx/listdev.h - mpx/listdev.c - include/mpxextinit.h - -____________________________________________________________ - -Merging from master - -____________________________________________________________ - -Ironing some glitches caused by the merge - -Files: - Xi/exevents.c - randr/rrpointer.c - dix/events.c - - -== 01.12.06 == - -mpx: SelectEvents and GetEventBase requests. - Some renaming and cleaning up in extinit.c - MPXLastEvent added - -Xi: ShouldFreeInputMask() from XI is not static any more, used in mpx - -dix: GetPointerEvents() allocates MPX event for MPX devices. - DeliverDeviceEvents() caters for MPX devices. - - -Files: - configure.ac - mpx/Makefile.am - mpx/extinit.c - mpx/getvers.c - mpx/getevbase.c - mpx/getevbase.h - mpx/listdev.c - mpx/listdev.h - mpx/mpxglobals.h - mpx/selectev.c - mpx/selectev.h - mpx/mpxevents.h - Xi/exevents.c - dix/events.c - dix/getevents.c - include/mpxevents.h - include/mpxextinit.h - - -== 30.11.06 -mpx: Adding ListDevices request. Minor changes, using - MPXRestoreExtensionEvents() when resetting. - -Files: - mpx/Makefile.am - mpx/extinit.c - mpx/listdev.c - mpx/listdev.h - mpx/mpxextinit.h - - -== 29.11.06 == -mpx: Infrastructure for MPX extension, GetExtensionVersion request works. - -Files: - mpx/ - mpx/Makefile.am - mpx/extinit.c - mpx/getvers.c - mpx/getvers.h - mpxglobals.h - mpx/selectev.c - configure.ac - Makefile.am - os/utils.c - mi/miinitext.c - include/globals.h - -== 28.11.06 == -mi: Bugfix: FreeCursor ignores negative refcounts. - -mieq: Bugfix: Motion notifies did overwrite DeviceMotionNotifies - -Files: - dix/cursor.c - mi/mieq.c - -____________________________________________________________ - -dix: missing parameter to SetCursorPosition in CheckMotion ifndef MPX - -mi: missing include in misprite.c ifndef MPX - -Files: - dix/events.c - mi/misprite.c - - -== 27.11.06 == -mi: free allocated memory in miDCCloseScreen and in miDCInitialize in case - of errors. - Some copyright notices. - misprite.c passes DeviceIntPtr around and down to DC (previously - miCursorInfoPtr and the plain device id). - Large cleanup in misprite.c to avoid code duplication. - -Files: - mi/midispcur.c - mi/misprite.c - mi/misprite.h - -____________________________________________________________ - -mi: mipointer.c cleanup, reducing code duplication, using MPHasCursor(), - removing IsMPDev() - -Files: - mi/mipointer.c - -____________________________________________________________ - -mi: malloc checks for misprite and midispcur, code cleanup - removed IsMPDev() - -Files: - mi/misprite.c - mi/mipointer.c - mi/midispcur.c - dix/events.c - - -== 23.11.06 == -mi: closing memory leak, miPointer is freed in miPointerCloseScreen - bugfix: uninitialized pPointer in miPointerGetPosition ifndef MPX - adding DeviceIntPtr parameter to ScreenRec's cursor functions. - cleanup of miPointer code to use same scheme in each function - -dix: MPHasCursor() function determines checking whether to invoke - cursor rendering. - -animcur: adding DeviceIntPtr parameter to cursor functions but animcur relies - on the core pointer right now. - -xfixes: adding DeviceIntPtr parameter to cursor functions but xfixes relies on - the core pointer right now. - -rac: adding DeviceIntPtr parameter to cursor functions but RAC relies on - the core pointer right now. - -ramdac: adding DeviceIntPtr parameter to cursor functions but ramdac relies on - the core pointer right now. - -Files: - mi/mipointer.c - mi/mipointer.h - mi/micursor.c - mi/mi.h - mi/mieq.c - include/cursor.h - include/inputstr.h - include/scrnintstr.h - include/dix.h - dix/events.c - dix/cursor.c - Xext/xtest.c - render/animcur.c - xfixes/cursor.c - XTrap/xtrapddmi.c - xkb/ddxFakeMtn.c - hw/xfree86/common/xf86Cursor.c - hw/xfree86/common/xf86RandR.c - hw/xfree86/rac/xf86RAC.c - hw/xfree86/ramdac/xf86Cursor.c - hw/xfree86/dri/dri.c - - -== 22.11.06 == - -mi: added DevToSprite() conversion function - fixed miSpriteRealize to use passed pDev argument instead of looping. - -dix: changed sprite dependency and added MPX functionality to parts of - events.c (XineramaChangeToCursor, XineramaCheckPhysLimits, - XineramaConstrainCursor) - -Xi: fix: accessing other->buttons for keyboard segfaulted the server - -Files: - mi/misprite.c - mi/mipointer.c - dix/events.c - Xi/exevents.c - -____________________________________________________________ - -dix GetSpriteWindow() adjusted for MPX - added device dependency for MPX to DoEnterLeaveEvents, - EnterLeaveEvents, EnterNotifies, LeaveNotifies and - FixUpEventFromWindow. - -Files: - Xext/security.c - Xi/exevents.c - xkb/ddxFakeMtn.c - dix/events.c - include/dix.h - -____________________________________________________________ - -dix: DeliverEventsToWindow adjusted for MPX - -mi: sprite debugging disabled - -Files: - dix/events.c - Xi/exevents.c - mi/misprite.c - include/dix.h - - -== 21.11.06 == -mi: added MPX to miSpriteReportDamage - added id field to miCursorInfoPtr, required to pass through to miDC - core pointer uses mpCursors array as well. - added miDCBufferRec for future use with MPX - -Files: - mi/midispcur.c - mi/misprite.c - mi/mispritest.h - -TAG: MPX_BEFORE_MIDC_API_BREAK - -____________________________________________________________ - -mi: added device ID to miSpriteCursorFuncRec functions - added MPX code to midispcur.c - - -Files: - mi/midispcur.c - mi/misprite.c - mi/mispritest.h - -BUG: Core pointer changes whenever MPX cursor changes shape. - -____________________________________________________________ - -mi: constrain MPX cursors to screen - -Files: - dix/events.c - mi/mipointer.c - include/scrnintstr.h - -TAG: MPX_BEFORE_DIX_API_BREAK - - -____________________________________________________________ - -dix: moved sprite from static to be pointer of type SpritePtr - added SpriteRecs for MPX devices - changed sprite dependency and added MPX functionality to parts - of events.c (ConfineToShape, PostNewCursor, XineramaCheckMotion, - CheckMotion, XineramaChangeToCursor, ChangeToCursor, CheckPhysLimits, - PointerConfinedToScreen) - added DeviceIntRec param to GetSpritePosition(). This required some - minor changes in ddx, xtest, xkb and xfixes. - -mi: changed miPointer to pointer instead of static struct. - -Files: - dix/events.c - dix/exevents.c - Xext/xtest.c - ddx/ddxFakeBtn.c - ddx/ddxFakeMtn.c - ddx/ddxDevBtn.c - xkb/xkbActions.c - xfixes/cursor.c - mi/mieq.c - -____________________________________________________________ - -dix: WindowsRestructured() calls CheckMotion() on all devices - -mi: core pointer was checked twice in miSpriteReportDamage, - miSpriteInstallColormap, miSpriteStoreColors, miSpriteSaveDoomedAreas - and miSpriteRealiseCursor - using damage bug (see comment in file) to avoid artefacts - -Files: - dix/events.c - mi/misprite.c - mi/mispritest.h - -== 20.11.06 == - -mi: moved core pointer information from miSpriteScreenRec into a - miCursorInfoRec. - bugfix in mipointer, semicolon after preprocessor statement - -Files: - mi/mispritest.h - mi/misprite.c - mi/mipointer.c - -____________________________________________________________ - -mi: added MPX to miSprite functions. - -Files: - mi/mispritest.h - mi/misprite.c - mi/mipointer.c - dix/events.c - -NOTE: This version will render multiple cursors but with an artefact each time -when devices alternate. - -== 17.11.06 == -dix: moved isMPdev field to end of _DeviceIntRec structure - -mi: - added miMPPointers array to mipointer.c - added DeviceIntPtr to all miPointerSpriteFuncs. Coming from miPointer - we use inputInfo.pointer as standard value. ABI BREAK! - -ramdac: - forcing failed HW Cursor initialisation. MPX needs software rendering. - changes to use new miPointerSpriteFunc (this required externing - inputInfo, should probably be fixed at a later point). - - -RAC: changes to use new miPointerSpriteFuncs. - -Files: - include/inputstr.h - mi/mipointer.c - mi/mipointer.h - mi/misprite.c - hw/xfree86/ramdac/xf86HWCurs.c - hw/xfree86/ramdac/xf86Cursor.c - hw/xfree86/rac/xf86RAC.c - -____________________________________________________________ - -mi: - added miCursorInfoRec to contain info of the MPX cursors. - calling miUpdatePointerSprite() from event queue for MPX devices. - adding device-specific processing to miPointer*() functions. - -dix: Call to SetCursorPosition in CheckMotion() temporarily disabled. - -xfree86/common: call to miPointerUpdateSprite() disabled, is done from the EQ - -NOTE: This build will not display cursor images. -BUG: The second mouse does to take correct x coordinates. - -Files: - mi/mispritestr.h - mi/misprite.c - mi/mipointer.c - mi/mipointer.h - mi/mieq.c - dix/events.c - hw/xfree86/common/xf86Events.c - - -== 16.11.06 == -dix: - merge with code cleanup from master - GetPointerEvents treats events in the same way as XINPUT devices when flag - has POINTER_MULTIPOINTER set. - -xfree86/common: - added XI86_MP_DEVICE flag and parsing in xf86ProcessCommonOptions - added POINTER_MULTIPOINTER define. Is used in xf86PostMotionEvent and - xf86PostButtonEvent for the flags that are passed into GetPointerEvents() - -global: - added flags to configure.ac to enable/disable MPX define - added flags to dix-config.h.in to #define MPX - -Files: - dix/getevents.c - hw/xfree86/common/xf86Xinput.c - hw/xfree86/common/xf86Xinput.h - include/input.h - configure.ac - include/dix-config.h.in - -____________________________________________________________ - -dix: added isMPdev field to _DeviceIntRec, is used in GetPointerEvents() - -mieq: avoid merging events from different devices in mieqEnqueue() - -xfree86/common - isMPdev field used from xf86ActivateDevice(), xf86PostMotionEvent() - and xf86PostButtonEvent() - -Files: - dix/getevents.c - hw/xfree86/common/xf86Xinput.c - include/inputstr.h - mi/mieq.c - -____________________________________________________________ - -mieq: EQ processing handles MP devices - -global: MPX define added to xorg-server.h.in - -xfree86/common: small fix to avoid byte overflow - -Files: - mi/mieq.c - hw/xfree86/common/xf86Xinput.c - include/xserver-config.h.in diff --git a/Xi/exglobals.h b/Xi/exglobals.h index 3afd1bb9e..bc4a60d85 100644 --- a/Xi/exglobals.h +++ b/Xi/exglobals.h @@ -70,6 +70,8 @@ extern int DeviceButtonStateNotify; extern int DeviceMappingNotify; extern int ChangeDeviceNotify; extern int DevicePresenceNotify; +extern int DeviceEnterNotify; +extern int DeviceLeaveNotify; extern int RT_INPUTCLIENT; diff --git a/Xi/extinit.c b/Xi/extinit.c index 82bed5000..8948e6c6a 100644 --- a/Xi/extinit.c +++ b/Xi/extinit.c @@ -170,6 +170,8 @@ Mask DeviceOwnerGrabButtonMask; Mask DeviceButtonGrabMask; Mask DeviceButtonMotionMask; Mask DevicePresenceNotifyMask; +Mask DeviceEnterWindowMask; +Mask DeviceLeaveWindowMask; int DeviceValuator; int DeviceKeyPress; @@ -187,6 +189,8 @@ int DeviceButtonStateNotify; int DeviceMappingNotify; int ChangeDeviceNotify; int DevicePresenceNotify; +int DeviceEnterNotify; +int DeviceLeaveNotify; int RT_INPUTCLIENT; @@ -251,6 +255,8 @@ XInputExtensionInit(void) EventSwapVector[DeviceButtonStateNotify] = SEventIDispatch; EventSwapVector[DeviceMappingNotify] = SEventIDispatch; EventSwapVector[ChangeDeviceNotify] = SEventIDispatch; + EventSwapVector[DeviceEnterNotify] = SEventIDispatch; + EventSwapVector[DeviceLeaveNotify] = SEventIDispatch; } else { FatalError("IExtensionInit: AddExtensions failed\n"); } @@ -436,6 +442,8 @@ SProcIDispatch(register ClientPtr client) return (SProcXQueryDevicePointer(client)); else if (stuff->data == X_WarpDevicePointer) return (SProcXWarpDevicePointer(client)); + else if (stuff->data == X_ChangeDeviceCursor) + return (SProcXChangeDeviceCursor(client)); else { SendErrorToClient(client, IReqCode, stuff->data, 0, BadRequest); } @@ -566,6 +574,10 @@ SEventIDispatch(xEvent * from, xEvent * to) DO_SWAP(SDeviceMappingNotifyEvent, deviceMappingNotify); else if (type == ChangeDeviceNotify) DO_SWAP(SChangeDeviceNotifyEvent, changeDeviceNotify); + else if (type == DeviceEnterNotify) + DO_SWAP(SDeviceEnterNotifyEvent, deviceEnterNotify); + else if (type == DeviceLeaveNotify) + DO_SWAP(SDeviceLeaveNotifyEvent, deviceLeaveNotify); else { FatalError("XInputExtension: Impossible event!\n"); } @@ -671,6 +683,31 @@ SDevicePresenceNotifyEvent (devicePresenceNotify *from, devicePresenceNotify *to swaps(&to->control, n); } +void SDeviceEnterNotifyEvent (deviceEnterNotify *from, deviceEnterNotify *to) +{ + register char n; + + *to = *from; + swaps(&to->sequenceNumber,n); + swapl(&to->time, n); +} + +void SDeviceLeaveNotifyEvent (deviceLeaveNotify *from, deviceLeaveNotify *to) +{ + register char n; + + *to = *from; + swaps(&to->sequenceNumber,n); + swapl(&to->time, n); + swapl(&to->root, n); + swapl(&to->event, n); + swapl(&to->child, n); + swaps(&to->rootX, n); + swaps(&to->rootY, n); + swaps(&to->eventX, n); + swaps(&to->eventY, n); +} + /************************************************************************ * * This function sets up extension event types and masks. @@ -698,6 +735,8 @@ FixExtensionEvents(ExtensionEntry * extEntry) DeviceKeyStateNotify = ChangeDeviceNotify + 1; DeviceButtonStateNotify = DeviceKeyStateNotify + 1; DevicePresenceNotify = DeviceButtonStateNotify + 1; + DeviceEnterNotify = DevicePresenceNotify + 1; + DeviceLeaveNotify = DeviceEnterNotify + 1; event_base[KeyClass] = DeviceKeyPress; event_base[ButtonClass] = DeviceButtonPress; @@ -773,6 +812,15 @@ FixExtensionEvents(ExtensionEntry * extEntry) DevicePresenceNotifyMask = GetNextExtEventMask(); SetEventInfo(DevicePresenceNotifyMask, _devicePresence); + + DeviceEnterWindowMask = GetNextExtEventMask(); + SetMaskForExtEvent(DeviceEnterWindowMask, DeviceEnterNotify); + AllowPropagateSuppress(DeviceEnterWindowMask); + + DeviceLeaveWindowMask = GetNextExtEventMask(); + SetMaskForExtEvent(DeviceLeaveWindowMask, DeviceLeaveNotify); + AllowPropagateSuppress(DeviceLeaveWindowMask); + SetEventInfo(0, _noExtensionEvent); } @@ -814,6 +862,8 @@ RestoreExtensionEvents(void) DeviceKeyStateNotify = 13; DeviceButtonStateNotify = 13; DevicePresenceNotify = 14; + DeviceEnterNotify = 15; + DeviceLeaveNotify = 16; BadDevice = 0; BadEvent = 1; @@ -852,6 +902,8 @@ IResetProc(ExtensionEntry * unused) EventSwapVector[DeviceMappingNotify] = NotImplemented; EventSwapVector[ChangeDeviceNotify] = NotImplemented; EventSwapVector[DevicePresenceNotify] = NotImplemented; + EventSwapVector[DeviceEnterNotify] = NotImplemented; + EventSwapVector[DeviceLeaveNotify] = NotImplemented; RestoreExtensionEvents(); } diff --git a/Xi/querydp.c b/Xi/querydp.c index 04323e42a..c1ba2ee3b 100644 --- a/Xi/querydp.c +++ b/Xi/querydp.c @@ -84,7 +84,7 @@ ProcXQueryDevicePointer(register ClientPtr client) REQUEST_SIZE_MATCH(xQueryDevicePointerReq); pDev = LookupDeviceIntRec(stuff->deviceid); - if (pDev == NULL) { + if (pDev == NULL || pDev->valuator == NULL) { SendErrorToClient(client, IReqCode, X_QueryDevicePointer, stuff->deviceid, BadDevice); return Success; diff --git a/dix/events.c b/dix/events.c index 3c11723c1..23fb1ecfa 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3322,13 +3322,17 @@ EnterLeaveEvent( register WindowPtr pWin, Window child) { - xEvent event; + xEvent event; register DeviceIntPtr keybd = inputInfo.keyboard; WindowPtr focus; register DeviceIntPtr mouse = pDev; register GrabPtr grab = mouse->grab; Mask mask; + deviceEnterNotify *devEnterLeave; + int mskidx; + OtherInputMasks *inputMasks; + if ((pWin == mouse->valuator->motionHintWindow) && (detail != NotifyInferior)) mouse->valuator->motionHintWindow = NullWindow; @@ -3342,33 +3346,35 @@ EnterLeaveEvent( { mask = pWin->eventMask | wOtherEventMasks(pWin); } - if (mask & filters[type]) - { - event.u.u.type = type; - event.u.u.detail = detail; - event.u.enterLeave.time = currentTime.milliseconds; - event.u.enterLeave.rootX = pDev->pSprite->hot.x; - event.u.enterLeave.rootY = pDev->pSprite->hot.y; - /* Counts on the same initial structure of crossing & button events! */ - FixUpEventFromWindow(mouse, &event, pWin, None, FALSE); - /* Enter/Leave events always set child */ - event.u.enterLeave.child = child; - event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ? - ELFlagSameScreen : 0; + + event.u.u.type = type; + event.u.u.detail = detail; + event.u.enterLeave.time = currentTime.milliseconds; + event.u.enterLeave.rootX = pDev->pSprite->hot.x; + event.u.enterLeave.rootY = pDev->pSprite->hot.y; + /* Counts on the same initial structure of crossing & button events! */ + FixUpEventFromWindow(mouse, &event, pWin, None, FALSE); + /* Enter/Leave events always set child */ + event.u.enterLeave.child = child; + event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ? + ELFlagSameScreen : 0; #ifdef XKB - if (!noXkbExtension) { - event.u.enterLeave.state = mouse->button->state & 0x1f00; - event.u.enterLeave.state |= - XkbGrabStateFromRec(&keybd->key->xkbInfo->state); - } else + if (!noXkbExtension) { + event.u.enterLeave.state = mouse->button->state & 0x1f00; + event.u.enterLeave.state |= + XkbGrabStateFromRec(&keybd->key->xkbInfo->state); + } else #endif - event.u.enterLeave.state = keybd->key->state | mouse->button->state; - event.u.enterLeave.mode = mode; - focus = keybd->focus->win; - if ((focus != NoneWin) && - ((pWin == focus) || (focus == PointerRootWin) || - IsParent(focus, pWin))) - event.u.enterLeave.flags |= ELFlagFocus; + event.u.enterLeave.state = keybd->key->state | mouse->button->state; + event.u.enterLeave.mode = mode; + focus = keybd->focus->win; + if ((focus != NoneWin) && + ((pWin == focus) || (focus == PointerRootWin) || + IsParent(focus, pWin))) + event.u.enterLeave.flags |= ELFlagFocus; + + if (mask & filters[type]) + { if (grab) (void)TryClientEvents(rClient(grab), &event, 1, mask, filters[type], grab); @@ -3376,6 +3382,27 @@ EnterLeaveEvent( (void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type], NullGrab, 0); } + + devEnterLeave = (deviceEnterNotify*)&event; + devEnterLeave->type = (type == EnterNotify) ? DeviceEnterNotify : + DeviceLeaveNotify; + devEnterLeave->type = (type == EnterNotify) ? DeviceEnterNotify : + DeviceLeaveNotify; + devEnterLeave->deviceid = pDev->id; + mskidx = pDev->id; + inputMasks = wOtherInputMasks(pWin); + if (inputMasks && + (filters[devEnterLeave->type] & inputMasks->deliverableEvents[mskidx])) + { + if (grab) + (void)TryClientEvents(rClient(grab), (xEvent*)devEnterLeave, 1, + mask, filters[devEnterLeave->type], grab); + else + (void)DeliverEventsToWindow(pDev, pWin, (xEvent*)devEnterLeave, + 1, filters[devEnterLeave->type], + NullGrab, pDev->id); + } + if ((type == EnterNotify) && (mask & KeymapStateMask)) { xKeymapEvent ke; diff --git a/include/extinit.h b/include/extinit.h index 5546b210f..6cf7bf737 100644 --- a/include/extinit.h +++ b/include/extinit.h @@ -110,6 +110,18 @@ SDevicePresenceNotifyEvent ( ); void +SDeviceEnterNotifyEvent ( + deviceEnterNotify * /* from */, + deviceEnterNotify * /* to */ + ); + +void +SDeviceLeaveNotifyEvent ( + deviceLeaveNotify * /* from */, + deviceLeaveNotify * /* to */ + ); + +void FixExtensionEvents ( ExtensionEntry * /* extEntry */ ); |