Files
u-boot/include/mouse.h
Simon Glass be1ea51b83 input: Provide a way for tests to register a mouse click
In tests it is useful to fake a mouse click to check that expo handles
it correctly. Create a function for this.

Signed-off-by: Simon Glass <simon.glass@canonical.com>
2025-11-14 12:00:31 -07:00

194 lines
4.9 KiB
C

/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Mouse/trackpad/touchscreen input uclass
*
* Copyright 2020 Google LLC
*/
#ifndef _MOUSE_H
#define _MOUSE_H
#include <stdbool.h>
#include <video_defs.h>
struct udevice;
enum mouse_ev_t {
MOUSE_EV_NULL,
MOUSE_EV_MOTION,
MOUSE_EV_BUTTON,
};
enum mouse_state_t {
BUTTON_LEFT = 1 << 0,
BUTTON_MIDDLE = 1 << 1,
BUTTON_RIGHT = 1 << 2,
BUTTON_SCROLL_PLUS = 1 << 3,
BUTTON_SCROLL_MINUS = 1 << 4,
};
/**
* struct mouse_uc_priv - pre-device private data for mouse uclass
*
* @left_pressed: True if left button is currently pressed
* @click_pending: True if a click has occurred but not yet retrieved
* @click_pos: Position where the click occurred
* @last_pos: Last position received from mouse
* @video_dev: Video device for coordinate scaling
* @video_width: Width of video display
* @video_height: Height of video display
*/
struct mouse_uc_priv {
bool left_pressed;
bool click_pending;
struct vid_pos click_pos;
struct vid_pos last_pos;
struct udevice *video_dev;
int video_width;
int video_height;
};
/**
* struct mouse_event - information about a mouse event
*
* @type: Mouse event ype
*/
struct mouse_event {
enum mouse_ev_t type;
union {
/**
* @state: Mouse state (enum mouse_state_t bitmask)
* @x: X position of mouse
* @y: Y position of mouse
* @xrel: Relative motion in X direction
* @yrel: Relative motion in Y direction
*/
struct mouse_motion {
unsigned char state;
unsigned short x;
unsigned short y;
short xrel;
short yrel;
} motion;
/**
* @button: Button number that was pressed/released (BUTTON_...)
* @pressed: True if button was pressed, false if released
* @clicks: number of clicks (normally 1; 2 = double-click)
* @x: X position of mouse
* @y: Y position of mouse
*/
struct mouse_button {
unsigned char button;
bool pressed;
unsigned char clicks;
unsigned short x;
unsigned short y;
} button;
};
};
struct mouse_ops {
/**
* mouse_get_event() - Get a mouse event
*
* Gets the next available mouse event from the device. This can be a
* motion event (mouse movement) or a button event (button press or
* release).
*
* @dev: Mouse device
* @event: Returns the mouse event
* Returns: 0 if OK, -EAGAIN if no event available, -ENOSYS if not
* supported
*/
int (*get_event)(struct udevice *dev, struct mouse_event *event);
/**
* set_ptr_visible() - Show or hide the system mouse pointer
*
* This is used to hide the system pointer when expo is rendering its
* own custom mouse pointer.
*
* @dev: Mouse device
* @visible: true to show the pointer, false to hide it
* Returns: 0 if OK, -ENOSYS if not supported
*/
int (*set_ptr_visible)(struct udevice *dev, bool visible);
};
#define mouse_get_ops(dev) ((struct mouse_ops *)(dev)->driver->ops)
/**
* mouse_get_event() - Get a mouse event
*
* Gets the next available mouse event from the device. This can be a
* motion event (mouse movement) or a button event (button press or
* release).
*
* @dev: Mouse device
* @event: Returns the mouse event
* Returns: 0 if OK, -EAGAIN if no event available, -ENOSYS if not
* supported
*/
int mouse_get_event(struct udevice *dev, struct mouse_event *event);
/**
* mouse_get_click() - Check if a left mouse button click has occurred
*
* @dev: Mouse device
* @pos: Returns position of click
* Returns: 0 if a click has occurred, -EAGAIN if no click pending
*/
int mouse_get_click(struct udevice *dev, struct vid_pos *pos);
/**
* mouse_get_pos() - Get the current mouse position
*
* @dev: Mouse device
* @pos: Returns last position
* Returns: 0 if position is available, -ve on error
*/
int mouse_get_pos(struct udevice *dev, struct vid_pos *pos);
/**
* mouse_set_ptr_visible() - Show or hide the system mouse pointer
*
* This is used to hide the system pointer when rendering a custom mouse
* pointer (e.g., in expo mode).
*
* @dev: Mouse device
* @visible: true to show the pointer, false to hide it
* Returns: 0 if OK, -ENOSYS if not supported
*/
int mouse_set_ptr_visible(struct udevice *dev, bool visible);
/**
* mouse_set_video() - Set the video device for coordinate scaling
*
* Sets up the video device in the mouse uclass private data so mouse drivers
* can scale coordinates to match the display resolution.
*
* This also places the mouse in the middle of the display
*
* @dev: Mouse device
* @video_dev: Video device
* Returns: 0 if OK, -ve on error
*/
int mouse_set_video(struct udevice *dev, struct udevice *video_dev);
/**
* mouse_queue_click_for_test() - Queue a click event for testing
*
* This is a back-door function for tests to simulate a mouse click at a
* specific position. The click will be returned by the next call to
* mouse_get_click().
*
* @dev: Mouse device
* @x: X coordinate of click
* @y: Y coordinate of click
* Returns: 0 if OK, -ve on error
*/
int mouse_queue_click_for_test(struct udevice *dev, int x, int y);
#endif