Use factory method to create mouse controller on MacOS

This commit is contained in:
dijunkun
2023-12-14 17:02:43 +08:00
parent 3ab0e0136e
commit 95ef8fe8b9
4 changed files with 94 additions and 161 deletions

View File

@@ -0,0 +1,49 @@
#include "mouse_controller.h"
#include <ApplicationServices/ApplicationServices.h>
#include "log.h"
MouseController::MouseController() {}
MouseController::~MouseController() {}
int MouseController::Init(int screen_width, int screen_height) {
screen_width_ = screen_width;
screen_height_ = screen_height;
return 0;
}
int MouseController::Destroy() { return 0; }
int MouseController::SendCommand(RemoteAction remote_action) {
int mouse_pos_x = remote_action.m.x * screen_width_ / 1280;
int mouse_pos_y = remote_action.m.y * screen_height_ / 720;
if (remote_action.type == ControlType::mouse) {
CGEventRef mouse_event;
CGEventType mouse_type;
if (remote_action.m.flag == MouseFlag::left_down) {
mouse_type = kCGEventLeftMouseDown;
} else if (remote_action.m.flag == MouseFlag::left_up) {
mouse_type = kCGEventLeftMouseUp;
} else if (remote_action.m.flag == MouseFlag::right_down) {
mouse_type = kCGEventRightMouseDown;
} else if (remote_action.m.flag == MouseFlag::right_up) {
mouse_type = kCGEventRightMouseUp;
} else {
mouse_type = kCGEventMouseMoved;
}
mouse_event = CGEventCreateMouseEvent(NULL, mouse_type,
CGPointMake(mouse_pos_x, mouse_pos_y),
kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, mouse_event);
CFRelease(mouse_event);
}
return 0;
}

View File

@@ -0,0 +1,27 @@
/*
* @Author: DI JUNKUN
* @Date: 2023-12-14
* Copyright (c) 2023 by DI JUNKUN, All Rights Reserved.
*/
#ifndef _MOUSE_CONTROLLER_H_
#define _MOUSE_CONTROLLER_H_
#include "device_controller.h"
class MouseController : public DeviceController {
public:
MouseController();
virtual ~MouseController();
public:
virtual int Init(int screen_width, int screen_height);
virtual int Destroy();
virtual int SendCommand(RemoteAction remote_action);
private:
int screen_width_ = 0;
int screen_height_ = 0;
};
#endif

View File

