#ifndef WLR_TYPES_WLR_CURSOR_H #define WLR_TYPES_WLR_CURSOR_H #include #include #include #include #include struct wlr_cursor_state; struct wlr_cursor { struct wlr_cursor_state *state; double x, y; struct { struct wl_signal motion; struct wl_signal motion_absolute; struct wl_signal button; struct wl_signal axis; struct wl_signal touch_up; struct wl_signal touch_down; struct wl_signal touch_motion; struct wl_signal touch_cancel; struct wl_signal tablet_tool_axis; struct wl_signal tablet_tool_proximity; struct wl_signal tablet_tool_tip; struct wl_signal tablet_tool_button; } events; }; struct wlr_cursor *wlr_cursor_create(); void wlr_cursor_destroy(struct wlr_cursor *cur); /** * Warp the cursor to the given x and y in layout coordinates. If x and y are * out of the layout boundaries or constraints, no warp will happen. * * `dev` may be passed to respect device mapping constraints. If `dev` is NULL, * device mapping constraints will be ignored. * * Returns true when the mouse warp was successful. */ bool wlr_cursor_warp(struct wlr_cursor *cur, struct wlr_input_device *dev, double x, double y); void wlr_cursor_warp_absolute(struct wlr_cursor *cur, struct wlr_input_device *dev, double x_mm, double y_mm); /** * Move the cursor in the direction of the given x and y coordinates. * * `dev` may be passed to respect device mapping constraints. If `dev` is NULL, * device mapping constraints will be ignored. */ void wlr_cursor_move(struct wlr_cursor *cur, struct wlr_input_device *dev, double delta_x, double delta_y); /** * Set the cursor image. stride is given in bytes. If pixels is NULL, hides the * cursor. * * If scale isn't zero, the image is only set on outputs having the provided * scale. */ void wlr_cursor_set_image(struct wlr_cursor *cur, const uint8_t *pixels, int32_t stride, uint32_t width, uint32_t height, int32_t hotspot_x, int32_t hotspot_y, float scale); /** * Set the cursor surface. The surface can be committed to update the cursor * image. The surface position is substracted from the hotspot. A NULL surface * commit hides the cursor. */ void wlr_cursor_set_surface(struct wlr_cursor *cur, struct wlr_surface *surface, int32_t hotspot_x, int32_t hotspot_y); /** * Attaches this input device to this cursor. The input device must be one of: * * - WLR_INPUT_DEVICE_POINTER * - WLR_INPUT_DEVICE_TOUCH * - WLR_INPUT_DEVICE_TABLET_TOOL */ void wlr_cursor_attach_input_device(struct wlr_cursor *cur, struct wlr_input_device *dev); void wlr_cursor_detach_input_device(struct wlr_cursor *cur, struct wlr_input_device *dev); /** * Uses the given layout to establish the boundaries and movement semantics of * this cursor. Cursors without an output layout allow infinite movement in any * direction and do not support absolute input events. */ void wlr_cursor_attach_output_layout(struct wlr_cursor *cur, struct wlr_output_layout *l); /** * Attaches this cursor to the given output, which must be among the outputs in * the current output_layout for this cursor. This call is invalid for a cursor * without an associated output layout. */ void wlr_cursor_map_to_output(struct wlr_cursor *cur, struct wlr_output *output); /** * Maps all input from a specific input device to a given output. The input * device must be attached to this cursor and the output must be among the * outputs in the attached output layout. */ void wlr_cursor_map_input_to_output(struct wlr_cursor *cur, struct wlr_input_device *dev, struct wlr_output *output); /** * Maps this cursor to an arbitrary region on the associated wlr_output_layout. */ void wlr_cursor_map_to_region(struct wlr_cursor *cur, struct wlr_box *box); /** * Maps inputs from this input device to an arbitrary region on the associated * wlr_output_layout. */ void wlr_cursor_map_input_to_region(struct wlr_cursor *cur, struct wlr_input_device *dev, struct wlr_box *box); /** * Convert absolute coordinates to layout coordinates for the device. */ bool wlr_cursor_absolute_to_layout_coords(struct wlr_cursor *cur, struct wlr_input_device *device, double x_mm, double y_mm, double width_mm, double height_mm, double *lx, double *ly); #endif