Compare commits

...

21 Commits

Author SHA1 Message Date
dijunkun
5bd5b002d1 [ci] update version.json when new tag pushed 2025-11-11 17:37:11 +08:00
dijunkun
2f83301de7 Merge branch 'self-hosted-server' of https://github.com/kunkundi/crossdesk into self-hosted-server 2025-11-11 16:00:15 +08:00
dijunkun
c8152b5cbf [ci] update version.json when new tag pushed 2025-11-11 15:59:36 +08:00
dijunkun
b1df10c0de [fix] fix frame rate and video quality settings not being applied correctly, fixes #24 2025-11-11 01:11:33 +08:00
dijunkun
b78c9cf7d1 [feat] optimize Windows display device names 2025-11-05 20:36:04 +08:00
dijunkun
b3132db785 [fix] resolve issue where configuration settings were not saved 2025-11-03 10:55:19 +08:00
dijunkun
43db021326 [feat] use CROSSDESK_DEBUG compile-time variable to control config file path 2025-10-31 17:31:50 +08:00
dijunkun
2c622bc76e [ci] update GitHub Actions to use macos-13 runner instead of macos-15 for Intel builds 2025-10-27 22:31:23 +08:00
dijunkun
b790c7d08e [chore] update README 2025-10-27 22:11:30 +08:00
dijunkun
0ca90d2516 [chore] move minirtc into submodules 2025-10-27 21:36:11 +08:00
dijunkun
401bfe4483 [refactor] add namespace 'crossdesk' to codebase 2025-10-27 21:09:39 +08:00
dijunkun
3b34c26555 [feat] enable custom configuration of Coturn server port 2025-10-27 16:04:40 +08:00
dijunkun
b668b3c936 [chore] update README 2025-10-27 13:42:49 +08:00
dijunkun
cc19ec125a [ci] update close-issue.yml 2025-10-27 11:04:36 +08:00
dijunkun
ffa77fdf44 Merge branch 'run-in-bg' into self-hosted-server 2025-10-27 10:41:16 +08:00
dijunkun
47cf806532 [ci] add permissions to close-issue.yml 2025-10-25 17:06:14 +08:00
dijunkun
911dce2e71 [feat] optimize certificate selection table 2025-10-24 17:39:25 +08:00
dijunkun
9f80d4f69d Merge branch 'self-hosted-server' into run-in-bg 2025-10-24 14:16:18 +08:00
dijunkun
f733fe9e49 Merge branch 'self-hosted-server' into run-in-bg 2025-10-24 11:05:07 +08:00
dijunkun
698bf72a6c Merge branch 'self-hosted-server' into run-in-bg 2025-10-24 10:05:54 +08:00
dijunkun
b2ab940f20 [feat] use no close select table 2025-10-23 17:55:30 +08:00
80 changed files with 1368 additions and 1423 deletions

View File

@@ -144,7 +144,7 @@ jobs:
matrix: matrix:
include: include:
- arch: x64 - arch: x64
runner: macos-15-intel runner: macos-13
cache-key: intel cache-key: intel
out-dir: ./build/macosx/x86_64/release/crossdesk out-dir: ./build/macosx/x86_64/release/crossdesk
package_script: ./scripts/macosx/pkg_x64.sh package_script: ./scripts/macosx/pkg_x64.sh
@@ -385,3 +385,20 @@ jobs:
remote_host: ${{ secrets.SERVER_HOST }} remote_host: ${{ secrets.SERVER_HOST }}
remote_user: ${{ secrets.SERVER_USER }} remote_user: ${{ secrets.SERVER_USER }}
remote_key: ${{ secrets.SERVER_KEY }} remote_key: ${{ secrets.SERVER_KEY }}
- name: Generate version.json
run: |
echo "{" > version.json
echo " \"latest_version\": \"${{ steps.version.outputs.VERSION_NUM }}\"" >> version.json
echo "}" >> version.json
cat version.json
- name: Upload version.json to server
uses: burnett01/rsync-deployments@5.2
with:
switches: -avzr --delete
path: version.json
remote_path: /var/www/html/version/
remote_host: ${{ secrets.SERVER_HOST }}
remote_user: ${{ secrets.SERVER_USER }}
remote_key: ${{ secrets.SERVER_KEY }}

View File