@@ -6,7 +6,6 @@
#include <Winsock2.h> #include <Winsock2.h>
#include <iphlpapi.h> #include <iphlpapi.h>
#elif __APPLE__ #elif __APPLE__
#include <ApplicationServices/ApplicationServices.h>
#include <ifaddrs.h> #include <ifaddrs.h>
#include <net/if_dl.h> #include <net/if_dl.h>
#include <net/if_types.h> #include <net/if_types.h>
@@ -14,7 +13,6 @@
#include <sys/types.h> #include <sys/types.h>
#elif __linux__ #elif __linux__
#include <fcntl.h> #include <fcntl.h>
#include <linux/uinput.h>
#include <net/if.h> #include <net/if.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/socket.h> #include <sys/socket.h>
@@ -398,104 +396,11 @@ void ServerReceiveDataBuffer(const char *data, size_t size, const char *user_id,
<< remote_action.m.flag << " " << remote_action.m.x << " " << remote_action.m.flag << " " << remote_action.m.x << " "
<< remote_action.m.y << std::endl; << remote_action.m.y << std::endl;
int mouse_pos_x = remote_action.m.x * screen_w / 1280;
int mouse_pos_y = remote_action.m.y * screen_h / 720;
LOG_ERROR("[{} {}] [{} {}]", screen_w, screen_h, mouse_pos_x, mouse_pos_y);
#if 1
#ifdef _WIN32
mouse_controller->SendCommand(remote_action); mouse_controller->SendCommand(remote_action);
#elif __APPLE__
// if (remote_action.type == ControlType::mouse) {
// CGEventRef mouse_event;
// CGEventType mouse_type;
// if (remote_action.m.flag == MouseFlag::left_down) {
// mouse_type = kCGEventLeftMouseDown;
// } else if (remote_action.m.flag == MouseFlag::left_up) {
// mouse_type = kCGEventLeftMouseUp;
// } else if (remote_action.m.flag == MouseFlag::right_down) {
// mouse_type = kCGEventRightMouseDown;
// } else if (remote_action.m.flag == MouseFlag::right_up) {
// mouse_type = kCGEventRightMouseUp;
// } else {
// mouse_type = kCGEventMouseMoved;
// }
// mouse_event = CGEventCreateMouseEvent(NULL, mouse_type,
// CGPointMake(mouse_pos_x,
// mouse_pos_y), kCGMouseButtonLeft);
// CGEventPost(kCGHIDEventTap, mouse_event);
// CFRelease(mouse_event);
// }
#elif __linux__
mouse_controller->SendCommand(remote_action);
#endif
#endif
} }
void ClientReceiveDataBuffer(const char *data, size_t size, const char *user_id, void ClientReceiveDataBuffer(const char *data, size_t size, const char *user_id,
size_t user_id_size) { size_t user_id_size) {}
std::string user(user_id, user_id_size);
RemoteAction remote_action;
memcpy(&remote_action, data, sizeof(remote_action));
std::cout << "remote_action: " << remote_action.type << " "
<< remote_action.m.flag << " " << remote_action.m.x << " "
<< remote_action.m.y << std::endl;
int mouse_pos_x = remote_action.m.x * screen_w / 1280;
int mouse_pos_y = remote_action.m.y * screen_h / 720;
#ifdef _WIN32
INPUT ip;
if (remote_action.type == ControlType::mouse) {
ip.type = INPUT_MOUSE;
ip.mi.dx = mouse_pos_x;
ip.mi.dy = mouse_pos_y;
if (remote_action.m.flag == MouseFlag::left_down) {
ip.mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE;
} else if (remote_action.m.flag == MouseFlag::left_up) {
ip.mi.dwFlags = MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE;
} else if (remote_action.m.flag == MouseFlag::right_down) {
ip.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE;
} else if (remote_action.m.flag == MouseFlag::right_up) {
ip.mi.dwFlags = MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_ABSOLUTE;
} else {
ip.mi.dwFlags = MOUSEEVENTF_MOVE;
}
ip.mi.mouseData = 0;
ip.mi.time = 0;
#if MOUSE_CONTROL
// Set cursor pos
SetCursorPos(ip.mi.dx, ip.mi.dy);
// Send the press
if (ip.mi.dwFlags != MOUSEEVENTF_MOVE) {
SendInput(1, &ip, sizeof(INPUT));
}
#endif
// std::cout << "Receive data from [" << user << "], " << ip.type << " "
// << ip.mi.dwFlags << " " << ip.mi.dx << " " << ip.mi.dy
// << std::endl;
}
#elif __APPLE__
CGEventRef mouse_event;
mouse_event = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved,
CGPointMake(mouse_pos_x, mouse_pos_y),
kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, mouse_event);
CFRelease(mouse_event);
#endif
}
void ServerSignalStatus(SignalStatus status) { void ServerSignalStatus(SignalStatus status) {
server_signal_status = status; server_signal_status = status;
@@ -815,80 +720,32 @@ int main() {
: true; : true;
nv12_buffer = new char[NV12_BUFFER_SIZE]; nv12_buffer = new char[NV12_BUFFER_SIZE];
#ifdef _WIN32
device_controller_factory = new DeviceControllerFactory();
mouse_controller = (MouseController *)device_controller_factory->Create(
DeviceControllerFactory::Device::Mouse);
mouse_controller->Init(screen_w, screen_h);
screen_capture = new ScreenCaptureWgc();
RECORD_DESKTOP_RECT rect; RECORD_DESKTOP_RECT rect;
rect.left = 0; rect.left = 0;
rect.top = 0; rect.top = 0;
#ifdef _WIN32
rect.right = GetSystemMetrics(SM_CXSCREEN); rect.right = GetSystemMetrics(SM_CXSCREEN);
rect.bottom = GetSystemMetrics(SM_CYSCREEN); rect.bottom = GetSystemMetrics(SM_CYSCREEN);
screen_capture = new ScreenCaptureWgc();
last_frame_time_ = std::chrono::high_resolution_clock::now();
screen_capture->Init(
rect, 60,
[](unsigned char *data, int size, int width, int height) -> void {
auto now_time = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> duration =
now_time - last_frame_time_;
auto tc = duration.count() * 1000;
if (tc >= 0) {
BGRAToNV12FFmpeg(data, width, height,
(unsigned char *)nv12_buffer);
SendData(peer_server, DATA_TYPE::VIDEO, (const char *)nv12_buffer,
NV12_BUFFER_SIZE);
// std::cout << "Send" << std::endl;
last_frame_time_ = now_time;
}
});
screen_capture->Start();
#elif __linux__ #elif __linux__
rect.right = 0;
rect.bottom = 0;
screen_capture = new ScreenCaptureX11();
#elif __APPLE__
rect.right = 0;
rect.bottom = 0;
screen_capture = new ScreenCaptureAvf();
#endif
device_controller_factory = new DeviceControllerFactory(); device_controller_factory = new DeviceControllerFactory();
mouse_controller = (MouseController *)device_controller_factory->Create( mouse_controller = (MouseController *)device_controller_factory->Create(
DeviceControllerFactory::Device::Mouse); DeviceControllerFactory::Device::Mouse);
mouse_controller->Init(screen_w, screen_h); mouse_controller->Init(screen_w, screen_h);
screen_capture = new ScreenCaptureX11();
RECORD_DESKTOP_RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = 0;
rect.bottom = 0;
last_frame_time_ = std::chrono::high_resolution_clock::now();
screen_capture->Init(
rect, 60,
[](unsigned char *data, int size, int width, int height) -> void {
auto now_time = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> duration =
now_time - last_frame_time_;
auto tc = duration.count() * 1000;
if (tc >= 0) {
SendData(peer_server, DATA_TYPE::VIDEO, (const char *)data,
NV12_BUFFER_SIZE);
last_frame_time_ = now_time;
}
});
screen_capture->Start();
#elif __APPLE__
screen_capture = new ScreenCaptureAvf(); screen_capture = new ScreenCaptureAvf();
RECORD_DESKTOP_RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = 0;
rect.bottom = 0;
last_frame_time_ = std::chrono::high_resolution_clock::now(); last_frame_time_ = std::chrono::high_resolution_clock::now();
screen_capture->Init( screen_capture->Init(
rect, 60, rect, 60,
@@ -905,7 +762,6 @@ int main() {
} }
}); });
screen_capture->Start(); screen_capture->Start();
#endif
} }
}); });

View File

@@ -72,11 +72,12 @@ target("device_controller")
add_deps("log") add_deps("log")
if is_os("windows") then if is_os("windows") then
add_files("src/device_controller/mouse/windows/*.cpp") add_files("src/device_controller/mouse/windows/*.cpp")
add_includedirs("src/device_controller/mouse/windows", {public = true}) add_includedirs("src/device_controller/mouse/windows", {public = true})
add_includedirs("src/device_controller", {public = true}) add_includedirs("src/device_controller", {public = true})
elseif is_os("macosx") then elseif is_os("macosx") then
-- add_files("src/screen_capture/macosx/*.cpp") add_files("src/device_controller/mouse/mac/*.cpp")
-- add_includedirs("src/screen_capture/macosx", {public = true}) add_includedirs("src/device_controller/mouse/mac", {public = true})
add_includedirs("src/device_controller", {public = true})
elseif is_os("linux") then elseif is_os("linux") then
add_files("src/device_controller/mouse/linux/*.cpp") add_files("src/device_controller/mouse/linux/*.cpp")
add_includedirs("src/device_controller/mouse/linux", {public = true}) add_includedirs("src/device_controller/mouse/linux", {public = true})