mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-12-18 13:19:24 +08:00
Compare commits
1 Commits
web-client
...
v1.1.1-202
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0cfdcd7e00 |
@@ -1,302 +0,0 @@
|
|||||||
#include "autostart.h"
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <filesystem>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
#include <limits.h>
|
|
||||||
#include <mach-o/dyld.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#elif defined(__linux__)
|
|
||||||
#include <linux/limits.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace crossdesk {
|
|
||||||
|
|
||||||
static std::string get_home_dir() {
|
|
||||||
const char* home = std::getenv("HOME");
|
|
||||||
if (!home) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return std::string(home);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool file_exists(const std::string& path) {
|
|
||||||
return std::filesystem::exists(path) &&
|
|
||||||
std::filesystem::is_regular_file(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::string GetExecutablePath() {
|
|
||||||
#ifdef _WIN32
|
|
||||||
char path[32768];
|
|
||||||
DWORD length = GetModuleFileNameA(nullptr, path, sizeof(path));
|
|
||||||
if (length > 0 && length < sizeof(path)) {
|
|
||||||
return std::string(path);
|
|
||||||
}
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
char path[1024];
|
|
||||||
uint32_t size = sizeof(path);
|
|
||||||
if (_NSGetExecutablePath(path, &size) == 0) {
|
|
||||||
char resolved_path[PATH_MAX];
|
|
||||||
if (realpath(path, resolved_path) != nullptr) {
|
|
||||||
return std::string(resolved_path);
|
|
||||||
}
|
|
||||||
return std::string(path);
|
|
||||||
}
|
|
||||||
#elif defined(__linux__)
|
|
||||||
char path[PATH_MAX];
|
|
||||||
ssize_t count = readlink("/proc/self/exe", path, sizeof(path) - 1);
|
|
||||||
if (count != -1) {
|
|
||||||
path[count] = '\0';
|
|
||||||
return std::string(path);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Windows
|
|
||||||
#ifdef _WIN32
|
|
||||||
static constexpr const char* WINDOWS_RUN_KEY =
|
|
||||||
"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
|
|
||||||
|
|
||||||
static bool windows_enable(const std::string& appName,
|
|
||||||
const std::string& exePath) {
|
|
||||||
if (exePath.empty() || !std::filesystem::exists(exePath)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
HKEY hKey = nullptr;
|
|
||||||
// Use KEY_WRITE to ensure we have write permission
|
|
||||||
LONG result =
|
|
||||||
RegOpenKeyExA(HKEY_CURRENT_USER, WINDOWS_RUN_KEY, 0, KEY_WRITE, &hKey);
|
|
||||||
if (result != ERROR_SUCCESS) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string regValue = exePath;
|
|
||||||
if (!exePath.empty() && exePath.find(' ') != std::string::npos) {
|
|
||||||
if (exePath.front() != '"' || exePath.back() != '"') {
|
|
||||||
regValue = "\"" + exePath + "\"";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure we close the key even if RegSetValueExA fails
|
|
||||||
result = RegSetValueExA(hKey, appName.c_str(), 0, REG_SZ,
|
|
||||||
reinterpret_cast<const BYTE*>(regValue.c_str()),
|
|
||||||
static_cast<DWORD>(regValue.size() + 1));
|
|
||||||
RegCloseKey(hKey);
|
|
||||||
|
|
||||||
return result == ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool windows_disable(const std::string& appName) {
|
|
||||||
HKEY hKey = nullptr;
|
|
||||||
LONG result =
|
|
||||||
RegOpenKeyExA(HKEY_CURRENT_USER, WINDOWS_RUN_KEY, 0, KEY_WRITE, &hKey);
|
|
||||||
if (result != ERROR_SUCCESS) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = RegDeleteValueA(hKey, appName.c_str());
|
|
||||||
RegCloseKey(hKey);
|
|
||||||
|
|
||||||
// Return true even if the value doesn't exist (already disabled)
|
|
||||||
return result == ERROR_SUCCESS || result == ERROR_FILE_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool windows_exists(const std::string& appName) {
|
|
||||||
HKEY hKey = nullptr;
|
|
||||||
LONG result =
|
|
||||||
RegOpenKeyExA(HKEY_CURRENT_USER, WINDOWS_RUN_KEY, 0, KEY_READ, &hKey);
|
|
||||||
if (result != ERROR_SUCCESS) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = RegQueryValueExA(hKey, appName.c_str(), nullptr, nullptr, nullptr,
|
|
||||||
nullptr);
|
|
||||||
RegCloseKey(hKey);
|
|
||||||
|
|
||||||
return result == ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Linux
|
|
||||||
#if defined(__linux__)
|
|
||||||
static std::string linux_desktop_path(const std::string& appName) {
|
|
||||||
std::string home = get_home_dir();
|
|
||||||
if (home.empty()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return home + "/.config/autostart/" + appName + ".desktop";
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool linux_enable(const std::string& appName,
|
|
||||||
const std::string& exePath) {
|
|
||||||
std::string home = get_home_dir();
|
|
||||||
if (home.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::filesystem::path dir =
|
|
||||||
std::filesystem::path(home) / ".config" / "autostart";
|
|
||||||
|
|
||||||
// Create directory if it doesn't exist
|
|
||||||
std::error_code ec;
|
|
||||||
std::filesystem::create_directories(dir, ec);
|
|
||||||
if (ec) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string path = linux_desktop_path(appName);
|
|
||||||
if (path.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ofstream file(path);
|
|
||||||
if (!file.is_open()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
file << "[Desktop Entry]\n";
|
|
||||||
file << "Type=Application\n";
|
|
||||||
file << "Exec=" << exePath << "\n";
|
|
||||||
file << "Hidden=false\n";
|
|
||||||
file << "NoDisplay=false\n";
|
|
||||||
file << "X-GNOME-Autostart-enabled=true\n";
|
|
||||||
file << "Terminal=false\n";
|
|
||||||
file << "StartupNotify=false\n";
|
|
||||||
file << "Name=" << appName << "\n";
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return file.good();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool linux_disable(const std::string& appName) {
|
|
||||||
std::string path = linux_desktop_path(appName);
|
|
||||||
if (path.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::error_code ec;
|
|
||||||
return std::filesystem::remove(path, ec) && !ec;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool linux_exists(const std::string& appName) {
|
|
||||||
std::string path = linux_desktop_path(appName);
|
|
||||||
if (path.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return file_exists(path);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// macOS
|
|
||||||
#ifdef __APPLE__
|
|
||||||
static std::string mac_plist_path(const std::string& appName) {
|
|
||||||
std::string home = get_home_dir();
|
|
||||||
if (home.empty()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return home + "/Library/LaunchAgents/" + appName + ".plist";
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool mac_enable(const std::string& appName, const std::string& exePath) {
|
|
||||||
std::string path = mac_plist_path(appName);
|
|
||||||
if (path.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure LaunchAgents directory exists
|
|
||||||
std::filesystem::path dir =
|
|
||||||
std::filesystem::path(get_home_dir()) / "Library" / "LaunchAgents";
|
|
||||||
std::error_code ec;
|
|
||||||
std::filesystem::create_directories(dir, ec);
|
|
||||||
if (ec) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ofstream file(path);
|
|
||||||
if (!file.is_open()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
file << R"(<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
||||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>Label</key>
|
|
||||||
<string>)"
|
|
||||||
<< appName << R"(</string>
|
|
||||||
<key>ProgramArguments</key>
|
|
||||||
<array>
|
|
||||||
<string>)"
|
|
||||||
<< exePath << R"(</string>
|
|
||||||
</array>
|
|
||||||
<key>RunAtLoad</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>)";
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return file.good();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool mac_disable(const std::string& appName) {
|
|
||||||
std::string path = mac_plist_path(appName);
|
|
||||||
if (path.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::error_code ec;
|
|
||||||
return std::filesystem::remove(path, ec) && !ec;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool mac_exists(const std::string& appName) {
|
|
||||||
std::string path = mac_plist_path(appName);
|
|
||||||
if (path.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return file_exists(path);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool EnableAutostart(const std::string& appName) {
|
|
||||||
std::string exePath = GetExecutablePath();
|
|
||||||
if (exePath.empty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#ifdef _WIN32
|
|
||||||
return windows_enable(appName, exePath);
|
|
||||||
#elif __APPLE__
|
|
||||||
return mac_enable(appName, exePath);
|
|
||||||
#else
|
|
||||||
return linux_enable(appName, exePath);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DisableAutostart(const std::string& appName) {
|
|
||||||
#ifdef _WIN32
|
|
||||||
return windows_disable(appName);
|
|
||||||
#elif __APPLE__
|
|
||||||
return mac_disable(appName);
|
|
||||||
#else
|
|
||||||
return linux_disable(appName);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsAutostartEnabled(const std::string& appName) {
|
|
||||||
#ifdef _WIN32
|
|
||||||
return windows_exists(appName);
|
|
||||||
#elif __APPLE__
|
|
||||||
return mac_exists(appName);
|
|
||||||
#else
|
|
||||||
return linux_exists(appName);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace crossdesk
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* @Author: DI JUNKUN
|
|
||||||
* @Date: 2025-11-18
|
|
||||||
* Copyright (c) 2025 by DI JUNKUN, All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _AUTOSTART_H_
|
|
||||||
#define _AUTOSTART_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace crossdesk {
|
|
||||||
|
|
||||||
bool EnableAutostart(const std::string& appName);
|
|
||||||
|
|
||||||
bool DisableAutostart(const std::string& appName);
|
|
||||||
|
|
||||||
bool IsAutostartEnabled(const std::string& appName);
|
|
||||||
|
|
||||||
} // namespace crossdesk
|
|
||||||
#endif
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
#include "config_center.h"
|
#include "config_center.h"
|
||||||
|
|
||||||
#include "autostart.h"
|
|
||||||
#include "rd_log.h"
|
|
||||||
|
|
||||||
namespace crossdesk {
|
namespace crossdesk {
|
||||||
|
|
||||||
ConfigCenter::ConfigCenter(const std::string& config_path,
|
ConfigCenter::ConfigCenter(const std::string& config_path,
|
||||||
@@ -51,8 +48,7 @@ int ConfigCenter::Load() {
|
|||||||
ini_.GetValue(section_, "cert_file_path", cert_file_path_.c_str());
|
ini_.GetValue(section_, "cert_file_path", cert_file_path_.c_str());
|
||||||
enable_self_hosted_ =
|
enable_self_hosted_ =
|
||||||
ini_.GetBoolValue(section_, "enable_self_hosted", enable_self_hosted_);
|
ini_.GetBoolValue(section_, "enable_self_hosted", enable_self_hosted_);
|
||||||
enable_autostart_ =
|
|
||||||
ini_.GetBoolValue(section_, "enable_autostart", enable_autostart_);
|
|
||||||
enable_minimize_to_tray_ = ini_.GetBoolValue(
|
enable_minimize_to_tray_ = ini_.GetBoolValue(
|
||||||
section_, "enable_minimize_to_tray", enable_minimize_to_tray_);
|
section_, "enable_minimize_to_tray", enable_minimize_to_tray_);
|
||||||
|
|
||||||
@@ -75,7 +71,6 @@ int ConfigCenter::Save() {
|
|||||||
static_cast<long>(signal_server_port_));
|
static_cast<long>(signal_server_port_));
|
||||||
ini_.SetValue(section_, "cert_file_path", cert_file_path_.c_str());
|
ini_.SetValue(section_, "cert_file_path", cert_file_path_.c_str());
|
||||||
ini_.SetBoolValue(section_, "enable_self_hosted", enable_self_hosted_);
|
ini_.SetBoolValue(section_, "enable_self_hosted", enable_self_hosted_);
|
||||||
ini_.SetBoolValue(section_, "enable_autostart", enable_autostart_);
|
|
||||||
ini_.SetBoolValue(section_, "enable_minimize_to_tray",
|
ini_.SetBoolValue(section_, "enable_minimize_to_tray",
|
||||||
enable_minimize_to_tray_);
|
enable_minimize_to_tray_);
|
||||||
|
|
||||||
@@ -226,29 +221,6 @@ int ConfigCenter::SetMinimizeToTray(bool enable_minimize_to_tray) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ConfigCenter::SetAutostart(bool enable_autostart) {
|
|
||||||
enable_autostart_ = enable_autostart;
|
|
||||||
bool success = false;
|
|
||||||
if (enable_autostart) {
|
|
||||||
success = EnableAutostart("CrossDesk");
|
|
||||||
} else {
|
|
||||||
success = DisableAutostart("CrossDesk");
|
|
||||||
}
|
|
||||||
|
|
||||||
ini_.SetBoolValue(section_, "enable_autostart", enable_autostart_);
|
|
||||||
SI_Error rc = ini_.SaveFile(config_path_.c_str());
|
|
||||||
if (rc < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
LOG_ERROR("SetAutostart failed");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// getters
|
// getters
|
||||||
|
|
||||||
ConfigCenter::LANGUAGE ConfigCenter::GetLanguage() const { return language_; }
|
ConfigCenter::LANGUAGE ConfigCenter::GetLanguage() const { return language_; }
|
||||||
@@ -302,6 +274,4 @@ std::string ConfigCenter::GetDefaultCertFilePath() const {
|
|||||||
bool ConfigCenter::IsSelfHosted() const { return enable_self_hosted_; }
|
bool ConfigCenter::IsSelfHosted() const { return enable_self_hosted_; }
|
||||||
|
|
||||||
bool ConfigCenter::IsMinimizeToTray() const { return enable_minimize_to_tray_; }
|
bool ConfigCenter::IsMinimizeToTray() const { return enable_minimize_to_tray_; }
|
||||||
|
|
||||||
bool ConfigCenter::IsEnableAutostart() const { return enable_autostart_; }
|
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
@@ -40,7 +40,6 @@ class ConfigCenter {
|
|||||||
int SetCertFilePath(const std::string& cert_file_path);
|
int SetCertFilePath(const std::string& cert_file_path);
|
||||||
int SetSelfHosted(bool enable_self_hosted);
|
int SetSelfHosted(bool enable_self_hosted);
|
||||||
int SetMinimizeToTray(bool enable_minimize_to_tray);
|
int SetMinimizeToTray(bool enable_minimize_to_tray);
|
||||||
int SetAutostart(bool enable_autostart);
|
|
||||||
|
|
||||||
// read config
|
// read config
|
||||||
|
|
||||||
@@ -61,7 +60,6 @@ class ConfigCenter {
|
|||||||
std::string GetDefaultCertFilePath() const;
|
std::string GetDefaultCertFilePath() const;
|
||||||
bool IsSelfHosted() const;
|
bool IsSelfHosted() const;
|
||||||
bool IsMinimizeToTray() const;
|
bool IsMinimizeToTray() const;
|
||||||
bool IsEnableAutostart() const;
|
|
||||||
|
|
||||||
int Load();
|
int Load();
|
||||||
int Save();
|
int Save();
|
||||||
@@ -88,7 +86,6 @@ class ConfigCenter {
|
|||||||
std::string cert_file_path_default_ = "";
|
std::string cert_file_path_default_ = "";
|
||||||
bool enable_self_hosted_ = false;
|
bool enable_self_hosted_ = false;
|
||||||
bool enable_minimize_to_tray_ = false;
|
bool enable_minimize_to_tray_ = false;
|
||||||
bool enable_autostart_ = false;
|
|
||||||
};
|
};
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
#endif
|
#endif
|
||||||
@@ -120,14 +120,8 @@ int KeyboardCapturer::Hook(OnKeyAction on_key_action, void* user_ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int KeyboardCapturer::Unhook() {
|
int KeyboardCapturer::Unhook() {
|
||||||
if (run_loop_source_) {
|
CFRelease(run_loop_source_);
|
||||||
CFRelease(run_loop_source_);
|
CFRelease(event_tap_);
|
||||||
}
|
|
||||||
|
|
||||||
if (event_tap_) {
|
|
||||||
CFRelease(event_tap_);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -21,11 +21,11 @@
|
|||||||
#define SETTINGS_WINDOW_WIDTH_CN 202
|
#define SETTINGS_WINDOW_WIDTH_CN 202
|
||||||
#define SETTINGS_WINDOW_WIDTH_EN 248
|
#define SETTINGS_WINDOW_WIDTH_EN 248
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
#define SETTINGS_WINDOW_HEIGHT_CN 375
|
|
||||||
#define SETTINGS_WINDOW_HEIGHT_EN 375
|
|
||||||
#else
|
|
||||||
#define SETTINGS_WINDOW_HEIGHT_CN 345
|
#define SETTINGS_WINDOW_HEIGHT_CN 345
|
||||||
#define SETTINGS_WINDOW_HEIGHT_EN 345
|
#define SETTINGS_WINDOW_HEIGHT_EN 345
|
||||||
|
#else
|
||||||
|
#define SETTINGS_WINDOW_HEIGHT_CN 315
|
||||||
|
#define SETTINGS_WINDOW_HEIGHT_EN 315
|
||||||
#endif
|
#endif
|
||||||
#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_CN 228
|
#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_CN 228
|
||||||
#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_EN 275
|
#define SELF_HOSTED_SERVER_CONFIG_WINDOW_WIDTH_EN 275
|
||||||
@@ -47,8 +47,6 @@
|
|||||||
#define ENABLE_SRTP_CHECKBOX_PADDING_EN 218
|
#define ENABLE_SRTP_CHECKBOX_PADDING_EN 218
|
||||||
#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_CN 171
|
#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_CN 171
|
||||||
#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_EN 218
|
#define ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_EN 218
|
||||||
#define ENABLE_AUTOSTART_PADDING_CN 171
|
|
||||||
#define ENABLE_AUTOSTART_PADDING_EN 218
|
|
||||||
#define ENABLE_MINIZE_TO_TRAY_PADDING_CN 171
|
#define ENABLE_MINIZE_TO_TRAY_PADDING_CN 171
|
||||||
#define ENABLE_MINIZE_TO_TRAY_PADDING_EN 218
|
#define ENABLE_MINIZE_TO_TRAY_PADDING_EN 218
|
||||||
#define SELF_HOSTED_SERVER_HOST_INPUT_BOX_PADDING_CN 90
|
#define SELF_HOSTED_SERVER_HOST_INPUT_BOX_PADDING_CN 90
|
||||||
|
|||||||
@@ -168,10 +168,8 @@ static std::vector<std::string> access_website = {
|
|||||||
static std::vector<std::string> confirm_delete_connection = {
|
static std::vector<std::string> confirm_delete_connection = {
|
||||||
reinterpret_cast<const char*>(u8"确认删除此连接"),
|
reinterpret_cast<const char*>(u8"确认删除此连接"),
|
||||||
"Confirm to delete this connection"};
|
"Confirm to delete this connection"};
|
||||||
|
|
||||||
static std::vector<std::string> enable_autostart = {
|
|
||||||
reinterpret_cast<const char*>(u8"开机自启:"), "Auto Start:"};
|
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
|
|
||||||
static std::vector<std::string> minimize_to_tray = {
|
static std::vector<std::string> minimize_to_tray = {
|
||||||
reinterpret_cast<const char*>(u8"退出时最小化到系统托盘:"),
|
reinterpret_cast<const char*>(u8"退出时最小化到系统托盘:"),
|
||||||
"Minimize to system tray when exit:"};
|
"Minimize to system tray when exit:"};
|
||||||
|
|||||||
@@ -260,8 +260,6 @@ int Render::LoadSettingsFromCacheFile() {
|
|||||||
enable_turn_ = config_center_->IsEnableTurn();
|
enable_turn_ = config_center_->IsEnableTurn();
|
||||||
enable_srtp_ = config_center_->IsEnableSrtp();
|
enable_srtp_ = config_center_->IsEnableSrtp();
|
||||||
enable_self_hosted_ = config_center_->IsSelfHosted();
|
enable_self_hosted_ = config_center_->IsSelfHosted();
|
||||||
enable_autostart_ = config_center_->IsEnableAutostart();
|
|
||||||
enable_minimize_to_tray_ = config_center_->IsMinimizeToTray();
|
|
||||||
|
|
||||||
language_button_value_last_ = language_button_value_;
|
language_button_value_last_ = language_button_value_;
|
||||||
video_quality_button_value_last_ = video_quality_button_value_;
|
video_quality_button_value_last_ = video_quality_button_value_;
|
||||||
@@ -270,8 +268,6 @@ int Render::LoadSettingsFromCacheFile() {
|
|||||||
enable_turn_last_ = enable_turn_;
|
enable_turn_last_ = enable_turn_;
|
||||||
enable_srtp_last_ = enable_srtp_;
|
enable_srtp_last_ = enable_srtp_;
|
||||||
enable_self_hosted_last_ = enable_self_hosted_;
|
enable_self_hosted_last_ = enable_self_hosted_;
|
||||||
enable_autostart_last_ = enable_autostart_;
|
|
||||||
enable_minimize_to_tray_last_ = enable_minimize_to_tray_;
|
|
||||||
|
|
||||||
LOG_INFO("Load settings from cache file");
|
LOG_INFO("Load settings from cache file");
|
||||||
|
|
||||||
@@ -329,9 +325,8 @@ int Render::ScreenCapturerInit() {
|
|||||||
|
|
||||||
int Render::StartScreenCapturer() {
|
int Render::StartScreenCapturer() {
|
||||||
if (screen_capturer_) {
|
if (screen_capturer_) {
|
||||||
LOG_INFO("Start screen capturer, show cursor: {}", show_cursor_);
|
LOG_INFO("Start screen capturer");
|
||||||
|
screen_capturer_->Start();
|
||||||
screen_capturer_->Start(show_cursor_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -316,7 +316,6 @@ class Render {
|
|||||||
bool start_speaker_capturer_ = false;
|
bool start_speaker_capturer_ = false;
|
||||||
bool speaker_capturer_is_started_ = false;
|
bool speaker_capturer_is_started_ = false;
|
||||||
bool start_keyboard_capturer_ = true;
|
bool start_keyboard_capturer_ = true;
|
||||||
bool show_cursor_ = false;
|
|
||||||
bool keyboard_capturer_is_started_ = false;
|
bool keyboard_capturer_is_started_ = false;
|
||||||
bool foucs_on_main_window_ = false;
|
bool foucs_on_main_window_ = false;
|
||||||
bool foucs_on_stream_window_ = false;
|
bool foucs_on_stream_window_ = false;
|
||||||
@@ -463,8 +462,6 @@ class Render {
|
|||||||
bool enable_turn_last_ = false;
|
bool enable_turn_last_ = false;
|
||||||
bool enable_srtp_last_ = false;
|
bool enable_srtp_last_ = false;
|
||||||
bool enable_self_hosted_last_ = false;
|
bool enable_self_hosted_last_ = false;
|
||||||
bool enable_autostart_ = false;
|
|
||||||
bool enable_autostart_last_ = false;
|
|
||||||
bool enable_minimize_to_tray_ = false;
|
bool enable_minimize_to_tray_ = false;
|
||||||
bool enable_minimize_to_tray_last_ = false;
|
bool enable_minimize_to_tray_last_ = false;
|
||||||
char signal_server_ip_self_[256] = "";
|
char signal_server_ip_self_[256] = "";
|
||||||
|
|||||||
@@ -464,13 +464,6 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id,
|
|||||||
#else
|
#else
|
||||||
render->start_mouse_controller_ = true;
|
render->start_mouse_controller_ = true;
|
||||||
#endif
|
#endif
|
||||||
if (std::all_of(render->connection_status_.begin(),
|
|
||||||
render->connection_status_.end(), [](const auto& kv) {
|
|
||||||
return kv.first.find("web") != std::string::npos;
|
|
||||||
})) {
|
|
||||||
render->show_cursor_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ConnectionStatus::Closed: {
|
case ConnectionStatus::Closed: {
|
||||||
@@ -493,14 +486,6 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char* user_id,
|
|||||||
|
|
||||||
render->connection_status_.erase(remote_id);
|
render->connection_status_.erase(remote_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (std::all_of(render->connection_status_.begin(),
|
|
||||||
render->connection_status_.end(), [](const auto& kv) {
|
|
||||||
return kv.first.find("web") == std::string::npos;
|
|
||||||
})) {
|
|
||||||
render->show_cursor_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -8,10 +8,8 @@
|
|||||||
|
|
||||||
namespace crossdesk {
|
namespace crossdesk {
|
||||||
|
|
||||||
void Hyperlink(const std::string& label, const std::string& url,
|
void Hyperlink(const std::string& label, const std::string& url) {
|
||||||
const float window_width) {
|
|
||||||
ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 0, 255, 255));
|
ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0, 0, 255, 255));
|
||||||
ImGui::SetCursorPosX(window_width * 0.1f);
|
|
||||||
ImGui::Text("%s", label.c_str());
|
ImGui::Text("%s", label.c_str());
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
|
|
||||||
@@ -69,8 +67,7 @@ int Render::AboutWindow() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::string text = localization::version[localization_language_index_] +
|
std::string text = localization::version[localization_language_index_] +
|
||||||
": CrossDesk " + version;
|
": CrossDesk v" + version;
|
||||||
ImGui::SetCursorPosX(about_window_width_ * 0.1f);
|
|
||||||
ImGui::Text("%s", text.c_str());
|
ImGui::Text("%s", text.c_str());
|
||||||
|
|
||||||
if (update_available_) {
|
if (update_available_) {
|
||||||
@@ -79,16 +76,14 @@ int Render::AboutWindow() {
|
|||||||
": " + latest_version_;
|
": " + latest_version_;
|
||||||
std::string access_website =
|
std::string access_website =
|
||||||
localization::access_website[localization_language_index_];
|
localization::access_website[localization_language_index_];
|
||||||
Hyperlink(latest_version, "https://crossdesk.cn", about_window_width_);
|
Hyperlink(latest_version, "https://crossdesk.cn");
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Text("");
|
ImGui::Text("");
|
||||||
|
|
||||||
std::string copyright_text = "© 2025 by JUNKUN DI. All rights reserved.";
|
std::string copyright_text = "© 2025 by JUNKUN DI. All rights reserved.";
|
||||||
std::string license_text = "Licensed under GNU LGPL v3.";
|
std::string license_text = "Licensed under GNU LGPL v3.";
|
||||||
ImGui::SetCursorPosX(about_window_width_ * 0.1f);
|
|
||||||
ImGui::Text("%s", copyright_text.c_str());
|
ImGui::Text("%s", copyright_text.c_str());
|
||||||
ImGui::SetCursorPosX(about_window_width_ * 0.1f);
|
|
||||||
ImGui::Text("%s", license_text.c_str());
|
ImGui::Text("%s", license_text.c_str());
|
||||||
|
|
||||||
ImGui::SetCursorPosX(about_window_width_ * 0.42f);
|
ImGui::SetCursorPosX(about_window_width_ * 0.42f);
|
||||||
|
|||||||
@@ -233,25 +233,6 @@ int Render::SettingWindow() {
|
|||||||
ImGui::SetCursorPosY(settings_items_offset);
|
ImGui::SetCursorPosY(settings_items_offset);
|
||||||
ImGui::Checkbox("##enable_self_hosted", &enable_self_hosted_);
|
ImGui::Checkbox("##enable_self_hosted", &enable_self_hosted_);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
|
||||||
|
|
||||||
{
|
|
||||||
settings_items_offset += settings_items_padding;
|
|
||||||
ImGui::SetCursorPosY(settings_items_offset + 4);
|
|
||||||
|
|
||||||
ImGui::Text("%s",
|
|
||||||
localization::enable_autostart[localization_language_index_]
|
|
||||||
.c_str());
|
|
||||||
|
|
||||||
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
|
||||||
ImGui::SetCursorPosX(ENABLE_AUTOSTART_PADDING_CN);
|
|
||||||
} else {
|
|
||||||
ImGui::SetCursorPosX(ENABLE_AUTOSTART_PADDING_EN);
|
|
||||||
}
|
|
||||||
ImGui::SetCursorPosY(settings_items_offset);
|
|
||||||
ImGui::Checkbox("##enable_autostart_", &enable_autostart_);
|
|
||||||
}
|
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
@@ -366,22 +347,6 @@ int Render::SettingWindow() {
|
|||||||
}
|
}
|
||||||
enable_self_hosted_last_ = enable_self_hosted_;
|
enable_self_hosted_last_ = enable_self_hosted_;
|
||||||
|
|
||||||
if (enable_autostart_) {
|
|
||||||
config_center_->SetAutostart(true);
|
|
||||||
} else {
|
|
||||||
config_center_->SetAutostart(false);
|
|
||||||
}
|
|
||||||
enable_autostart_last_ = enable_autostart_;
|
|
||||||
|
|
||||||
#if _WIN32
|
|
||||||
if (enable_minimize_to_tray_) {
|
|
||||||
config_center_->SetMinimizeToTray(true);
|
|
||||||
} else {
|
|
||||||
config_center_->SetMinimizeToTray(false);
|
|
||||||
}
|
|
||||||
enable_minimize_to_tray_last_ = enable_minimize_to_tray_;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
settings_window_pos_reset_ = true;
|
settings_window_pos_reset_ = true;
|
||||||
|
|
||||||
// Recreate peer instance
|
// Recreate peer instance
|
||||||
|
|||||||
@@ -36,21 +36,9 @@ int ScreenCapturerX11::Init(const int fps, cb_desktop_data cb) {
|
|||||||
XRRCrtcInfo* crtc_info =
|
XRRCrtcInfo* crtc_info =
|
||||||
XRRGetCrtcInfo(display_, screen_res_, output_info->crtc);
|
XRRGetCrtcInfo(display_, screen_res_, output_info->crtc);
|
||||||
|
|
||||||
std::string name(output_info->name);
|
display_info_list_.push_back(
|
||||||
|
DisplayInfo((void*)display_, output_info->name, true, crtc_info->x,
|
||||||
if (name.empty()) {
|
crtc_info->y, crtc_info->width, crtc_info->height));
|
||||||
name = "Display" + std::to_string(i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// clean display name, remove non-alphanumeric characters
|
|
||||||
name.erase(
|
|
||||||
std::remove_if(name.begin(), name.end(),
|
|
||||||
[](unsigned char c) { return !std::isalnum(c); }),
|
|
||||||
name.end());
|
|
||||||
|
|
||||||
display_info_list_.push_back(DisplayInfo(
|
|
||||||
(void*)display_, name, true, crtc_info->x, crtc_info->y,
|
|
||||||
crtc_info->x + crtc_info->width, crtc_info->y + crtc_info->height));
|
|
||||||
|
|
||||||
XRRFreeCrtcInfo(crtc_info);
|
XRRFreeCrtcInfo(crtc_info);
|
||||||
}
|
}
|
||||||
@@ -98,7 +86,7 @@ int ScreenCapturerX11::Destroy() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ScreenCapturerX11::Start(bool show_cursor) {
|
int ScreenCapturerX11::Start() {
|
||||||
if (running_) return 0;
|
if (running_) return 0;
|
||||||
running_ = true;
|
running_ = true;
|
||||||
paused_ = false;
|
paused_ = false;
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#include <X11/extensions/Xrandr.h>
|
#include <X11/extensions/Xrandr.h>
|
||||||
#include <X11/extensions/Xfixes.h>
|
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@@ -31,7 +30,7 @@ class ScreenCapturerX11 : public ScreenCapturer {
|
|||||||
public:
|
public:
|
||||||
int Init(const int fps, cb_desktop_data cb) override;
|
int Init(const int fps, cb_desktop_data cb) override;
|
||||||
int Destroy() override;
|
int Destroy() override;
|
||||||
int Start(bool show_cursor) override;
|
int Start() override;
|
||||||
int Stop() override;
|
int Stop() override;
|
||||||
|
|
||||||
int Pause(int monitor_index) override;
|
int Pause(int monitor_index) override;
|
||||||
@@ -55,7 +54,6 @@ class ScreenCapturerX11 : public ScreenCapturer {
|
|||||||
std::atomic<bool> running_{false};
|
std::atomic<bool> running_{false};
|
||||||
std::atomic<bool> paused_{false};
|
std::atomic<bool> paused_{false};
|
||||||
std::atomic<int> monitor_index_{0};
|
std::atomic<int> monitor_index_{0};
|
||||||
std::atomic<bool> show_cursor_{true};
|
|
||||||
int fps_ = 60;
|
int fps_ = 60;
|
||||||
cb_desktop_data callback_;
|
cb_desktop_data callback_;
|
||||||
std::vector<DisplayInfo> display_info_list_;
|
std::vector<DisplayInfo> display_info_list_;
|
||||||
@@ -63,9 +61,6 @@ class ScreenCapturerX11 : public ScreenCapturer {
|
|||||||
// 缓冲区
|
// 缓冲区
|
||||||
std::vector<uint8_t> y_plane_;
|
std::vector<uint8_t> y_plane_;
|
||||||
std::vector<uint8_t> uv_plane_;
|
std::vector<uint8_t> uv_plane_;
|
||||||
|
|
||||||
// 鼠标光标相关
|
|
||||||
void DrawCursor(XImage* image, int x, int y);
|
|
||||||
};
|
};
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
#endif
|
#endif
|
||||||
@@ -28,8 +28,8 @@ int ScreenCapturerSck::Destroy() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ScreenCapturerSck::Start(bool show_cursor) {
|
int ScreenCapturerSck::Start() {
|
||||||
screen_capturer_sck_impl_->Start(show_cursor);
|
screen_capturer_sck_impl_->Start();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class ScreenCapturerSck : public ScreenCapturer {
|
|||||||
public:
|
public:
|
||||||
int Init(const int fps, cb_desktop_data cb) override;
|
int Init(const int fps, cb_desktop_data cb) override;
|
||||||
int Destroy() override;
|
int Destroy() override;
|
||||||
int Start(bool show_cursor) override;
|
int Start() override;
|
||||||
int Stop() override;
|
int Stop() override;
|
||||||
|
|
||||||
int Pause(int monitor_index) override;
|
int Pause(int monitor_index) override;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class API_AVAILABLE(macos(14.0)) ScreenCapturerSckImpl : public ScreenCapturer {
|
|||||||
public:
|
public:
|
||||||
int Init(const int fps, cb_desktop_data cb) override;
|
int Init(const int fps, cb_desktop_data cb) override;
|
||||||
|
|
||||||
int Start(bool show_cursor) override;
|
int Start() override;
|
||||||
|
|
||||||
int SwitchTo(int monitor_index) override;
|
int SwitchTo(int monitor_index) override;
|
||||||
|
|
||||||
@@ -80,7 +80,6 @@ class API_AVAILABLE(macos(14.0)) ScreenCapturerSckImpl : public ScreenCapturer {
|
|||||||
int width_ = 0;
|
int width_ = 0;
|
||||||
int height_ = 0;
|
int height_ = 0;
|
||||||
int fps_ = 60;
|
int fps_ = 60;
|
||||||
bool show_cursor_ = false;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Called by SckHelper when shareable content is returned by ScreenCaptureKit. `content` will be
|
// Called by SckHelper when shareable content is returned by ScreenCaptureKit. `content` will be
|
||||||
@@ -226,17 +225,13 @@ int ScreenCapturerSckImpl::Init(const int fps, cb_desktop_data cb) {
|
|||||||
CGRect bounds = CGDisplayBounds(display_id);
|
CGRect bounds = CGDisplayBounds(display_id);
|
||||||
bool is_primary = CGDisplayIsMain(display_id);
|
bool is_primary = CGDisplayIsMain(display_id);
|
||||||
|
|
||||||
std::string name = GetDisplayName(display_id);
|
std::string name;
|
||||||
|
name = GetDisplayName(display_id);
|
||||||
|
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
name = "Display" + std::to_string(unnamed_count++);
|
name = "Display " + std::to_string(unnamed_count++);
|
||||||
}
|
}
|
||||||
|
|
||||||
// clean display name, remove non-alphanumeric characters
|
|
||||||
name.erase(
|
|
||||||
std::remove_if(name.begin(), name.end(), [](unsigned char c) { return !std::isalnum(c); }),
|
|
||||||
name.end());
|
|
||||||
|
|
||||||
DisplayInfo info((void *)(uintptr_t)display_id, name, is_primary,
|
DisplayInfo info((void *)(uintptr_t)display_id, name, is_primary,
|
||||||
static_cast<int>(bounds.origin.x), static_cast<int>(bounds.origin.y),
|
static_cast<int>(bounds.origin.x), static_cast<int>(bounds.origin.y),
|
||||||
static_cast<int>(bounds.origin.x + bounds.size.width),
|
static_cast<int>(bounds.origin.x + bounds.size.width),
|
||||||
@@ -251,8 +246,7 @@ int ScreenCapturerSckImpl::Init(const int fps, cb_desktop_data cb) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ScreenCapturerSckImpl::Start(bool show_cursor) {
|
int ScreenCapturerSckImpl::Start() {
|
||||||
show_cursor_ = show_cursor;
|
|
||||||
StartOrReconfigureCapturer();
|
StartOrReconfigureCapturer();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -334,7 +328,7 @@ void ScreenCapturerSckImpl::OnShareableContentCreated(SCShareableContent *conten
|
|||||||
excludingWindows:@[]];
|
excludingWindows:@[]];
|
||||||
SCStreamConfiguration *config = [[SCStreamConfiguration alloc] init];
|
SCStreamConfiguration *config = [[SCStreamConfiguration alloc] init];
|
||||||
config.pixelFormat = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
|
config.pixelFormat = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
|
||||||
config.showsCursor = show_cursor_;
|
config.showsCursor = false;
|
||||||
config.width = filter.contentRect.size.width * filter.pointPixelScale;
|
config.width = filter.contentRect.size.width * filter.pointPixelScale;
|
||||||
config.height = filter.contentRect.size.height * filter.pointPixelScale;
|
config.height = filter.contentRect.size.height * filter.pointPixelScale;
|
||||||
config.captureResolution = SCCaptureResolutionAutomatic;
|
config.captureResolution = SCCaptureResolutionAutomatic;
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class ScreenCapturer {
|
|||||||
public:
|
public:
|
||||||
virtual int Init(const int fps, cb_desktop_data cb) = 0;
|
virtual int Init(const int fps, cb_desktop_data cb) = 0;
|
||||||
virtual int Destroy() = 0;
|
virtual int Destroy() = 0;
|
||||||
virtual int Start(bool show_cursor) = 0;
|
virtual int Start() = 0;
|
||||||
virtual int Stop() = 0;
|
virtual int Stop() = 0;
|
||||||
virtual int Pause(int monitor_index) = 0;
|
virtual int Pause(int monitor_index) = 0;
|
||||||
virtual int Resume(int monitor_index) = 0;
|
virtual int Resume(int monitor_index) = 0;
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ int ScreenCapturerWgc::Init(const int fps, cb_desktop_data cb) {
|
|||||||
|
|
||||||
int ScreenCapturerWgc::Destroy() { return 0; }
|
int ScreenCapturerWgc::Destroy() { return 0; }
|
||||||
|
|
||||||
int ScreenCapturerWgc::Start(bool show_cursor) {
|
int ScreenCapturerWgc::Start() {
|
||||||
if (running_ == true) {
|
if (running_ == true) {
|
||||||
LOG_ERROR("Screen capturer already running");
|
LOG_ERROR("Screen capturer already running");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -172,7 +172,7 @@ int ScreenCapturerWgc::Start(bool show_cursor) {
|
|||||||
if (sessions_[i].running_) {
|
if (sessions_[i].running_) {
|
||||||
LOG_ERROR("Session {} is already running", i);
|
LOG_ERROR("Session {} is already running", i);
|
||||||
} else {
|
} else {
|
||||||
sessions_[i].session_->Start(show_cursor);
|
sessions_[i].session_->Start();
|
||||||
|
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
sessions_[i].session_->Pause();
|
sessions_[i].session_->Pause();
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class ScreenCapturerWgc : public ScreenCapturer,
|
|||||||
|
|
||||||
int Init(const int fps, cb_desktop_data cb) override;
|
int Init(const int fps, cb_desktop_data cb) override;
|
||||||
int Destroy() override;
|
int Destroy() override;
|
||||||
int Start(bool show_cursor) override;
|
int Start() override;
|
||||||
int Stop() override;
|
int Stop() override;
|
||||||
|
|
||||||
int Pause(int monitor_index) override;
|
int Pause(int monitor_index) override;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class WgcSession {
|
|||||||
|
|
||||||
virtual void RegisterObserver(wgc_session_observer* observer) = 0;
|
virtual void RegisterObserver(wgc_session_observer* observer) = 0;
|
||||||
|
|
||||||
virtual int Start(bool show_cursor) = 0;
|
virtual int Start() = 0;
|
||||||
virtual int Stop() = 0;
|
virtual int Stop() = 0;
|
||||||
|
|
||||||
virtual int Pause() = 0;
|
virtual int Pause() = 0;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ void WgcSessionImpl::RegisterObserver(wgc_session_observer* observer) {
|
|||||||
observer_ = observer;
|
observer_ = observer;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WgcSessionImpl::Start(bool show_cursor) {
|
int WgcSessionImpl::Start() {
|
||||||
std::lock_guard locker(lock_);
|
std::lock_guard locker(lock_);
|
||||||
|
|
||||||
if (is_running_) return 0;
|
if (is_running_) return 0;
|
||||||
@@ -91,7 +91,7 @@ int WgcSessionImpl::Start(bool show_cursor) {
|
|||||||
|
|
||||||
capture_session_.StartCapture();
|
capture_session_.StartCapture();
|
||||||
|
|
||||||
capture_session_.IsCursorCaptureEnabled(show_cursor);
|
capture_session_.IsCursorCaptureEnabled(false);
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
} catch (winrt::hresult_error) {
|
} catch (winrt::hresult_error) {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ class WgcSessionImpl : public WgcSession {
|
|||||||
|
|
||||||
void RegisterObserver(wgc_session_observer* observer) override;
|
void RegisterObserver(wgc_session_observer* observer) override;
|
||||||
|
|
||||||
int Start(bool show_cursor) override;
|
int Start() override;
|
||||||
int Stop() override;
|
int Stop() override;
|
||||||
|
|
||||||
int Pause() override;
|
int Pause() override;
|
||||||
|
|||||||
@@ -133,15 +133,9 @@ target("thumbnail")
|
|||||||
add_files("src/thumbnail/*.cpp")
|
add_files("src/thumbnail/*.cpp")
|
||||||
add_includedirs("src/thumbnail", {public = true})
|
add_includedirs("src/thumbnail", {public = true})
|
||||||
|
|
||||||
target("autostart")
|
|
||||||
set_kind("object")
|
|
||||||
add_deps("rd_log")
|
|
||||||
add_files("src/autostart/*.cpp")
|
|
||||||
add_includedirs("src/autostart", {public = true})
|
|
||||||
|
|
||||||
target("config_center")
|
target("config_center")
|
||||||
set_kind("object")
|
set_kind("object")
|
||||||
add_deps("rd_log", "autostart")
|
add_deps("rd_log")
|
||||||
add_files("src/config_center/*.cpp")
|
add_files("src/config_center/*.cpp")
|
||||||
add_includedirs("src/config_center", {public = true})
|
add_includedirs("src/config_center", {public = true})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user