diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-03-12 16:37:28 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-03-12 16:37:28 +1000 |
commit | c25b34fe61cb3fc7c3583a8ccf62c470cc8ead06 (patch) | |
tree | 15c79c4c385ef27db236f80933778bd5cf37dab0 | |
parent | 3ae6a3779d9040a4d7c3e1b7901117e24e0d3ecf (diff) | |
parent | ff5fb43a4b38c707a1a9948ace621a62b5b2457a (diff) |
Merge branch 'server-1.7-nominations' into server-1.7-branch
-rw-r--r-- | Xext/Makefile.am | 4 | ||||
-rw-r--r-- | Xi/exevents.c | 2 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | dix/events.c | 91 | ||||
-rw-r--r-- | include/inputstr.h | 30 |
5 files changed, 99 insertions, 30 deletions
diff --git a/Xext/Makefile.am b/Xext/Makefile.am index ac45f955a..4f05ce9f1 100644 --- a/Xext/Makefile.am +++ b/Xext/Makefile.am @@ -32,6 +32,7 @@ BUILTIN_SRCS = \ # Sources always included in libXextmodule.la & libXext.la. That's right, zero. MODULE_SRCS = +MODULE_LIBS = # Optional sources included if extension enabled by configure.ac rules @@ -83,6 +84,7 @@ endif XSELINUX_SRCS = xselinux.c xselinux.h if XSELINUX MODULE_SRCS += $(XSELINUX_SRCS) +MODULE_LIBS += $(SELINUX_LIBS) endif # Security extension: multi-level security to protect clients from each other @@ -119,11 +121,13 @@ endif # Now take all of the above, mix well, bake for 10 minutes and get libXext*.la libXext_la_SOURCES = $(BUILTIN_SRCS) $(MODULE_SRCS) +libXext_la_LIBADD = $(MODULE_LIBS) if XORG libXextbuiltin_la_SOURCES = $(BUILTIN_SRCS) libXextmodule_la_SOURCES = $(MODULE_SRCS) +libXextmodule_la_LIBADD = $(MODULE_LIBS) endif EXTRA_DIST = \ diff --git a/Xi/exevents.c b/Xi/exevents.c index a63b65b6b..e680f6fb8 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1051,7 +1051,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device) break; } - if (DeviceEventCallback) { + if (DeviceEventCallback && !syncEvents.playingEvents) { DeviceEventInfoRec eventinfo; SpritePtr pSprite = device->spriteInfo->sprite; diff --git a/configure.ac b/configure.ac index 08e444ec5..9dca9871f 100644 --- a/configure.ac +++ b/configure.ac @@ -1326,7 +1326,7 @@ PKG_CHECK_MODULES([XSERVERLIBS], [$REQUIRED_LIBS]) # XSERVER_CFLAGS="${XSERVERCFLAGS_CFLAGS} ${SHA1_CFLAGS}" XSERVER_LIBS="$DIX_LIB $CONFIG_LIB $MI_LIB $OS_LIB" -XSERVER_SYS_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS} ${SHA1_LIB} ${SELINUX_LIBS}" +XSERVER_SYS_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS}" AC_SUBST([XSERVER_LIBS]) AC_SUBST([XSERVER_SYS_LIBS]) diff --git a/dix/events.c b/dix/events.c index c6aa4ab39..3c625db6e 100644 --- a/dix/events.c +++ b/dix/events.c @@ -253,33 +253,7 @@ extern BOOL EventIsKeyRepeat(xEvent *event); */ InputInfo inputInfo; -/** - * syncEvents is the global structure for queued events. - * - * Devices can be frozen through GrabModeSync pointer grabs. If this is the - * case, events from these devices are added to "pending" instead of being - * processed normally. When the device is unfrozen, events in "pending" are - * replayed and processed as if they would come from the device directly. - */ -static struct { - QdEventPtr pending, /**< list of queued events */ - *pendtail; /**< last event in list */ - /** The device to replay events for. Only set in AllowEvents(), in which - * case it is set to the device specified in the request. */ - DeviceIntPtr replayDev; /* kludgy rock to put flag for */ - - /** - * The window the events are supposed to be replayed on. - * This window may be set to the grab's window (but only when - * Replay{Pointer|Keyboard} is given in the XAllowEvents() - * request. */ - WindowPtr replayWin; /* ComputeFreezes */ - /** - * Flag to indicate whether we're in the process of - * replaying events. Only set in ComputeFreezes(). */ - Bool playingEvents; - TimeStamp time; -} syncEvents; +EventSyncInfoRec syncEvents; /** * The root window the given device is currently on. @@ -3462,6 +3436,7 @@ CheckPassiveGrabsOnWindow( { DeviceIntPtr gdev; XkbSrvInfoPtr xkbi = NULL; + Mask mask = 0; gdev= grab->modifierDevice; if (grab->grabtype == GRABTYPE_CORE) @@ -3514,6 +3489,10 @@ CheckPassiveGrabsOnWindow( (grab->confineTo->realized && BorderSizeNotEmpty(device, grab->confineTo)))) { + int rc, count = 0; + xEvent *xE = NULL; + xEvent core; + event->corestate &= 0x1f00; event->corestate |= tempGrab.modifiersDetail.exact & (~0x1f00); grabinfo = &device->deviceGrab; @@ -3560,8 +3539,62 @@ CheckPassiveGrabsOnWindow( } + if (match & CORE_MATCH) + { + rc = EventToCore((InternalEvent*)event, &core); + if (rc != Success) + { + if (rc != BadMatch) + ErrorF("[dix] %s: core conversion failed in CPGFW " + "(%d, %d).\n", device->name, event->type, rc); + continue; + } + xE = &core; + count = 1; + mask = grab->eventMask; + } else if (match & XI2_MATCH) + { + rc = EventToXI2((InternalEvent*)event, &xE); + if (rc != Success) + { + if (rc != BadMatch) + ErrorF("[dix] %s: XI2 conversion failed in CPGFW " + "(%d, %d).\n", device->name, event->type, rc); + continue; + } + count = 1; + + /* FIXME: EventToXI2 returns NULL for enter events, so + * dereferencing the event is bad. Internal event types are + * aligned with core events, so the else clause is valid. + * long-term we should use internal events for enter/focus + * as well */ + if (xE) + mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8]; + else if (event->type == XI_Enter || event->type == XI_FocusIn) + mask = grab->xi2mask[device->id][event->type/8]; + } else + { + rc = EventToXI((InternalEvent*)event, &xE, &count); + if (rc != Success) + { + if (rc != BadMatch) + ErrorF("[dix] %s: XI conversion failed in CPGFW " + "(%d, %d).\n", device->name, event->type, rc); + continue; + } + mask = grab->eventMask; + } + (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE); - DeliverGrabbedEvent((InternalEvent*)event, device, FALSE); + + if (xE) + { + FixUpEventFromWindow(device, xE, grab->window, None, TRUE); + + TryClientEvents(rClient(grab), device, xE, count, mask, + GetEventFilter(device, xE), grab); + } if (grabinfo->sync.state == FROZEN_NO_EVENT) { @@ -3571,6 +3604,8 @@ CheckPassiveGrabsOnWindow( grabinfo->sync.state = FROZEN_WITH_EVENT; } + if (match & (XI_MATCH | XI2_MATCH)) + xfree(xE); /* on core match xE == &core */ return TRUE; } } diff --git a/include/inputstr.h b/include/inputstr.h index 29ad5a814..15184d071 100644 --- a/include/inputstr.h +++ b/include/inputstr.h @@ -557,4 +557,34 @@ typedef struct _QdEvent { InternalEvent *event; } QdEventRec; +/** + * syncEvents is the global structure for queued events. + * + * Devices can be frozen through GrabModeSync pointer grabs. If this is the + * case, events from these devices are added to "pending" instead of being + * processed normally. When the device is unfrozen, events in "pending" are + * replayed and processed as if they would come from the device directly. + */ +typedef struct _EventSyncInfo { + QdEventPtr pending, /**< list of queued events */ + *pendtail; /**< last event in list */ + /** The device to replay events for. Only set in AllowEvents(), in which + * case it is set to the device specified in the request. */ + DeviceIntPtr replayDev; /* kludgy rock to put flag for */ + + /** + * The window the events are supposed to be replayed on. + * This window may be set to the grab's window (but only when + * Replay{Pointer|Keyboard} is given in the XAllowEvents() + * request. */ + WindowPtr replayWin; /* ComputeFreezes */ + /** + * Flag to indicate whether we're in the process of + * replaying events. Only set in ComputeFreezes(). */ + Bool playingEvents; + TimeStamp time; +} EventSyncInfoRec, *EventSyncInfoPtr; + +extern EventSyncInfoRec syncEvents; + #endif /* INPUTSTRUCT_H */ |