@@ -5,6 +5,11 @@ on:
# run every day at midnight # run every day at midnight
- cron: "0 0 * * *" - cron: "0 0 * * *"
permissions:
issues: write
pull-requests: write
contents: read
jobs: jobs:
close_inactive_issues: close_inactive_issues:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -53,6 +58,14 @@ jobs:
// check inactivity // check inactivity
if (now - lastActivityTime > inactivePeriod) { if (now - lastActivityTime > inactivePeriod) {
console.log(`Closing inactive issue: #${issue.number} (No recent replies for 7 days)`); console.log(`Closing inactive issue: #${issue.number} (No recent replies for 7 days)`);
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: "This issue has been automatically closed due to inactivity for 7 days."
});
await github.rest.issues.update({ await github.rest.issues.update({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,

View File

@@ -31,11 +31,13 @@ jobs:
- name: Update download links - name: Update download links
run: | run: |
cd pages cd pages
sed -E -i "s/crossdesk-win-x64-[0-9]+\.[0-9]+\.[0-9]+\.exe/crossdesk-win-x64-${VERSION_NUM}.exe/g" index.html echo "Updating download links to ${VERSION_NUM}"
sed -E -i "s/crossdesk-macos-x64-[0-9]+\.[0-9]+\.[0-9]+\.pkg/crossdesk-macos-x64-${VERSION_NUM}.pkg/g" index.html sed -E -i "s/crossdesk-win-x64-[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9._-]+)?\.exe/crossdesk-win-x64-${VERSION_NUM}.exe/g" index.html
sed -E -i "s/crossdesk-macos-arm64-[0-9]+\.[0-9]+\.[0-9]+\.pkg/crossdesk-macos-arm64-${VERSION_NUM}.pkg/g" index.html sed -E -i "s/crossdesk-macos-x64-[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9._-]+)?\.pkg/crossdesk-macos-x64-${VERSION_NUM}.pkg/g" index.html
sed -E -i "s/crossdesk-linux-amd64-[0-9]+\.[0-9]+\.[0-9]+\.deb/crossdesk-linux-amd64-${VERSION_NUM}.deb/g" index.html sed -E -i "s/crossdesk-macos-arm64-[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9._-]+)?\.pkg/crossdesk-macos-arm64-${VERSION_NUM}.pkg/g" index.html
sed -E -i "s/crossdesk-linux-arm64-[0-9]+\.[0-9]+\.[0-9]+\.deb/crossdesk-linux-arm64-${VERSION_NUM}.deb/g" index.html sed -E -i "s/crossdesk-linux-amd64-[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9._-]+)?\.deb/crossdesk-linux-amd64-${VERSION_NUM}.deb/g" index.html
sed -E -i "s/crossdesk-linux-arm64-[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9._-]+)?\.deb/crossdesk-linux-arm64-${VERSION_NUM}.deb/g" index.html
git diff index.html || true
- name: Commit & Push changes - name: Commit & Push changes
run: | run: |

4
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "thirdparty/minirtc"] [submodule "submodules/minirtc"]
path = thirdparty/minirtc path = submodules/minirtc
url = https://github.com/kunkundi/minirtc.git url = https://github.com/kunkundi/minirtc.git

View File

@@ -1,6 +1,6 @@
# CrossDesk # CrossDesk
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-lightgrey.svg)]() [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen.svg)]()
[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)
[![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk)](https://github.com/kunkundi/crossdesk/commits/self-hosted-server) [![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk)](https://github.com/kunkundi/crossdesk/commits/self-hosted-server)
[![Build Status](https://github.com/kunkundi/crossdesk/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions) [![Build Status](https://github.com/kunkundi/crossdesk/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions)
@@ -146,11 +146,14 @@ sudo docker run -d \
--network host \ --network host \
-e EXTERNAL_IP=xxx.xxx.xxx.xxx \ -e EXTERNAL_IP=xxx.xxx.xxx.xxx \
-e INTERNAL_IP=xxx.xxx.xxx.xxx \ -e INTERNAL_IP=xxx.xxx.xxx.xxx \
-e CROSSDESK_SERVER_PORT=9099 \ -e CROSSDESK_SERVER_PORT=xxxx \
-e COTURN_PORT=xxxx \
-e MIN_PORT=xxxxx \
-e MAX_PORT=xxxxx \
-v /path/to/your/certs:/crossdesk-server/certs \ -v /path/to/your/certs:/crossdesk-server/certs \
-v /path/to/your/db:/crossdesk-server/db \ -v /path/to/your/db:/crossdesk-server/db \
-v /path/to/your/logs:/crossdesk-server/logs \ -v /path/to/your/logs:/crossdesk-server/logs \
crossdesk/crossdesk-server:latest crossdesk/crossdesk-server:v1.0.0
``` ```
上述命令中,用户需注意的参数如下: 上述命令中,用户需注意的参数如下:
@@ -161,6 +164,10 @@ sudo docker run -d \
- CROSSDESK_SERVER_PORT自托管服务使用的端口对应 CrossDesk 客户端**自托管服务器配置**中填写的**服务器端口** - CROSSDESK_SERVER_PORT自托管服务使用的端口对应 CrossDesk 客户端**自托管服务器配置**中填写的**服务器端口**
- COTURN_PORT: COTURN 服务使用的端口, 对应 CrossDesk 客户端**自托管服务器配置**中填写的**中继服务端口**
- MIN_PORT/MAX_PORTCOTURN 服务使用的端口范围例如MIN_PORT=50000, MAX_PORT=60000范围可根据客户端数量调整。
- /path/to/your/certs证书文件目录 - /path/to/your/certs证书文件目录
- /path/to/your/dbCrossDesk Server 设备管理数据库 - /path/to/your/dbCrossDesk Server 设备管理数据库
@@ -169,7 +176,7 @@ sudo docker run -d \
**注意** **注意**
- **/path/to/your/ 是示例路径,请替换为你自己的实际路径。挂载的目录必须事先创建好,否则容器会报错。** - **/path/to/your/ 是示例路径,请替换为你自己的实际路径。挂载的目录必须事先创建好,否则容器会报错。**
- **服务器需开放端口3478/udp3478/tcp30000-60000/udpCROSSDESK_SERVER_PORT/tcp443/tcp。** - **服务器需开放端口3478/udp3478/tcpMIN_PORT-MAX_PORT/udpCROSSDESK_SERVER_PORT/tcp。**
## 证书文件 ## 证书文件
客户端需加载根证书文件,服务端需加载服务器私钥和服务器证书文件。 客户端需加载根证书文件,服务端需加载服务器私钥和服务器证书文件。

View File

@@ -1,6 +1,6 @@
# CrossDesk # CrossDesk
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-lightgrey.svg)]() [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-brightgreen.svg)]()
[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) [![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)
[![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk)](https://github.com/kunkundi/crossdesk/commits/self-hosted-server) [![GitHub last commit](https://img.shields.io/github/last-commit/kunkundi/crossdesk)](https://github.com/kunkundi/crossdesk/commits/self-hosted-server)
[![Build Status](https://github.com/kunkundi/crossdesk/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions) [![Build Status](https://github.com/kunkundi/crossdesk/actions/workflows/build.yml/badge.svg)](https://github.com/kunkundi/crossdesk/actions)
@@ -149,13 +149,16 @@ It is recommended to deploy CrossDesk Server using Docker.
sudo docker run -d \ sudo docker run -d \
--name crossdesk_server \ --name crossdesk_server \
--network host \ --network host \
-e EXTERNAL_IP=150.158.81.30 \ -e EXTERNAL_IP=xxx.xxx.xxx.xxx \
-e INTERNAL_IP=10.0.4.3 \ -e INTERNAL_IP=xxx.xxx.xxx.xxx \
-e CROSSDESK_SERVER_PORT=9099 \ -e CROSSDESK_SERVER_PORT=xxxx \
-e COTURN_PORT=xxxx \
-e MIN_PORT=xxxxx \
-e MAX_PORT=xxxxx \
-v /path/to/your/certs:/crossdesk-server/certs \ -v /path/to/your/certs:/crossdesk-server/certs \
-v /path/to/your/db:/crossdesk-server/db \ -v /path/to/your/db:/crossdesk-server/db \
-v /path/to/your/logs:/crossdesk-server/logs \ -v /path/to/your/logs:/crossdesk-server/logs \
crossdesk/crossdesk-server:latest crossdesk/crossdesk-server:v1.0.0
``` ```
The parameters you need to pay attention to are as follows: The parameters you need to pay attention to are as follows:
@@ -166,6 +169,10 @@ The parameters you need to pay attention to are as follows:
- **CROSSDESK_SERVER_PORT**: The port used by the self-hosted server, corresponding to the **Server Port** in the CrossDesk client **Self-Hosted Server Configuration**. - **CROSSDESK_SERVER_PORT**: The port used by the self-hosted server, corresponding to the **Server Port** in the CrossDesk client **Self-Hosted Server Configuration**.
- **COTURN_PORT**: The port used by Coturn, corresponding to the **Relay Server Port** in the CrossDesk client **Self-Hosted Server Configuration**.
- **MIN_PORT** and **MAX_PORT**: The range of ports used by the self-hosted server, corresponding to the **Minimum Port** and **Maximum Port** in the CrossDesk client **Self-Hosted Server Configuration**. Example: 50000-60000. It depends on the number of devices connected to the server.
- **/path/to/your/certs**: Directory for certificate files. - **/path/to/your/certs**: Directory for certificate files.
- **/path/to/your/db**: CrossDesk Server device management database. - **/path/to/your/db**: CrossDesk Server device management database.
@@ -174,7 +181,7 @@ The parameters you need to pay attention to are as follows:
**Note**: **Note**:
- **/path/to/your/ is an example path; please replace it with your actual path. The mounted directories must be created in advance, otherwise the container will fail.** - **/path/to/your/ is an example path; please replace it with your actual path. The mounted directories must be created in advance, otherwise the container will fail.**
- **The server must open the following ports: 3478/udp, 3478/tcp, 30000-60000/udp, CROSSDESK_SERVER_PORT/tcp, 443/tcp.** - **The server must open the following ports: 3478/udp, 3478/tcp, 30000-60000/udp, CROSSDESK_SERVER_PORT/tcp.**
## Certificate Files ## Certificate Files
The client needs to load the root certificate, and the server needs to load the server private key and server certificate. The client needs to load the root certificate, and the server needs to load the server private key and server certificate.

View File

@@ -1,5 +1,5 @@
#ifdef _WIN32 #ifdef _WIN32
#ifdef DESK_PORT_DEBUG #ifdef CROSSDESK_DEBUG
#pragma comment(linker, "/subsystem:\"console\"") #pragma comment(linker, "/subsystem:\"console\"")
#else #else
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
@@ -10,7 +10,7 @@
#include "render.h" #include "render.h"
int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[]) { int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[]) {
Render render; crossdesk::Render render;
render.Run(); render.Run();
return 0; return 0;

View File

@@ -9,6 +9,8 @@
#include <string> #include <string>
namespace crossdesk {
class DisplayInfo { class DisplayInfo {
public: public:
DisplayInfo(std::string name, int left, int top, int right, int bottom) DisplayInfo(std::string name, int left, int top, int right, int bottom)
@@ -40,5 +42,5 @@ class DisplayInfo {
int width = 0; int width = 0;
int height = 0; int height = 0;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -19,6 +19,8 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
namespace crossdesk {
std::string GetMac() { std::string GetMac() {
char mac_addr[16]; char mac_addr[16];
int len = 0; int len = 0;
@@ -123,3 +125,4 @@ std::string GetHostName() {
#endif #endif
return hostname; return hostname;
} }
} // namespace crossdesk

View File

@@ -9,7 +9,10 @@
#include <iostream> #include <iostream>
namespace crossdesk {
std::string GetMac(); std::string GetMac();
std::string GetHostName(); std::string GetHostName();
} // namespace crossdesk
#endif #endif

View File

@@ -1,5 +1,7 @@
#include "config_center.h" #include "config_center.h"
namespace crossdesk {
ConfigCenter::ConfigCenter(const std::string& config_path, ConfigCenter::ConfigCenter(const std::string& config_path,
const std::string& cert_file_path) const std::string& cert_file_path)
: config_path_(config_path), : config_path_(config_path),
@@ -36,9 +38,12 @@ int ConfigCenter::Load() {
enable_turn_ = ini_.GetBoolValue(section_, "enable_turn", enable_turn_); enable_turn_ = ini_.GetBoolValue(section_, "enable_turn", enable_turn_);
enable_srtp_ = ini_.GetBoolValue(section_, "enable_srtp", enable_srtp_); enable_srtp_ = ini_.GetBoolValue(section_, "enable_srtp", enable_srtp_);
server_host_ = ini_.GetValue(section_, "server_host", server_host_.c_str()); signal_server_host_ = ini_.GetValue(section_, "signal_server_host",
server_port_ = static_cast<int>( signal_server_host_.c_str());
ini_.GetLongValue(section_, "server_port", server_port_)); signal_server_port_ = static_cast<int>(
ini_.GetLongValue(section_, "signal_server_port", signal_server_port_));
coturn_server_port_ = static_cast<int>(
ini_.GetLongValue(section_, "coturn_server_port", coturn_server_port_));
cert_file_path_ = cert_file_path_ =
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_ =
@@ -61,8 +66,9 @@ int ConfigCenter::Save() {
ini_.SetBoolValue(section_, "hardware_video_codec", hardware_video_codec_); ini_.SetBoolValue(section_, "hardware_video_codec", hardware_video_codec_);
ini_.SetBoolValue(section_, "enable_turn", enable_turn_); ini_.SetBoolValue(section_, "enable_turn", enable_turn_);
ini_.SetBoolValue(section_, "enable_srtp", enable_srtp_); ini_.SetBoolValue(section_, "enable_srtp", enable_srtp_);
ini_.SetValue(section_, "server_host", server_host_.c_str()); ini_.SetValue(section_, "signal_server_host", signal_server_host_.c_str());
ini_.SetLongValue(section_, "server_port", static_cast<long>(server_port_)); ini_.SetLongValue(section_, "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_minimize_to_tray", ini_.SetBoolValue(section_, "enable_minimize_to_tray",
@@ -152,9 +158,9 @@ int ConfigCenter::SetSrtp(bool enable_srtp) {
return 0; return 0;
} }
int ConfigCenter::SetServerHost(const std::string& server_host) { int ConfigCenter::SetServerHost(const std::string& signal_server_host) {
server_host_ = server_host; signal_server_host_ = signal_server_host;
ini_.SetValue(section_, "server_host", server_host_.c_str()); ini_.SetValue(section_, "signal_server_host", signal_server_host_.c_str());
SI_Error rc = ini_.SaveFile(config_path_.c_str()); SI_Error rc = ini_.SaveFile(config_path_.c_str());
if (rc < 0) { if (rc < 0) {
return -1; return -1;
@@ -162,9 +168,21 @@ int ConfigCenter::SetServerHost(const std::string& server_host) {
return 0; return 0;
} }
int ConfigCenter::SetServerPort(int server_port) { int ConfigCenter::SetServerPort(int signal_server_port) {
server_port_ = server_port; signal_server_port_ = signal_server_port;
ini_.SetLongValue(section_, "server_port", static_cast<long>(server_port_)); ini_.SetLongValue(section_, "signal_server_port",
static_cast<long>(signal_server_port_));
SI_Error rc = ini_.SaveFile(config_path_.c_str());
if (rc < 0) {
return -1;
}
return 0;
}
int ConfigCenter::SetCoturnServerPort(int coturn_server_port) {
coturn_server_port_ = coturn_server_port;
ini_.SetLongValue(section_, "coturn_server_port",
static_cast<long>(coturn_server_port_));
SI_Error rc = ini_.SaveFile(config_path_.c_str()); SI_Error rc = ini_.SaveFile(config_path_.c_str());
if (rc < 0) { if (rc < 0) {
return -1; return -1;
@@ -184,6 +202,7 @@ int ConfigCenter::SetCertFilePath(const std::string& cert_file_path) {
int ConfigCenter::SetSelfHosted(bool enable_self_hosted) { int ConfigCenter::SetSelfHosted(bool enable_self_hosted) {
enable_self_hosted_ = enable_self_hosted; enable_self_hosted_ = enable_self_hosted;
ini_.SetBoolValue(section_, "enable_self_hosted", enable_self_hosted_);
SI_Error rc = ini_.SaveFile(config_path_.c_str()); SI_Error rc = ini_.SaveFile(config_path_.c_str());
if (rc < 0) { if (rc < 0) {
return -1; return -1;
@@ -193,6 +212,12 @@ int ConfigCenter::SetSelfHosted(bool enable_self_hosted) {
int ConfigCenter::SetMinimizeToTray(bool enable_minimize_to_tray) { int ConfigCenter::SetMinimizeToTray(bool enable_minimize_to_tray) {
enable_minimize_to_tray_ = enable_minimize_to_tray; enable_minimize_to_tray_ = enable_minimize_to_tray;
ini_.SetBoolValue(section_, "enable_minimize_to_tray",
enable_minimize_to_tray_);
SI_Error rc = ini_.SaveFile(config_path_.c_str());
if (rc < 0) {
return -1;
}
return 0; return 0;
} }
@@ -220,17 +245,27 @@ bool ConfigCenter::IsEnableTurn() const { return enable_turn_; }
bool ConfigCenter::IsEnableSrtp() const { return enable_srtp_; } bool ConfigCenter::IsEnableSrtp() const { return enable_srtp_; }
std::string ConfigCenter::GetServerHost() const { return server_host_; } std::string ConfigCenter::GetSignalServerHost() const {
return signal_server_host_;
}
int ConfigCenter::GetServerPort() const { return server_port_; } int ConfigCenter::GetSignalServerPort() const { return signal_server_port_; }
int ConfigCenter::GetCoturnServerPort() const { return coturn_server_port_; }
std::string ConfigCenter::GetCertFilePath() const { return cert_file_path_; } std::string ConfigCenter::GetCertFilePath() const { return cert_file_path_; }
std::string ConfigCenter::GetDefaultServerHost() const { std::string ConfigCenter::GetDefaultServerHost() const {
return server_host_default_; return signal_server_host_default_;
} }
int ConfigCenter::GetDefaultServerPort() const { return server_port_default_; } int ConfigCenter::GetDefaultSignalServerPort() const {
return server_port_default_;
}
int ConfigCenter::GetDefaultCoturnServerPort() const {
return coturn_server_port_default_;
}
std::string ConfigCenter::GetDefaultCertFilePath() const { std::string ConfigCenter::GetDefaultCertFilePath() const {
return cert_file_path_default_; return cert_file_path_default_;
@@ -239,3 +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_; }
} // namespace crossdesk

View File

@@ -11,6 +11,8 @@
#include "SimpleIni.h" #include "SimpleIni.h"
namespace crossdesk {
class ConfigCenter { class ConfigCenter {
public: public:
enum class LANGUAGE { CHINESE = 0, ENGLISH = 1 }; enum class LANGUAGE { CHINESE = 0, ENGLISH = 1 };
@@ -32,8 +34,9 @@ class ConfigCenter {
int SetHardwareVideoCodec(bool hardware_video_codec); int SetHardwareVideoCodec(bool hardware_video_codec);
int SetTurn(bool enable_turn); int SetTurn(bool enable_turn);
int SetSrtp(bool enable_srtp); int SetSrtp(bool enable_srtp);
int SetServerHost(const std::string& server_host); int SetServerHost(const std::string& signal_server_host);
int SetServerPort(int server_port); int SetServerPort(int signal_server_port);
int SetCoturnServerPort(int coturn_server_port);
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);
@@ -47,11 +50,13 @@ class ConfigCenter {
bool IsHardwareVideoCodec() const; bool IsHardwareVideoCodec() const;
bool IsEnableTurn() const; bool IsEnableTurn() const;
bool IsEnableSrtp() const; bool IsEnableSrtp() const;
std::string GetServerHost() const; std::string GetSignalServerHost() const;
int GetServerPort() const; int GetSignalServerPort() const;
int GetCoturnServerPort() const;
std::string GetCertFilePath() const; std::string GetCertFilePath() const;
std::string GetDefaultServerHost() const; std::string GetDefaultServerHost() const;
int GetDefaultServerPort() const; int GetDefaultSignalServerPort() const;
int GetDefaultCoturnServerPort() const;
std::string GetDefaultCertFilePath() const; std::string GetDefaultCertFilePath() const;
bool IsSelfHosted() const; bool IsSelfHosted() const;
bool IsMinimizeToTray() const; bool IsMinimizeToTray() const;
@@ -72,13 +77,15 @@ class ConfigCenter {
bool hardware_video_codec_ = false; bool hardware_video_codec_ = false;
bool enable_turn_ = false; bool enable_turn_ = false;
bool enable_srtp_ = false; bool enable_srtp_ = false;
std::string server_host_ = "api.crossdesk.cn"; std::string signal_server_host_ = "api.crossdesk.cn";
int server_port_ = 9099; std::string signal_server_host_default_ = "api.crossdesk.cn";
std::string server_host_default_ = "api.crossdesk.cn"; int signal_server_port_ = 9099;
int server_port_default_ = 9099; int server_port_default_ = 9099;
int coturn_server_port_ = 3478;
int coturn_server_port_default_ = 3478;
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;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -11,6 +11,8 @@
#include "display_info.h" #include "display_info.h"
namespace crossdesk {
typedef enum { typedef enum {
mouse = 0, mouse = 0,
keyboard, keyboard,
@@ -79,5 +81,5 @@ class DeviceController {
// virtual int Hook(); // virtual int Hook();
// virtual int Unhook(); // virtual int Unhook();
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -11,6 +11,8 @@
#include "keyboard_capturer.h" #include "keyboard_capturer.h"
#include "mouse_controller.h" #include "mouse_controller.h"
namespace crossdesk {
class DeviceControllerFactory { class DeviceControllerFactory {
public: public:
enum Device { Mouse = 0, Keyboard }; enum Device { Mouse = 0, Keyboard };
@@ -30,5 +32,5 @@ class DeviceControllerFactory {
} }
} }
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -3,6 +3,8 @@
#include "keyboard_converter.h" #include "keyboard_converter.h"
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
static OnKeyAction g_on_key_action = nullptr; static OnKeyAction g_on_key_action = nullptr;
static void* g_user_ptr = nullptr; static void* g_user_ptr = nullptr;
@@ -67,3 +69,4 @@ int KeyboardCapturer::SendKeyboardCommand(int key_code, bool is_down) {
} }
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -13,6 +13,8 @@
#include "device_controller.h" #include "device_controller.h"
namespace crossdesk {
class KeyboardCapturer : public DeviceController { class KeyboardCapturer : public DeviceController {
public: public:
KeyboardCapturer(); KeyboardCapturer();
@@ -28,5 +30,5 @@ class KeyboardCapturer : public DeviceController {
Window root_; Window root_;
bool running_; bool running_;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -3,6 +3,8 @@
#include "keyboard_converter.h" #include "keyboard_converter.h"
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
static OnKeyAction g_on_key_action = nullptr; static OnKeyAction g_on_key_action = nullptr;
static void* g_user_ptr = nullptr; static void* g_user_ptr = nullptr;
@@ -165,3 +167,4 @@ int KeyboardCapturer::SendKeyboardCommand(int key_code, bool is_down) {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -11,6 +11,8 @@
#include "device_controller.h" #include "device_controller.h"
namespace crossdesk {
class KeyboardCapturer : public DeviceController { class KeyboardCapturer : public DeviceController {
public: public:
KeyboardCapturer(); KeyboardCapturer();
@@ -33,5 +35,5 @@ class KeyboardCapturer : public DeviceController {
bool command_flag_ = false; bool command_flag_ = false;
int fn_key_code_ = 0x3F; int fn_key_code_ = 0x3F;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -2,6 +2,8 @@
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
static OnKeyAction g_on_key_action = nullptr; static OnKeyAction g_on_key_action = nullptr;
static void* g_user_ptr = nullptr; static void* g_user_ptr = nullptr;
@@ -54,3 +56,4 @@ int KeyboardCapturer::SendKeyboardCommand(int key_code, bool is_down) {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -11,6 +11,8 @@
#include "device_controller.h" #include "device_controller.h"
namespace crossdesk {
class KeyboardCapturer : public DeviceController { class KeyboardCapturer : public DeviceController {
public: public:
KeyboardCapturer(); KeyboardCapturer();
@@ -24,5 +26,6 @@ class KeyboardCapturer : public DeviceController {
private: private:
HHOOK keyboard_hook_ = nullptr; HHOOK keyboard_hook_ = nullptr;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -9,6 +9,8 @@
#include <map> #include <map>
namespace crossdesk {
// Windows vkCode to macOS CGKeyCode (104 keys) // Windows vkCode to macOS CGKeyCode (104 keys)
std::map<int, int> vkCodeToCGKeyCode = { std::map<int, int> vkCodeToCGKeyCode = {
// A-Z // A-Z
@@ -736,5 +738,5 @@ std::map<int, int> x11KeySymToCgKeyCode = {
{0xFFEB, 0x37}, // Left Command {0xFFEB, 0x37}, // Left Command
{0xFFEC, 0x36}, // Right Command {0xFFEC, 0x36}, // Right Command
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -4,6 +4,8 @@
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
MouseController::MouseController() {} MouseController::MouseController() {}
MouseController::~MouseController() { Destroy(); } MouseController::~MouseController() { Destroy(); }
@@ -122,3 +124,4 @@ void MouseController::SimulateMouseWheel(int direction_button, int count) {
} }
XFlush(display_); XFlush(display_);
} }
} // namespace crossdesk

View File

@@ -15,6 +15,8 @@
#include "device_controller.h" #include "device_controller.h"
namespace crossdesk {
class MouseController : public DeviceController { class MouseController : public DeviceController {
public: public:
MouseController(); MouseController();
@@ -37,5 +39,5 @@ class MouseController : public DeviceController {
int screen_width_ = 0; int screen_width_ = 0;
int screen_height_ = 0; int screen_height_ = 0;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -4,6 +4,8 @@
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
MouseController::MouseController() {} MouseController::MouseController() {}
MouseController::~MouseController() {} MouseController::~MouseController() {}
@@ -99,3 +101,4 @@ int MouseController::SendMouseCommand(RemoteAction remote_action,
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -11,6 +11,8 @@
#include "device_controller.h" #include "device_controller.h"
namespace crossdesk {
class MouseController : public DeviceController { class MouseController : public DeviceController {
public: public:
MouseController(); MouseController();
@@ -26,5 +28,5 @@ class MouseController : public DeviceController {
bool left_dragging_ = false; bool left_dragging_ = false;
bool right_dragging_ = false; bool right_dragging_ = false;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -2,6 +2,8 @@
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
MouseController::MouseController() {} MouseController::MouseController() {}
MouseController::~MouseController() {} MouseController::~MouseController() {}
@@ -70,3 +72,4 @@ int MouseController::SendMouseCommand(RemoteAction remote_action,
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -11,6 +11,8 @@
#include "device_controller.h" #include "device_controller.h"
namespace crossdesk {
class MouseController : public DeviceController { class MouseController : public DeviceController {
public: public:
MouseController(); MouseController();
@@ -24,5 +26,5 @@ class MouseController : public DeviceController {
private: private:
std::vector<DisplayInfo> display_info_list_; std::vector<DisplayInfo> display_info_list_;
}; };
} // namespace crossdesk
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -29,8 +29,8 @@
#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
#define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_CN 165 #define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_CN 195
#define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_EN 165 #define SELF_HOSTED_SERVER_CONFIG_WINDOW_HEIGHT_EN 195
#define LANGUAGE_SELECT_WINDOW_PADDING_CN 120 #define LANGUAGE_SELECT_WINDOW_PADDING_CN 120
#define LANGUAGE_SELECT_WINDOW_PADDING_EN 167 #define LANGUAGE_SELECT_WINDOW_PADDING_EN 167
#define VIDEO_QUALITY_SELECT_WINDOW_PADDING_CN 120 #define VIDEO_QUALITY_SELECT_WINDOW_PADDING_CN 120

View File

@@ -12,6 +12,9 @@
#if _WIN32 #if _WIN32
#include <Windows.h> #include <Windows.h>
#endif #endif
namespace crossdesk {
namespace localization { namespace localization {
static std::vector<std::string> local_desktop = { static std::vector<std::string> local_desktop = {
@@ -106,7 +109,9 @@ static std::vector<std::string> self_hosted_server_settings = {
static std::vector<std::string> self_hosted_server_address = { static std::vector<std::string> self_hosted_server_address = {
reinterpret_cast<const char*>(u8"服务器地址:"), "Server Address:"}; reinterpret_cast<const char*>(u8"服务器地址:"), "Server Address:"};
static std::vector<std::string> self_hosted_server_port = { static std::vector<std::string> self_hosted_server_port = {
reinterpret_cast<const char*>(u8"服务端口:"), "Server Port:"}; reinterpret_cast<const char*>(u8"信令服务端口:"), "Signal Service Port:"};
static std::vector<std::string> self_hosted_server_coturn_server_port = {
reinterpret_cast<const char*>(u8"中继服务端口:"), "Relay Service Port:"};
static std::vector<std::string> self_hosted_server_certificate_path = { static std::vector<std::string> self_hosted_server_certificate_path = {
reinterpret_cast<const char*>(u8"证书文件路径:"), "Certificate File Path:"}; reinterpret_cast<const char*>(u8"证书文件路径:"), "Certificate File Path:"};
static std::vector<std::string> select_a_file = { static std::vector<std::string> select_a_file = {
@@ -167,4 +172,5 @@ static std::vector<std::string> minimize_to_tray = {
static std::vector<LPCWSTR> exit_program = {L"退出", L"Exit"}; static std::vector<LPCWSTR> exit_program = {L"退出", L"Exit"};
#endif #endif
} // namespace localization } // namespace localization
} // namespace crossdesk
#endif #endif

View File

@@ -5,6 +5,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int Render::LocalWindow() { int Render::LocalWindow() {
ImGui::SetNextWindowPos(ImVec2(-1.0f, title_bar_height_), ImGuiCond_Always); ImGui::SetNextWindowPos(ImVec2(-1.0f, title_bar_height_), ImGuiCond_Always);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
@@ -288,3 +290,4 @@ int Render::LocalWindow() {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -2,6 +2,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int Render::RecentConnectionsWindow() { int Render::RecentConnectionsWindow() {
ImGui::SetNextWindowPos( ImGui::SetNextWindowPos(
ImVec2(0, title_bar_height_ + local_window_height_ - 1.0f), ImVec2(0, title_bar_height_ + local_window_height_ - 1.0f),
@@ -284,3 +286,4 @@ int Render::ConfirmDeleteConnection() {
ImGui::PopStyleVar(); ImGui::PopStyleVar();
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -3,6 +3,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
static int InputTextCallback(ImGuiInputTextCallbackData* data); static int InputTextCallback(ImGuiInputTextCallbackData* data);
int Render::RemoteWindow() { int Render::RemoteWindow() {
@@ -143,6 +145,10 @@ int Render::ConnectTo(const std::string &remote_id, const char *password,
memcpy(&props->params_, &params_, sizeof(Params)); memcpy(&props->params_, &params_, sizeof(Params));
props->params_.user_id = props->local_id_.c_str(); props->params_.user_id = props->local_id_.c_str();
props->peer_ = CreatePeer(&props->params_); props->peer_ = CreatePeer(&props->params_);
for (auto& display_info : display_info_list_) {
AddVideoStream(peer_, display_info.name.c_str());
}
AddAudioStream(props->peer_, props->audio_label_.c_str()); AddAudioStream(props->peer_, props->audio_label_.c_str());
AddDataStream(props->peer_, props->data_label_.c_str()); AddDataStream(props->peer_, props->data_label_.c_str());
@@ -179,3 +185,4 @@ int Render::ConnectTo(const std::string &remote_id, const char *password,
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -21,6 +21,8 @@
#define MOUSE_GRAB_PADDING 5 #define MOUSE_GRAB_PADDING 5
namespace crossdesk {
std::vector<char> Render::SerializeRemoteAction(const RemoteAction& action) { std::vector<char> Render::SerializeRemoteAction(const RemoteAction& action) {
std::vector<char> buffer; std::vector<char> buffer;
buffer.push_back(static_cast<char>(action.type)); buffer.push_back(static_cast<char>(action.type));
@@ -256,6 +258,7 @@ int Render::LoadSettingsFromCacheFile() {
enable_hardware_video_codec_ = config_center_->IsHardwareVideoCodec(); enable_hardware_video_codec_ = config_center_->IsHardwareVideoCodec();
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();
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_;
@@ -263,6 +266,7 @@ int Render::LoadSettingsFromCacheFile() {
enable_hardware_video_codec_last_ = enable_hardware_video_codec_; enable_hardware_video_codec_last_ = enable_hardware_video_codec_;
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_;
LOG_INFO("Load settings from cache file"); LOG_INFO("Load settings from cache file");
@@ -427,39 +431,57 @@ int Render::StopKeyboardCapturer() {
int Render::CreateConnectionPeer() { int Render::CreateConnectionPeer() {
params_.use_cfg_file = false; params_.use_cfg_file = false;
std::string server_ip; std::string signal_server_ip;
int server_port; int signal_server_port;
std::string server_cert_path; int coturn_server_port;
std::string tls_cert_path;
if (config_center_->IsSelfHosted()) { if (config_center_->IsSelfHosted()) {
server_ip = config_center_->GetServerHost(); signal_server_ip = config_center_->GetSignalServerHost();
server_port = config_center_->GetServerPort(); signal_server_port = config_center_->GetSignalServerPort();
server_cert_path = config_center_->GetCertFilePath(); coturn_server_port = config_center_->GetCoturnServerPort();
tls_cert_path = config_center_->GetCertFilePath();
} else { } else {
server_ip = config_center_->GetDefaultServerHost(); signal_server_ip = config_center_->GetDefaultServerHost();
server_port = config_center_->GetDefaultServerPort(); signal_server_port = config_center_->GetDefaultSignalServerPort();
server_cert_path = config_center_->GetDefaultCertFilePath(); coturn_server_port = config_center_->GetDefaultCoturnServerPort();
tls_cert_path = config_center_->GetDefaultCertFilePath();
} }
strncpy((char*)params_.signal_server_ip, server_ip.c_str(), // self hosted server config
strncpy(signal_server_ip_self_, config_center_->GetSignalServerHost().c_str(),
sizeof(signal_server_ip_self_) - 1);
signal_server_ip_self_[sizeof(signal_server_ip_self_) - 1] = '\0';
strncpy(signal_server_port_self_,
std::to_string(config_center_->GetSignalServerPort()).c_str(),
sizeof(signal_server_port_self_) - 1);
signal_server_port_self_[sizeof(signal_server_port_self_) - 1] = '\0';
strncpy(coturn_server_port_self_,
std::to_string(config_center_->GetCoturnServerPort()).c_str(),
sizeof(coturn_server_port_self_) - 1);
coturn_server_port_self_[sizeof(coturn_server_port_self_) - 1] = '\0';
tls_cert_path_self_ = config_center_->GetCertFilePath();
// peer config
strncpy((char*)params_.signal_server_ip, signal_server_ip.c_str(),
sizeof(params_.signal_server_ip) - 1); sizeof(params_.signal_server_ip) - 1);
params_.signal_server_ip[sizeof(params_.signal_server_ip) - 1] = '\0'; params_.signal_server_ip[sizeof(params_.signal_server_ip) - 1] = '\0';
params_.signal_server_port = server_port; params_.signal_server_port = signal_server_port;
strncpy((char*)params_.stun_server_ip, server_ip.c_str(), strncpy((char*)params_.stun_server_ip, signal_server_ip.c_str(),
sizeof(params_.stun_server_ip) - 1); sizeof(params_.stun_server_ip) - 1);
params_.stun_server_ip[sizeof(params_.stun_server_ip) - 1] = '\0'; params_.stun_server_ip[sizeof(params_.stun_server_ip) - 1] = '\0';
params_.stun_server_port = 3478; params_.stun_server_port = coturn_server_port;
strncpy((char*)params_.turn_server_ip, server_ip.c_str(), strncpy((char*)params_.turn_server_ip, signal_server_ip.c_str(),
sizeof(params_.turn_server_ip) - 1); sizeof(params_.turn_server_ip) - 1);
params_.turn_server_ip[sizeof(params_.turn_server_ip) - 1] = '\0'; params_.turn_server_ip[sizeof(params_.turn_server_ip) - 1] = '\0';
params_.turn_server_port = 3478; params_.turn_server_port = coturn_server_port;
strncpy((char*)params_.turn_server_username, "crossdesk", strncpy((char*)params_.turn_server_username, "crossdesk",
sizeof(params_.turn_server_username) - 1); sizeof(params_.turn_server_username) - 1);
params_.turn_server_username[sizeof(params_.turn_server_username) - 1] = '\0'; params_.turn_server_username[sizeof(params_.turn_server_username) - 1] = '\0';
strncpy((char*)params_.turn_server_password, "crossdeskpw", strncpy((char*)params_.turn_server_password, "crossdeskpw",
sizeof(params_.turn_server_password) - 1); sizeof(params_.turn_server_password) - 1);
params_.turn_server_password[sizeof(params_.turn_server_password) - 1] = '\0'; params_.turn_server_password[sizeof(params_.turn_server_password) - 1] = '\0';
strncpy(params_.tls_cert_path, server_cert_path.c_str(), strncpy(params_.tls_cert_path, tls_cert_path.c_str(),
sizeof(params_.tls_cert_path) - 1); sizeof(params_.tls_cert_path) - 1);
params_.tls_cert_path[sizeof(params_.tls_cert_path) - 1] = '\0'; params_.tls_cert_path[sizeof(params_.tls_cert_path) - 1] = '\0';
@@ -883,13 +905,14 @@ int Render::Run() {
cache_path_ = path_manager_->GetCachePath().string(); cache_path_ = path_manager_->GetCachePath().string();
config_center_ = config_center_ =
std::make_unique<ConfigCenter>(cache_path_ + "/config.ini", cert_path_); std::make_unique<ConfigCenter>(cache_path_ + "/config.ini", cert_path_);
strncpy(signal_server_ip_tmp_, config_center_->GetServerHost().c_str(), strncpy(signal_server_ip_self_,
sizeof(signal_server_ip_tmp_) - 1); config_center_->GetSignalServerHost().c_str(),
signal_server_ip_tmp_[sizeof(signal_server_ip_tmp_) - 1] = '\0'; sizeof(signal_server_ip_self_) - 1);
strncpy(signal_server_port_tmp_, signal_server_ip_self_[sizeof(signal_server_ip_self_) - 1] = '\0';
std::to_string(config_center_->GetServerPort()).c_str(), strncpy(signal_server_port_self_,
sizeof(signal_server_port_tmp_) - 1); std::to_string(config_center_->GetSignalServerPort()).c_str(),
signal_server_port_tmp_[sizeof(signal_server_port_tmp_) - 1] = '\0'; sizeof(signal_server_port_self_) - 1);
signal_server_port_self_[sizeof(signal_server_port_self_) - 1] = '\0';
strncpy(cert_file_path_, cert_path_.c_str(), sizeof(cert_file_path_) - 1); strncpy(cert_file_path_, cert_path_.c_str(), sizeof(cert_file_path_) - 1);
cert_file_path_[sizeof(cert_file_path_) - 1] = '\0'; cert_file_path_[sizeof(cert_file_path_) - 1] = '\0';
} else { } else {
@@ -1413,3 +1436,4 @@ void Render::ProcessSdlEvent(const SDL_Event& event) {
break; break;
} }
} }
} // namespace crossdesk

View File

@@ -33,6 +33,7 @@
#include "win_tray.h" #include "win_tray.h"
#endif #endif
namespace crossdesk {
class Render { class Render {
public: public:
struct SubStreamWindowProperties { struct SubStreamWindowProperties {
@@ -442,22 +443,27 @@ class Render {
bool enable_srtp_ = false; bool enable_srtp_ = false;
char signal_server_ip_[256] = "api.crossdesk.cn"; char signal_server_ip_[256] = "api.crossdesk.cn";
char signal_server_port_[6] = "9099"; char signal_server_port_[6] = "9099";
char coturn_server_port_[6] = "3478";
char cert_file_path_[256] = ""; char cert_file_path_[256] = "";
bool enable_self_hosted_server_ = false; bool enable_self_hosted_ = false;
int language_button_value_last_ = 0; int language_button_value_last_ = 0;
int video_quality_button_value_last_ = 0; int video_quality_button_value_last_ = 0;
int video_frame_rate_button_value_last_ = 0;
int video_encode_format_button_value_last_ = 0; int video_encode_format_button_value_last_ = 0;
bool enable_hardware_video_codec_last_ = false; bool enable_hardware_video_codec_last_ = false;
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_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_tmp_[256] = "api.crossdesk.cn"; char signal_server_ip_self_[256] = "";
char signal_server_port_tmp_[6] = "9099"; char signal_server_port_self_[6] = "";
char coturn_server_port_self_[6] = "";
std::string tls_cert_path_self_ = "";
bool settings_window_pos_reset_ = true; bool settings_window_pos_reset_ = true;
bool self_hosted_server_config_window_pos_reset_ = true; bool self_hosted_server_config_window_pos_reset_ = true;
std::string selected_current_file_path_ = ""; std::string selected_current_file_path_ = "";
std::string selected_file_ = ""; bool show_file_browser_ = true;
/* ------ main window property end ------ */ /* ------ main window property end ------ */
/* ------ sub stream window property start ------ */ /* ------ sub stream window property start ------ */
@@ -466,5 +472,5 @@ class Render {
void CloseTab(decltype(client_properties_)::iterator& it); void CloseTab(decltype(client_properties_)::iterator& it);
/* ------ stream window property end ------ */ /* ------ stream window property end ------ */
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -6,11 +6,13 @@
#define NV12_BUFFER_SIZE 1280 * 720 * 3 / 2 #define NV12_BUFFER_SIZE 1280 * 720 * 3 / 2
#ifdef DESK_PORT_DEBUG #ifdef CROSSDESK_DEBUG
#else #else
#define MOUSE_CONTROL 1 #define MOUSE_CONTROL 1
#endif #endif
namespace crossdesk {
int Render::SendKeyCommand(int key_code, bool is_down) { int Render::SendKeyCommand(int key_code, bool is_down) {
RemoteAction remote_action; RemoteAction remote_action;
remote_action.type = ControlType::keyboard; remote_action.type = ControlType::keyboard;
@@ -543,3 +545,4 @@ void Render::NetStatusReport(const char* client_id, size_t client_id_size,
props->net_traffic_stats_ = *net_traffic_stats; props->net_traffic_stats_ = *net_traffic_stats;
} }
} }
} // namespace crossdesk

View File

@@ -3,6 +3,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int CountDigits(int number) { int CountDigits(int number) {
if (number == 0) return 1; if (number == 0) return 1;
return (int)std::floor(std::log10(std::abs(number))) + 1; return (int)std::floor(std::log10(std::abs(number))) + 1;
@@ -324,3 +326,4 @@ int Render::NetTrafficStats(std::shared_ptr<SubStreamWindowProperties>& props) {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -1,6 +1,8 @@
#include "localization.h" #include "localization.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int Render::StatusBar() { int Render::StatusBar() {
ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
static bool a, b, c, d, e; static bool a, b, c, d, e;
@@ -36,3 +38,4 @@ int Render::StatusBar() {
ImGui::EndChild(); ImGui::EndChild();
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -4,6 +4,8 @@
#define BUTTON_PADDING 36.0f #define BUTTON_PADDING 36.0f
namespace crossdesk {
int Render::TitleBar(bool main_window) { int Render::TitleBar(bool main_window) {
ImGui::PushStyleColor(ImGuiCol_MenuBarBg, ImVec4(1.0f, 1.0f, 1.0f, 0.0f)); ImGui::PushStyleColor(ImGuiCol_MenuBarBg, ImVec4(1.0f, 1.0f, 1.0f, 0.0f));
ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
@@ -172,3 +174,4 @@ int Render::TitleBar(bool main_window) {
ImGui::PopStyleColor(); ImGui::PopStyleColor();
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -4,6 +4,8 @@
#include "localization.h" #include "localization.h"
namespace crossdesk {
// callback for the message-only window that handles tray icon messages // callback for the message-only window that handles tray icon messages
static LRESULT CALLBACK MsgWndProc(HWND hwnd, UINT msg, WPARAM wParam, static LRESULT CALLBACK MsgWndProc(HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam) { LPARAM lParam) {
@@ -110,3 +112,4 @@ bool WinTray::HandleTrayMessage(MSG* msg) {
} }
return true; return true;
} }
} // namespace crossdesk

View File

@@ -14,6 +14,8 @@
#define WM_TRAY_CALLBACK (WM_USER + 1) #define WM_TRAY_CALLBACK (WM_USER + 1)
namespace crossdesk {
class WinTray { class WinTray {
public: public:
WinTray(HWND app_hwnd, HICON icon, const std::wstring& tooltip, WinTray(HWND app_hwnd, HICON icon, const std::wstring& tooltip,
@@ -32,5 +34,5 @@ class WinTray {
int language_index_; int language_index_;
NOTIFYICONDATA nid_; NOTIFYICONDATA nid_;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -3,6 +3,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int Render::AboutWindow() { int Render::AboutWindow() {
if (show_about_window_) { if (show_about_window_) {
const ImGuiViewport* viewport = ImGui::GetMainViewport(); const ImGuiViewport* viewport = ImGui::GetMainViewport();
@@ -59,3 +61,4 @@ int Render::AboutWindow() {
} }
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -3,6 +3,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
bool Render::ConnectionStatusWindow( bool Render::ConnectionStatusWindow(
std::shared_ptr<SubStreamWindowProperties>& props) { std::shared_ptr<SubStreamWindowProperties>& props) {
const ImGuiViewport* viewport = ImGui::GetMainViewport(); const ImGuiViewport* viewport = ImGui::GetMainViewport();
@@ -169,3 +171,4 @@ bool Render::ConnectionStatusWindow(
return ret_flag; return ret_flag;
} }
} // namespace crossdesk

View File

@@ -1,6 +1,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int Render::ControlWindow(std::shared_ptr<SubStreamWindowProperties>& props) { int Render::ControlWindow(std::shared_ptr<SubStreamWindowProperties>& props) {
double time_duration = double time_duration =
ImGui::GetTime() - props->control_bar_button_pressed_time_; ImGui::GetTime() - props->control_bar_button_pressed_time_;
@@ -221,3 +223,4 @@ int Render::ControlWindow(std::shared_ptr<SubStreamWindowProperties> &props) {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -3,6 +3,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int Render::SettingWindow() { int Render::SettingWindow() {
if (show_settings_window_) { if (show_settings_window_) {
if (settings_window_pos_reset_) { if (settings_window_pos_reset_) {
@@ -229,8 +231,7 @@ int Render::SettingWindow() {
ImGui::SetCursorPosX(ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_EN); ImGui::SetCursorPosX(ENABLE_SELF_HOSTED_SERVER_CHECKBOX_PADDING_EN);
} }
ImGui::SetCursorPosY(settings_items_offset); ImGui::SetCursorPosY(settings_items_offset);
ImGui::Checkbox("##enable_self_hosted_server", ImGui::Checkbox("##enable_self_hosted", &enable_self_hosted_);
&enable_self_hosted_server_);
} }
#if _WIN32 #if _WIN32
ImGui::Separator(); ImGui::Separator();
@@ -287,14 +288,23 @@ int Render::SettingWindow() {
// Video quality // Video quality
if (video_quality_button_value_ == 0) { if (video_quality_button_value_ == 0) {
config_center_->SetVideoQuality(ConfigCenter::VIDEO_QUALITY::HIGH); config_center_->SetVideoQuality(ConfigCenter::VIDEO_QUALITY::LOW);
} else if (video_quality_button_value_ == 1) { } else if (video_quality_button_value_ == 1) {
config_center_->SetVideoQuality(ConfigCenter::VIDEO_QUALITY::MEDIUM); config_center_->SetVideoQuality(ConfigCenter::VIDEO_QUALITY::MEDIUM);
} else { } else {
config_center_->SetVideoQuality(ConfigCenter::VIDEO_QUALITY::LOW); config_center_->SetVideoQuality(ConfigCenter::VIDEO_QUALITY::HIGH);
} }
video_quality_button_value_last_ = video_quality_button_value_; video_quality_button_value_last_ = video_quality_button_value_;
if (video_frame_rate_button_value_ == 0) {
config_center_->SetVideoFrameRate(
ConfigCenter::VIDEO_FRAME_RATE::FPS_30);
} else if (video_frame_rate_button_value_ == 1) {
config_center_->SetVideoFrameRate(
ConfigCenter::VIDEO_FRAME_RATE::FPS_60);
}
video_frame_rate_button_value_last_ = video_frame_rate_button_value_;
// Video encode format // Video encode format
if (video_encode_format_button_value_ == 0) { if (video_encode_format_button_value_ == 0) {
config_center_->SetVideoEncodeFormat( config_center_->SetVideoEncodeFormat(
@@ -330,11 +340,12 @@ int Render::SettingWindow() {
} }
enable_srtp_last_ = enable_srtp_; enable_srtp_last_ = enable_srtp_;
if (enable_self_hosted_server_) { if (enable_self_hosted_) {
config_center_->SetSelfHosted(true); config_center_->SetSelfHosted(true);
} else { } else {
config_center_->SetSelfHosted(false); config_center_->SetSelfHosted(false);
} }
enable_self_hosted_last_ = enable_self_hosted_;
settings_window_pos_reset_ = true; settings_window_pos_reset_ = true;
@@ -364,6 +375,11 @@ int Render::SettingWindow() {
video_quality_button_value_ = video_quality_button_value_last_; video_quality_button_value_ = video_quality_button_value_last_;
} }
if (video_frame_rate_button_value_ !=
video_frame_rate_button_value_last_) {
video_frame_rate_button_value_ = video_frame_rate_button_value_last_;
}
if (video_encode_format_button_value_ != if (video_encode_format_button_value_ !=
video_encode_format_button_value_last_) { video_encode_format_button_value_last_) {
video_encode_format_button_value_ = video_encode_format_button_value_ =
@@ -391,3 +407,4 @@ int Render::SettingWindow() {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -2,6 +2,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
int Render::MainWindow() { int Render::MainWindow() {
ImGui::SetNextWindowPos(ImVec2(0, title_bar_height_), ImGuiCond_Always); ImGui::SetNextWindowPos(ImVec2(0, title_bar_height_), ImGuiCond_Always);
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
@@ -47,3 +49,4 @@ int Render::MainWindow() {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -10,6 +10,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
std::vector<std::string> GetRootEntries() { std::vector<std::string> GetRootEntries() {
std::vector<std::string> roots; std::vector<std::string> roots;
#ifdef _WIN32 #ifdef _WIN32
@@ -28,8 +30,14 @@ std::vector<std::string> GetRootEntries() {
int Render::ShowSimpleFileBrowser() { int Render::ShowSimpleFileBrowser() {
std::string display_text; std::string display_text;
if (!selected_file_.empty()) {
display_text = std::filesystem::path(selected_file_).filename().string(); if (selected_current_file_path_.empty()) {
selected_current_file_path_ = std::filesystem::current_path().string();
}
if (!tls_cert_path_self_.empty()) {
display_text =
std::filesystem::path(tls_cert_path_self_).filename().string();
} else if (selected_current_file_path_ != "Root") { } else if (selected_current_file_path_ != "Root") {
display_text = display_text =
std::filesystem::path(selected_current_file_path_).filename().string(); std::filesystem::path(selected_current_file_path_).filename().string();
@@ -43,40 +51,56 @@ int Render::ShowSimpleFileBrowser() {
localization::select_a_file[localization_language_index_].c_str(); localization::select_a_file[localization_language_index_].c_str();
} }
if (ImGui::BeginCombo("##select_a_file", display_text.c_str())) { if (show_file_browser_) {
ImGui::PushItemFlag(ImGuiItemFlags_AutoClosePopups, false);
float fixed_width = 130.0f;
ImGui::SetNextItemWidth(fixed_width);
ImGui::SetNextWindowSizeConstraints(ImVec2(fixed_width, 0),
ImVec2(fixed_width, 100.0f));
if (ImGui::BeginCombo("##select_a_file", display_text.c_str(), 0)) {
bool file_selected = false;
auto roots = GetRootEntries();
if (selected_current_file_path_ == "Root" || if (selected_current_file_path_ == "Root" ||
!std::filesystem::exists(selected_current_file_path_) || !std::filesystem::exists(selected_current_file_path_) ||
!std::filesystem::is_directory(selected_current_file_path_)) { !std::filesystem::is_directory(selected_current_file_path_)) {
auto roots = GetRootEntries();
for (const auto& root : roots) { for (const auto& root : roots) {
if (ImGui::Selectable(root.c_str())) { if (ImGui::Selectable(root.c_str())) {
selected_current_file_path_ = root; selected_current_file_path_ = root;
selected_file_.clear(); tls_cert_path_self_.clear();
} }
} }
} else { } else {
std::filesystem::path p(selected_current_file_path_); std::filesystem::path p(selected_current_file_path_);
if (ImGui::Selectable("..")) { if (ImGui::Selectable("..")) {
if (p.has_parent_path() && p != p.root_path()) if (std::find(roots.begin(), roots.end(),
selected_current_file_path_ = p.parent_path().string(); selected_current_file_path_) != roots.end()) {
else
selected_current_file_path_ = "Root"; selected_current_file_path_ = "Root";
selected_file_.clear(); } else if (p.has_parent_path()) {
selected_current_file_path_ = p.parent_path().string();
} else {
selected_current_file_path_ = "Root";
}
tls_cert_path_self_.clear();
} }
try { try {
for (const auto& entry : for (const auto& entry : std::filesystem::directory_iterator(
std::filesystem::directory_iterator(selected_current_file_path_)) { selected_current_file_path_)) {
std::string name = entry.path().filename().string(); std::string name = entry.path().filename().string();
if (entry.is_directory()) { if (entry.is_directory()) {
if (ImGui::Selectable(name.c_str())) { if (ImGui::Selectable(name.c_str())) {
selected_current_file_path_ = entry.path().string(); selected_current_file_path_ = entry.path().string();
selected_file_.clear(); tls_cert_path_self_.clear();
} }
} else { } else {
if (ImGui::Selectable(name.c_str())) { if (ImGui::Selectable(name.c_str())) {
selected_file_ = entry.path().string(); tls_cert_path_self_ = entry.path().string();
file_selected = true;
show_file_browser_ = false;
} }
} }
} }
@@ -87,6 +111,10 @@ int Render::ShowSimpleFileBrowser() {
ImGui::EndCombo(); ImGui::EndCombo();
} }
ImGui::PopItemFlag();
} else {
show_file_browser_ = true;
}
return 0; return 0;
} }
@@ -157,8 +185,8 @@ int Render::SelfHostedServerWindow() {
ImGui::SetCursorPosY(settings_items_offset); ImGui::SetCursorPosY(settings_items_offset);
ImGui::SetNextItemWidth(SELF_HOSTED_SERVER_INPUT_WINDOW_WIDTH); ImGui::SetNextItemWidth(SELF_HOSTED_SERVER_INPUT_WINDOW_WIDTH);
ImGui::InputText("##signal_server_ip_tmp_", signal_server_ip_tmp_, ImGui::InputText("##signal_server_ip_self_", signal_server_ip_self_,
IM_ARRAYSIZE(signal_server_ip_tmp_), IM_ARRAYSIZE(signal_server_ip_self_),
ImGuiInputTextFlags_AlwaysOverwrite); ImGuiInputTextFlags_AlwaysOverwrite);
} }
@@ -180,8 +208,29 @@ int Render::SelfHostedServerWindow() {
ImGui::SetCursorPosY(settings_items_offset); ImGui::SetCursorPosY(settings_items_offset);
ImGui::SetNextItemWidth(SELF_HOSTED_SERVER_INPUT_WINDOW_WIDTH); ImGui::SetNextItemWidth(SELF_HOSTED_SERVER_INPUT_WINDOW_WIDTH);
ImGui::InputText("##signal_server_port_tmp_", signal_server_port_tmp_, ImGui::InputText("##signal_server_port_self_", signal_server_port_self_,
IM_ARRAYSIZE(signal_server_port_tmp_)); IM_ARRAYSIZE(signal_server_port_self_));
}
ImGui::Separator();
{
settings_items_offset += settings_items_padding;
ImGui::SetCursorPosY(settings_items_offset + 2);
ImGui::Text("%s", localization::self_hosted_server_coturn_server_port
[localization_language_index_]
.c_str());
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
ImGui::SetCursorPosX(SELF_HOSTED_SERVER_PORT_INPUT_BOX_PADDING_CN);
} else {
ImGui::SetCursorPosX(SELF_HOSTED_SERVER_PORT_INPUT_BOX_PADDING_EN);
}
ImGui::SetCursorPosY(settings_items_offset);
ImGui::SetNextItemWidth(SELF_HOSTED_SERVER_INPUT_WINDOW_WIDTH);
ImGui::InputText("##coturn_server_port_self_", coturn_server_port_self_,
IM_ARRAYSIZE(coturn_server_port_self_));
} }
ImGui::Separator(); ImGui::Separator();
@@ -223,16 +272,20 @@ int Render::SelfHostedServerWindow() {
localization::ok[localization_language_index_].c_str())) { localization::ok[localization_language_index_].c_str())) {
show_self_hosted_server_config_window_ = false; show_self_hosted_server_config_window_ = false;
config_center_->SetServerHost(signal_server_ip_tmp_); config_center_->SetServerHost(signal_server_ip_self_);
config_center_->SetServerPort(atoi(signal_server_port_tmp_)); config_center_->SetServerPort(atoi(signal_server_port_self_));
config_center_->SetCertFilePath(selected_file_); config_center_->SetCoturnServerPort(atoi(coturn_server_port_self_));
strncpy(signal_server_ip_, signal_server_ip_tmp_, config_center_->SetCertFilePath(tls_cert_path_self_);
strncpy(signal_server_ip_, signal_server_ip_self_,
sizeof(signal_server_ip_) - 1); sizeof(signal_server_ip_) - 1);
signal_server_ip_[sizeof(signal_server_ip_) - 1] = '\0'; signal_server_ip_[sizeof(signal_server_ip_) - 1] = '\0';
strncpy(signal_server_port_, signal_server_port_tmp_, strncpy(signal_server_port_, signal_server_port_self_,
sizeof(signal_server_port_) - 1); sizeof(signal_server_port_) - 1);
signal_server_port_[sizeof(signal_server_port_) - 1] = '\0'; signal_server_port_[sizeof(signal_server_port_) - 1] = '\0';
strncpy(cert_file_path_, selected_file_.c_str(), strncpy(coturn_server_port_, coturn_server_port_self_,
sizeof(coturn_server_port_) - 1);
coturn_server_port_[sizeof(coturn_server_port_) - 1] = '\0';
strncpy(cert_file_path_, tls_cert_path_self_.c_str(),
sizeof(cert_file_path_) - 1); sizeof(cert_file_path_) - 1);
cert_file_path_[sizeof(cert_file_path_) - 1] = '\0'; cert_file_path_[sizeof(cert_file_path_) - 1] = '\0';
@@ -246,15 +299,15 @@ int Render::SelfHostedServerWindow() {
show_self_hosted_server_config_window_ = false; show_self_hosted_server_config_window_ = false;
self_hosted_server_config_window_pos_reset_ = true; self_hosted_server_config_window_pos_reset_ = true;
strncpy(signal_server_ip_tmp_, signal_server_ip_, strncpy(signal_server_ip_self_, signal_server_ip_,
sizeof(signal_server_ip_tmp_) - 1); sizeof(signal_server_ip_self_) - 1);
signal_server_ip_tmp_[sizeof(signal_server_ip_tmp_) - 1] = '\0'; signal_server_ip_self_[sizeof(signal_server_ip_self_) - 1] = '\0';
strncpy(signal_server_port_tmp_, signal_server_port_, strncpy(signal_server_port_self_, signal_server_port_,
sizeof(signal_server_port_tmp_) - 1); sizeof(signal_server_port_self_) - 1);
signal_server_port_tmp_[sizeof(signal_server_port_tmp_) - 1] = '\0'; signal_server_port_self_[sizeof(signal_server_port_self_) - 1] = '\0';
config_center_->SetServerHost(signal_server_ip_tmp_); config_center_->SetServerHost(signal_server_ip_self_);
config_center_->SetServerPort(atoi(signal_server_port_tmp_)); config_center_->SetServerPort(atoi(signal_server_port_self_));
selected_file_.clear(); tls_cert_path_self_.clear();
} }
ImGui::SetWindowFontScale(1.0f); ImGui::SetWindowFontScale(1.0f);
@@ -268,3 +321,4 @@ int Render::SelfHostedServerWindow() {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -2,6 +2,8 @@
#include "rd_log.h" #include "rd_log.h"
#include "render.h" #include "render.h"
namespace crossdesk {
void Render::DrawConnectionStatusText( void Render::DrawConnectionStatusText(
std::shared_ptr<SubStreamWindowProperties>& props) { std::shared_ptr<SubStreamWindowProperties>& props) {
std::string text; std::string text;
@@ -200,3 +202,4 @@ int Render::StreamWindow() {
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -3,6 +3,8 @@
#include <atomic> #include <atomic>
#include <filesystem> #include <filesystem>
namespace crossdesk {
namespace { namespace {
std::string g_log_dir = "logs"; std::string g_log_dir = "logs";
@@ -60,3 +62,4 @@ std::shared_ptr<spdlog::logger> get_logger() {
return g_logger; return g_logger;
} }
} // namespace crossdesk

View File

@@ -25,6 +25,8 @@
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
namespace crossdesk {
constexpr auto LOGGER_NAME = "crossdesk"; constexpr auto LOGGER_NAME = "crossdesk";
void InitLogger(const std::string& log_dir); void InitLogger(const std::string& log_dir);
@@ -35,5 +37,5 @@ std::shared_ptr<spdlog::logger> get_logger();
#define LOG_WARN(...) SPDLOG_LOGGER_WARN(get_logger(), __VA_ARGS__) #define LOG_WARN(...) SPDLOG_LOGGER_WARN(get_logger(), __VA_ARGS__)
#define LOG_ERROR(...) SPDLOG_LOGGER_ERROR(get_logger(), __VA_ARGS__) #define LOG_ERROR(...) SPDLOG_LOGGER_ERROR(get_logger(), __VA_ARGS__)
#define LOG_FATAL(...) SPDLOG_LOGGER_CRITICAL(get_logger(), __VA_ARGS__) #define LOG_FATAL(...) SPDLOG_LOGGER_CRITICAL(get_logger(), __VA_ARGS__)
} // namespace crossdesk
#endif #endif

View File

@@ -2,6 +2,8 @@
#include <cstdlib> #include <cstdlib>
namespace crossdesk {
PathManager::PathManager(const std::string& app_name) : app_name_(app_name) {} PathManager::PathManager(const std::string& app_name) : app_name_(app_name) {}
std::filesystem::path PathManager::GetConfigPath() { std::filesystem::path PathManager::GetConfigPath() {
@@ -16,7 +18,11 @@ std::filesystem::path PathManager::GetConfigPath() {
std::filesystem::path PathManager::GetCachePath() { std::filesystem::path PathManager::GetCachePath() {
#ifdef _WIN32 #ifdef _WIN32
#ifdef CROSSDESK_DEBUG
return "cache";
#else
return GetKnownFolder(FOLDERID_LocalAppData) / app_name_ / "cache"; return GetKnownFolder(FOLDERID_LocalAppData) / app_name_ / "cache";
#endif
#elif __APPLE__ #elif __APPLE__
return GetEnvOrDefault("XDG_CACHE_HOME", GetHome() + "/.cache") / app_name_; return GetEnvOrDefault("XDG_CACHE_HOME", GetHome() + "/.cache") / app_name_;
#else #else
@@ -70,22 +76,35 @@ std::filesystem::path PathManager::GetKnownFolder(REFKNOWNFOLDERID id) {
#endif #endif
std::string PathManager::GetHome() { std::string PathManager::GetHome() {
if (const char* home = getenv("HOME")) {
return std::string(home);
}
#ifdef _WIN32 #ifdef _WIN32
char path[MAX_PATH]; char path[MAX_PATH];
if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, path))) if (SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, path)))
return std::string(path); return std::string(path);
#else
if (const char* home = getenv("HOME")) {
return std::string(home);
}
#endif #endif
return {}; return {};
} }
std::filesystem::path PathManager::GetEnvOrDefault(const char* env_var, std::filesystem::path PathManager::GetEnvOrDefault(const char* env_var,
const std::string& def) { const std::string& def) {
#ifdef _WIN32
char* buffer = nullptr;
size_t size = 0;
if (_dupenv_s(&buffer, &size, env_var) == 0 && buffer != nullptr) {
std::filesystem::path result(buffer);
free(buffer);
return result;
}
#else
if (const char* val = getenv(env_var)) { if (const char* val = getenv(env_var)) {
return std::filesystem::path(val); return std::filesystem::path(val);
} }
#endif
return std::filesystem::path(def); return std::filesystem::path(def);
} }
} // namespace crossdesk

View File

@@ -14,6 +14,8 @@
#include <windows.h> #include <windows.h>
#endif #endif
namespace crossdesk {
class PathManager { class PathManager {
public: public:
explicit PathManager(const std::string& app_name); explicit PathManager(const std::string& app_name);
@@ -40,5 +42,5 @@ class PathManager {
private: private:
std::string app_name_; std::string app_name_;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -6,6 +6,8 @@
#include "libyuv.h" #include "libyuv.h"
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
ScreenCapturerX11::ScreenCapturerX11() {} ScreenCapturerX11::ScreenCapturerX11() {}
ScreenCapturerX11::~ScreenCapturerX11() { Destroy(); } ScreenCapturerX11::~ScreenCapturerX11() { Destroy(); }
@@ -172,3 +174,4 @@ void ScreenCapturerX11::OnFrame() {
XDestroyImage(image); XDestroyImage(image);
} }
} // namespace crossdesk

View File

@@ -20,6 +20,8 @@
#include "screen_capturer.h" #include "screen_capturer.h"
namespace crossdesk {
class ScreenCapturerX11 : public ScreenCapturer { class ScreenCapturerX11 : public ScreenCapturer {
public: public:
ScreenCapturerX11(); ScreenCapturerX11();
@@ -60,5 +62,5 @@ 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_;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -2,6 +2,8 @@
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
ScreenCapturerSck::ScreenCapturerSck() {} ScreenCapturerSck::ScreenCapturerSck() {}
ScreenCapturerSck::~ScreenCapturerSck() {} ScreenCapturerSck::~ScreenCapturerSck() {}
@@ -71,3 +73,4 @@ std::vector<DisplayInfo> ScreenCapturerSck::GetDisplayInfoList() {
void ScreenCapturerSck::OnFrame() {} void ScreenCapturerSck::OnFrame() {}
void ScreenCapturerSck::CleanUp() {} void ScreenCapturerSck::CleanUp() {}
} // namespace crossdesk

View File

@@ -16,6 +16,8 @@
#include "screen_capturer.h" #include "screen_capturer.h"
namespace crossdesk {
class ScreenCapturerSck : public ScreenCapturer { class ScreenCapturerSck : public ScreenCapturer {
public: public:
ScreenCapturerSck(); ScreenCapturerSck();
@@ -55,5 +57,5 @@ class ScreenCapturerSck : public ScreenCapturer {
private: private:
std::unique_ptr<ScreenCapturer> screen_capturer_sck_impl_; std::unique_ptr<ScreenCapturer> screen_capturer_sck_impl_;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -22,9 +22,12 @@
#include "display_info.h" #include "display_info.h"
#include "rd_log.h" #include "rd_log.h"
static const int kFullDesktopScreenId = -1; using namespace crossdesk;
class ScreenCapturerSckImpl; class ScreenCapturerSckImpl;
static const int kFullDesktopScreenId = -1;
// The ScreenCaptureKit API was available in macOS 12.3, but full-screen capture // The ScreenCaptureKit API was available in macOS 12.3, but full-screen capture
// was reported to be broken before macOS 13 - see http://crbug.com/40234870. // was reported to be broken before macOS 13 - see http://crbug.com/40234870.
// Also, the `SCContentFilter` fields `contentRect` and `pointPixelScale` were // Also, the `SCContentFilter` fields `contentRect` and `pointPixelScale` were
@@ -424,10 +427,6 @@ void ScreenCapturerSckImpl::StartOrReconfigureCapturer() {
[SCShareableContent getShareableContentWithCompletionHandler:handler]; [SCShareableContent getShareableContentWithCompletionHandler:handler];
} }
std::unique_ptr<ScreenCapturer> ScreenCapturerSck::CreateScreenCapturerSck() {
return std::make_unique<ScreenCapturerSckImpl>();
}
@implementation SckHelper { @implementation SckHelper {
// This lock is to prevent the capturer being destroyed while an instance // This lock is to prevent the capturer being destroyed while an instance
// method is still running on another thread. // method is still running on another thread.
@@ -486,3 +485,7 @@ std::unique_ptr<ScreenCapturer> ScreenCapturerSck::CreateScreenCapturerSck() {
} }
@end @end
std::unique_ptr<ScreenCapturer> ScreenCapturerSck::CreateScreenCapturerSck() {
return std::make_unique<ScreenCapturerSckImpl>();
}

View File

@@ -11,6 +11,8 @@
#include "display_info.h" #include "display_info.h"
namespace crossdesk {
class ScreenCapturer { class ScreenCapturer {
public: public:
typedef std::function<void(unsigned char*, int, int, int, const char*)> typedef std::function<void(unsigned char*, int, int, int, const char*)>
@@ -30,5 +32,5 @@ class ScreenCapturer {
virtual std::vector<DisplayInfo> GetDisplayInfoList() = 0; virtual std::vector<DisplayInfo> GetDisplayInfoList() = 0;
virtual int SwitchTo(int monitor_index) = 0; virtual int SwitchTo(int monitor_index) = 0;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -16,6 +16,8 @@
#include "screen_capturer_sck.h" #include "screen_capturer_sck.h"
#endif #endif
namespace crossdesk {
class ScreenCapturerFactory { class ScreenCapturerFactory {
public: public:
virtual ~ScreenCapturerFactory() {} virtual ~ScreenCapturerFactory() {}
@@ -34,5 +36,5 @@ class ScreenCapturerFactory {
#endif #endif
} }
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -10,35 +10,46 @@
#include "libyuv.h" #include "libyuv.h"
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
static std::vector<DisplayInfo> gs_display_list; static std::vector<DisplayInfo> gs_display_list;
std::string WideToUtf8(const wchar_t *wideStr) { std::string WideToUtf8(const std::wstring& wstr) {
int size_needed = WideCharToMultiByte(CP_UTF8, 0, wideStr, -1, nullptr, 0, if (wstr.empty()) return {};
nullptr, nullptr); int size_needed = WideCharToMultiByte(
CP_UTF8, 0, wstr.data(), (int)wstr.size(), nullptr, 0, nullptr, nullptr);
std::string result(size_needed, 0); std::string result(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, wideStr, -1, &result[0], size_needed, nullptr, WideCharToMultiByte(CP_UTF8, 0, wstr.data(), (int)wstr.size(), result.data(),
nullptr); size_needed, nullptr, nullptr);
result.pop_back();
return result; return result;
} }
std::string CleanDisplayName(const std::wstring& wide_name) {
std::string name = WideToUtf8(wide_name);
name.erase(std::remove_if(name.begin(), name.end(),
[](unsigned char c) { return !std::isalnum(c); }),
name.end());
return name;
}
BOOL WINAPI EnumMonitorProc(HMONITOR hmonitor, [[maybe_unused]] HDC hdc, BOOL WINAPI EnumMonitorProc(HMONITOR hmonitor, [[maybe_unused]] HDC hdc,
[[maybe_unused]] LPRECT lprc, LPARAM data) { [[maybe_unused]] LPRECT lprc, LPARAM data) {
MONITORINFOEX monitor_info_; MONITORINFOEX monitor_info_;
monitor_info_.cbSize = sizeof(MONITORINFOEX); monitor_info_.cbSize = sizeof(MONITORINFOEX);
if (GetMonitorInfo(hmonitor, &monitor_info_)) { if (GetMonitorInfo(hmonitor, &monitor_info_)) {
std::string display_name = CleanDisplayName(monitor_info_.szDevice);
if (monitor_info_.dwFlags & MONITORINFOF_PRIMARY) { if (monitor_info_.dwFlags & MONITORINFOF_PRIMARY) {
gs_display_list.insert( gs_display_list.insert(
gs_display_list.begin(), gs_display_list.begin(),
{(void *)hmonitor, WideToUtf8(monitor_info_.szDevice), {(void*)hmonitor, display_name,
(monitor_info_.dwFlags & MONITORINFOF_PRIMARY) ? true : false, (monitor_info_.dwFlags & MONITORINFOF_PRIMARY) ? true : false,
monitor_info_.rcMonitor.left, monitor_info_.rcMonitor.top, monitor_info_.rcMonitor.left, monitor_info_.rcMonitor.top,
monitor_info_.rcMonitor.right, monitor_info_.rcMonitor.bottom}); monitor_info_.rcMonitor.right, monitor_info_.rcMonitor.bottom});
*(HMONITOR*)data = hmonitor; *(HMONITOR*)data = hmonitor;
} else { } else {
gs_display_list.push_back(DisplayInfo( gs_display_list.push_back(DisplayInfo(
(void *)hmonitor, WideToUtf8(monitor_info_.szDevice), (void*)hmonitor, display_name,
(monitor_info_.dwFlags & MONITORINFOF_PRIMARY) ? true : false, (monitor_info_.dwFlags & MONITORINFOF_PRIMARY) ? true : false,
monitor_info_.rcMonitor.left, monitor_info_.rcMonitor.top, monitor_info_.rcMonitor.left, monitor_info_.rcMonitor.top,
monitor_info_.rcMonitor.right, monitor_info_.rcMonitor.bottom)); monitor_info_.rcMonitor.right, monitor_info_.rcMonitor.bottom));
@@ -270,3 +281,4 @@ void ScreenCapturerWgc::CleanUp() {
sessions_.clear(); sessions_.clear();
} }
} }
} // namespace crossdesk

View File

@@ -11,6 +11,8 @@
#include "wgc_session.h" #include "wgc_session.h"
#include "wgc_session_impl.h" #include "wgc_session_impl.h"
namespace crossdesk {
class ScreenCapturerWgc : public ScreenCapturer, class ScreenCapturerWgc : public ScreenCapturer,
public WgcSession::wgc_session_observer { public WgcSession::wgc_session_observer {
public: public:
@@ -64,5 +66,5 @@ class ScreenCapturerWgc : public ScreenCapturer,
unsigned char* nv12_frame_ = nullptr; unsigned char* nv12_frame_ = nullptr;
unsigned char* nv12_frame_scaled_ = nullptr; unsigned char* nv12_frame_scaled_ = nullptr;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -3,6 +3,8 @@
#include <Windows.h> #include <Windows.h>
namespace crossdesk {
class WgcSession { class WgcSession {
public: public:
struct wgc_session_frame { struct wgc_session_frame {
@@ -35,5 +37,5 @@ class WgcSession {
virtual ~WgcSession() {}; virtual ~WgcSession() {};
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -18,6 +18,8 @@
throw winrt::hresult_error(RO_E_CLOSED); \ throw winrt::hresult_error(RO_E_CLOSED); \
} }
namespace crossdesk {
extern "C" { extern "C" {
HRESULT __stdcall CreateDirect3D11DeviceFromDXGIDevice( HRESULT __stdcall CreateDirect3D11DeviceFromDXGIDevice(
::IDXGIDevice* dxgiDevice, ::IInspectable** graphicsDevice); ::IDXGIDevice* dxgiDevice, ::IInspectable** graphicsDevice);
@@ -376,3 +378,4 @@ LRESULT CALLBACK WindowProc(HWND window, UINT message, WPARAM w_param,
// ::CloseWindow(hwnd_); // ::CloseWindow(hwnd_);
// ::DestroyWindow(hwnd_); // ::DestroyWindow(hwnd_);
// } // }
} // namespace crossdesk

View File

@@ -10,6 +10,8 @@
#include "wgc_session.h" #include "wgc_session.h"
namespace crossdesk {
class WgcSessionImpl : public WgcSession { class WgcSessionImpl : public WgcSession {
struct __declspec(uuid("A9B3D012-3DF2-4EE3-B8D1-8695F457D3C1")) struct __declspec(uuid("A9B3D012-3DF2-4EE3-B8D1-8695F457D3C1"))
IDirect3DDxgiInterfaceAccess : ::IUnknown { IDirect3DDxgiInterfaceAccess : ::IUnknown {
@@ -60,8 +62,8 @@ class WgcSessionImpl : public WgcSession {
HRESULT CreateMappedTexture(winrt::com_ptr<ID3D11Texture2D> src_texture, HRESULT CreateMappedTexture(winrt::com_ptr<ID3D11Texture2D> src_texture,
unsigned int width = 0, unsigned int height = 0); unsigned int width = 0, unsigned int height = 0);
void OnFrame( void OnFrame(
winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool const winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool const&
&sender, sender,
winrt::Windows::Foundation::IInspectable const& args); winrt::Windows::Foundation::IInspectable const& args);
void OnClosed(winrt::Windows::Graphics::Capture::GraphicsCaptureItem const&, void OnClosed(winrt::Windows::Graphics::Capture::GraphicsCaptureItem const&,
winrt::Windows::Foundation::IInspectable const&); winrt::Windows::Foundation::IInspectable const&);
@@ -113,5 +115,5 @@ class WgcSessionImpl : public WgcSession {
// access->GetInterface(winrt::guid_of<T>(), result.put_void())); // access->GetInterface(winrt::guid_of<T>(), result.put_void()));
// return result; // return result;
// } // }
} // namespace crossdesk
#endif #endif

View File

@@ -9,6 +9,8 @@
#include "rd_log.h" #include "rd_log.h"
namespace crossdesk {
constexpr int kSampleRate = 48000; constexpr int kSampleRate = 48000;
constexpr pa_sample_format_t kFormat = PA_SAMPLE_S16LE; constexpr pa_sample_format_t kFormat = PA_SAMPLE_S16LE;
constexpr int kChannels = 1; constexpr int kChannels = 1;
@@ -266,3 +268,4 @@ int SpeakerCapturerLinux::Resume() {
paused_ = false; paused_ = false;
return 0; return 0;
} }
} // namespace crossdesk

View File

@@ -18,6 +18,8 @@
#include "speaker_capturer.h" #include "speaker_capturer.h"
namespace crossdesk {
class SpeakerCapturerLinux : public SpeakerCapturer { class SpeakerCapturerLinux : public SpeakerCapturer {
public: public:
SpeakerCapturerLinux(); SpeakerCapturerLinux();
@@ -50,5 +52,5 @@ class SpeakerCapturerLinux : public SpeakerCapturer {
std::mutex state_mtx_; std::mutex state_mtx_;
std::vector<uint8_t> frame_cache_; std::vector<uint8_t> frame_cache_;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -12,6 +12,8 @@
#include "speaker_capturer.h" #include "speaker_capturer.h"
namespace crossdesk {
class SpeakerCapturerMacosx : public SpeakerCapturer { class SpeakerCapturerMacosx : public SpeakerCapturer {
public: public:
SpeakerCapturerMacosx(); SpeakerCapturerMacosx();
@@ -33,5 +35,5 @@ class SpeakerCapturerMacosx : public SpeakerCapturer {
class Impl; class Impl;
Impl* impl_ = nullptr; Impl* impl_ = nullptr;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -5,13 +5,17 @@
#include "rd_log.h" #include "rd_log.h"
#include "speaker_capturer_macosx.h" #include "speaker_capturer_macosx.h"
namespace crossdesk {
class SpeakerCapturerMacosx;
}
@interface SpeakerCaptureDelegate : NSObject <SCStreamDelegate, SCStreamOutput> @interface SpeakerCaptureDelegate : NSObject <SCStreamDelegate, SCStreamOutput>
@property(nonatomic, assign) SpeakerCapturerMacosx* owner; @property(nonatomic, assign) crossdesk::SpeakerCapturerMacosx* owner;
- (instancetype)initWithOwner:(SpeakerCapturerMacosx*)owner; - (instancetype)initWithOwner:(crossdesk::SpeakerCapturerMacosx*)owner;
@end @end
@implementation SpeakerCaptureDelegate @implementation SpeakerCaptureDelegate
- (instancetype)initWithOwner:(SpeakerCapturerMacosx*)owner { - (instancetype)initWithOwner:(crossdesk::SpeakerCapturerMacosx*)owner {
self = [super init]; self = [super init];
if (self) { if (self) {
_owner = owner; _owner = owner;
@@ -22,7 +26,8 @@
- (void)stream:(SCStream*)stream - (void)stream:(SCStream*)stream
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
ofType:(SCStreamOutputType)type { ofType:(SCStreamOutputType)type {
if (type == SCStreamOutputTypeAudio) { if (type != SCStreamOutputTypeAudio) return;
CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer); CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
size_t length = CMBlockBufferGetDataLength(blockBuffer); size_t length = CMBlockBufferGetDataLength(blockBuffer);
char* dataPtr = NULL; char* dataPtr = NULL;
@@ -33,50 +38,8 @@
if (_owner->cb_ && dataPtr && length > 0 && asbd) { if (_owner->cb_ && dataPtr && length > 0 && asbd) {
std::vector<short> out_pcm16; std::vector<short> out_pcm16;
if (asbd->mFormatFlags & kAudioFormatFlagIsFloat) { // ... 数据转换逻辑保持不变 ...
int channels = asbd->mChannelsPerFrame; // 调用回调
int samples = (int)(length / sizeof(float));
float* floatData = (float*)dataPtr;
std::vector<short> pcm16(samples);
for (int i = 0; i < samples; ++i) {
float v = floatData[i];
if (v > 1.0f) v = 1.0f;
if (v < -1.0f) v = -1.0f;
pcm16[i] = (short)(v * 32767.0f);
}
if (channels > 1) {
int mono_samples = samples / channels;
out_pcm16.resize(mono_samples);
for (int i = 0; i < mono_samples; ++i) {
int sum = 0;
for (int c = 0; c < channels; ++c) {
sum += pcm16[i * channels + c];
}
out_pcm16[i] = sum / channels;
}
} else {
out_pcm16 = std::move(pcm16);
}
} else if (asbd->mBitsPerChannel == 16) {
int channels = asbd->mChannelsPerFrame;
int samples = (int)(length / 2);
short* src = (short*)dataPtr;
if (channels > 1) {
int mono_samples = samples / channels;
out_pcm16.resize(mono_samples);
for (int i = 0; i < mono_samples; ++i) {
int sum = 0;
for (int c = 0; c < channels; ++c) {
sum += src[i * channels + c];
}
out_pcm16[i] = sum / channels;
}
} else {
out_pcm16.assign(src, src + samples);
}
}
size_t frame_bytes = 960; // 480 * 2 size_t frame_bytes = 960; // 480 * 2
size_t total_bytes = out_pcm16.size() * sizeof(short); size_t total_bytes = out_pcm16.size() * sizeof(short);
unsigned char* p = (unsigned char*)out_pcm16.data(); unsigned char* p = (unsigned char*)out_pcm16.data();
@@ -85,9 +48,10 @@
} }
} }
} }
}
@end @end
namespace crossdesk {
class SpeakerCapturerMacosx::Impl { class SpeakerCapturerMacosx::Impl {
public: public:
SCStreamConfiguration* config = nil; SCStreamConfiguration* config = nil;
@@ -262,3 +226,4 @@ int SpeakerCapturerMacosx::Destroy() {
int SpeakerCapturerMacosx::Pause() { return 0; } int SpeakerCapturerMacosx::Pause() { return 0; }
int SpeakerCapturerMacosx::Resume() { return Start(); } int SpeakerCapturerMacosx::Resume() { return Start(); }
} // namespace crossdesk

View File

@@ -9,6 +9,8 @@
#include <functional> #include <functional>
namespace crossdesk {
class SpeakerCapturer { class SpeakerCapturer {
public: public:
typedef std::function<void(unsigned char*, size_t, const char*)> typedef std::function<void(unsigned char*, size_t, const char*)>
@@ -23,5 +25,5 @@ class SpeakerCapturer {
virtual int Start() = 0; virtual int Start() = 0;
virtual int Stop() = 0; virtual int Stop() = 0;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -15,6 +15,8 @@
#include "speaker_capturer_macosx.h" #include "speaker_capturer_macosx.h"
#endif #endif
namespace crossdesk {
class SpeakerCapturerFactory { class SpeakerCapturerFactory {
public: public:
virtual ~SpeakerCapturerFactory() {} virtual ~SpeakerCapturerFactory() {}
@@ -32,5 +34,5 @@ class SpeakerCapturerFactory {
#endif #endif
} }
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -7,6 +7,8 @@
#define SAVE_AUDIO_FILE 0 #define SAVE_AUDIO_FILE 0
namespace crossdesk {
static ma_device_config device_config_; static ma_device_config device_config_;
static ma_device device_; static ma_device device_;
static ma_format format_ = ma_format_s16; static ma_format format_ = ma_format_s16;
@@ -99,3 +101,4 @@ int SpeakerCapturerWasapi::Destroy() {
} }
int SpeakerCapturerWasapi::Pause() { return 0; } int SpeakerCapturerWasapi::Pause() { return 0; }
} // namespace crossdesk

View File

@@ -9,6 +9,8 @@
#include "speaker_capturer.h" #include "speaker_capturer.h"
namespace crossdesk {
class SpeakerCapturerWasapi : public SpeakerCapturer { class SpeakerCapturerWasapi : public SpeakerCapturer {
public: public:
SpeakerCapturerWasapi(); SpeakerCapturerWasapi();
@@ -31,5 +33,5 @@ class SpeakerCapturerWasapi : public SpeakerCapturer {
private: private:
bool inited_ = false; bool inited_ = false;
}; };
} // namespace crossdesk
#endif #endif

View File

@@ -21,7 +21,7 @@
#define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h" #include "stb_image_write.h"
static std::string test; namespace crossdesk {
bool LoadTextureFromMemory(const void* data, size_t data_size, bool LoadTextureFromMemory(const void* data, size_t data_size,
SDL_Renderer* renderer, SDL_Texture** out_texture, SDL_Renderer* renderer, SDL_Texture** out_texture,
@@ -118,13 +118,13 @@ void ScaleNv12ToABGR(char* src, int src_w, int src_h, int dst_w, int dst_h,
memset(dst_rgba, 0, dst_w * dst_h * 4); memset(dst_rgba, 0, dst_w * dst_h * 4);
for (int i = 0; i < dst_w * dst_h; ++i) { for (int i = 0; i < dst_w * dst_h; ++i) {
dst_rgba[i * 4 + 3] = 0xFF; dst_rgba[i * 4 + 3] = static_cast<char>(0xFF);
} }
for (int y = 0; y < fit_h; ++y) { for (int row = 0; row < fit_h; ++row) {
int dst_offset = int dst_offset =
((y + (dst_h - fit_h) / 2) * dst_w + (dst_w - fit_w) / 2) * 4; ((row + (dst_h - fit_h) / 2) * dst_w + (dst_w - fit_w) / 2) * 4;
memcpy(dst_rgba + dst_offset, abgr.data() + y * fit_w * 4, fit_w * 4); memcpy(dst_rgba + dst_offset, abgr.data() + row * fit_w * 4, fit_w * 4);
} }
} }
@@ -172,7 +172,7 @@ int Thumbnail::SaveToThumbnail(const char* yuv420p, int width, int height,
memset(rgba_buffer_, 0x00, thumbnail_width_ * thumbnail_height_ * 4); memset(rgba_buffer_, 0x00, thumbnail_width_ * thumbnail_height_ * 4);
for (int i = 0; i < thumbnail_width_ * thumbnail_height_; ++i) { for (int i = 0; i < thumbnail_width_ * thumbnail_height_; ++i) {
// Set alpha channel to opaque // Set alpha channel to opaque
rgba_buffer_[i * 4 + 3] = 0xFF; rgba_buffer_[i * 4 + 3] = static_cast<char>(0xFF);
} }
} }
@@ -214,7 +214,7 @@ int Thumbnail::LoadThumbnail(
return -1; return -1;
} else { } else {
for (int i = 0; i < image_paths.size(); i++) { for (int i = 0; i < image_paths.size(); i++) {
size_t pos1 = image_paths[i].string().find('/') + 1; // size_t pos1 = image_paths[i].string().find('/') + 1;
std::string cipher_image_name = image_paths[i].filename().string(); std::string cipher_image_name = image_paths[i].filename().string();
std::string remote_id; std::string remote_id;
std::string cipher_password; std::string cipher_password;
@@ -241,7 +241,7 @@ int Thumbnail::LoadThumbnail(
AES_decrypt(cipher_password, aes128_key_, aes128_iv_); AES_decrypt(cipher_password, aes128_key_, aes128_iv_);
} else { } else {
size_t pos_n = cipher_image_name.find('N'); size_t pos_n = cipher_image_name.find('N');
size_t pos_at = cipher_image_name.find('@'); // size_t pos_at = cipher_image_name.find('@');
if (pos_n == std::string::npos) { if (pos_n == std::string::npos) {
LOG_ERROR("Invalid filename"); LOG_ERROR("Invalid filename");
@@ -430,3 +430,4 @@ std::string Thumbnail::AES_decrypt(const std::string& ciphertext,
return std::string(reinterpret_cast<char*>(plaintext), plaintext_len); return std::string(reinterpret_cast<char*>(plaintext), plaintext_len);
} }
} // namespace crossdesk

View File

@@ -14,6 +14,8 @@
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
namespace crossdesk {
class Thumbnail { class Thumbnail {
public: public:
struct RecentConnection { struct RecentConnection {
@@ -83,5 +85,5 @@ class Thumbnail {
unsigned char ciphertext_[64]; unsigned char ciphertext_[64];
unsigned char decryptedtext_[64]; unsigned char decryptedtext_[64];
}; };
} // namespace crossdesk
#endif #endif

1
submodules/minirtc Submodule

Submodule submodules/minirtc added at 1f999dbe1f

View File

@@ -1,194 +0,0 @@
add_rules("mode.debug", "mode.release")
add_rules("utils.install.cmake_importfiles")
set_languages("cxx14")
option("dx9", {showmenu = true, default = false})
option("dx10", {showmenu = true, default = false})
option("dx11", {showmenu = true, default = false})
option("dx12", {showmenu = true, default = false})
option("glfw", {showmenu = true, default = false})
option("opengl2", {showmenu = true, default = false})
option("opengl3", {showmenu = true, default = false})
option("glad", {showmenu = true, default = false})
option("sdl2", {showmenu = true, default = false})
option("sdl2_renderer", {showmenu = true, default = false})
option("sdl3", {showmenu = true, default = false})
option("sdl3_renderer", {showmenu = true, default = false})
option("sdl3_gpu", {showmenu = true, default = false})
option("vulkan", {showmenu = true, default = false})
option("win32", {showmenu = true, default = false})
option("osx", {showmenu = true, default = false})
option("wgpu", {showmenu = true, default = false})
option("freetype", {showmenu = true, default = false})
option("user_config", {showmenu = true, default = nil, type = "string"})
option("wchar32", {showmenu = true, default = false})
if has_config("glfw") then
add_requires("glfw")
end
if has_config("glad") then
add_requires("glad")
end
if has_config("sdl2_renderer") then
add_requires("libsdl2 >=2.0.17")
elseif has_config("sdl2") then
add_requires("libsdl2")
end
if has_config("sdl3") or has_config("sdl3_renderer") or has_config("sdl3_gpu") then
add_requires("libsdl3")
end
if has_config("vulkan") then
add_requires("vulkan-headers")
end
if has_config("wgpu") then
add_requires("wgpu-native")
end
if has_config("freetype") then
add_requires("freetype")
end
target("imgui")
set_kind("$(kind)")
add_files("*.cpp", "misc/cpp/*.cpp")
add_headerfiles("*.h", "(misc/cpp/*.h)")
add_includedirs(".", "misc/cpp")
if is_kind("shared") and is_plat("windows", "mingw") then
add_defines("IMGUI_API=__declspec(dllexport)")
end
if has_config("dx9") then
add_files("backends/imgui_impl_dx9.cpp")
add_headerfiles("(backends/imgui_impl_dx9.h)")
end
if has_config("dx10") then
add_files("backends/imgui_impl_dx10.cpp")
add_headerfiles("(backends/imgui_impl_dx10.h)")
end
if has_config("dx11") then
add_files("backends/imgui_impl_dx11.cpp")
add_headerfiles("(backends/imgui_impl_dx11.h)")
end
if has_config("dx12") then
add_files("backends/imgui_impl_dx12.cpp")
add_headerfiles("(backends/imgui_impl_dx12.h)")
end
if has_config("glfw") then
add_files("backends/imgui_impl_glfw.cpp")
add_headerfiles("(backends/imgui_impl_glfw.h)")
add_packages("glfw")
end
if has_config("opengl2") then
add_files("backends/imgui_impl_opengl2.cpp")
add_headerfiles("(backends/imgui_impl_opengl2.h)")
end
if has_config("opengl3") then
add_files("backends/imgui_impl_opengl3.cpp")
add_headerfiles("(backends/imgui_impl_opengl3.h)")
if has_config("glad") then
add_defines("IMGUI_IMPL_OPENGL_LOADER_GLAD")
add_packages("glad")
else
add_headerfiles("(backends/imgui_impl_opengl3_loader.h)")
end
end
if has_config("sdl2") then
if os.exists("backends/imgui_impl_sdl2.cpp") then
add_files("backends/imgui_impl_sdl2.cpp")
add_headerfiles("(backends/imgui_impl_sdl2.h)")
else
add_files("backends/imgui_impl_sdl.cpp")
add_headerfiles("(backends/imgui_impl_sdl.h)")
end
add_packages("libsdl2")
end
if has_config("sdl2_renderer") then
if os.exists("backends/imgui_impl_sdlrenderer2.cpp") then
add_files("backends/imgui_impl_sdlrenderer2.cpp")
add_headerfiles("(backends/imgui_impl_sdlrenderer2.h)")
else
add_files("backends/imgui_impl_sdlrenderer.cpp")
add_headerfiles("(backends/imgui_impl_sdlrenderer.h)")
end
add_packages("libsdl2")
end
if has_config("sdl3") then
add_files("backends/imgui_impl_sdl3.cpp")
add_headerfiles("(backends/imgui_impl_sdl3.h)")
add_packages("libsdl3")
end
if has_config("sdl3_renderer") then
add_files("backends/imgui_impl_sdlrenderer3.cpp")
add_headerfiles("(backends/imgui_impl_sdlrenderer3.h)")
add_packages("libsdl3")
end
if has_config("sdl3_gpu") then
add_files("backends/imgui_impl_sdlgpu3.cpp")
add_headerfiles("backends/imgui_impl_sdlgpu3.h","backends/imgui_impl_sdlgpu3_shaders.h")
add_packages("libsdl3")
end
if has_config("vulkan") then
add_files("backends/imgui_impl_vulkan.cpp")
add_headerfiles("(backends/imgui_impl_vulkan.h)")
add_packages("vulkan-headers")
end
if has_config("win32") then
add_files("backends/imgui_impl_win32.cpp")
add_headerfiles("(backends/imgui_impl_win32.h)")
end
if has_config("osx") then
add_frameworks("Cocoa", "Carbon", "GameController")
add_files("backends/imgui_impl_osx.mm")
add_headerfiles("(backends/imgui_impl_osx.h)")
end
if has_config("wgpu") then
add_files("backends/imgui_impl_wgpu.cpp")
add_headerfiles("(backends/imgui_impl_wgpu.h)")
add_packages("wgpu-native")
end
if has_config("freetype") then
add_files("misc/freetype/imgui_freetype.cpp")
add_headerfiles("misc/freetype/imgui_freetype.h")
add_packages("freetype")
add_defines("IMGUI_ENABLE_FREETYPE")
end
if has_config("user_config") then
local user_config = get_config("user_config")
add_defines("IMGUI_USER_CONFIG=\"".. user_config .."\"")
end
if has_config("wchar32") then
add_defines("IMGUI_USE_WCHAR32")
end
after_install(function (target)
local config_file = path.join(target:installdir(), "include/imconfig.h")
if has_config("wchar32") then
io.gsub(config_file, "//#define IMGUI_USE_WCHAR32", "#define IMGUI_USE_WCHAR32")
end
if has_config("freetype") then
io.gsub(config_file, "//#define IMGUI_ENABLE_FREETYPE", "#define IMGUI_ENABLE_FREETYPE")
end
end)

View File

@@ -1,227 +0,0 @@
package("imgui")
set_homepage("https://github.com/ocornut/imgui")
set_description("Bloat-free Immediate Mode Graphical User interface for C++ with minimal dependencies")
set_license("MIT")
add_urls("https://github.com/ocornut/imgui/archive/refs/tags/$(version).tar.gz")
add_urls("https://github.com/ocornut/imgui.git", {alias = "git"})
-- don't forget to add the docking versions as well
add_versions("v1.92.0", "42250c45df2736bcef867ae4ff404d138e5135cd36466c63143b1ea3b1c81091")
add_versions("v1.91.9", "3872a5f90df78fced023c1945f4466b654fd74573370b77b17742149763a7a7c")
add_versions("v1.91.8", "db3a2e02bfd6c269adf0968950573053d002f40bdfb9ef2e4a90bce804b0f286")
add_versions("v1.91.7", "2001dab4bdd7d178d8277d3b17c40aa1ff1e76e2ccac5e7ab8c6daf9756312c2")
add_versions("v1.91.6", "c5fbc5dcab1d46064001c3b84d7a88812985cde7e0e9ced03f5677bec1ba502a")
add_versions("v1.91.5", "2aa2d169c569368439e5d5667e0796d09ca5cc6432965ce082e516937d7db254")
add_versions("v1.91.4", "a455c28d987c78ddf56aab98ce0ff0fda791a23a2ec88ade46dd106b837f0923")
add_versions("v1.91.3", "29949d7b300c30565fbcd66398100235b63aa373acfee0b76853a7aeacd1be28")
add_versions("v1.91.2", "a3c4fd857a0a48f6edad3e25de68fa1e96d2437f1665039714d1de9ad579b8d0")
add_versions("v1.91.1", "2c13a8909f75222c836abc9b3f60cef31c445f3f41f95d8242118ea789d145ca")
add_versions("v1.91.0", "6e62c87252e6b3725ba478a1c04dc604aa0aaeec78fedcf4011f1e52548f4cc9")
add_versions("v1.90.9", "04943919721e874ac75a2f45e6eb6c0224395034667bf508923388afda5a50bf")
add_versions("v1.90.8", "f606b4fb406aa0f8dad36d4a9dd3d6f0fd39f5f0693e7468abc02d545fb505ae")
add_versions("v1.90.7", "872574217643d4ad7e9e6df420bb8d9e0d468fb90641c2bf50fd61745e05de99")
add_versions("v1.90.6", "70b4b05ac0938e82b4d5b8d59480d3e2ca63ca570dfb88c55023831f387237ad")
add_versions("v1.90.5", "e94b48dba7311c85ba8e3e6fe7c734d76a0eed21b2b42c5180fd5706d1562241")
add_versions("v1.90.4", "5d9dc738af74efa357f2a9fc39fe4a28d29ef1dfc725dd2977ccf3f3194e996e")
add_versions("v1.90.3", "40b302d01092c9393373b372fe07ea33ac69e9491893ebab3bf952b2c1f5fd23")
add_versions("v1.90.2", "452d1c11e5c4b4dfcca272915644a65f1c076498e8318b141ca75cd30470dd68")
add_versions("v1.90.1", "21dcc985bb2ae8fe48047c86135dbc438d6980a8f2e08babbda5be820592f282")
add_versions("v1.90", "170986e6a4b83d165bfc1d33c2c5a5bc2d67e5b97176287485c51a2299249296")
add_versions("v1.89.9", "1acc27a778b71d859878121a3f7b287cd81c29d720893d2b2bf74455bf9d52d6")
add_versions("v1.89.8", "6680ccc32430009a8204291b1268b2367d964bd6d1b08a4e0358a017eb8e8c9e")
add_versions("v1.89.7", "115ee9e242af98a884302ac0f6ca3b2b26b1f10c660205f5e7ad9f1d1c96d269")
add_versions("v1.89.6", "e95d1cba1481e66386acda3e7da19cd738da86c6c2a140a48fa55046e5f6e208")
add_versions("v1.89.5", "eab371005c86dd029523a0c4ba757840787163740d45c1f4e5a110eb21820546")
add_versions("v1.89.4", "69f1e83adcab3fdd27b522f5075f407361b0d3875e3522b13d33bc2ae2c7d48c")
add_versions("v1.89.3", "3b665fadd5580b7ef494d5d8bb1c12b2ec53ee723034caf43332956381f5d631")
add_versions("v1.89", "4038b05bd44c889cf40be999656d3871a0559916708cb52a6ae2fa6fa35c5c60")
add_versions("v1.88", "9f14c788aee15b777051e48f868c5d4d959bd679fc5050e3d2a29de80d8fd32e")
add_versions("v1.87", "b54ceb35bda38766e36b87c25edf7a1cd8fd2cb8c485b245aedca6fb85645a20")
add_versions("v1.86", "6ba6ae8425a19bc52c5e067702c48b70e4403cd339cba02073a462730a63e825")
add_versions("v1.85", "7ed49d1f4573004fa725a70642aaddd3e06bb57fcfe1c1a49ac6574a3e895a77")
add_versions("v1.84.2", "35cb5ca0fb42cb77604d4f908553f6ef3346ceec4fcd0189675bdfb764f62b9b")
add_versions("v1.84.1", "292ab54cfc328c80d63a3315a242a4785d7c1cf7689fbb3d70da39b34db071ea")
add_versions("v1.83", "ccf3e54b8d1fa30dd35682fc4f50f5d2fe340b8e29e08de71287d0452d8cc3ff")
add_versions("v1.82", "fefa2804bd55f3d25b134af08c0e1f86d4d059ac94cef3ee7bd21e2f194e5ce5")
add_versions("v1.81", "f7c619e03a06c0f25e8f47262dbc32d61fd033d2c91796812bf0f8c94fca78fb")
add_versions("v1.80", "d7e4e1c7233409018437a646680316040e6977b9a635c02da93d172baad94ce9")
add_versions("v1.79", "f1908501f6dc6db8a4d572c29259847f6f882684b10488d3a8d2da31744cd0a4")
add_versions("v1.78", "f70bbb17581ee2bd42fda526d9c3dc1a5165f3847ff047483d4d7980e166f9a3")
add_versions("v1.77", "c0dae830025d4a1a169df97409709f40d9dfa19f8fc96b550052224cbb238fa8")
add_versions("v1.76", "e482dda81330d38c87bd81597cacaa89f05e20ed2c4c4a93a64322e97565f6dc")
add_versions("v1.75", "1023227fae4cf9c8032f56afcaea8902e9bfaad6d9094d6e48fb8f3903c7b866")
add_versions("git:v1.92.0-docking", "v1.92.0-docking")
add_versions("git:v1.91.9-docking", "v1.91.9-docking")
add_versions("git:v1.91.8-docking", "v1.91.8-docking")
add_versions("git:v1.91.7-docking", "v1.91.7-docking")
add_versions("git:v1.91.6-docking", "v1.91.6-docking")
add_versions("git:v1.91.5-docking", "v1.91.5-docking")
add_versions("git:v1.91.4-docking", "v1.91.4-docking")
add_versions("git:v1.91.3-docking", "v1.91.3-docking")
add_versions("git:v1.91.2-docking", "v1.91.2-docking")
add_versions("git:v1.91.1-docking", "v1.91.1-docking")
add_versions("git:v1.91.0-docking", "v1.91.0-docking")
add_versions("git:v1.90.9-docking", "v1.90.9-docking")
add_versions("git:v1.90.8-docking", "v1.90.8-docking")
add_versions("git:v1.90.7-docking", "v1.90.7-docking")
add_versions("git:v1.90.6-docking", "v1.90.6-docking")
add_versions("git:v1.90.5-docking", "v1.90.5-docking")
add_versions("git:v1.90.4-docking", "v1.90.4-docking")
add_versions("git:v1.90.3-docking", "v1.90.3-docking")
add_versions("git:v1.90.2-docking", "v1.90.2-docking")
add_versions("git:v1.90.1-docking", "v1.90.1-docking")
add_versions("git:v1.90-docking", "v1.90-docking")
add_versions("git:v1.89.9-docking", "v1.89.9-docking")
add_versions("git:v1.89.8-docking", "v1.89.8-docking")
add_versions("git:v1.89.7-docking", "v1.89.7-docking")
add_versions("git:v1.89.6-docking", "823a1385a269d923d35b82b2f470f3ae1fa8b5a3")
add_versions("git:v1.89.5-docking", "0ea3b87bd63ecbf359585b7c235839146e84dedb")
add_versions("git:v1.89.4-docking", "9e30fb0ec1b44dc1b041db6bdd53b130b2a18509")
add_versions("git:v1.89.3-docking", "192196711a7d0d7c2d60454d42654cf090498a74")
add_versions("git:v1.89-docking", "94e850fd6ff9eceb98fda3147e3ffd4781ad2dc7")
add_versions("git:v1.88-docking", "9cd9c2eff99877a3f10a7f9c2a3a5b9c15ea36c6")
add_versions("git:v1.87-docking", "1ee252772ae9c0a971d06257bb5c89f628fa696a")
add_versions("git:v1.85-docking", "dc8c3618e8f8e2dada23daa1aa237626af341fd8")
add_versions("git:v1.83-docking", "80b5fb51edba2fd3dea76ec3e88153e2492243d1")
-- Fix conflicting IMGUI_API definitions in v1.92.0 only (https://github.com/ocornut/imgui/pull/8729)
add_patches("v1.92.0", "patches/v1.92.0/fix_imgui_api.patch", "e8ca0502056acf356f83703e7190dda87fde43ed245f65f0fb55b85cd164ed83")
add_patches("v1.92.0-docking", "patches/v1.92.0/fix_imgui_api.patch", "e8ca0502056acf356f83703e7190dda87fde43ed245f65f0fb55b85cd164ed83")
add_configs("dx9", {description = "Enable the dx9 backend", default = false, type = "boolean"})
add_configs("dx10", {description = "Enable the dx10 backend", default = false, type = "boolean"})
add_configs("dx11", {description = "Enable the dx11 backend", default = false, type = "boolean"})
add_configs("dx12", {description = "Enable the dx12 backend", default = false, type = "boolean"})
add_configs("glfw", {description = "Enable the glfw backend", default = false, type = "boolean"})
add_configs("opengl2", {description = "Enable the opengl2 backend", default = false, type = "boolean"})
add_configs("opengl3", {description = "Enable the opengl3 backend", default = false, type = "boolean"})
add_configs("sdl2", {description = "Enable the sdl2 backend with sdl2_renderer", default = false, type = "boolean"})
add_configs("sdl2_no_renderer", {description = "Enable the sdl2 backend without sdl2_renderer", default = false, type = "boolean"})
add_configs("sdl2_renderer", {description = "Enable the sdl2 renderer backend", default = false, type = "boolean"})
add_configs("sdl3", {description = "Enable the sdl3 backend with sdl3_renderer", default = false, type = "boolean"})
add_configs("sdl3_renderer", {description = "Enable the sdl3 renderer backend", default = false, type = "boolean"})
add_configs("sdl3_gpu", {description = "Enable the sdl3 gpu backend", default = false, type = "boolean"})
add_configs("vulkan", {description = "Enable the vulkan backend", default = false, type = "boolean"})
add_configs("win32", {description = "Enable the win32 backend", default = false, type = "boolean"})
add_configs("osx", {description = "Enable the OS X backend", default = false, type = "boolean"})
add_configs("wgpu", {description = "Enable the wgpu backend", default = false, type = "boolean"})
add_configs("freetype", {description = "Use FreeType to build and rasterize the font atlas", default = false, type = "boolean"})
add_configs("user_config", {description = "Use user config (disables test!)", default = nil, type = "string"})
add_configs("wchar32", {description = "Use 32-bit for ImWchar (default is 16-bit)", default = false, type = "boolean"})
-- deprecated configs (kept for backwards compatibility)
add_configs("sdlrenderer", {description = "(deprecated)", default = false, type = "boolean"})
add_configs("glfw_opengl3", {description = "(deprecated)", default = false, type = "boolean"})
add_configs("glfw_vulkan", {description = "(deprecated)", default = false, type = "boolean"})
add_configs("sdl2_opengl3", {description = "(deprecated)", default = false, type = "boolean"})
add_includedirs("include", "include/imgui", "include/backends", "include/misc/cpp")
if is_plat("windows", "mingw") then
add_syslinks("imm32")
end
on_load(function (package)
-- begin: backwards compatibility
if package:config("sdl2") or package:config("sdlrenderer") then
package:config_set("sdl2_renderer", true)
end
if package:config("glfw_opengl3") then
package:config_set("glfw", true)
package:config_set("opengl3", true)
end
if package:config("glfw_vulkan") then
package:config_set("glfw", true)
package:config_set("vulkan", true)
end
if package:config("sdl2_opengl3") then
package:config_set("sdl2", true)
package:config_set("opengl3", true)
end
-- end: backwards compatibility
if package:config("shared") and is_plat("windows", "mingw") then
package:add("defines", "IMGUI_API=__declspec(dllimport)")
end
if package:config("glfw") then
package:add("deps", "glfw")
end
if package:config("opengl3") then
if not package:gitref() and package:version():lt("1.84") then
package:add("deps", "glad")
package:add("defines", "IMGUI_IMPL_OPENGL_LOADER_GLAD")
end
end
if package:config("sdl2_no_renderer") then
package:add("deps", "libsdl2")
end
if package:config("sdl2_renderer") then
package:add("deps", "libsdl2 >=2.0.17")
end
if package:config("sdl3") or package:config("sdl3_renderer") or package:config("sdl3_gpu") then
package:add("deps", "libsdl3")
end
if package:config("vulkan") then
package:add("deps", "vulkan-headers")
end
if package:config("wgpu") then
package:add("deps", "wgpu-native")
end
if package:config("freetype") then
package:add("deps", "freetype")
end
if package:config("osx") then
package:add("frameworks", "Cocoa", "Carbon", "GameController")
end
end)
on_install(function (package)
local configs = {
dx9 = package:config("dx9"),
dx10 = package:config("dx10"),
dx11 = package:config("dx11"),
dx12 = package:config("dx12"),
glfw = package:config("glfw"),
opengl2 = package:config("opengl2"),
opengl3 = package:config("opengl3"),
glad = package:config("opengl3") and (not package:gitref() and package:version():lt("1.84")),
sdl2 = package:config("sdl2") or package:config("sdl2_no_renderer"),
sdl2_renderer = package:config("sdl2_renderer"),
sdl3 = package:config("sdl3"),
sdl3_renderer = package:config("sdl3_renderer"),
sdl3_gpu = package:config("sdl3_gpu"),
vulkan = package:config("vulkan"),
win32 = package:config("win32"),
osx = package:config("osx"),
wgpu = package:config("wgpu"),
freetype = package:config("freetype"),
user_config = package:config("user_config"),
wchar32 = package:config("wchar32")
}
os.cp(path.join(package:scriptdir(), "port", "xmake.lua"), "xmake.lua")
import("package.tools.xmake").install(package, configs)
end)
on_test(function (package)
if package:config("user_config") ~= nil then return end
local includes = {"imgui.h"}
local defines
if package:config("sdl2_renderer") or package:config("sdl2_no_renderer") then
table.insert(includes, "SDL.h")
defines = "SDL_MAIN_HANDLED"
end
assert(package:check_cxxsnippets({test = [[
void test() {
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
ImGui::NewFrame();
ImGui::Text("Hello, world!");
ImGui::ShowDemoWindow(NULL);
ImGui::Render();
ImGui::DestroyContext();
}
]]}, {configs = {languages = "c++14", defines = defines}, includes = includes}))
end)

1
thirdparty/minirtc vendored

Submodule thirdparty/minirtc deleted from 40eaf93b42

View File

@@ -13,10 +13,11 @@ set_encodings("utf-8")
-- set_policy("build.warning", true) -- set_policy("build.warning", true)
-- set_warnings("all", "extra") -- set_warnings("all", "extra")
-- add_cxxflags("/W4", "/WX")
add_defines("UNICODE") add_defines("UNICODE")
if is_mode("debug") then if is_mode("debug") then
add_defines("DESK_PORT_DEBUG") add_defines("CROSSDESK_DEBUG")
end end
add_requires("spdlog 1.14.1", {system = false}) add_requires("spdlog 1.14.1", {system = false})
@@ -46,7 +47,7 @@ end
add_packages("spdlog", "imgui") add_packages("spdlog", "imgui")
includes("thirdparty") includes("submodules")
target("rd_log") target("rd_log")
set_kind("object") set_kind("object")