void pointer_position_set(struct wlc_point *new_origin, bool force_focus) { struct wlc_point origin; wlc_pointer_get_position(&origin); pointer_state.delta.x = new_origin->x - origin.x; pointer_state.delta.y = new_origin->y - origin.y; wlc_pointer_set_position(new_origin); // Update view under pointer swayc_t *prev_view = pointer_state.view; pointer_state.view = container_under_pointer(); // If pointer is in a mode, update it if (pointer_state.mode) { pointer_mode_update(); // Otherwise change focus if config is set } else if (force_focus || (prev_view != pointer_state.view && config->focus_follows_mouse)) { if (pointer_state.view && pointer_state.view->type == C_VIEW) { set_focused_container(pointer_state.view); } } }
static bool handle_pointer_motion(wlc_handle handle, uint32_t time, const struct wlc_origin *origin) { // Update pointer origin pointer_state.delta.x = origin->x - pointer_state.origin.x; pointer_state.delta.y = origin->y - pointer_state.origin.y; pointer_state.origin.x = origin->x; pointer_state.origin.y = origin->y; // Update view under pointer swayc_t *prev_view = pointer_state.view; pointer_state.view = container_under_pointer(); // If pointer is in a mode, update it if (pointer_state.mode) { pointer_mode_update(); } // Otherwise change focus if config is set an else if (prev_view != pointer_state.view && config->focus_follows_mouse) { if (pointer_state.view && pointer_state.view->type == C_VIEW) { set_focused_container(pointer_state.view); } } return EVENT_PASSTHROUGH; }