✨ 新增: 添加工作目录设置相关函数
📝 修改: 实现工作目录设置及自动工作目录的逻辑 📝 修改: 更新菜单和命令行输入设置涉及的逻辑 🔧 修复: 修改自启动相关的注册表键名生成逻辑main
parent
eb3a5aa939
commit
286bd74835
|
@ -44,8 +44,9 @@ public:
|
||||||
void SetStopCommand(const std::string& command, int timeout_ms = 5000);
|
void SetStopCommand(const std::string& command, int timeout_ms = 5000);
|
||||||
void SetEnvironmentVariables(const std::map<std::string, std::string>& env_vars);
|
void SetEnvironmentVariables(const std::map<std::string, std::string>& env_vars);
|
||||||
void SetOutputEncoding(OutputEncoding encoding);
|
void SetOutputEncoding(OutputEncoding encoding);
|
||||||
|
void SetAutoWorkingDir(bool auto_dir);
|
||||||
|
|
||||||
// 新增:工作目录设置
|
// 工作目录设置
|
||||||
void SetWorkingDirectory(const std::string& working_dir);
|
void SetWorkingDirectory(const std::string& working_dir);
|
||||||
std::string GetWorkingDirectory() const;
|
std::string GetWorkingDirectory() const;
|
||||||
|
|
||||||
|
|
|
@ -26,38 +26,40 @@ CLIProcess::CLIProcess() {
|
||||||
max_log_lines_ = 1000;
|
max_log_lines_ = 1000;
|
||||||
stop_timeout_ms_ = 5000;
|
stop_timeout_ms_ = 5000;
|
||||||
output_encoding_ = OutputEncoding::AUTO_DETECT;
|
output_encoding_ = OutputEncoding::AUTO_DETECT;
|
||||||
use_auto_working_dir_ = false; // 自动工作目录
|
use_auto_working_dir_ = true; // 自动工作目录
|
||||||
}
|
}
|
||||||
|
|
||||||
CLIProcess::~CLIProcess() {
|
CLIProcess::~CLIProcess() {
|
||||||
Stop();
|
Stop();
|
||||||
CleanupResources();
|
CleanupResources();
|
||||||
}
|
}
|
||||||
|
void CLIProcess::SetAutoWorkingDir(const bool auto_dir) {
|
||||||
// 新增:设置工作目录
|
use_auto_working_dir_ = auto_dir;
|
||||||
|
}
|
||||||
|
// 设置工作目录
|
||||||
void CLIProcess::SetWorkingDirectory(const std::string& working_dir) {
|
void CLIProcess::SetWorkingDirectory(const std::string& working_dir) {
|
||||||
std::lock_guard<std::mutex> lock(working_dir_mutex_);
|
std::lock_guard<std::mutex> lock(working_dir_mutex_);
|
||||||
if (working_dir.empty()) {
|
if (working_dir.empty()) {
|
||||||
use_auto_working_dir_ = true;
|
// use_auto_working_dir_ = true;
|
||||||
working_directory_.clear();
|
working_directory_.clear();
|
||||||
} else {
|
} else {
|
||||||
if (DirectoryExists(working_dir)) {
|
if (DirectoryExists(working_dir)) {
|
||||||
working_directory_ = GetAbsolutePath(working_dir);
|
working_directory_ = GetAbsolutePath(working_dir);
|
||||||
use_auto_working_dir_ = false;
|
use_auto_working_dir_ = false;
|
||||||
AddLog("工作目录已设置为: " + working_directory_);
|
// AddLog("工作目录已设置为: " + working_directory_);
|
||||||
} else {
|
} else {
|
||||||
AddLog("警告: 指定的工作目录不存在: " + working_dir);
|
AddLog("警告: 指定的工作目录不存在: " + working_dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增:获取当前工作目录设置
|
// 获取当前工作目录设置
|
||||||
std::string CLIProcess::GetWorkingDirectory() const {
|
std::string CLIProcess::GetWorkingDirectory() const {
|
||||||
std::lock_guard<std::mutex> lock(working_dir_mutex_);
|
std::lock_guard<std::mutex> lock(working_dir_mutex_);
|
||||||
return working_directory_;
|
return working_directory_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增:从命令中提取目录路径
|
// 从命令中提取目录路径
|
||||||
std::string CLIProcess::ExtractDirectoryFromCommand(const std::string& command) {
|
std::string CLIProcess::ExtractDirectoryFromCommand(const std::string& command) {
|
||||||
if (command.empty()) return "";
|
if (command.empty()) return "";
|
||||||
|
|
||||||
|
@ -470,7 +472,7 @@ void CLIProcess::Start(const std::string& command) {
|
||||||
|
|
||||||
// AddLog("环境变量设置完成,数量: " + std::to_string(environment_variables_.size()));
|
// AddLog("环境变量设置完成,数量: " + std::to_string(environment_variables_.size()));
|
||||||
} else {
|
} else {
|
||||||
AddLog("未设置自定义环境变量,使用默认环境 PWD:" + WideToString(working_dir));
|
// AddLog("未设置自定义环境变量,使用默认环境 PWD:" + WideToString(working_dir));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL result = CreateProcess(
|
BOOL result = CreateProcess(
|
||||||
|
|
|
@ -111,6 +111,7 @@ bool Manager::Initialize() {
|
||||||
m_app_state.LoadSettings();
|
m_app_state.LoadSettings();
|
||||||
m_app_state.auto_start = IsAutoStartEnabled();
|
m_app_state.auto_start = IsAutoStartEnabled();
|
||||||
m_app_state.ApplySettings();
|
m_app_state.ApplySettings();
|
||||||
|
m_app_state.SaveSettings();
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
m_tray->UpdateWebUrl(StringToWide(m_app_state.web_url));
|
m_tray->UpdateWebUrl(StringToWide(m_app_state.web_url));
|
||||||
|
@ -122,6 +123,8 @@ bool Manager::Initialize() {
|
||||||
// 如果开启了开机自启动且有启动命令,则自动启动子进程
|
// 如果开启了开机自启动且有启动命令,则自动启动子进程
|
||||||
if (m_app_state.auto_start && strlen(m_app_state.command_input) > 0) {
|
if (m_app_state.auto_start && strlen(m_app_state.command_input) > 0) {
|
||||||
m_app_state.cli_process.Start(m_app_state.command_input);
|
m_app_state.cli_process.Start(m_app_state.command_input);
|
||||||
|
m_app_state.show_main_window = false;
|
||||||
|
HideMainWindow();
|
||||||
}
|
}
|
||||||
m_tray->UpdateStatus(m_app_state.cli_process.IsRunning() ? L"运行中" : L"已停止", m_app_state.cli_process.GetPid());
|
m_tray->UpdateStatus(m_app_state.cli_process.IsRunning() ? L"运行中" : L"已停止", m_app_state.cli_process.GetPid());
|
||||||
m_initialized = true;
|
m_initialized = true;
|
||||||
|
@ -235,9 +238,11 @@ void Manager::RenderUI() {
|
||||||
|
|
||||||
// 设置默认布局(仅在第一次运行时)
|
// 设置默认布局(仅在第一次运行时)
|
||||||
SetupDefaultDockingLayout(m_dockspace_id);
|
SetupDefaultDockingLayout(m_dockspace_id);
|
||||||
|
|
||||||
ImGuiWindowClass window_class;
|
ImGuiWindowClass window_class;
|
||||||
window_class.DockNodeFlagsOverrideSet = ImGuiDockNodeFlags_NoWindowMenuButton;
|
window_class.DockNodeFlagsOverrideSet = ImGuiDockNodeFlags_NoWindowMenuButton;
|
||||||
ImGui::SetNextWindowClass(&window_class);
|
ImGui::SetNextWindowClass(&window_class);
|
||||||
|
|
||||||
RenderMainContent();
|
RenderMainContent();
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
@ -541,7 +546,11 @@ void Manager::RenderSettingsMenu() {
|
||||||
SetAutoStart(m_app_state.auto_start);
|
SetAutoStart(m_app_state.auto_start);
|
||||||
m_app_state.settings_dirty = true;
|
m_app_state.settings_dirty = true;
|
||||||
}
|
}
|
||||||
|
if (ImGui::MenuItem("自动工作路径", nullptr, m_app_state.auto_working_dir)) {
|
||||||
|
m_app_state.auto_working_dir = !m_app_state.auto_working_dir;
|
||||||
|
m_app_state.cli_process.SetAutoWorkingDir(m_app_state.auto_working_dir);
|
||||||
|
m_app_state.settings_dirty = true;
|
||||||
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
ImGui::Text("日志设置");
|
ImGui::Text("日志设置");
|
||||||
if (ImGui::InputInt("最大日志行数", &m_app_state.max_log_lines, 100, 500)) {
|
if (ImGui::InputInt("最大日志行数", &m_app_state.max_log_lines, 100, 500)) {
|
||||||
|
@ -732,7 +741,7 @@ void Manager::RenderOutputEncodingSettings() {
|
||||||
|
|
||||||
void Manager::RenderControlPanel(float buttonWidth, float buttonHeight, float inputWidth) {
|
void Manager::RenderControlPanel(float buttonWidth, float buttonHeight, float inputWidth) {
|
||||||
// 启动命令输入区域
|
// 启动命令输入区域
|
||||||
ImGui::SeparatorText("启动命令");
|
ImGui::SeparatorText("CLI程序");
|
||||||
|
|
||||||
// 命令输入框和历史记录按钮
|
// 命令输入框和历史记录按钮
|
||||||
ImGui::SetNextItemWidth(inputWidth);
|
ImGui::SetNextItemWidth(inputWidth);
|
||||||
|
@ -749,7 +758,11 @@ void Manager::RenderControlPanel(float buttonWidth, float buttonHeight, float in
|
||||||
if (show_command_history_) {
|
if (show_command_history_) {
|
||||||
RenderCommandHistory();
|
RenderCommandHistory();
|
||||||
}
|
}
|
||||||
|
ImGui::SeparatorText("工作路径(留空且开启自动路径为文件父路径、不然为管理器路径)");
|
||||||
|
if (ImGui::InputText("##工作路径", m_app_state.working_directory, IM_ARRAYSIZE(m_app_state.working_directory))) {
|
||||||
|
m_app_state.cli_process.SetWorkingDirectory(m_app_state.working_directory);
|
||||||
|
m_app_state.settings_dirty = true;
|
||||||
|
}
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
|
|
||||||
// 控制按钮组
|
// 控制按钮组
|
||||||
|
@ -758,6 +771,11 @@ void Manager::RenderControlPanel(float buttonWidth, float buttonHeight, float in
|
||||||
if (strlen(m_app_state.command_input) > 0) {
|
if (strlen(m_app_state.command_input) > 0) {
|
||||||
m_app_state.cli_process.Start(m_app_state.command_input);
|
m_app_state.cli_process.Start(m_app_state.command_input);
|
||||||
m_app_state.AddCommandToHistory(m_app_state.command_input);
|
m_app_state.AddCommandToHistory(m_app_state.command_input);
|
||||||
|
if (strlen(m_app_state.working_directory) > 0) {
|
||||||
|
m_app_state.cli_process.SetWorkingDirectory(m_app_state.working_directory);
|
||||||
|
}else {
|
||||||
|
strncpy_s(m_app_state.working_directory,m_app_state.cli_process.GetWorkingDirectory().c_str(),sizeof(m_app_state.working_directory)-1);
|
||||||
|
}
|
||||||
m_tray->UpdateStatus(m_app_state.cli_process.IsRunning() ? L"运行中" : L"已停止",
|
m_tray->UpdateStatus(m_app_state.cli_process.IsRunning() ? L"运行中" : L"已停止",
|
||||||
m_app_state.cli_process.GetPid());
|
m_app_state.cli_process.GetPid());
|
||||||
}
|
}
|
||||||
|
@ -1133,7 +1151,6 @@ void Manager::ContentScaleCallback(GLFWwindow *window, float xscale, float yscal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_WIN32_BACKEND
|
#ifdef USE_WIN32_BACKEND
|
||||||
bool Manager::InitializeWin32() {
|
bool Manager::InitializeWin32() {
|
||||||
m_wc = {};
|
m_wc = {};
|
||||||
|
@ -1478,7 +1495,6 @@ void Manager::ReloadFonts() const {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
// macOS 特定的辅助函数声明
|
// macOS 特定的辅助函数声明
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -32,12 +32,22 @@ void SetAutoStart(bool enable) {
|
||||||
WCHAR exePath[MAX_PATH];
|
WCHAR exePath[MAX_PATH];
|
||||||
GetModuleFileName(NULL, exePath, MAX_PATH);
|
GetModuleFileName(NULL, exePath, MAX_PATH);
|
||||||
|
|
||||||
|
// 计算路径的简单哈希值
|
||||||
|
size_t hash = 0;
|
||||||
|
for (size_t i = 0; i < wcslen(exePath); i++) {
|
||||||
|
hash = (hash * 31) + exePath[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建包含哈希的键名
|
||||||
|
WCHAR keyName[32];
|
||||||
|
swprintf(keyName, 32, L"CLIManager_%08X", static_cast<unsigned int>(hash));
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
RegSetValueEx(hKey, L"CLIManager", 0, REG_SZ,
|
RegSetValueEx(hKey, keyName, 0, REG_SZ,
|
||||||
(BYTE*)exePath, (wcslen(exePath) + 1) * sizeof(WCHAR));
|
(BYTE*)exePath, (wcslen(exePath) + 1) * sizeof(WCHAR));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
RegDeleteValue(hKey, L"CLIManager");
|
RegDeleteValue(hKey, keyName);
|
||||||
}
|
}
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
}
|
}
|
||||||
|
@ -49,8 +59,21 @@ bool IsAutoStartEnabled() {
|
||||||
if (RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
|
if (RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
WCHAR exePath[MAX_PATH];
|
||||||
|
GetModuleFileName(NULL, exePath, MAX_PATH);
|
||||||
|
|
||||||
|
// 计算相同的哈希值
|
||||||
|
size_t hash = 0;
|
||||||
|
for (size_t i = 0; i < wcslen(exePath); i++) {
|
||||||
|
hash = (hash * 31) + exePath[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建相同的键名用于查询
|
||||||
|
WCHAR keyName[32];
|
||||||
|
swprintf(keyName, 32, L"CLIManager_%08X", static_cast<unsigned int>(hash));
|
||||||
|
|
||||||
DWORD type, size = 0;
|
DWORD type, size = 0;
|
||||||
bool exists = (RegQueryValueEx(hKey, L"CLIManager", NULL, &type, NULL, &size) == ERROR_SUCCESS);
|
bool exists = (RegQueryValueEx(hKey, keyName, NULL, &type, NULL, &size) == ERROR_SUCCESS);
|
||||||
|
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
return exists;
|
return exists;
|
||||||
|
|
Loading…
Reference in New Issue