another menu item), but we need events for the popup menu surface
as well.
- - input_device.attach() should use a timestamp so the server can
- discard late requests (sending a request to set the pointer image
- in response to a motion event, the pointer leaves and then reenters
- the surface, before the server receives the reqest -> the server
- must discard it).
-
- The message format has to include information about number of fds
in the message so we can skip a message correctly. Or we should
just give up on trying to recover from unknown messages.
int hotspot_x, hotspot_y;
struct dnd *dnd;
struct input *input;
+ uint32_t time;
};
struct dnd_offer {
surface = dnd_drag->translucent;
buffer = display_get_buffer_for_surface(dnd->display, surface);
- wl_input_device_attach(device, buffer,
+ wl_input_device_attach(device, dnd_drag->time, buffer,
dnd_drag->hotspot_x, dnd_drag->hotspot_y);
}
dnd_drag = malloc(sizeof *dnd_drag);
dnd_drag->dnd = dnd;
dnd_drag->input = input;
+ dnd_drag->time = time;
dnd_drag->opaque =
create_drag_cursor(dnd_drag, item, x, y, 1);
}
static void
-set_pointer_image(struct input *input, int pointer)
+set_pointer_image(struct input *input, uint32_t time, int pointer)
{
struct display *display = input->display;
struct wl_buffer *buffer;
if (input->current_pointer_image == POINTER_DEFAULT)
return;
- wl_input_device_attach(input->input_device, NULL, 0, 0);
+ wl_input_device_attach(input->input_device, time, NULL, 0, 0);
input->current_pointer_image = POINTER_DEFAULT;
return;
default:
input->current_pointer_image = pointer;
surface = display->pointer_surfaces[pointer];
buffer = display_get_buffer_for_surface(display, surface);
- wl_input_device_attach(input->input_device, buffer,
+ wl_input_device_attach(input->input_device, time, buffer,
pointer_images[pointer].hotspot_x,
pointer_images[pointer].hotspot_y);
}
x, y, sx, sy,
window->user_data);
- set_pointer_image(input, pointer);
+ set_pointer_image(input, time, pointer);
}
static void
x, y, sx, sy,
window->user_data);
- set_pointer_image(input, pointer);
+ set_pointer_image(input, time, pointer);
} else {
input->pointer_focus = NULL;
input->current_pointer_image = POINTER_UNSET;
WLSC_POINTER_LEFT_PTR);
device->pointer_focus = surface;
+ device->pointer_focus_time = time;
}
static struct wlsc_surface *
static void
input_device_attach(struct wl_client *client,
struct wl_input_device *device_base,
+ uint32_t time,
struct wl_buffer *buffer_base, int32_t x, int32_t y)
{
struct wlsc_input_device *device =
(struct wlsc_input_device *) device_base;
struct wlsc_buffer *buffer = (struct wlsc_buffer *) buffer_base;
+ if (time < device->pointer_focus_time)
+ return;
if (device->pointer_focus == NULL)
return;
if (device->pointer_focus->base.client != client &&
struct wlsc_surface *keyboard_focus;
struct wl_array keys;
uint32_t modifier_state;
+ uint32_t pointer_focus_time;
enum wlsc_grab_type grab;
struct wlsc_surface *grab_surface;
scanner : LDLIBS += $(EXPAT_LIBS)
-install : $(libs) compositor
+install : $(libs)
install -d $(libdir) $(includedir) $(libdir)/pkgconfig
install wayland-server.pc wayland-client.pc $(libdir)/pkgconfig
install $(libs) $(libdir)
<interface name="input_device" version="1">
<request name="attach">
+ <arg name="time" type="uint"/>
<arg name="buffer" type="object" interface="buffer"/>
<arg name="hotspot_x" type="int"/>
<arg name="hotspot_y" type="int"/>