The HID ids (accessory ids or UHID ids) were defined by the keyboard and mouse implementations. Instead, define them in the common HID part, and make that id part of the sc_hid_event. This prepares the introduction of gamepad support, which will handle several gamepads (and ids) in the common HID gamepad code.
85 lines
2.5 KiB
C
85 lines
2.5 KiB
C
#include "mouse_aoa.h"
|
|
|
|
#include <assert.h>
|
|
|
|
#include "hid/hid_mouse.h"
|
|
#include "input_events.h"
|
|
#include "util/log.h"
|
|
|
|
/** Downcast mouse processor to mouse_aoa */
|
|
#define DOWNCAST(MP) container_of(MP, struct sc_mouse_aoa, mouse_processor)
|
|
|
|
static void
|
|
sc_mouse_processor_process_mouse_motion(struct sc_mouse_processor *mp,
|
|
const struct sc_mouse_motion_event *event) {
|
|
struct sc_mouse_aoa *mouse = DOWNCAST(mp);
|
|
|
|
struct sc_hid_event hid_event;
|
|
sc_hid_mouse_event_from_motion(&hid_event, event);
|
|
|
|
if (!sc_aoa_push_hid_event(mouse->aoa, &hid_event)) {
|
|
LOGW("Could not request HID event (mouse motion)");
|
|
}
|
|
}
|
|
|
|
static void
|
|
sc_mouse_processor_process_mouse_click(struct sc_mouse_processor *mp,
|
|
const struct sc_mouse_click_event *event) {
|
|
struct sc_mouse_aoa *mouse = DOWNCAST(mp);
|
|
|
|
struct sc_hid_event hid_event;
|
|
sc_hid_mouse_event_from_click(&hid_event, event);
|
|
|
|
if (!sc_aoa_push_hid_event(mouse->aoa, &hid_event)) {
|
|
LOGW("Could not request HID event (mouse click)");
|
|
}
|
|
}
|
|
|
|
static void
|
|
sc_mouse_processor_process_mouse_scroll(struct sc_mouse_processor *mp,
|
|
const struct sc_mouse_scroll_event *event) {
|
|
struct sc_mouse_aoa *mouse = DOWNCAST(mp);
|
|
|
|
struct sc_hid_event hid_event;
|
|
sc_hid_mouse_event_from_scroll(&hid_event, event);
|
|
|
|
if (!sc_aoa_push_hid_event(mouse->aoa, &hid_event)) {
|
|
LOGW("Could not request HID event (mouse scroll)");
|
|
}
|
|
}
|
|
|
|
bool
|
|
sc_mouse_aoa_init(struct sc_mouse_aoa *mouse, struct sc_aoa *aoa) {
|
|
mouse->aoa = aoa;
|
|
|
|
bool ok = sc_aoa_setup_hid(aoa, SC_HID_ID_MOUSE,
|
|
SC_HID_MOUSE_REPORT_DESC,
|
|
SC_HID_MOUSE_REPORT_DESC_LEN);
|
|
if (!ok) {
|
|
LOGW("Register HID mouse failed");
|
|
return false;
|
|
}
|
|
|
|
static const struct sc_mouse_processor_ops ops = {
|
|
.process_mouse_motion = sc_mouse_processor_process_mouse_motion,
|
|
.process_mouse_click = sc_mouse_processor_process_mouse_click,
|
|
.process_mouse_scroll = sc_mouse_processor_process_mouse_scroll,
|
|
// Touch events not supported (coordinates are not relative)
|
|
.process_touch = NULL,
|
|
};
|
|
|
|
mouse->mouse_processor.ops = &ops;
|
|
|
|
mouse->mouse_processor.relative_mode = true;
|
|
|
|
return true;
|
|
}
|
|
|
|
void
|
|
sc_mouse_aoa_destroy(struct sc_mouse_aoa *mouse) {
|
|
bool ok = sc_aoa_unregister_hid(mouse->aoa, SC_HID_ID_MOUSE);
|
|
if (!ok) {
|
|
LOGW("Could not unregister HID mouse");
|
|
}
|
|
}
|