[PATCH v3] compositor: send a pointer motion if the focus surface moves under the pointer

Pekka Paalanen ppaalanen at gmail.com
Thu Feb 28 00:26:31 PST 2013


On Wed, 27 Feb 2013 16:01:18 -0500
Kristian Høgsberg <hoegsberg at gmail.com> wrote:

> On Thu, Feb 21, 2013 at 04:36:20PM +0100, Giulio Camuffo wrote:
> > ---
> >  src/compositor.c | 19 +++++++++++++++----
> >  1 file changed, 15 insertions(+), 4 deletions(-)
> > 
> > diff --git a/src/compositor.c b/src/compositor.c
> > index 64d0830..025c6fd 100644
> > --- a/src/compositor.c
> > +++ b/src/compositor.c
> > @@ -776,6 +776,7 @@ weston_device_repick(struct weston_seat *seat)
> >  	const struct wl_pointer_grab_interface *interface;
> >  	struct weston_surface *surface, *focus;
> >  	struct wl_pointer *pointer = seat->seat.pointer;
> > +	int32_t curr_x, curr_y;
> >  
> >  	if (!pointer)
> >  		return;
> > @@ -783,16 +784,26 @@ weston_device_repick(struct weston_seat *seat)
> >  	surface = weston_compositor_pick_surface(seat->compositor,
> >  						 pointer->x,
> >  						 pointer->y,
> > -						 &pointer->current_x,
> > -						 &pointer->current_y);
> > +						 &curr_x,
> > +						 &curr_y);
> >  
> >  	if (&surface->surface != pointer->current) {
> >  		interface = pointer->grab->interface;
> >  		pointer->current = &surface->surface;
> >  		interface->focus(pointer->grab, &surface->surface,
> > -				 pointer->current_x,
> > -				 pointer->current_y);
> > +				 curr_x,
> > +				 curr_y);
> > +	} else if (pointer->current_x != curr_x ||
> > +			pointer->current_y != curr_y) {
> > +		/* The current surface moved under the cursor, send
> > +		 * a motion event. */
> > +		interface = pointer->grab->interface;
> > +		interface->motion(pointer->grab, weston_compositor_get_time(),
> > +				  curr_x,
> > +				  curr_y);
> 
> Using weston_compositor_get_time() here is problematic (we need to get
> rid of that function, it's always problematic...).  Input events come
> with their own timestamp, which are CLOCK_MONOTONIC, while
> weston_compositor_get_time() is based on gettimeofday().  Motion
> events and button clicks corresponds to somebody actually moving the
> pointer and we have evdev events with kernel timestamps for those.
> The timestamps are there to allow application reason about the timing
> of "real world events" like time of a double click or pointer speed.
> 
> Whenever we have to "make up a timestamp" there's something wrong.
> The reason enter and leave don't have timestamps is that they can
> happen in response to windows getting mapped or unmapped, which can
> happen whenever a clients decides to unmap its window.  So there's no
> inherent timestamp and not always corresponding pointer motion
> involved (and if there is, a motion event with timestamp will follow).  
> 
> I wonder if we're better off sending a leave/enter pair here, since
> that doesn't need a timestamp and doesn't imply that the pointer
> moved.

Hmm, leave/enter pair... we will probably have a leave/enter pair
also when focus moves from a sub-surface to another surface of the same
window. How do we guarantee, that a client does not repaint in between,
to avoid a flash? Especially when keyboard focus moves within a
window.


Thanks,
pq


More information about the wayland-devel mailing list