mirror of
https://github.com/Genymobile/scrcpy
synced 2025-08-22 09:57:30 +00:00
acc_scroll
This commit is contained in:
parent
d74cfd5711
commit
f9b3f973de
@ -151,6 +151,11 @@ sc_hid_buttons_from_buttons_state(uint8_t buttons_state) {
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sc_hid_mouse_init(struct sc_hid_mouse *hid) {
|
||||||
|
hid->acc_vscroll = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
sc_hid_mouse_generate_input_from_motion(struct sc_hid_input *hid_input,
|
sc_hid_mouse_generate_input_from_motion(struct sc_hid_input *hid_input,
|
||||||
const struct sc_mouse_motion_event *event) {
|
const struct sc_mouse_motion_event *event) {
|
||||||
@ -175,8 +180,9 @@ sc_hid_mouse_generate_input_from_click(struct sc_hid_input *hid_input,
|
|||||||
data[3] = 0; // wheel coordinates only used for scrolling
|
data[3] = 0; // wheel coordinates only used for scrolling
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
sc_hid_mouse_generate_input_from_scroll(struct sc_hid_input *hid_input,
|
sc_hid_mouse_generate_input_from_scroll(struct sc_hid_mouse *hid,
|
||||||
|
struct sc_hid_input *hid_input,
|
||||||
const struct sc_mouse_scroll_event *event) {
|
const struct sc_mouse_scroll_event *event) {
|
||||||
sc_hid_mouse_input_init(hid_input);
|
sc_hid_mouse_input_init(hid_input);
|
||||||
|
|
||||||
@ -184,9 +190,19 @@ sc_hid_mouse_generate_input_from_scroll(struct sc_hid_input *hid_input,
|
|||||||
data[0] = 0; // buttons state irrelevant (and unknown)
|
data[0] = 0; // buttons state irrelevant (and unknown)
|
||||||
data[1] = 0; // no x motion
|
data[1] = 0; // no x motion
|
||||||
data[2] = 0; // no y motion
|
data[2] = 0; // no y motion
|
||||||
// In practice, vscroll is always -1, 0 or 1, but in theory other values
|
|
||||||
// are possible
|
hid->acc_vscroll += event->vscroll;
|
||||||
data[3] = CLAMP(event->vscroll, -127, 127);
|
if (hid->acc_vscroll > -1 && hid->acc_vscroll < 1) {
|
||||||
|
// Not enough scrolling to inject a scroll tick
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
hid->acc_vscroll = CLAMP(hid->acc_vscroll, -127, 127);
|
||||||
|
int8_t consume = hid->acc_vscroll; // truncate towards 0
|
||||||
|
assert(consume);
|
||||||
|
hid->acc_vscroll -= consume;
|
||||||
|
data[3] = consume;
|
||||||
|
return true;
|
||||||
// Horizontal scrolling ignored
|
// Horizontal scrolling ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,13 @@
|
|||||||
|
|
||||||
#define SC_HID_ID_MOUSE 2
|
#define SC_HID_ID_MOUSE 2
|
||||||
|
|
||||||
|
struct sc_hid_mouse {
|
||||||
|
float acc_vscroll;
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
sc_hid_mouse_init(struct sc_hid_mouse *hid);
|
||||||
|
|
||||||
void
|
void
|
||||||
sc_hid_mouse_generate_open(struct sc_hid_open *hid_open);
|
sc_hid_mouse_generate_open(struct sc_hid_open *hid_open);
|
||||||
|
|
||||||
@ -22,8 +29,9 @@ void
|
|||||||
sc_hid_mouse_generate_input_from_click(struct sc_hid_input *hid_input,
|
sc_hid_mouse_generate_input_from_click(struct sc_hid_input *hid_input,
|
||||||
const struct sc_mouse_click_event *event);
|
const struct sc_mouse_click_event *event);
|
||||||
|
|
||||||
void
|
bool
|
||||||
sc_hid_mouse_generate_input_from_scroll(struct sc_hid_input *hid_input,
|
sc_hid_mouse_generate_input_from_scroll(struct sc_hid_mouse *hid,
|
||||||
|
struct sc_hid_input *hid_input,
|
||||||
const struct sc_mouse_scroll_event *event);
|
const struct sc_mouse_scroll_event *event);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -55,7 +55,10 @@ sc_mouse_processor_process_mouse_scroll(struct sc_mouse_processor *mp,
|
|||||||
struct sc_mouse_uhid *mouse = DOWNCAST(mp);
|
struct sc_mouse_uhid *mouse = DOWNCAST(mp);
|
||||||
|
|
||||||
struct sc_hid_input hid_input;
|
struct sc_hid_input hid_input;
|
||||||
sc_hid_mouse_generate_input_from_scroll(&hid_input, event);
|
if (!sc_hid_mouse_generate_input_from_scroll(&mouse->hid, &hid_input,
|
||||||
|
event)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
sc_mouse_uhid_send_input(mouse, &hid_input, "mouse scroll");
|
sc_mouse_uhid_send_input(mouse, &hid_input, "mouse scroll");
|
||||||
}
|
}
|
||||||
@ -63,6 +66,8 @@ sc_mouse_processor_process_mouse_scroll(struct sc_mouse_processor *mp,
|
|||||||
bool
|
bool
|
||||||
sc_mouse_uhid_init(struct sc_mouse_uhid *mouse,
|
sc_mouse_uhid_init(struct sc_mouse_uhid *mouse,
|
||||||
struct sc_controller *controller) {
|
struct sc_controller *controller) {
|
||||||
|
sc_hid_mouse_init(&mouse->hid);
|
||||||
|
|
||||||
mouse->controller = controller;
|
mouse->controller = controller;
|
||||||
|
|
||||||
static const struct sc_mouse_processor_ops ops = {
|
static const struct sc_mouse_processor_ops ops = {
|
||||||
|
@ -4,11 +4,13 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
|
#include "hid/hid_mouse.h"
|
||||||
#include "trait/mouse_processor.h"
|
#include "trait/mouse_processor.h"
|
||||||
|
|
||||||
struct sc_mouse_uhid {
|
struct sc_mouse_uhid {
|
||||||
struct sc_mouse_processor mouse_processor; // mouse processor trait
|
struct sc_mouse_processor mouse_processor; // mouse processor trait
|
||||||
|
|
||||||
|
struct sc_hid_mouse hid;
|
||||||
struct sc_controller *controller;
|
struct sc_controller *controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ sc_mouse_processor_process_mouse_scroll(struct sc_mouse_processor *mp,
|
|||||||
struct sc_mouse_aoa *mouse = DOWNCAST(mp);
|
struct sc_mouse_aoa *mouse = DOWNCAST(mp);
|
||||||
|
|
||||||
struct sc_hid_input hid_input;
|
struct sc_hid_input hid_input;
|
||||||
sc_hid_mouse_generate_input_from_scroll(&hid_input, event);
|
sc_hid_mouse_generate_input_from_scroll(&mouse->hid, &hid_input, event);
|
||||||
|
|
||||||
if (!sc_aoa_push_input(mouse->aoa, &hid_input)) {
|
if (!sc_aoa_push_input(mouse->aoa, &hid_input)) {
|
||||||
LOGW("Could not push AOA HID input (mouse scroll)");
|
LOGW("Could not push AOA HID input (mouse scroll)");
|
||||||
@ -62,6 +62,8 @@ sc_mouse_aoa_init(struct sc_mouse_aoa *mouse, struct sc_aoa *aoa) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sc_hid_mouse_init(&mouse->hid);
|
||||||
|
|
||||||
static const struct sc_mouse_processor_ops ops = {
|
static const struct sc_mouse_processor_ops ops = {
|
||||||
.process_mouse_motion = sc_mouse_processor_process_mouse_motion,
|
.process_mouse_motion = sc_mouse_processor_process_mouse_motion,
|
||||||
.process_mouse_click = sc_mouse_processor_process_mouse_click,
|
.process_mouse_click = sc_mouse_processor_process_mouse_click,
|
||||||
|
@ -5,12 +5,14 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "hid/hid_mouse.h"
|
||||||
#include "usb/aoa_hid.h"
|
#include "usb/aoa_hid.h"
|
||||||
#include "trait/mouse_processor.h"
|
#include "trait/mouse_processor.h"
|
||||||
|
|
||||||
struct sc_mouse_aoa {
|
struct sc_mouse_aoa {
|
||||||
struct sc_mouse_processor mouse_processor; // mouse processor trait
|
struct sc_mouse_processor mouse_processor; // mouse processor trait
|
||||||
|
|
||||||
|
struct sc_hid_mouse hid;
|
||||||
struct sc_aoa *aoa;
|
struct sc_aoa *aoa;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user