mirror of
https://github.com/X11Libre/xserver.git
synced 2026-04-14 17:18:09 +00:00
Add support for XI2.3: Pointer barrier events and releases.
This adds support for clients that would like to get a notification every time a barrier is hit, and allows clients to temporarily release a barrier so that pointers can go through them, without having to destroy and recreate barriers. Based on work by Chris Halse Rogers <chris.halse.rogers@canonical.com> Signed-off-by: Jasper St. Pierre <jstpierre@mecheye.net> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
committed by
Peter Hutterer
parent
85a37ddcc2
commit
e130a46ab4
@@ -57,6 +57,7 @@ static int eventToKeyButtonPointer(DeviceEvent *ev, xEvent **xi, int *count);
|
||||
static int eventToDeviceChanged(DeviceChangedEvent *ev, xEvent **dcce);
|
||||
static int eventToDeviceEvent(DeviceEvent *ev, xEvent **xi);
|
||||
static int eventToRawEvent(RawDeviceEvent *ev, xEvent **xi);
|
||||
static int eventToBarrierEvent(BarrierEvent *ev, xEvent **xi);
|
||||
static int eventToTouchOwnershipEvent(TouchOwnershipEvent *ev, xEvent **xi);
|
||||
|
||||
/* Do not use, read comments below */
|
||||
@@ -277,6 +278,9 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
|
||||
case ET_RawTouchUpdate:
|
||||
case ET_RawTouchEnd:
|
||||
return eventToRawEvent(&ev->raw_event, xi);
|
||||
case ET_BarrierHit:
|
||||
case ET_BarrierLeave:
|
||||
return eventToBarrierEvent(&ev->barrier_event, xi);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -782,6 +786,35 @@ eventToRawEvent(RawDeviceEvent *ev, xEvent **xi)
|
||||
return Success;
|
||||
}
|
||||
|
||||
static int
|
||||
eventToBarrierEvent(BarrierEvent *ev, xEvent **xi)
|
||||
{
|
||||
xXIBarrierEvent *barrier;
|
||||
int len = sizeof(xXIBarrierEvent);
|
||||
|
||||
*xi = calloc(1, len);
|
||||
barrier = (xXIBarrierEvent*) *xi;
|
||||
barrier->type = GenericEvent;
|
||||
barrier->extension = IReqCode;
|
||||
barrier->evtype = GetXI2Type(ev->type);
|
||||
barrier->length = bytes_to_int32(len - sizeof(xEvent));
|
||||
barrier->deviceid = ev->deviceid;
|
||||
barrier->sourceid = ev->sourceid;
|
||||
barrier->time = ev->time;
|
||||
barrier->event = ev->window;
|
||||
barrier->root = ev->root;
|
||||
barrier->dx = double_to_fp3232(ev->dx);
|
||||
barrier->dy = double_to_fp3232(ev->dy);
|
||||
barrier->dtime = ev->dt;
|
||||
barrier->flags = ev->flags;
|
||||
barrier->eventid = ev->event_id;
|
||||
barrier->barrier = ev->barrierid;
|
||||
barrier->root_x = double_to_fp1616(ev->root_x);
|
||||
barrier->root_y = double_to_fp1616(ev->root_y);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the corresponding core type for the given event or 0 if no core
|
||||
* equivalent exists.
|
||||
@@ -929,6 +962,12 @@ GetXI2Type(enum EventType type)
|
||||
case ET_TouchOwnership:
|
||||
xi2type = XI_TouchOwnership;
|
||||
break;
|
||||
case ET_BarrierHit:
|
||||
xi2type = XI_BarrierHit;
|
||||
break;
|
||||
case ET_BarrierLeave:
|
||||
xi2type = XI_BarrierLeave;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user