mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-03-24 09:07:31 +08:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
103b8372e4 | ||
|
|
f7f1724bf1 | ||
|
|
5d70e11f17 | ||
|
|
fb7ae90d46 |
19
.github/workflows/build.yml
vendored
19
.github/workflows/build.yml
vendored
@@ -289,12 +289,26 @@ jobs:
|
|||||||
cd "${{ github.workspace }}\scripts\windows"
|
cd "${{ github.workspace }}\scripts\windows"
|
||||||
makensis /DVERSION=$env:VERSION_NUM nsis_script.nsi
|
makensis /DVERSION=$env:VERSION_NUM nsis_script.nsi
|
||||||
|
|
||||||
|
- name: Package Portable
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$portableDir = "${{ github.workspace }}\portable"
|
||||||
|
New-Item -ItemType Directory -Force -Path $portableDir
|
||||||
|
Copy-Item "${{ github.workspace }}\build\windows\x64\release\crossdesk.exe" "$portableDir\CrossDesk.exe"
|
||||||
|
Compress-Archive -Path "$portableDir\*" -DestinationPath "${{ github.workspace }}\crossdesk-win-x64-portable-${{ env.VERSION_NUM }}.zip"
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: crossdesk-win-x64-${{ env.VERSION_NUM }}
|
name: crossdesk-win-x64-${{ env.VERSION_NUM }}
|
||||||
path: ${{ github.workspace }}/scripts/windows/crossdesk-win-x64-${{ env.VERSION_NUM }}.exe
|
path: ${{ github.workspace }}/scripts/windows/crossdesk-win-x64-${{ env.VERSION_NUM }}.exe
|
||||||
|
|
||||||
|
- name: Upload portable artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: crossdesk-win-x64-portable-${{ env.VERSION_NUM }}
|
||||||
|
path: ${{ github.workspace }}/crossdesk-win-x64-portable-${{ env.VERSION_NUM }}.zip
|
||||||
|
|
||||||
release:
|
release:
|
||||||
name: Publish Release
|
name: Publish Release
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
@@ -335,6 +349,7 @@ jobs:
|
|||||||
cp artifacts/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}.deb
|
cp artifacts/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}.deb
|
||||||
cp artifacts/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}.deb
|
cp artifacts/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}.deb
|
||||||
cp artifacts/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe
|
cp artifacts/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe
|
||||||
|
cp artifacts/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}.zip
|
||||||
|
|
||||||
- name: List release files
|
- name: List release files
|
||||||
run: ls -lh release/
|
run: ls -lh release/
|
||||||
@@ -392,6 +407,10 @@ jobs:
|
|||||||
"url": "https://downloads.crossdesk.cn/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe",
|
"url": "https://downloads.crossdesk.cn/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe",
|
||||||
"filename": "crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe"
|
"filename": "crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe"
|
||||||
},
|
},
|
||||||
|
"windows-x64-portable": {
|
||||||
|
"url": "https://downloads.crossdesk.cn/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}.zip",
|
||||||
|
"filename": "crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}.zip"
|
||||||
|
},
|
||||||
"macos-x64": {
|
"macos-x64": {
|
||||||
"url": "https://downloads.crossdesk.cn/crossdesk-macos-x64-${{ steps.version.outputs.VERSION_WITH_V }}.pkg",
|
"url": "https://downloads.crossdesk.cn/crossdesk-macos-x64-${{ steps.version.outputs.VERSION_WITH_V }}.pkg",
|
||||||
"filename": "crossdesk-macos-x64-${{ steps.version.outputs.VERSION_WITH_V }}.pkg"
|
"filename": "crossdesk-macos-x64-${{ steps.version.outputs.VERSION_WITH_V }}.pkg"
|
||||||
|
|||||||
4
.github/workflows/update-version-json.yml
vendored
4
.github/workflows/update-version-json.yml
vendored
@@ -94,6 +94,10 @@ jobs:
|
|||||||
"url": "https://downloads.crossdesk.cn/crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe",
|
"url": "https://downloads.crossdesk.cn/crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe",
|
||||||
"filename": "crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe"
|
"filename": "crossdesk-win-x64-${{ steps.version.outputs.TAG_NAME }}.exe"
|
||||||
},
|
},
|
||||||
|
"windows-x64-portable": {
|
||||||
|
"url": "https://downloads.crossdesk.cn/crossdesk-win-x64-portable-${{ steps.version.outputs.TAG_NAME }}.zip",
|
||||||
|
"filename": "crossdesk-win-x64-portable-${{ steps.version.outputs.TAG_NAME }}.zip"
|
||||||
|
},
|
||||||
"macos-x64": {
|
"macos-x64": {
|
||||||
"url": "https://downloads.crossdesk.cn/crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg",
|
"url": "https://downloads.crossdesk.cn/crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg",
|
||||||
"filename": "crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg"
|
"filename": "crossdesk-macos-x64-${{ steps.version.outputs.TAG_NAME }}.pkg"
|
||||||
|
|||||||
2
scripts/windows/crossdesk.rc
Normal file
2
scripts/windows/crossdesk.rc
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// Application icon (IDI_ICON1 = 1, which is the default app icon resource ID)
|
||||||
|
IDI_ICON1 ICON "..\\..\\icons\\windows\\crossdesk.ico"
|
||||||
@@ -46,7 +46,7 @@ ShowInstDetails show
|
|||||||
|
|
||||||
Section "MainSection"
|
Section "MainSection"
|
||||||
; Check if CrossDesk is running
|
; Check if CrossDesk is running
|
||||||
StrCpy $1 "crossdesk.exe"
|
StrCpy $1 "CrossDesk.exe"
|
||||||
|
|
||||||
nsProcess::_FindProcess "$1"
|
nsProcess::_FindProcess "$1"
|
||||||
Pop $R0
|
Pop $R0
|
||||||
@@ -72,10 +72,7 @@ installApp:
|
|||||||
SetOverwrite ifnewer
|
SetOverwrite ifnewer
|
||||||
|
|
||||||
; Main application executable path
|
; Main application executable path
|
||||||
File /oname=crossdesk.exe "..\..\build\windows\x64\release\crossdesk.exe"
|
File /oname=CrossDesk.exe "..\..\build\windows\x64\release\crossdesk.exe"
|
||||||
|
|
||||||
; Copy icon file to installation directory
|
|
||||||
File "${MUI_ICON}"
|
|
||||||
|
|
||||||
; Write uninstall information
|
; Write uninstall information
|
||||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
WriteUninstaller "$INSTDIR\uninstall.exe"
|
||||||
@@ -85,28 +82,23 @@ installApp:
|
|||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayIcon" "$INSTDIR\crossdesk.ico"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "DisplayIcon" "$INSTDIR\CrossDesk.exe"
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoModify" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoModify" 1
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoRepair" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_REG_KEY}" "NoRepair" 1
|
||||||
WriteRegStr HKCU "Software\${PRODUCT_NAME}" "InstallDir" "$INSTDIR"
|
WriteRegStr HKCU "Software\${PRODUCT_NAME}" "InstallDir" "$INSTDIR"
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
; After installation
|
|
||||||
Section -Post
|
|
||||||
ExecWait '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\mt.exe" -manifest "$INSTDIR\crossdesk.manifest" -outputresource:"$INSTDIR\crossdesk.exe";1'
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
Section -AdditionalIcons
|
Section -AdditionalIcons
|
||||||
; Desktop shortcut
|
; Desktop shortcut
|
||||||
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.ico"
|
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\CrossDesk.exe" "" "$INSTDIR\CrossDesk.exe"
|
||||||
|
|
||||||
; Start menu shortcut
|
; Start menu shortcut
|
||||||
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\crossdesk.exe" "" "$INSTDIR\crossdesk.ico"
|
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\CrossDesk.exe" "" "$INSTDIR\CrossDesk.exe"
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
Section "Uninstall"
|
Section "Uninstall"
|
||||||
; Check if CrossDesk is running
|
; Check if CrossDesk is running
|
||||||
StrCpy $1 "crossdesk.exe"
|
StrCpy $1 "CrossDesk.exe"
|
||||||
|
|
||||||
nsProcess::_FindProcess "$1"
|
nsProcess::_FindProcess "$1"
|
||||||
Pop $R0
|
Pop $R0
|
||||||
@@ -129,7 +121,7 @@ cancelUninstall:
|
|||||||
|
|
||||||
uninstallApp:
|
uninstallApp:
|
||||||
; Delete main executable and uninstaller
|
; Delete main executable and uninstaller
|
||||||
Delete "$INSTDIR\crossdesk.exe"
|
Delete "$INSTDIR\CrossDesk.exe"
|
||||||
Delete "$INSTDIR\uninstall.exe"
|
Delete "$INSTDIR\uninstall.exe"
|
||||||
|
|
||||||
; Recursively delete installation directory
|
; Recursively delete installation directory
|
||||||
@@ -152,5 +144,5 @@ SectionEnd
|
|||||||
|
|
||||||
; ------ Functions ------
|
; ------ Functions ------
|
||||||
Function LaunchApp
|
Function LaunchApp
|
||||||
Exec "$INSTDIR\crossdesk.exe"
|
Exec "$INSTDIR\CrossDesk.exe"
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|||||||
@@ -74,6 +74,15 @@ int ConfigCenter::Load() {
|
|||||||
enable_minimize_to_tray_ = ini_.GetBoolValue(
|
enable_minimize_to_tray_ = ini_.GetBoolValue(
|
||||||
section_, "enable_minimize_to_tray", enable_minimize_to_tray_);
|
section_, "enable_minimize_to_tray", enable_minimize_to_tray_);
|
||||||
|
|
||||||
|
const char* file_transfer_save_path_value =
|
||||||
|
ini_.GetValue(section_, "file_transfer_save_path", nullptr);
|
||||||
|
if (file_transfer_save_path_value != nullptr &&
|
||||||
|
strlen(file_transfer_save_path_value) > 0) {
|
||||||
|
file_transfer_save_path_ = file_transfer_save_path_value;
|
||||||
|
} else {
|
||||||
|
file_transfer_save_path_ = "";
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,6 +113,9 @@ int ConfigCenter::Save() {
|
|||||||
ini_.SetBoolValue(section_, "enable_minimize_to_tray",
|
ini_.SetBoolValue(section_, "enable_minimize_to_tray",
|
||||||
enable_minimize_to_tray_);
|
enable_minimize_to_tray_);
|
||||||
|
|
||||||
|
ini_.SetValue(section_, "file_transfer_save_path",
|
||||||
|
file_transfer_save_path_.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;
|
||||||
@@ -358,4 +370,19 @@ bool ConfigCenter::IsMinimizeToTray() const { return enable_minimize_to_tray_; }
|
|||||||
bool ConfigCenter::IsEnableAutostart() const { return enable_autostart_; }
|
bool ConfigCenter::IsEnableAutostart() const { return enable_autostart_; }
|
||||||
|
|
||||||
bool ConfigCenter::IsEnableDaemon() const { return enable_daemon_; }
|
bool ConfigCenter::IsEnableDaemon() const { return enable_daemon_; }
|
||||||
|
|
||||||
|
int ConfigCenter::SetFileTransferSavePath(const std::string& path) {
|
||||||
|
file_transfer_save_path_ = path;
|
||||||
|
ini_.SetValue(section_, "file_transfer_save_path",
|
||||||
|
file_transfer_save_path_.c_str());
|
||||||
|
SI_Error rc = ini_.SaveFile(config_path_.c_str());
|
||||||
|
if (rc < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ConfigCenter::GetFileTransferSavePath() const {
|
||||||
|
return file_transfer_save_path_;
|
||||||
|
}
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
@@ -39,6 +39,7 @@ class ConfigCenter {
|
|||||||
int SetMinimizeToTray(bool enable_minimize_to_tray);
|
int SetMinimizeToTray(bool enable_minimize_to_tray);
|
||||||
int SetAutostart(bool enable_autostart);
|
int SetAutostart(bool enable_autostart);
|
||||||
int SetDaemon(bool enable_daemon);
|
int SetDaemon(bool enable_daemon);
|
||||||
|
int SetFileTransferSavePath(const std::string& path);
|
||||||
|
|
||||||
// read config
|
// read config
|
||||||
|
|
||||||
@@ -59,6 +60,7 @@ class ConfigCenter {
|
|||||||
bool IsMinimizeToTray() const;
|
bool IsMinimizeToTray() const;
|
||||||
bool IsEnableAutostart() const;
|
bool IsEnableAutostart() const;
|
||||||
bool IsEnableDaemon() const;
|
bool IsEnableDaemon() const;
|
||||||
|
std::string GetFileTransferSavePath() const;
|
||||||
|
|
||||||
int Load();
|
int Load();
|
||||||
int Save();
|
int Save();
|
||||||
@@ -85,6 +87,7 @@ class ConfigCenter {
|
|||||||
bool enable_minimize_to_tray_ = false;
|
bool enable_minimize_to_tray_ = false;
|
||||||
bool enable_autostart_ = false;
|
bool enable_autostart_ = false;
|
||||||
bool enable_daemon_ = false;
|
bool enable_daemon_ = false;
|
||||||
|
std::string file_transfer_save_path_ = "";
|
||||||
};
|
};
|
||||||
} // namespace crossdesk
|
} // namespace crossdesk
|
||||||
#endif
|
#endif
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -198,6 +198,13 @@ static std::vector<std::string> file_transfer = {
|
|||||||
reinterpret_cast<const char*>(u8"文件传输:"), "File Transfer:"};
|
reinterpret_cast<const char*>(u8"文件传输:"), "File Transfer:"};
|
||||||
static std::vector<std::string> connection_status = {
|
static std::vector<std::string> connection_status = {
|
||||||
reinterpret_cast<const char*>(u8"连接状态:"), "Connection Status:"};
|
reinterpret_cast<const char*>(u8"连接状态:"), "Connection Status:"};
|
||||||
|
static std::vector<std::string> file_transfer_save_path = {
|
||||||
|
reinterpret_cast<const char*>(u8"文件接收保存路径:"),
|
||||||
|
"File Transfer Save Path:"};
|
||||||
|
static std::vector<std::string> browse = {
|
||||||
|
reinterpret_cast<const char*>(u8"浏览"), "Browse"};
|
||||||
|
static std::vector<std::string> default_desktop = {
|
||||||
|
reinterpret_cast<const char*>(u8"桌面"), "Desktop"};
|
||||||
|
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
static std::vector<std::string> minimize_to_tray = {
|
static std::vector<std::string> minimize_to_tray = {
|
||||||
|
|||||||
@@ -492,6 +492,16 @@ int Render::LoadSettingsFromCacheFile() {
|
|||||||
enable_daemon_ = config_center_->IsEnableDaemon();
|
enable_daemon_ = config_center_->IsEnableDaemon();
|
||||||
enable_minimize_to_tray_ = config_center_->IsMinimizeToTray();
|
enable_minimize_to_tray_ = config_center_->IsMinimizeToTray();
|
||||||
|
|
||||||
|
// File transfer save path
|
||||||
|
{
|
||||||
|
std::string saved_path = config_center_->GetFileTransferSavePath();
|
||||||
|
strncpy(file_transfer_save_path_buf_, saved_path.c_str(),
|
||||||
|
sizeof(file_transfer_save_path_buf_) - 1);
|
||||||
|
file_transfer_save_path_buf_[sizeof(file_transfer_save_path_buf_) - 1] =
|
||||||
|
'\0';
|
||||||
|
file_transfer_save_path_last_ = saved_path;
|
||||||
|
}
|
||||||
|
|
||||||
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_;
|
||||||
video_encode_format_button_value_last_ = video_encode_format_button_value_;
|
video_encode_format_button_value_last_ = video_encode_format_button_value_;
|
||||||
|
|||||||
@@ -646,6 +646,8 @@ class Render {
|
|||||||
bool enable_daemon_last_ = false;
|
bool enable_daemon_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 file_transfer_save_path_buf_[512] = "";
|
||||||
|
std::string file_transfer_save_path_last_ = "";
|
||||||
char signal_server_ip_self_[256] = "";
|
char signal_server_ip_self_[256] = "";
|
||||||
char signal_server_port_self_[6] = "";
|
char signal_server_port_self_[6] = "";
|
||||||
char coturn_server_port_self_[6] = "";
|
char coturn_server_port_self_[6] = "";
|
||||||
|
|||||||
@@ -321,6 +321,14 @@ void Render::OnReceiveDataBufferCb(const char* data, size_t size,
|
|||||||
std::string remote_user_id = std::string(user_id, user_id_size);
|
std::string remote_user_id = std::string(user_id, user_id_size);
|
||||||
|
|
||||||
static FileReceiver receiver;
|
static FileReceiver receiver;
|
||||||
|
// Update output directory from config
|
||||||
|
std::string configured_path =
|
||||||
|
render->config_center_->GetFileTransferSavePath();
|
||||||
|
if (!configured_path.empty()) {
|
||||||
|
receiver.SetOutputDir(std::filesystem::u8path(configured_path));
|
||||||
|
} else if (receiver.OutputDir().empty()) {
|
||||||
|
receiver = FileReceiver(); // re-init with default desktop path
|
||||||
|
}
|
||||||
receiver.SetOnSendAck([render,
|
receiver.SetOnSendAck([render,
|
||||||
remote_user_id](const FileTransferAck& ack) -> int {
|
remote_user_id](const FileTransferAck& ack) -> int {
|
||||||
bool is_server_sending = remote_user_id.rfind("C-", 0) != 0;
|
bool is_server_sending = remote_user_id.rfind("C-", 0) != 0;
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "layout.h"
|
#include "layout.h"
|
||||||
#include "localization.h"
|
#include "localization.h"
|
||||||
#include "rd_log.h"
|
#include "rd_log.h"
|
||||||
@@ -24,13 +28,34 @@ void Render::Hyperlink(const std::string& label, const std::string& url,
|
|||||||
ImGui::EndTooltip();
|
ImGui::EndTooltip();
|
||||||
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
std::string cmd = "start " + url;
|
int wide_len =
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, url.c_str(), -1, nullptr, 0);
|
||||||
|
if (wide_len > 0) {
|
||||||
|
std::wstring wide_url(static_cast<size_t>(wide_len), L'\0');
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, url.c_str(), -1, &wide_url[0],
|
||||||
|
wide_len);
|
||||||
|
if (!wide_url.empty() && wide_url.back() == L'\0') {
|
||||||
|
wide_url.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring cmd = L"cmd.exe /c start \"\" \"" + wide_url + L"\"";
|
||||||
|
STARTUPINFOW startup_info = {sizeof(startup_info)};
|
||||||
|
PROCESS_INFORMATION process_info = {};
|
||||||
|
if (CreateProcessW(nullptr, &cmd[0], nullptr, nullptr, FALSE,
|
||||||
|
CREATE_NO_WINDOW, nullptr, nullptr, &startup_info,
|
||||||
|
&process_info)) {
|
||||||
|
CloseHandle(process_info.hThread);
|
||||||
|
CloseHandle(process_info.hProcess);
|
||||||
|
}
|
||||||
|
}
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
std::string cmd = "open " + url;
|
std::string cmd = "open " + url;
|
||||||
#else
|
#else
|
||||||
std::string cmd = "xdg-open " + url;
|
std::string cmd = "xdg-open " + url;
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(_WIN32)
|
||||||
system(cmd.c_str()); // open browser
|
system(cmd.c_str()); // open browser
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ int Render::FileTransferWindow(
|
|||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 3.0f);
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 3.0f);
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f);
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f);
|
||||||
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 0.9f));
|
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1.0f, 1.0f, 1.0f, 0.9f));
|
||||||
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0f, 0.0f, 0.0f, 0.3f));
|
||||||
ImGui::PushStyleColor(ImGuiCol_TitleBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
ImGui::PushStyleColor(ImGuiCol_TitleBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
ImGui::PushStyleColor(ImGuiCol_TitleBgActive, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
ImGui::PushStyleColor(ImGuiCol_TitleBgActive, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "localization.h"
|
#include "localization.h"
|
||||||
#include "rd_log.h"
|
#include "rd_log.h"
|
||||||
#include "render.h"
|
#include "render.h"
|
||||||
|
#include "tinyfiledialogs.h"
|
||||||
|
|
||||||
namespace crossdesk {
|
namespace crossdesk {
|
||||||
|
|
||||||
@@ -15,28 +16,28 @@ int Render::SettingWindow() {
|
|||||||
!defined(__arm__) && USE_CUDA) || \
|
!defined(__arm__) && USE_CUDA) || \
|
||||||
defined(__APPLE__))
|
defined(__APPLE__))
|
||||||
ImGui::SetNextWindowPos(
|
ImGui::SetNextWindowPos(
|
||||||
ImVec2(io.DisplaySize.x * 0.343f, io.DisplaySize.y * 0.07f));
|
ImVec2(io.DisplaySize.x * 0.343f, io.DisplaySize.y * 0.05f));
|
||||||
ImGui::SetNextWindowSize(
|
ImGui::SetNextWindowSize(
|
||||||
ImVec2(io.DisplaySize.x * 0.315f, io.DisplaySize.y * 0.85f));
|
ImVec2(io.DisplaySize.x * 0.315f, io.DisplaySize.y * 0.9f));
|
||||||
#else
|
#else
|
||||||
ImGui::SetNextWindowPos(
|
ImGui::SetNextWindowPos(
|
||||||
ImVec2(io.DisplaySize.x * 0.343f, io.DisplaySize.y * 0.1f));
|
ImVec2(io.DisplaySize.x * 0.343f, io.DisplaySize.y * 0.08f));
|
||||||
ImGui::SetNextWindowSize(
|
ImGui::SetNextWindowSize(
|
||||||
ImVec2(io.DisplaySize.x * 0.315f, io.DisplaySize.y * 0.8f));
|
ImVec2(io.DisplaySize.x * 0.315f, io.DisplaySize.y * 0.85f));
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#if (((defined(_WIN32) || defined(__linux__)) && !defined(__aarch64__) && \
|
#if (((defined(_WIN32) || defined(__linux__)) && !defined(__aarch64__) && \
|
||||||
!defined(__arm__) && USE_CUDA) || \
|
!defined(__arm__) && USE_CUDA) || \
|
||||||
defined(__APPLE__))
|
defined(__APPLE__))
|
||||||
ImGui::SetNextWindowPos(
|
ImGui::SetNextWindowPos(
|
||||||
ImVec2(io.DisplaySize.x * 0.297f, io.DisplaySize.y * 0.07f));
|
ImVec2(io.DisplaySize.x * 0.297f, io.DisplaySize.y * 0.05f));
|
||||||
ImGui::SetNextWindowSize(
|
ImGui::SetNextWindowSize(
|
||||||
ImVec2(io.DisplaySize.x * 0.407f, io.DisplaySize.y * 0.85f));
|
ImVec2(io.DisplaySize.x * 0.407f, io.DisplaySize.y * 0.9f));
|
||||||
#else
|
#else
|
||||||
ImGui::SetNextWindowPos(
|
ImGui::SetNextWindowPos(
|
||||||
ImVec2(io.DisplaySize.x * 0.297f, io.DisplaySize.y * 0.1f));
|
ImVec2(io.DisplaySize.x * 0.297f, io.DisplaySize.y * 0.08f));
|
||||||
ImGui::SetNextWindowSize(
|
ImGui::SetNextWindowSize(
|
||||||
ImVec2(io.DisplaySize.x * 0.407f, io.DisplaySize.y * 0.8f));
|
ImVec2(io.DisplaySize.x * 0.407f, io.DisplaySize.y * 0.85f));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,6 +352,62 @@ int Render::SettingWindow() {
|
|||||||
&enable_minimize_to_tray_);
|
&enable_minimize_to_tray_);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
ImGui::Separator();
|
||||||
|
|
||||||
|
{
|
||||||
|
settings_items_offset += settings_items_padding;
|
||||||
|
ImGui::SetCursorPosY(settings_items_offset);
|
||||||
|
ImGui::AlignTextToFramePadding();
|
||||||
|
ImGui::Text(
|
||||||
|
"%s",
|
||||||
|
localization::file_transfer_save_path[localization_language_index_]
|
||||||
|
.c_str());
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ConfigCenter::LANGUAGE::CHINESE == localization_language_) {
|
||||||
|
ImGui::SetCursorPosX(title_bar_button_width_ * 2.8f);
|
||||||
|
} else {
|
||||||
|
ImGui::SetCursorPosX(title_bar_button_width_ * 4.3f);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string display_path =
|
||||||
|
strlen(file_transfer_save_path_buf_) > 0
|
||||||
|
? file_transfer_save_path_buf_
|
||||||
|
: localization::default_desktop[localization_language_index_];
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered,
|
||||||
|
ImVec4(0.95f, 0.95f, 0.95f, 1.0f));
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive,
|
||||||
|
ImVec4(0.9f, 0.9f, 0.9f, 1.0f));
|
||||||
|
ImGui::PushFont(main_windows_system_chinese_font_);
|
||||||
|
if (ImGui::Button(display_path.c_str(),
|
||||||
|
ImVec2(title_bar_button_width_ * 2.0f, 0))) {
|
||||||
|
const char* folder =
|
||||||
|
tinyfd_selectFolderDialog(localization::file_transfer_save_path
|
||||||
|
[localization_language_index_]
|
||||||
|
.c_str(),
|
||||||
|
strlen(file_transfer_save_path_buf_) > 0
|
||||||
|
? file_transfer_save_path_buf_
|
||||||
|
: nullptr);
|
||||||
|
if (folder) {
|
||||||
|
strncpy(file_transfer_save_path_buf_, folder,
|
||||||
|
sizeof(file_transfer_save_path_buf_) - 1);
|
||||||
|
file_transfer_save_path_buf_[sizeof(file_transfer_save_path_buf_) -
|
||||||
|
1] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ImGui::IsItemHovered() &&
|
||||||
|
strlen(file_transfer_save_path_buf_) > 0) {
|
||||||
|
ImGui::BeginTooltip();
|
||||||
|
ImGui::SetWindowFontScale(0.5f);
|
||||||
|
ImGui::Text("%s", file_transfer_save_path_buf_);
|
||||||
|
ImGui::SetWindowFontScale(1.0f);
|
||||||
|
ImGui::EndTooltip();
|
||||||
|
}
|
||||||
|
ImGui::PopFont();
|
||||||
|
ImGui::PopStyleColor(3);
|
||||||
|
}
|
||||||
|
|
||||||
if (stream_window_inited_) {
|
if (stream_window_inited_) {
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
}
|
}
|
||||||
@@ -469,6 +526,10 @@ int Render::SettingWindow() {
|
|||||||
enable_minimize_to_tray_last_ = enable_minimize_to_tray_;
|
enable_minimize_to_tray_last_ = enable_minimize_to_tray_;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// File transfer save path
|
||||||
|
config_center_->SetFileTransferSavePath(file_transfer_save_path_buf_);
|
||||||
|
file_transfer_save_path_last_ = file_transfer_save_path_buf_;
|
||||||
|
|
||||||
settings_window_pos_reset_ = true;
|
settings_window_pos_reset_ = true;
|
||||||
|
|
||||||
// Recreate peer instance
|
// Recreate peer instance
|
||||||
@@ -516,6 +577,13 @@ int Render::SettingWindow() {
|
|||||||
enable_turn_ = enable_turn_last_;
|
enable_turn_ = enable_turn_last_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Restore file transfer save path
|
||||||
|
strncpy(file_transfer_save_path_buf_,
|
||||||
|
file_transfer_save_path_last_.c_str(),
|
||||||
|
sizeof(file_transfer_save_path_buf_) - 1);
|
||||||
|
file_transfer_save_path_buf_[sizeof(file_transfer_save_path_buf_) - 1] =
|
||||||
|
'\0';
|
||||||
|
|
||||||
settings_window_pos_reset_ = true;
|
settings_window_pos_reset_ = true;
|
||||||
}
|
}
|
||||||
ImGui::SetWindowFontScale(0.5f);
|
ImGui::SetWindowFontScale(0.5f);
|
||||||
|
|||||||
@@ -97,6 +97,14 @@ class FileReceiver {
|
|||||||
|
|
||||||
const std::filesystem::path& OutputDir() const { return output_dir_; }
|
const std::filesystem::path& OutputDir() const { return output_dir_; }
|
||||||
|
|
||||||
|
void SetOutputDir(const std::filesystem::path& dir) {
|
||||||
|
output_dir_ = dir;
|
||||||
|
if (!output_dir_.empty()) {
|
||||||
|
std::error_code ec;
|
||||||
|
std::filesystem::create_directories(output_dir_, ec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::filesystem::path GetDefaultDesktopPath();
|
static std::filesystem::path GetDefaultDesktopPath();
|
||||||
|
|
||||||
|
|||||||
@@ -204,3 +204,6 @@ target("crossdesk")
|
|||||||
add_deps("rd_log", "common", "gui")
|
add_deps("rd_log", "common", "gui")
|
||||||
add_files("src/app/*.cpp")
|
add_files("src/app/*.cpp")
|
||||||
add_includedirs("src/app", {public = true})
|
add_includedirs("src/app", {public = true})
|
||||||
|
if is_os("windows") then
|
||||||
|
add_files("scripts/windows/crossdesk.rc")
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user