[PATCH 3/5] Add support for XI2.3: Pointer barrier notify events

Jasper St. Pierre jstpierre at mecheye.net
Thu Nov 22 20:31:37 PST 2012


On Thu, Nov 22, 2012 at 10:34 PM, Peter Hutterer
<peter.hutterer at who-t.net>wrote:

> On Tue, Nov 20, 2012 at 02:50:43PM -0500, Jasper St. Pierre wrote:
> > From: "Jasper St. Pierre" <jstpierre at mecheye.net>
> >
> > This adds support for clients that would like to get a notification
> > every time a barrier is released, along with a way to temporarily
> > release a barrier after it has been hit.
> >
> > This adds two new events to XI: BarrierHitNotify and
> > BarrierPointerReleasedNotify.
> >
> > Based on work by Chris Halse Rogers <chris.halse.rogers at canonical.com>
> >
> > Signed-off-by: Jasper St. Pierre <jstpierre at mecheye.net>
> > ---
> >  Xi/exevents.c                  | 43 ++++++++++++++++++
> >  Xi/extinit.c                   | 32 ++++++++++++++
> >  Xi/xibarriers.c                | 98
> ++++++++++++++++++++++++++++++++++--------
> >  Xi/xibarriers.h                |  1 +
> >  dix/getevents.c                |  4 +-
> >  hw/xfree86/modes/xf86RandR12.c |  4 +-
> >  include/events.h               |  1 +
> >  include/eventstr.h             | 22 ++++++++++
> >  include/inputstr.h             |  2 +-
> >  include/protocol-versions.h    |  2 +-
> >  include/scrnintstr.h           |  2 +-
> >  mi/mieq.c                      |  3 ++
> >  mi/mipointer.c                 | 12 ++++--
> >  mi/mipointer.h                 |  4 +-
> >  randr/randrstr.h               |  2 +-
> >  randr/rrcrtc.c                 |  4 +-
> >  16 files changed, 204 insertions(+), 32 deletions(-)
> >
> > diff --git a/Xi/exevents.c b/Xi/exevents.c
> > index 4248b9a..98a2cee 100644
> > --- a/Xi/exevents.c
> > +++ b/Xi/exevents.c
> > @@ -1649,6 +1649,46 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr
> dev)
> >          UpdateDeviceState(dev, &ev->device_event);
> >  }
> >
> > +#define INT_TO_FP3232(x) ((FP3232) { (x), 0 })
> > +
> > +static void
> > +ProcessBarrierEvent(InternalEvent *e, DeviceIntPtr dev)
> > +{
> > +    Mask filter;
> > +    WindowPtr pWin;
> > +    BarrierEvent *be = &e->barrier_event;
> > +    xXIBarrierNotifyEvent ev = {
> > +        .type = GenericEvent,
> > +        .extension = IReqCode,
> > +        .sequenceNumber = 0,
> > +        .length = 9,
> > +        .evtype = be->event_type,
> > +        .window = be->window,
> > +        .deviceid = dev->id,
> > +        .time = be->time,
> > +        .x = be->x,
> > +        .y = be->y,
> > +        .dx = INT_TO_FP3232(be->dx),
> > +        .dy = INT_TO_FP3232(be->dy),
> > +        .raw_dx = INT_TO_FP3232(be->raw_dx),
> > +        .raw_dy = INT_TO_FP3232(be->raw_dy),
> > +        .dt = be->dt,
> > +        .event_id = be->event_id,
> > +        .barrier = be->barrierid,
> > +    };
> > +
> > +    if (!IsMaster(dev))
> > +        return;
> > +
> > +    if (dixLookupWindow(&pWin, be->window, serverClient, DixReadAccess)
> != Success)
> > +        return;
> > +
> > +    filter = GetEventFilter(dev, (xEvent *) &ev);
> > +
> > +    DeliverEventsToWindow(dev, pWin, (xEvent *) &ev, 1,
> > +                          filter, NullGrab);
> > +}
> > +
> >  /**
> >   * Process DeviceEvents and DeviceChangedEvents.
> >   */
> > @@ -1798,6 +1838,9 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr
> device)
> >      case ET_TouchEnd:
> >          ProcessTouchEvent(ev, device);
> >          break;
> > +    case ET_BarrierNotify:
> > +        ProcessBarrierEvent(ev, device);
> > +        break;
> >      default:
> >          ProcessDeviceEvent(ev, device);
> >          break;
> > diff --git a/Xi/extinit.c b/Xi/extinit.c
> > index 1074b23..6571943 100644
> > --- a/Xi/extinit.c
> > +++ b/Xi/extinit.c
> > @@ -840,6 +840,33 @@ STouchOwnershipEvent(xXITouchOwnershipEvent * from,
> xXITouchOwnershipEvent * to)
> >      swapl(&to->child);
> >  }
> >
> > +static void
> > +SBarrierNotifyEvent(xXIBarrierNotifyEvent * from,
> > +                    xXIBarrierNotifyEvent * to) {
> > +    to->type = from->type;
> > +
> > +    cpswaps(from->x, to->x);
> > +    cpswaps(from->y, to->y);
> > +    cpswaps(from->dt, to->dt);
> > +    cpswapl(from->length, to->length);
> > +    cpswapl(from->time, to->time);
> > +
> > +    cpswaps(from->event_id, to->event_id);
> > +    cpswapl(from->barrier, to->barrier);
> > +    cpswapl(from->window, to->window);
> > +
> > +#define SWAP_FP3232(x, y)                       \
> > +    do {                                        \
> > +        cpswapl((x).integral, (y).integral);    \
> > +        cpswapl((x).frac, (y).frac);            \
> > +    } while(0)
> > +
> > +    SWAP_FP3232(from->dx, to->dx);
> > +    SWAP_FP3232(from->dy, to->dy);
> > +    SWAP_FP3232(from->raw_dx, to->raw_dx);
> > +    SWAP_FP3232(from->raw_dy, to->raw_dy);
> > +}
> > +
> >  /** Event swapping function for XI2 events. */
> >  void
> >  XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
> > @@ -886,6 +913,11 @@ XI2EventSwap(xGenericEvent *from, xGenericEvent *to)
> >      case XI_RawTouchEnd:
> >          SRawEvent((xXIRawEvent *) from, (xXIRawEvent *) to);
> >          break;
> > +    case XI_BarrierHitNotify:
> > +    case XI_BarrierPointerReleasedNotify:
> > +        SBarrierNotifyEvent((xXIBarrierNotifyEvent *) from,
> > +                            (xXIBarrierNotifyEvent *) to);
> > +        break;
> >      default:
> >          ErrorF("[Xi] Unknown event type to swap. This is a bug.\n");
> >          break;
> > diff --git a/Xi/xibarriers.c b/Xi/xibarriers.c
> > index a97db56..9b5f657 100644
> > --- a/Xi/xibarriers.c
> > +++ b/Xi/xibarriers.c
> > @@ -56,6 +56,8 @@
> >  #include "xace.h"
> >  #include "list.h"
> >  #include "exglobals.h"
> > +#include "eventstr.h"
> > +#include "mi.h"
> >
> >  RESTYPE PointerBarrierType;
> >
> > @@ -67,10 +69,16 @@ typedef struct PointerBarrierClient
> *PointerBarrierClientPtr;
> >
> >  struct PointerBarrierClient {
> >      ScreenPtr screen;
> > +    WindowPtr window;
> >      struct PointerBarrier barrier;
> >      struct xorg_list entry;
> >      int num_devices;
> >      int *device_ids; /* num_devices */
> > +    Time last_timestamp;
> > +    int barrier_event_id;
> > +    int release_event_id;
> > +    Bool hit;
> > +    Bool last_hit;
> >  };
> >
> >  typedef struct _BarrierScreen {
> > @@ -241,7 +249,7 @@ barrier_blocks_device(struct PointerBarrierClient
> *client,
> >  }
> >
> >  /**
> > - * Find the nearest barrier that is blocking movement from x1/y1 to
> x2/y2.
> > + * Find the nearest barrier client that is blocking movement from x1/y1
> to x2/y2.
> >   *
> >   * @param dir Only barriers blocking movement in direction dir are
> checked
> >   * @param x1 X start coordinate of movement vector
> > @@ -250,13 +258,12 @@ barrier_blocks_device(struct PointerBarrierClient
> *client,
> >   * @param y2 Y end coordinate of movement vector
> >   * @return The barrier nearest to the movement origin that blocks this
> movement.
> >   */
> > -static struct PointerBarrier *
> > +static struct PointerBarrierClient *
> >  barrier_find_nearest(BarrierScreenPtr cs, DeviceIntPtr dev,
> >                       int dir,
> >                       int x1, int y1, int x2, int y2)
> >  {
> > -    struct PointerBarrierClient *c;
> > -    struct PointerBarrier *nearest = NULL;
> > +    struct PointerBarrierClient *c, *nearest = NULL;
> >      double min_distance = INT_MAX;      /* can't get higher than that
> in X anyway */
> >
> >      xorg_list_for_each_entry(c, &cs->barriers, entry) {
> > @@ -272,7 +279,7 @@ barrier_find_nearest(BarrierScreenPtr cs,
> DeviceIntPtr dev,
> >          if (barrier_is_blocking(b, x1, y1, x2, y2, &distance)) {
> >              if (min_distance > distance) {
> >                  min_distance = distance;
> > -                nearest = b;
> > +                nearest = c;
> >              }
> >          }
> >      }
> > @@ -308,16 +315,26 @@ barrier_clamp_to_barrier(struct PointerBarrier
> *barrier, int dir, int *x,
> >
> >  static void
> >  BarrierConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen, int
> mode,
> > -                             int *x, int *y)
> > +                             int *x, int *y, int unclamped_x, int
> unclamped_y)
> >  {
> >      BarrierScreenPtr cs = GetBarrierScreen(screen);
> >
> >      if (!xorg_list_is_empty(&cs->barriers) && !IsFloating(dev) &&
> >          mode == Relative) {
> >          int ox, oy;
> > +        int dx, dy;
> >          int dir;
> > -        int i;
> >          struct PointerBarrier *nearest = NULL;
> > +        PointerBarrierClientPtr c;
> > +        Time ms = GetTimeInMillis();
> > +        BarrierEvent ev = {
> > +            .header = ET_Internal,
> > +            .type = ET_BarrierNotify,
> > +            .length = sizeof (BarrierEvent),
> > +            .time = ms,
> > +            .deviceid = dev->id,
> > +            .sourceid = dev->id,
> > +        };
> >
> >          /* where are we coming from */
> >          miPointerGetPosition(dev, &ox, &oy);
> > @@ -330,29 +347,68 @@ BarrierConstrainCursorHarder(DeviceIntPtr dev,
> ScreenPtr screen, int mode,
> >           * destination, again finding the nearest barrier and clamping.
> >           */
> >          dir = barrier_get_direction(ox, oy, *x, *y);
> > +        dx = unclamped_x - ox;
> > +        dy = unclamped_y - oy;
> >
> >  #define MAX_BARRIERS 2
> >          for (i = 0; i < MAX_BARRIERS; i++) {
> > -            nearest = barrier_find_nearest(cs, dev, dir, ox, oy, *x,
> *y);
> > -            if (!nearest)
> > +            c = barrier_find_nearest(cs, dev, dir, ox, oy, *x, *y);
> > +            if (!c)
> >                  break;
> >
> > -            barrier_clamp_to_barrier(nearest, dir, x, y);
> > +            nearest = &c->barrier;
> >
> > -            if (barrier_is_vertical(nearest)) {
> > -                dir &= ~(BarrierNegativeX | BarrierPositiveX);
> > -                ox = *x;
> > +            if (!c->last_hit) {
> > +                /* This is the start of a new barrier event */
> > +                c->barrier_event_id++;
> >              }
> > -            else if (barrier_is_horizontal(nearest)) {
> > -                dir &= ~(BarrierNegativeY | BarrierPositiveY);
> > -                oy = *y;
> > +
> > +            if (c->barrier_event_id == c->release_event_id) {
> > +                ev.event_type = XI_BarrierPointerReleasedNotify;
> > +            } else {
> > +                ev.event_type = XI_BarrierHitNotify;
> > +
> > +                barrier_clamp_to_barrier(nearest, dir, x, y);
> > +                c->hit = TRUE;
> > +
> > +                if (barrier_is_vertical(nearest)) {
> > +                    dir &= ~(BarrierNegativeX | BarrierPositiveX);
> > +                    ox = *x;
> > +                }
> > +                else if (barrier_is_horizontal(nearest)) {
> > +                    dir &= ~(BarrierNegativeY | BarrierPositiveY);
> > +                    oy = *y;
> > +                }
> >              }
> > +
> > +            ev.event_id = c->barrier_event_id;
> > +            ev.barrierid = nearest->id;
> > +
> > +            ev.x = *x;
> > +            ev.y = *y;
> > +            ev.dx = dx;
> > +            ev.dy = dy;
> > +
> > +            /* FIXME: add proper raw dx/dy */
> > +            ev.raw_dx = dx;
> > +            ev.raw_dy = dy;
> > +
> > +            ev.dt = ms - c->last_timestamp;
> > +            ev.window = c->window->drawable.id;
> > +            c->last_timestamp = ms;
> > +
> > +            mieqEnqueue(dev, (InternalEvent *) &ev);
> > +        }
> > +
> > +        xorg_list_for_each_entry(c, &cs->barriers, entry) {
> > +            c->last_hit = c->hit;
> > +            c->hit = FALSE;
> >          }
> >      }
> >
> >      if (cs->ConstrainCursorHarder) {
> >          screen->ConstrainCursorHarder = cs->ConstrainCursorHarder;
> > -        screen->ConstrainCursorHarder(dev, screen, mode, x, y);
> > +        screen->ConstrainCursorHarder(dev, screen, mode, x, y,
> unclamped_x, unclamped_y);
> >          screen->ConstrainCursorHarder = BarrierConstrainCursorHarder;
> >      }
> >  }
> > @@ -378,7 +434,7 @@ CreatePointerBarrierClient(ClientPtr client,
> >          return BadAlloc;
> >      }
> >
> > -    err = dixLookupWindow(&pWin, stuff->window, client, DixReadAccess);
> > +    err = dixLookupWindow(&pWin, stuff->window, client, DixSendAccess);
>
> I don't think this needs to be changed. the window is just used as
> reference
> for creating the barrier, the send access is handled during normal event
> processing.
>
> but do I read this right that the window is also the one the events are
> being sent to? if so, the spec needs changing, right now we only require
> drawables (which could be a pixmap), not a valid window. and that only for
> retrieving the screen.
>
> (I also noticed that your github branch inputproto didn't have updated
> specs, so the behaviour is a bit of guesswork here)
>

Noted; will do.

inputproto doesn't have any specs - I still was a bit cautious about
updating things like this because I'm not sure how the specs between fixes
and input should interact.


> does a client need to select for XI_BarrierHitNotify separately?


Separately from what? If they want to receive barrier hit notify events,
they need to select the input, yes.


> and do so on the window specified here?


Of course. The events are sent to this window, not to any others.


> what happens if a client selects for that
> event on another window?


 They get any and all barrier events for that window.

I did this approach because people told me that we didn't want another
XSync Global Alarms case, and events should always be sent to windows.


> >      if (err != Success) {
> >          client->errorValue = stuff->window;
> >          goto error;
> > @@ -388,6 +444,7 @@ CreatePointerBarrierClient(ClientPtr client,
> >      cs = GetBarrierScreen(screen);
> >
> >      ret->screen = screen;
> > +    ret->window = pWin;
> >      ret->num_devices = stuff->num_devices;
> >      if (ret->num_devices > 0)
> >          ret->device_ids = (int*)&ret[1];
> > @@ -414,6 +471,11 @@ CreatePointerBarrierClient(ClientPtr client,
> >          ret->device_ids[i] = device_id;
> >      }
> >
> > +    ret->barrier.id = stuff->barrier;
> > +    ret->barrier_event_id = 0;
> > +    ret->release_event_id = 0;
> > +    ret->hit = FALSE;
> > +    ret->last_hit = FALSE;
> >      ret->barrier.x1 = min(stuff->x1, stuff->x2);
> >      ret->barrier.x2 = max(stuff->x1, stuff->x2);
> >      ret->barrier.y1 = min(stuff->y1, stuff->y2);
> > diff --git a/Xi/xibarriers.h b/Xi/xibarriers.h
> > index 8f2993f..91a0756 100644
> > --- a/Xi/xibarriers.h
> > +++ b/Xi/xibarriers.h
> > @@ -11,6 +11,7 @@
> >  extern _X_EXPORT RESTYPE PointerBarrierType;
> >
> >  struct PointerBarrier {
> > +    XID    id;
> >      CARD16 x1, x2, y1, y2;
> >      CARD32 directions;
> >  };
> > diff --git a/dix/getevents.c b/dix/getevents.c
> > index 2a686e8..6f17534 100644
> > --- a/dix/getevents.c
> > +++ b/dix/getevents.c
> > @@ -933,7 +933,9 @@ positionSprite(DeviceIntPtr dev, int mode,
> ValuatorMask *mask,
> >      /* miPointerSetPosition takes care of crossing screens for us, as
> well as
> >       * clipping to the current screen. Coordinates returned are in
> desktop
> >       * coord system */
> > -    scr = miPointerSetPosition(dev, mode, screenx, screeny);
> > +    scr = miPointerSetPosition(dev, mode, screenx, screeny,
> > +                               (int)floor(*screenx) - scr->x,
> > +                               (int)floor(*screeny) - scr->y);
> >
> >      /* If we were constrained, rescale x/y from the screen coordinates
> so
> >       * the device valuators reflect the correct position. For screen
> > diff --git a/hw/xfree86/modes/xf86RandR12.c
> b/hw/xfree86/modes/xf86RandR12.c
> > index 3530abf..55cfbd9 100644
> > --- a/hw/xfree86/modes/xf86RandR12.c
> > +++ b/hw/xfree86/modes/xf86RandR12.c
> > @@ -1871,7 +1871,7 @@ xf86CrtcSetScanoutPixmap(RRCrtcPtr randr_crtc,
> PixmapPtr pixmap)
> >  }
> >
> >  static void
> > -xf86RandR13ConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen,
> int mode, int *x, int *y)
> > +xf86RandR13ConstrainCursorHarder(DeviceIntPtr dev, ScreenPtr screen,
> int mode, int *x, int *y, int unclamped_x, int unclamped_y)
> >  {
> >      XF86RandRInfoPtr randrp = XF86RANDRINFO(screen);
> >
> > @@ -1880,7 +1880,7 @@ xf86RandR13ConstrainCursorHarder(DeviceIntPtr dev,
> ScreenPtr screen, int mode, i
> >
> >      if (randrp->orig_ConstrainCursorHarder) {
> >          screen->ConstrainCursorHarder =
> randrp->orig_ConstrainCursorHarder;
> > -        screen->ConstrainCursorHarder(dev, screen, mode, x, y);
> > +        screen->ConstrainCursorHarder(dev, screen, mode, x, y,
> unclamped_x, unclamped_y);
> >          screen->ConstrainCursorHarder =
> xf86RandR13ConstrainCursorHarder;
> >      }
> >  }
> > diff --git a/include/events.h b/include/events.h
> > index 222bf32..c0ef45d 100644
> > --- a/include/events.h
> > +++ b/include/events.h
> > @@ -27,6 +27,7 @@
> >  typedef struct _DeviceEvent DeviceEvent;
> >  typedef struct _DeviceChangedEvent DeviceChangedEvent;
> >  typedef struct _TouchOwnershipEvent TouchOwnershipEvent;
> > +typedef struct _BarrierEvent BarrierEvent;
> >
> >  #if XFreeXDGA
> >  typedef struct _DGAEvent DGAEvent;
> > diff --git a/include/eventstr.h b/include/eventstr.h
> > index dd6fbef..176bac0 100644
> > --- a/include/eventstr.h
> > +++ b/include/eventstr.h
> > @@ -72,6 +72,7 @@ enum EventType {
> >      ET_RawTouchUpdate,
> >      ET_RawTouchEnd,
> >      ET_XQuartz,
> > +    ET_BarrierNotify,
> >      ET_Internal = 0xFF          /* First byte */
> >  };
> >
> > @@ -227,6 +228,26 @@ struct _RawDeviceEvent {
> >      uint32_t flags;       /**< Flags to be copied into the generated
> event */
> >  };
> >
> > +struct _BarrierEvent {
> > +    unsigned char header; /**<  Always ET_Internal */
> > +    enum EventType type;  /**<  ET_BarrierNotify */
> > +    int length;           /**<  Length in bytes */
> > +    Time time;            /**<  Time in ms */
> > +    int deviceid;         /**< Device to post this event for */
> > +    int sourceid;         /**< The physical source device */
> > +    int barrierid;
> > +    Window window;
> > +    int16_t x;
> > +    int16_t y;
> > +    int32_t dx;
> > +    int32_t dy;
> > +    int32_t raw_dx;
> > +    int32_t raw_dy;
> > +    int16_t dt;
> > +    int16_t event_type;
> > +    int32_t event_id;
> > +};
> > +
> >  #ifdef XQUARTZ
> >  #define XQUARTZ_EVENT_MAXARGS 5
> >  struct _XQuartzEvent {
> > @@ -253,6 +274,7 @@ union _InternalEvent {
> >      DeviceEvent device_event;
> >      DeviceChangedEvent changed_event;
> >      TouchOwnershipEvent touch_ownership_event;
> > +    BarrierEvent barrier_event;
> >  #if XFreeXDGA
> >      DGAEvent dga_event;
> >  #endif
> > diff --git a/include/inputstr.h b/include/inputstr.h
> > index 5a38924..e4240c9 100644
> > --- a/include/inputstr.h
> > +++ b/include/inputstr.h
> > @@ -71,7 +71,7 @@ extern _X_EXPORT int CountBits(const uint8_t * mask,
> int len);
> >   * events to the protocol, the server will not support these events
> until
> >   * this number here is bumped.
> >   */
> > -#define XI2LASTEVENT    XI_RawTouchEnd
> > +#define XI2LASTEVENT    XI_BarrierPointerReleasedNotify
> >  #define XI2MASKSIZE     ((XI2LASTEVENT >> 3) + 1)       /* no of bytes
> for masks */
> >
> >  /**
> > diff --git a/include/protocol-versions.h b/include/protocol-versions.h
> > index cb8e213..10f5117 100644
> > --- a/include/protocol-versions.h
> > +++ b/include/protocol-versions.h
> > @@ -127,7 +127,7 @@
> >
> >  /* X Input */
> >  #define SERVER_XI_MAJOR_VERSION                      2
> > -#define SERVER_XI_MINOR_VERSION                      2
> > +#define SERVER_XI_MINOR_VERSION                      3
>
> This must be a separate commit, not hidden here.
>
> >
> >  /* XKB */
> >  #define SERVER_XKB_MAJOR_VERSION             1
> > diff --git a/include/scrnintstr.h b/include/scrnintstr.h
> > index df74073..095b029 100644
> > --- a/include/scrnintstr.h
> > +++ b/include/scrnintstr.h
> > @@ -339,7 +339,7 @@ typedef void (*DeviceCursorCleanupProcPtr)
> (DeviceIntPtr /* pDev */ ,
> >                                              ScreenPtr /* pScreen */ );
> >
> >  typedef void (*ConstrainCursorHarderProcPtr) (DeviceIntPtr, ScreenPtr,
> int,
> > -                                              int *, int *);
> > +                                              int *, int *, int, int);
>
> Please split the changes related to this out from the actual event stuff.
>

Will dol thanks.


> >
> >  typedef Bool (*SharePixmapBackingProcPtr)(PixmapPtr, ScreenPtr, void
> **);
> > diff --git a/mi/mieq.c b/mi/mieq.c
> > index b2c7769..102fe95 100644
> > --- a/mi/mieq.c
> > +++ b/mi/mieq.c
> > @@ -407,6 +407,9 @@ ChangeDeviceID(DeviceIntPtr dev, InternalEvent
> *event)
> >      case ET_RawTouchUpdate:
> >          event->raw_event.deviceid = dev->id;
> >          break;
> > +    case ET_BarrierNotify:
> > +        event->barrier_event.deviceid = dev->id;
> > +        break;
> >      default:
> >          ErrorF("[mi] Unknown event type (%d), cannot change id.\n",
> >                 event->any.type);
> > diff --git a/mi/mipointer.c b/mi/mipointer.c
> > index f345063..b440fd1 100644
> > --- a/mi/mipointer.c
> > +++ b/mi/mipointer.c
> > @@ -271,7 +271,7 @@ miPointerSetCursorPosition(DeviceIntPtr pDev,
> ScreenPtr pScreen,
> >      pPointer->generateEvent = generateEvent;
> >
> >      if (pScreen->ConstrainCursorHarder)
> > -        pScreen->ConstrainCursorHarder(pDev, pScreen, Absolute, &x, &y);
> > +        pScreen->ConstrainCursorHarder(pDev, pScreen, Absolute, &x, &y,
> 0, 0);
> >
> >      /* device dependent - must pend signal and call miPointerWarpCursor
> */
> >      (*pScreenPriv->screenFuncs->WarpCursor) (pDev, pScreen, x, y);
> > @@ -562,10 +562,13 @@ miPointerMoveNoEvent(DeviceIntPtr pDev, ScreenPtr
> pScreen, int x, int y)
> >   * @param mode Movement mode (Absolute or Relative)
> >   * @param[in,out] screenx The x coordinate in desktop coordinates
> >   * @param[in,out] screeny The y coordinate in desktop coordinates
> > + * @param unclamped_x The unclamped x coordinate in screen coordinates
> > + * @param unclamped_x The unclamped y coordinate in screen coordinates
>
> if you can avoid it, please don't. we already have 3 or 4 coordinate
> systems, if possible please let's keep everything in the desktop coordinate
> system. Conversion isn't that hard (screen->x + x) but remembering which
> coordinate is in which system is already confusing.
>
> Also, please define unclamped, since the casual reader won't know what's
> clamping.
>
> Cheers,
>    Peter
>
> >   */
> >  ScreenPtr
> > -miPointerSetPosition(DeviceIntPtr pDev, int mode, double *screenx,
> > -                     double *screeny)
> > +miPointerSetPosition(DeviceIntPtr pDev, int mode,
> > +                     double *screenx, double *screeny,
> > +                     int unclamped_x, int unclamped_y)
> >  {
> >      miPointerScreenPtr pScreenPriv;
> >      ScreenPtr pScreen;
> > @@ -614,7 +617,8 @@ miPointerSetPosition(DeviceIntPtr pDev, int mode,
> double *screenx,
> >          y = pPointer->limits.y2 - 1;
> >
> >      if (pScreen->ConstrainCursorHarder)
> > -        pScreen->ConstrainCursorHarder(pDev, pScreen, mode, &x, &y);
> > +        pScreen->ConstrainCursorHarder(pDev, pScreen, mode, &x, &y,
> > +                                       unclamped_x, unclamped_y);
> >
> >      if (pPointer->x != x || pPointer->y != y || pPointer->pScreen !=
> pScreen)
> >          miPointerMoveNoEvent(pDev, pScreen, x, y);
> > diff --git a/mi/mipointer.h b/mi/mipointer.h
> > index 1500e21..9d008f4 100644
> > --- a/mi/mipointer.h
> > +++ b/mi/mipointer.h
> > @@ -115,7 +115,9 @@ miPointerGetPosition(DeviceIntPtr pDev, int *x, int
> *y);
> >  /* Moves the cursor to the specified position.  May clip the
> co-ordinates:
> >   * x and y are modified in-place. */
> >  extern _X_EXPORT ScreenPtr
> > -miPointerSetPosition(DeviceIntPtr pDev, int mode, double *x, double *y);
> > +miPointerSetPosition(DeviceIntPtr pDev, int mode,
> > +                     double *x, double *y,
> > +                     int unclamped_x, int unclamped_y);
> >
> >  extern _X_EXPORT void
> >  miPointerUpdateSprite(DeviceIntPtr pDev);
> > diff --git a/randr/randrstr.h b/randr/randrstr.h
> > index a16302f..1cc4dfd 100644
> > --- a/randr/randrstr.h
> > +++ b/randr/randrstr.h
> > @@ -704,7 +704,7 @@ int
> >   ProcRRSetPanning(ClientPtr client);
> >
> >  void
> > - RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *);
> > + RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *,
> int, int);
> >
> >  /* rrdispatch.c */
> >  extern _X_EXPORT Bool
> > diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
> > index e82d050..d0eb8dd 100644
> > --- a/randr/rrcrtc.c
> > +++ b/randr/rrcrtc.c
> > @@ -1613,8 +1613,8 @@ static Bool
> constrain_all_screen_crtcs(DeviceIntPtr pDev, ScreenPtr pScreen, int
> >  }
> >
> >  void
> > -RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr pScreen, int mode,
> int *x,
> > -                        int *y)
> > +RRConstrainCursorHarder(DeviceIntPtr pDev, ScreenPtr pScreen, int mode,
> > +                        int *x, int *y, int unclamped_x, int
> unclamped_y)
> >  {
> >      rrScrPriv(pScreen);
> >      Bool ret;
> > --
> > 1.8.0
> >
> > _______________________________________________
> > xorg-devel at lists.x.org: X.Org development
> > Archives: http://lists.x.org/archives/xorg-devel
> > Info: http://lists.x.org/mailman/listinfo/xorg-devel
> >
>



-- 
  Jasper
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20121122/03527544/attachment-0001.html>


More information about the xorg-devel mailing list