mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Send out coordinates with pointer_focus event
We can't rely on motion events happening right away, pointer_focus could change because of windows coming or going etc.
This commit is contained in:
		
							parent
							
								
									c071f4d008
								
							
						
					
					
						commit
						6d70202f80
					
				
					 5 changed files with 25 additions and 10 deletions
				
			
		
							
								
								
									
										4
									
								
								TODO
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								TODO
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
Core wayland protocol
 | 
					Core wayland protocol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - enter notify needs coordinates for cases where pointer focus
 | 
					 - generate pointer_focus on raise/lower, move windows, all kinds of
 | 
				
			||||||
   changes without motion (surfaces coming or going)
 | 
					   changes in surface stacking.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - generate marshal stubs as static inline functions.
 | 
					 - generate marshal stubs as static inline functions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -400,7 +400,8 @@ window_handle_key(void *data, struct wl_input_device *input_device,
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
window_handle_pointer_focus(void *data,
 | 
					window_handle_pointer_focus(void *data,
 | 
				
			||||||
			    struct wl_input_device *input_device,
 | 
								    struct wl_input_device *input_device,
 | 
				
			||||||
			    uint32_t time, struct wl_surface *surface)
 | 
								    uint32_t time, struct wl_surface *surface,
 | 
				
			||||||
 | 
								    int32_t x, int32_t y, int32_t sx, int32_t sy)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct input *input = data;
 | 
						struct input *input = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								compositor.c
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								compositor.c
									
										
									
									
									
								
							| 
						 | 
					@ -641,7 +641,9 @@ wlsc_input_device_set_keyboard_focus(struct wlsc_input_device *device,
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
wlsc_input_device_set_pointer_focus(struct wlsc_input_device *device,
 | 
					wlsc_input_device_set_pointer_focus(struct wlsc_input_device *device,
 | 
				
			||||||
				    struct wlsc_surface *surface,
 | 
									    struct wlsc_surface *surface,
 | 
				
			||||||
				    uint32_t time)
 | 
									    uint32_t time,
 | 
				
			||||||
 | 
									    int32_t x, int32_t y,
 | 
				
			||||||
 | 
									    int32_t sx, int32_t sy)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (device->pointer_focus == surface)
 | 
						if (device->pointer_focus == surface)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -651,12 +653,13 @@ wlsc_input_device_set_pointer_focus(struct wlsc_input_device *device,
 | 
				
			||||||
		wl_surface_post_event(&device->pointer_focus->base,
 | 
							wl_surface_post_event(&device->pointer_focus->base,
 | 
				
			||||||
				      &device->base,
 | 
									      &device->base,
 | 
				
			||||||
				      WL_INPUT_DEVICE_POINTER_FOCUS,
 | 
									      WL_INPUT_DEVICE_POINTER_FOCUS,
 | 
				
			||||||
				      time, NULL);
 | 
									      time, NULL, 0, 0, 0, 0);
 | 
				
			||||||
	if (surface)
 | 
						if (surface)
 | 
				
			||||||
		wl_surface_post_event(&surface->base,
 | 
							wl_surface_post_event(&surface->base,
 | 
				
			||||||
				      &device->base,
 | 
									      &device->base,
 | 
				
			||||||
				      WL_INPUT_DEVICE_POINTER_FOCUS,
 | 
									      WL_INPUT_DEVICE_POINTER_FOCUS,
 | 
				
			||||||
				      time, &surface->base);
 | 
									      time, &surface->base,
 | 
				
			||||||
 | 
									      x, y, sx, sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	device->pointer_focus = surface;
 | 
						device->pointer_focus = surface;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -711,7 +714,8 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
 | 
				
			||||||
	case WLSC_DEVICE_GRAB_MOTION:
 | 
						case WLSC_DEVICE_GRAB_MOTION:
 | 
				
			||||||
		es = pick_surface(device, &sx, &sy);
 | 
							es = pick_surface(device, &sx, &sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		wlsc_input_device_set_pointer_focus(device, es, time);
 | 
							wlsc_input_device_set_pointer_focus(device, es,
 | 
				
			||||||
 | 
											    time, x, y, sx, sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (es)
 | 
							if (es)
 | 
				
			||||||
			wl_surface_post_event(&es->base, &device->base,
 | 
								wl_surface_post_event(&es->base, &device->base,
 | 
				
			||||||
| 
						 | 
					@ -806,6 +810,12 @@ notify_button(struct wlsc_input_device *device,
 | 
				
			||||||
		    (device->modifier_state & MODIFIER_SUPER))
 | 
							    (device->modifier_state & MODIFIER_SUPER))
 | 
				
			||||||
			shell_move(NULL, &compositor->shell,
 | 
								shell_move(NULL, &compositor->shell,
 | 
				
			||||||
				   &surface->base, device, time);
 | 
									   &surface->base, device, time);
 | 
				
			||||||
 | 
							else if (state && button == BTN_MIDDLE &&
 | 
				
			||||||
 | 
								 device->grab == WLSC_DEVICE_GRAB_MOTION &&
 | 
				
			||||||
 | 
								 (device->modifier_state & MODIFIER_SUPER))
 | 
				
			||||||
 | 
								shell_resize(NULL, &compositor->shell,
 | 
				
			||||||
 | 
									     &surface->base, device, time,
 | 
				
			||||||
 | 
									     WLSC_DEVICE_GRAB_RESIZE_BOTTOM_RIGHT);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			wl_surface_post_event(&surface->base, &device->base,
 | 
								wl_surface_post_event(&surface->base, &device->base,
 | 
				
			||||||
					      WL_INPUT_DEVICE_BUTTON,
 | 
										      WL_INPUT_DEVICE_BUTTON,
 | 
				
			||||||
| 
						 | 
					@ -896,7 +906,9 @@ handle_surface_destroy(struct wlsc_listener *listener,
 | 
				
			||||||
	if (device->pointer_focus == surface) {
 | 
						if (device->pointer_focus == surface) {
 | 
				
			||||||
		device->grab = WLSC_DEVICE_GRAB_NONE;
 | 
							device->grab = WLSC_DEVICE_GRAB_NONE;
 | 
				
			||||||
		focus = pick_surface(device, &sx, &sy);
 | 
							focus = pick_surface(device, &sx, &sy);
 | 
				
			||||||
		wlsc_input_device_set_pointer_focus(device, focus, time);
 | 
							wlsc_input_device_set_pointer_focus(device, focus, time,
 | 
				
			||||||
 | 
											    device->x, device->y,
 | 
				
			||||||
 | 
											    sx, sy);
 | 
				
			||||||
		fprintf(stderr, "lost pointer focus surface, reverting to %p\n", focus);
 | 
							fprintf(stderr, "lost pointer focus surface, reverting to %p\n", focus);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -124,6 +124,10 @@
 | 
				
			||||||
    <event name="pointer_focus">
 | 
					    <event name="pointer_focus">
 | 
				
			||||||
      <arg name="time" type="uint"/>
 | 
					      <arg name="time" type="uint"/>
 | 
				
			||||||
      <arg name="surface" type="surface"/>
 | 
					      <arg name="surface" type="surface"/>
 | 
				
			||||||
 | 
					      <arg name="x" type="int"/>
 | 
				
			||||||
 | 
					      <arg name="y" type="int"/>
 | 
				
			||||||
 | 
					      <arg name="surface_x" type="int"/>
 | 
				
			||||||
 | 
					      <arg name="surface_y" type="int"/>
 | 
				
			||||||
    </event>
 | 
					    </event>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <event name="keyboard_focus">
 | 
					    <event name="keyboard_focus">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,8 +81,6 @@ struct wl_visual {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wl_output {
 | 
					struct wl_output {
 | 
				
			||||||
	struct wl_proxy proxy;
 | 
						struct wl_proxy proxy;
 | 
				
			||||||
	struct wl_listener listener;
 | 
					 | 
				
			||||||
	int32_t width, height;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wl_shell {
 | 
					struct wl_shell {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue