pointer->y = event->y * OUTPUT_HEIGHT;
view = server_view_at(pointer->server, pointer->x, pointer->y, &sx, &sy);
- if (view) {
- ds_dbg("Set pointer focus to view(%p)", view);
- ds_seat_pointer_notify_enter(pointer->server->seat,
- ds_xdg_surface_get_surface(view->xdg_surface), sx, sy);
- ds_seat_pointer_notify_motion(pointer->server->seat, event->time_msec,
- sx, sy);
- pointer->focused_view = view;
+ if (pointer->focused_view != view) {
+ if (pointer->focused_view) {
+ ds_dbg("Clear pointer focus from view(%p)", pointer->focused_view);
+ ds_seat_pointer_notify_clear_focus(pointer->server->seat);
+ pointer->focused_view = NULL;
+ }
+ if (view) {
+ ds_dbg("Set pointer focus to view(%p)", view);
+ ds_seat_pointer_notify_enter(pointer->server->seat,
+ ds_xdg_surface_get_surface(view->xdg_surface), sx, sy);
+ pointer->focused_view = view;
+ }
}
- else {
- ds_dbg("Clear pointer focus from view(%p)", pointer->focused_view);
- ds_seat_pointer_notify_clear_focus(pointer->server->seat);
- pointer->focused_view = NULL;
+ if (view) {
+ ds_seat_pointer_notify_motion(pointer->server->seat,
+ event->time_msec, sx, sy);
}
}
WL_EXPORT void
ds_drag_start_pointer_drag(struct ds_drag *drag, uint32_t serial)
{
+ struct ds_surface *surface;
+ double sy, sx;
+
drag->grab_type = DS_DRAG_GRAB_KEYBOARD_POINTER;
+ surface = ds_seat_pointer_get_focused_surface(drag->seat, &sx, &sy);
+
ds_seat_pointer_clear_focus(drag->seat);
ds_seat_pointer_start_grab(drag->seat, &drag->pointer_grab);
+ if (surface)
+ ds_seat_pointer_notify_enter(drag->seat, surface, sx, sy);
+
drag_start(drag, serial);
}