[feat] enable screen switch on Linux platform

This commit is contained in:
dijunkun
2025-05-29 18:09:34 +08:00
parent d72c6d9df7
commit 094204361c
8 changed files with 111 additions and 52 deletions

View File

@@ -8,7 +8,8 @@ MouseController::MouseController() {}
MouseController::~MouseController() { Destroy(); }
int MouseController::Init(int screen_width, int screen_height) {
int MouseController::Init(std::vector<DisplayInfo> display_info_list) {
display_info_list_ = display_info_list;
display_ = XOpenDisplay(NULL);
if (!display_) {
LOG_ERROR("Cannot connect to X server");
@@ -16,8 +17,6 @@ int MouseController::Init(int screen_width, int screen_height) {
}
root_ = DefaultRootWindow(display_);
screen_width_ = screen_width;
screen_height_ = screen_height;
int event_base, error_base, major_version, minor_version;
if (!XTestQueryExtension(display_, &event_base, &error_base, &major_version,
@@ -38,14 +37,19 @@ int MouseController::Destroy() {
return 0;
}
int MouseController::SendMouseCommand(RemoteAction remote_action) {
int MouseController::SendMouseCommand(RemoteAction remote_action,
int display_index) {
switch (remote_action.type) {
case mouse:
switch (remote_action.m.flag) {
case MouseFlag::move:
SetMousePosition(
static_cast<int>(remote_action.m.x * screen_width_),
static_cast<int>(remote_action.m.y * screen_height_));
static_cast<int>(remote_action.m.x *
display_info_list_[display_index].width +
display_info_list_[display_index].left),
static_cast<int>(remote_action.m.y *
display_info_list_[display_index].height +
display_info_list_[display_index].top));
break;
case MouseFlag::left_down:
XTestFakeButtonEvent(display_, 1, True, CurrentTime);

View File

@@ -11,6 +11,8 @@
#include <X11/Xutil.h>
#include <unistd.h>
#include <vector>
#include "device_controller.h"
class MouseController : public DeviceController {
@@ -19,9 +21,9 @@ class MouseController : public DeviceController {
virtual ~MouseController();
public:
virtual int Init(int screen_width, int screen_height);
virtual int Init(std::vector<DisplayInfo> display_info_list);
virtual int Destroy();
virtual int SendMouseCommand(RemoteAction remote_action);
virtual int SendMouseCommand(RemoteAction remote_action, int display_index);
private:
void SimulateKeyDown(int kval);
@@ -31,6 +33,7 @@ class MouseController : public DeviceController {
Display* display_ = nullptr;
Window root_ = 0;
std::vector<DisplayInfo> display_info_list_;
int screen_width_ = 0;
int screen_height_ = 0;
};