Skip to content

Commit 014a5c8

Browse files
committed
Merge remote-tracking branch 'whot/barriers'
Conflicts: Xi/xichangehierarchy.c Small conflict with the patch from Xi: don't use devices after removing them Was easily resolved by hand. Signed-off-by: Keith Packard <[email protected]>
2 parents f793b5f + 2eefa5d commit 014a5c8

21 files changed

+1464
-464
lines changed

Xi/Makefile.am

+2
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ libXi_la_SOURCES = \
7878
ungrdevk.h \
7979
xiallowev.c \
8080
xiallowev.h \
81+
xibarriers.c \
82+
xibarriers.h \
8183
xichangecursor.c \
8284
xichangecursor.h \
8385
xichangehierarchy.c \

Xi/exevents.c

+47
Original file line numberDiff line numberDiff line change
@@ -1648,6 +1648,49 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
16481648
UpdateDeviceState(dev, &ev->device_event);
16491649
}
16501650

1651+
static void
1652+
ProcessBarrierEvent(InternalEvent *e, DeviceIntPtr dev)
1653+
{
1654+
Mask filter;
1655+
WindowPtr pWin;
1656+
BarrierEvent *be = &e->barrier_event;
1657+
xEvent *ev;
1658+
int rc;
1659+
GrabPtr grab = dev->deviceGrab.grab;
1660+
1661+
if (!IsMaster(dev))
1662+
return;
1663+
1664+
if (dixLookupWindow(&pWin, be->window, serverClient, DixReadAccess) != Success)
1665+
return;
1666+
1667+
if (grab)
1668+
be->flags |= XIBarrierDeviceIsGrabbed;
1669+
1670+
rc = EventToXI2(e, &ev);
1671+
if (rc != Success) {
1672+
ErrorF("[Xi] event conversion from %s failed with code %d\n", __func__, rc);
1673+
return;
1674+
}
1675+
1676+
/* A client has a grab, deliver to this client if the grab_window is the
1677+
barrier window.
1678+
1679+
Otherwise, deliver normally to the client.
1680+
*/
1681+
if (grab &&
1682+
CLIENT_ID(be->barrierid) == CLIENT_ID(grab->resource) &&
1683+
grab->window->drawable.id == be->window) {
1684+
DeliverGrabbedEvent(e, dev, FALSE);
1685+
} else {
1686+
filter = GetEventFilter(dev, ev);
1687+
1688+
DeliverEventsToWindow(dev, pWin, ev, 1,
1689+
filter, NullGrab);
1690+
}
1691+
free(ev);
1692+
}
1693+
16511694
/**
16521695
* Process DeviceEvents and DeviceChangedEvents.
16531696
*/
@@ -1797,6 +1840,10 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
17971840
case ET_TouchEnd:
17981841
ProcessTouchEvent(ev, device);
17991842
break;
1843+
case ET_BarrierHit:
1844+
case ET_BarrierLeave:
1845+
ProcessBarrierEvent(ev, device);
1846+
break;
18001847
default:
18011848
ProcessDeviceEvent(ev, device);
18021849
break;

Xi/extinit.c

+39-2
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ SOFTWARE.
122122
#include "xiqueryversion.h"
123123
#include "xisetclientpointer.h"
124124
#include "xiwarppointer.h"
125+
#include "xibarriers.h"
125126

126127
/* Masks for XI events have to be aligned with core event (partially anyway).
127128
* If DeviceButtonMotionMask is != ButtonMotionMask, event delivery
@@ -251,7 +252,8 @@ static int (*ProcIVector[]) (ClientPtr) = {
251252
ProcXIChangeProperty, /* 57 */
252253
ProcXIDeleteProperty, /* 58 */
253254
ProcXIGetProperty, /* 59 */
254-
ProcXIGetSelectedEvents /* 60 */
255+
ProcXIGetSelectedEvents, /* 60 */
256+
ProcXIBarrierReleasePointer /* 61 */
255257
};
256258

257259
/* For swapped clients */
@@ -316,7 +318,8 @@ static int (*SProcIVector[]) (ClientPtr) = {
316318
SProcXIChangeProperty, /* 57 */
317319
SProcXIDeleteProperty, /* 58 */
318320
SProcXIGetProperty, /* 59 */
319-
SProcXIGetSelectedEvents /* 60 */
321+
SProcXIGetSelectedEvents, /* 60 */
322+
SProcXIBarrierReleasePointer /* 61 */
320323
};
321324

322325
/*****************************************************************
@@ -839,6 +842,32 @@ STouchOwnershipEvent(xXITouchOwnershipEvent * from, xXITouchOwnershipEvent * to)
839842
swapl(&to->child);
840843
}
841844

845+
static void
846+
SBarrierEvent(xXIBarrierEvent * from,
847+
xXIBarrierEvent * to) {
848+
849+
*to = *from;
850+
851+
swaps(&from->sequenceNumber);
852+
swapl(&from->length);
853+
swaps(&from->evtype);
854+
swapl(&from->time);
855+
swaps(&from->deviceid);
856+
swaps(&from->sourceid);
857+
swapl(&from->event);
858+
swapl(&from->root);
859+
swapl(&from->root_x);
860+
swapl(&from->root_y);
861+
862+
swapl(&from->dx.integral);
863+
swapl(&from->dx.frac);
864+
swapl(&from->dy.integral);
865+
swapl(&from->dy.frac);
866+
swapl(&from->dtime);
867+
swapl(&from->barrier);
868+
swapl(&from->eventid);
869+
}
870+
842871
/** Event swapping function for XI2 events. */
843872
void
844873
XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
@@ -885,6 +914,11 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
885914
case XI_RawTouchEnd:
886915
SRawEvent((xXIRawEvent *) from, (xXIRawEvent *) to);
887916
break;
917+
case XI_BarrierHit:
918+
case XI_BarrierLeave:
919+
SBarrierEvent((xXIBarrierEvent *) from,
920+
(xXIBarrierEvent *) to);
921+
break;
888922
default:
889923
ErrorF("[Xi] Unknown event type to swap. This is a bug.\n");
890924
break;
@@ -1263,6 +1297,9 @@ XInputExtensionInit(void)
12631297
if (!AddCallback(&ClientStateCallback, XIClientCallback, 0))
12641298
FatalError("Failed to add callback to XI.\n");
12651299

1300+
if (!XIBarrierInit())
1301+
FatalError("Could not initialize barriers.\n");
1302+
12661303
extEntry = AddExtension(INAME, IEVENTS, IERRORS, ProcIDispatch,
12671304
SProcIDispatch, IResetProc, StandardMinorOpcode);
12681305
if (extEntry) {

0 commit comments

Comments
 (0)