mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 20:25:34 +08:00
151 lines
3.9 KiB
C++
151 lines
3.9 KiB
C++
#include "mouse_controller.h"
|
|
|
|
#include "log.h"
|
|
|
|
MouseController::MouseController() {}
|
|
|
|
MouseController::~MouseController() {
|
|
if (uinput_fd_) {
|
|
ioctl(uinput_fd_, UI_DEV_DESTROY);
|
|
close(uinput_fd_);
|
|
}
|
|
}
|
|
|
|
int MouseController::Init(int screen_width, int screen_height) {
|
|
screen_width_ = screen_width;
|
|
screen_height_ = screen_height;
|
|
|
|
uinput_fd_ = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
|
|
if (uinput_fd_ < 0) {
|
|
LOG_ERROR("Cannot open device: /dev/uinput");
|
|
return -1;
|
|
}
|
|
|
|
ioctl(uinput_fd_, UI_SET_EVBIT, EV_KEY);
|
|
ioctl(uinput_fd_, UI_SET_KEYBIT, BTN_RIGHT);
|
|
ioctl(uinput_fd_, UI_SET_KEYBIT, BTN_LEFT);
|
|
ioctl(uinput_fd_, UI_SET_EVBIT, EV_ABS);
|
|
ioctl(uinput_fd_, UI_SET_ABSBIT, ABS_X);
|
|
ioctl(uinput_fd_, UI_SET_ABSBIT, ABS_Y);
|
|
ioctl(uinput_fd_, UI_SET_EVBIT, EV_REL);
|
|
|
|
struct uinput_user_dev uidev;
|
|
memset(&uidev, 0, sizeof(uidev));
|
|
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "VirtualMouse");
|
|
uidev.id.bustype = BUS_USB;
|
|
uidev.id.version = 1;
|
|
uidev.id.vendor = 0x1;
|
|
uidev.id.product = 0x1;
|
|
uidev.absmin[ABS_X] = 0;
|
|
uidev.absmax[ABS_X] = screen_width_;
|
|
uidev.absmin[ABS_Y] = 0;
|
|
uidev.absmax[ABS_Y] = screen_height_;
|
|
|
|
int res_uidev = write(uinput_fd_, &uidev, sizeof(uidev));
|
|
ioctl(uinput_fd_, UI_DEV_CREATE);
|
|
return 0;
|
|
}
|
|
|
|
int MouseController::Destroy() { return 0; }
|
|
|
|
int MouseController::SendMouseCommand(RemoteAction remote_action) {
|
|
int mouse_pos_x = remote_action.m.x;
|
|
int mouse_pos_y = remote_action.m.y;
|
|
|
|
if (remote_action.type == ControlType::mouse) {
|
|
struct input_event event;
|
|
memset(&event, 0, sizeof(event));
|
|
gettimeofday(&event.time, NULL);
|
|
|
|
switch (remote_action.m.flag) {
|
|
case MouseFlag::left_down:
|
|
SimulateKeyDown(uinput_fd_, BTN_LEFT);
|
|
break;
|
|
case MouseFlag::left_up:
|
|
SimulateKeyUp(uinput_fd_, BTN_LEFT);
|
|
break;
|
|
case MouseFlag::right_down:
|
|
SimulateKeyDown(uinput_fd_, BTN_RIGHT);
|
|
break;
|
|
case MouseFlag::right_up:
|
|
SimulateKeyUp(uinput_fd_, BTN_RIGHT);
|
|
break;
|
|
case MouseFlag::middle_down:
|
|
SimulateKeyDown(uinput_fd_, BTN_MIDDLE);
|
|
break;
|
|
case MouseFlag::middle_up:
|
|
SimulateKeyUp(uinput_fd_, BTN_MIDDLE);
|
|
break;
|
|
case MouseFlag::wheel_vertical:
|
|
event.type = EV_REL;
|
|
event.code = REL_WHEEL;
|
|
event.value = remote_action.m.s;
|
|
write(uinput_fd_, &event, sizeof(event));
|
|
break;
|
|
case MouseFlag::wheel_horizontal:
|
|
event.type = EV_REL;
|
|
event.code = REL_HWHEEL;
|
|
event.value = remote_action.m.s;
|
|
write(uinput_fd_, &event, sizeof(event));
|
|
break;
|
|
default:
|
|
SetMousePosition(uinput_fd_, mouse_pos_x, mouse_pos_y);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void MouseController::SimulateKeyDown(int fd, int kval) {
|
|
int res_ev = 0;
|
|
struct input_event event;
|
|
memset(&event, 0, sizeof(event));
|
|
gettimeofday(&event.time, 0);
|
|
|
|
event.type = EV_KEY;
|
|
event.value = 1;
|
|
event.code = kval;
|
|
res_ev = write(fd, &event, sizeof(event));
|
|
|
|
event.type = EV_SYN;
|
|
event.value = 0;
|
|
event.code = SYN_REPORT;
|
|
res_ev = write(fd, &event, sizeof(event));
|
|
}
|
|
|
|
void MouseController::SimulateKeyUp(int fd, int kval) {
|
|
int res_ev = 0;
|
|
struct input_event event;
|
|
memset(&event, 0, sizeof(event));
|
|
gettimeofday(&event.time, 0);
|
|
|
|
event.type = EV_KEY;
|
|
event.value = 0;
|
|
event.code = kval;
|
|
res_ev = write(fd, &event, sizeof(event));
|
|
|
|
event.type = EV_SYN;
|
|
event.value = 0;
|
|
event.code = SYN_REPORT;
|
|
res_ev = write(fd, &event, sizeof(event));
|
|
}
|
|
|
|
void MouseController::SetMousePosition(int fd, int x, int y) {
|
|
struct input_event ev[2], ev_sync;
|
|
memset(ev, 0, sizeof(ev));
|
|
memset(&ev_sync, 0, sizeof(ev_sync));
|
|
|
|
ev[0].type = EV_ABS;
|
|
ev[0].code = ABS_X;
|
|
ev[0].value = x;
|
|
ev[1].type = EV_ABS;
|
|
ev[1].code = ABS_Y;
|
|
ev[1].value = y;
|
|
int res_w = write(fd, ev, sizeof(ev));
|
|
|
|
ev_sync.type = EV_SYN;
|
|
ev_sync.value = 0;
|
|
ev_sync.code = 0;
|
|
int res_ev_sync = write(fd, &ev_sync, sizeof(ev_sync));
|
|
} |