diff options
-rw-r--r-- | dix/events.c | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/dix/events.c b/dix/events.c index 3c7bd50cd..20754f0c5 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2037,31 +2037,29 @@ DeliverToWindowOwner(DeviceIntPtr dev, WindowPtr win, return EVENT_NOT_DELIVERED; } + /** - * Deliver events to clients registered on the window. + * Get the list of clients that should be tried for event delivery on the + * given window. * - * @param client_return On successful delivery, set to the recipient. - * @param mask_return On successful delivery, set to the recipient's event - * mask for this event. + * @return 1 if the client list should be traversed, zero if the event + * should be skipped. */ -static enum EventDeliveryState -DeliverEventToClients(DeviceIntPtr dev, WindowPtr win, xEvent *events, - int count, Mask filter, GrabPtr grab, - ClientPtr *client_return, Mask *mask_return) +static Bool +GetClientsForDelivery(DeviceIntPtr dev, WindowPtr win, + xEvent *events, Mask filter, InputClients **clients) { - int attempt; - enum EventDeliveryState rc = EVENT_SKIP; - InputClients *other; + int rc = 0; if (core_get_type(events) != 0) - other = (InputClients *)wOtherClients(win); + *clients = (InputClients *)wOtherClients(win); else if (xi2_get_type(events) != 0) { OtherInputMasks *inputMasks = wOtherInputMasks(win); /* Has any client selected for the event? */ if (!GetWindowXI2Mask(dev, win, events)) goto out; - other = inputMasks->inputClients; + *clients = inputMasks->inputClients; } else { OtherInputMasks *inputMasks = wOtherInputMasks(win); /* Has any client selected for the event? */ @@ -2069,9 +2067,33 @@ DeliverEventToClients(DeviceIntPtr dev, WindowPtr win, xEvent *events, !(inputMasks->inputEvents[dev->id] & filter)) goto out; - other = inputMasks->inputClients; + *clients = inputMasks->inputClients; } + rc = 1; +out: + return rc; +} + +/** + * Deliver events to clients registered on the window. + * + * @param client_return On successful delivery, set to the recipient. + * @param mask_return On successful delivery, set to the recipient's event + * mask for this event. + */ +static enum EventDeliveryState +DeliverEventToClients(DeviceIntPtr dev, WindowPtr win, xEvent *events, + int count, Mask filter, GrabPtr grab, + ClientPtr *client_return, Mask *mask_return) +{ + int attempt; + enum EventDeliveryState rc = EVENT_SKIP; + InputClients *other; + + if (!GetClientsForDelivery(dev, win, events, filter, &other)) + goto out; + rc = EVENT_NOT_DELIVERED; for (; other; other = other->next) |