input/pointer: try harder to not send duplicate motion events
wl_fixed_t is a 32-bit data type, but our doubles are 64-bit. This meant that two doubles that would map to the same wl_fixed_t could compare unequal, and send a duplicate motion event. Refs swaywm/sway#4632.
This commit is contained in:
		
							parent
							
								
									c27263c105
								
							
						
					
					
						commit
						033c9cab74
					
				| 
						 | 
				
			
			@ -230,18 +230,21 @@ void wlr_seat_pointer_send_motion(struct wlr_seat *wlr_seat, uint32_t time,
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (wlr_seat->pointer_state.sx == sx && wlr_seat->pointer_state.sy == sy) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	// Ensure we don't send duplicate motion events. Instead of comparing with an
 | 
			
		||||
	// epsilon, chop off some precision by converting to a `wl_fixed_t` first,
 | 
			
		||||
	// since that is what a client receives.
 | 
			
		||||
	wl_fixed_t sx_fixed = wl_fixed_from_double(sx);
 | 
			
		||||
	wl_fixed_t sy_fixed = wl_fixed_from_double(sy);
 | 
			
		||||
	if (wl_fixed_from_double(wlr_seat->pointer_state.sx) != sx_fixed ||
 | 
			
		||||
			wl_fixed_from_double(wlr_seat->pointer_state.sy) != sy_fixed) {
 | 
			
		||||
		struct wl_resource *resource;
 | 
			
		||||
		wl_resource_for_each(resource, &client->pointers) {
 | 
			
		||||
			if (wlr_seat_client_from_pointer_resource(resource) == NULL) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
	struct wl_resource *resource;
 | 
			
		||||
	wl_resource_for_each(resource, &client->pointers) {
 | 
			
		||||
		if (wlr_seat_client_from_pointer_resource(resource) == NULL) {
 | 
			
		||||
			continue;
 | 
			
		||||
			wl_pointer_send_motion(resource, time, sx_fixed, sy_fixed);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		wl_pointer_send_motion(resource, time, wl_fixed_from_double(sx),
 | 
			
		||||
			wl_fixed_from_double(sy));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wlr_seat_pointer_warp(wlr_seat, sx, sy);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue