mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-26 12:15:34 +08:00
Support cursor control on MacOS
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
#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>
|
||||||
@@ -407,6 +408,10 @@ void ServerReceiveDataBuffer(const char *data, size_t size, const char *user_id,
|
|||||||
// std::cout << "remote_action: " << remote_action.type << " "
|
// std::cout << "remote_action: " << remote_action.type << " "
|
||||||
// << 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;
|
||||||
|
#if 1
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
INPUT ip;
|
INPUT ip;
|
||||||
|
|
||||||
@@ -428,18 +433,43 @@ void ServerReceiveDataBuffer(const char *data, size_t size, const char *user_id,
|
|||||||
ip.mi.mouseData = 0;
|
ip.mi.mouseData = 0;
|
||||||
ip.mi.time = 0;
|
ip.mi.time = 0;
|
||||||
|
|
||||||
#if MOUSE_CONTROL
|
|
||||||
// Set cursor pos
|
// Set cursor pos
|
||||||
SetCursorPos(ip.mi.dx, ip.mi.dy);
|
SetCursorPos(ip.mi.dx, ip.mi.dy);
|
||||||
// Send the press
|
// Send the press
|
||||||
if (ip.mi.dwFlags != MOUSEEVENTF_MOVE) {
|
if (ip.mi.dwFlags != MOUSEEVENTF_MOVE) {
|
||||||
SendInput(1, &ip, sizeof(INPUT));
|
SendInput(1, &ip, sizeof(INPUT));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
// std::cout << "Receive data from [" << user << "], " << ip.type << " "
|
// std::cout << "Receive data from [" << user << "], " << ip.type << " "
|
||||||
// << ip.mi.dwFlags << " " << ip.mi.dx << " " << ip.mi.dy
|
// << ip.mi.dwFlags << " " << ip.mi.dx << " " << ip.mi.dy
|
||||||
// << std::endl;
|
// << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,16 +480,20 @@ void ClientReceiveDataBuffer(const char *data, size_t size, const char *user_id,
|
|||||||
RemoteAction remote_action;
|
RemoteAction remote_action;
|
||||||
memcpy(&remote_action, data, sizeof(remote_action));
|
memcpy(&remote_action, data, sizeof(remote_action));
|
||||||
|
|
||||||
// std::cout << "remote_action: " << remote_action.type << " "
|
std::cout << "remote_action: " << remote_action.type << " "
|
||||||
// << 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;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
INPUT ip;
|
INPUT ip;
|
||||||
|
|
||||||
if (remote_action.type == ControlType::mouse) {
|
if (remote_action.type == ControlType::mouse) {
|
||||||
ip.type = INPUT_MOUSE;
|
ip.type = INPUT_MOUSE;
|
||||||
ip.mi.dx = remote_action.m.x * screen_w / 1280;
|
ip.mi.dx = mouse_pos_x;
|
||||||
ip.mi.dy = remote_action.m.y * screen_h / 720;
|
ip.mi.dy = mouse_pos_y;
|
||||||
if (remote_action.m.flag == MouseFlag::left_down) {
|
if (remote_action.m.flag == MouseFlag::left_down) {
|
||||||
ip.mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE;
|
ip.mi.dwFlags = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE;
|
||||||
} else if (remote_action.m.flag == MouseFlag::left_up) {
|
} else if (remote_action.m.flag == MouseFlag::left_up) {
|
||||||
@@ -486,6 +520,15 @@ void ClientReceiveDataBuffer(const char *data, size_t size, const char *user_id,
|
|||||||
// << ip.mi.dwFlags << " " << ip.mi.dx << " " << ip.mi.dy
|
// << ip.mi.dwFlags << " " << ip.mi.dx << " " << ip.mi.dy
|
||||||
// << std::endl;
|
// << 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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,10 @@ int ScreenCaptureAvf::Init(const RECORD_DESKTOP_RECT &rect, const int fps,
|
|||||||
avdevice_register_all();
|
avdevice_register_all();
|
||||||
|
|
||||||
// grabbing frame rate
|
// grabbing frame rate
|
||||||
av_dict_set(&options_, "framerate", "30", 0);
|
av_dict_set(&options_, "framerate", "60", 0);
|
||||||
av_dict_set(&options_, "pixel_format", "nv12", 0);
|
av_dict_set(&options_, "pixel_format", "nv12", 0);
|
||||||
|
// show remote cursor
|
||||||
|
av_dict_set(&options_, "capture_cursor", "1", 0);
|
||||||
// Make the grabbed area follow the mouse
|
// Make the grabbed area follow the mouse
|
||||||
// av_dict_set(&options_, "follow_mouse", "centered", 0);
|
// av_dict_set(&options_, "follow_mouse", "centered", 0);
|
||||||
// Video frame size. The default is to capture the full screen
|
// Video frame size. The default is to capture the full screen
|
||||||
|
|||||||
2
thirdparty/projectx
vendored
2
thirdparty/projectx
vendored
Submodule thirdparty/projectx updated: 62f85bb333...d4abc318a4
Reference in New Issue
Block a user