mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-12-18 21:29:09 +08:00
[feat] support auto-start on boot
This commit is contained in:
302
src/autostart/autostart.cpp
Normal file
302
src/autostart/autostart.cpp
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
#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
|
||||||
21
src/autostart/autostart.h
Normal file
21
src/autostart/autostart.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* @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,5 +1,8 @@
|
|||||||
#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,
|
||||||
@@ -48,7 +51,8 @@ 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_);
|
||||||
|
|
||||||
@@ -71,6 +75,7 @@ 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_);
|
||||||
|
|
||||||
@@ -221,6 +226,29 @@ 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_; }
|
||||||
@@ -274,4 +302,6 @@ 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,6 +40,7 @@ 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
|
||||||
|
|
||||||
@@ -60,6 +61,7 @@ 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();
|
||||||
@@ -86,6 +88,7 @@ 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
|
||||||
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,6 +47,8 @@
|
|||||||
#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,8 +168,10 @@ 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"};
|
||||||
#if _WIN32
|
|
||||||
|
|
||||||
|
static std::vector<std::string> enable_autostart = {
|
||||||
|
reinterpret_cast<const char*>(u8"开机自启:"), "Auto Start:"};
|
||||||
|
#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,6 +260,8 @@ 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_;
|
||||||
@@ -268,6 +270,8 @@ 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");
|
||||||
|
|
||||||
|
|||||||
@@ -462,6 +462,8 @@ 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] = "";
|
||||||
|
|||||||
@@ -233,6 +233,25 @@ 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();
|
||||||
|
|
||||||
@@ -347,6 +366,22 @@ 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
|
||||||
|
|||||||
@@ -133,9 +133,15 @@ 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("config_center")
|
target("autostart")
|
||||||
set_kind("object")
|
set_kind("object")
|
||||||
add_deps("rd_log")
|
add_deps("rd_log")
|
||||||
|
add_files("src/autostart/*.cpp")
|
||||||
|
add_includedirs("src/autostart", {public = true})
|
||||||
|
|
||||||
|
target("config_center")
|
||||||
|
set_kind("object")
|
||||||
|
add_deps("rd_log", "autostart")
|
||||||
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