From 9b84f28cbaa75a4e8495a6863288561d96aa65a9 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sun, 5 Apr 2026 21:25:12 -0500 Subject: [PATCH] Rework server initialization * Only create server instance if server is actually needed * Pass initial server host and port through ResourceManager * Allow setting default server host and port in Server settings --- NetworkProtocol.h | 2 +- ProfileManager.cpp | 31 ++- ResourceManager.cpp | 191 +++++++++++++----- ResourceManager.h | 7 + SettingsManager.cpp | 1 - cli.cpp | 17 +- qt/OpenRGBDialog/OpenRGBDialog.cpp | 9 +- .../OpenRGBServerInfoPage.cpp | 65 ++++-- .../OpenRGBServerInfoPage.h | 2 +- .../OpenRGBSettingsPage.cpp | 28 +++ qt/OpenRGBSettingsPage/OpenRGBSettingsPage.h | 2 + qt/OpenRGBSettingsPage/OpenRGBSettingsPage.ui | 39 +++- 12 files changed, 297 insertions(+), 97 deletions(-) diff --git a/NetworkProtocol.h b/NetworkProtocol.h index 195886d06..d0add765c 100644 --- a/NetworkProtocol.h +++ b/NetworkProtocol.h @@ -28,7 +28,7 @@ /*-----------------------------------------------------*\ | Default Interface to bind to. | \*-----------------------------------------------------*/ -#define OPENRGB_SDK_HOST "0.0.0.0" +#define OPENRGB_SDK_HOST "127.0.0.1" /*-----------------------------------------------------*\ | Default OpenRGB SDK port is 6742 | diff --git a/ProfileManager.cpp b/ProfileManager.cpp index ac9dec057..d8c9c94a2 100644 --- a/ProfileManager.cpp +++ b/ProfileManager.cpp @@ -911,7 +911,12 @@ void ProfileManager::SetActiveProfile(std::string profile_name) { active_profile = profile_name; - ResourceManager::get()->GetServer()->SendRequest_ProfileManager_ActiveProfileChanged(active_profile); + NetworkServer* server = ResourceManager::get()->GetServer(); + + if(server) + { + server->SendRequest_ProfileManager_ActiveProfileChanged(active_profile); + } SignalProfileManagerUpdate(PROFILEMANAGER_UPDATE_REASON_ACTIVE_PROFILE_CHANGED); } @@ -969,7 +974,12 @@ void ProfileManager::SetProfileListFromDescription(unsigned int /*data_size*/, c void ProfileManager::SignalProfileManagerUpdate(unsigned int update_reason) { - ResourceManager::get()->GetServer()->SignalProfileManagerUpdate(update_reason); + NetworkServer* server = ResourceManager::get()->GetServer(); + + if(server) + { + server->SignalProfileManagerUpdate(update_reason); + } ProfileManagerCallbackMutex.lock(); @@ -1355,7 +1365,12 @@ bool ProfileManager::LoadProfileWithOptions plugin_manager->OnProfileAboutToLoad(); } - ResourceManager::get()->GetServer()->ProfileManager_ProfileAboutToLoad(); + NetworkServer* server = ResourceManager::get()->GetServer(); + + if(server) + { + server->ProfileManager_ProfileAboutToLoad(); + } /*-------------------------------------------------*\ | Get the list of controllers from the resource | @@ -1384,14 +1399,20 @@ bool ProfileManager::LoadProfileWithOptions /*-------------------------------------------------*\ | Notify local client | \*-------------------------------------------------*/ - ResourceManager::get()->GetServer()->SendRequest_ProfileManager_ProfileLoaded(profile_json.dump()); + if(server) + { + server->SendRequest_ProfileManager_ProfileLoaded(profile_json.dump()); + } /*-------------------------------------------------*\ | Update active profile | \*-------------------------------------------------*/ SetActiveProfile(profile_name); - ResourceManager::get()->GetServer()->SendRequest_ProfileManager_ActiveProfileChanged(active_profile); + if(server) + { + server->SendRequest_ProfileManager_ActiveProfileChanged(active_profile); + } return(true); } diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 7bc6066a5..0b5d9bc23 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -132,9 +132,12 @@ ResourceManager::ResourceManager() \*-----------------------------------------------------*/ auto_connection_client = NULL; auto_connection_active = false; + default_server_host = ""; + default_server_port = 0; detection_enabled = true; init_finished = false; plugin_manager = NULL; + server = NULL; SetupConfigurationDirectory(); @@ -150,44 +153,10 @@ ResourceManager::ResourceManager() \*-----------------------------------------------------*/ LogManager::get()->configure(settings_manager->GetSettings("LogManager"), GetConfigurationDirectory()); - /*-----------------------------------------------------*\ - | Initialize Server Instance | - | If configured, pass through full controller list | - | including clients. Otherwise, pass only local | - | hardware controllers | - \*-----------------------------------------------------*/ - json server_settings = settings_manager->GetSettings("Server"); - bool legacy_workaround = false; - - server = new NetworkServer(); - - /*-----------------------------------------------------*\ - | Set server name | - \*-----------------------------------------------------*/ - std::string titleString = "OpenRGB "; - titleString.append(VERSION_STRING); - - server->SetName(titleString); - server->SetSettingsManager(settings_manager); - - /*-----------------------------------------------------*\ - | Enable legacy SDK workaround in server if configured | - \*-----------------------------------------------------*/ - if(server_settings.contains("legacy_workaround")) - { - legacy_workaround = server_settings["legacy_workaround"]; - } - - if(legacy_workaround) - { - server->SetLegacyWorkaroundEnable(true); - } - /*-----------------------------------------------------*\ | Load sizes list from file | \*-----------------------------------------------------*/ profile_manager = new ProfileManager(GetConfigurationDirectory()); - server->SetProfileManager(profile_manager); } ResourceManager::~ResourceManager() @@ -224,6 +193,16 @@ filesystem::path ResourceManager::GetConfigurationDirectory() return(config_dir); } +std::string ResourceManager::GetDefaultServerHost() +{ + return(default_server_host); +} + +unsigned short ResourceManager::GetDefaultServerPort() +{ + return(default_server_port); +} + std::vector & ResourceManager::GetI2CBuses() { return DetectionManager::get()->GetI2CBuses(); @@ -266,10 +245,24 @@ void ResourceManager::SetConfigurationDirectory(const filesystem::path &director profile_manager->SetConfigurationDirectory(directory); } +void ResourceManager::SetDefaultServerHost(std::string new_server_host) +{ + default_server_host = new_server_host; +} + +void ResourceManager::SetDefaultServerPort(unsigned short new_server_port) +{ + default_server_port = new_server_port; +} + void ResourceManager::SetPluginManager(PluginManagerInterface* plugin_manager_ptr) { plugin_manager = plugin_manager_ptr; - server->SetPluginManager(plugin_manager); + + if(server) + { + server->SetPluginManager(plugin_manager); + } } /*---------------------------------------------------------*\ @@ -494,21 +487,24 @@ void ResourceManager::UpdateDeviceList() /*-----------------------------------------------------*\ | Update server list | \*-----------------------------------------------------*/ - json server_settings = settings_manager->GetSettings("Server"); - bool all_controllers = false; + if(server) + { + json server_settings = settings_manager->GetSettings("Server"); + bool all_controllers = false; - if(server_settings.contains("all_controllers")) - { - all_controllers = server_settings["all_controllers"]; - } + if(server_settings.contains("all_controllers")) + { + all_controllers = server_settings["all_controllers"]; + } - if(all_controllers) - { - server->SetControllers(rgb_controllers); - } - else - { - server->SetControllers(rgb_controllers_hw); + if(all_controllers) + { + server->SetControllers(rgb_controllers); + } + else + { + server->SetControllers(rgb_controllers_hw); + } } /*-----------------------------------------------------*\ @@ -532,7 +528,10 @@ void ResourceManager::WaitForDetection() \*---------------------------------------------------------*/ void ResourceManager::SignalResourceManagerUpdate(unsigned int update_reason) { - server->SignalResourceManagerUpdate(update_reason); + if(server) + { + server->SignalResourceManagerUpdate(update_reason); + } ResourceManagerCallbackMutex.lock(); @@ -724,13 +723,45 @@ void ResourceManager::Initialize(bool tryConnect, bool detectDevices, bool start } } + /*-----------------------------------------------------*\ + | If the server host and port have been set on the CLI, | + | use those values. Otherwise, get default server host | + | and port from settings if configured. | + \*-----------------------------------------------------*/ + json server_settings = settings_manager->GetSettings("Server"); + + if(default_server_host == "") + { + if(server_settings.contains("default_host")) + { + default_server_host = server_settings["default_host"]; + } + else + { + default_server_host = OPENRGB_SDK_HOST; + } + } + + if(default_server_port == 0) + { + if(server_settings.contains("default_port")) + { + default_server_port = server_settings["default_port"]; + } + else + { + default_server_port = OPENRGB_SDK_PORT; + } + } + /*-----------------------------------------------------*\ | Start server if requested | \*-----------------------------------------------------*/ if(start_server) { - GetServer()->StartServer(); - if(!GetServer()->GetOnline()) + InitializeServer(); + server->StartServer(); + if(!server->GetOnline()) { LOG_DEBUG("[%s] Server failed to start", RESOURCEMANAGER); } @@ -760,6 +791,64 @@ void ResourceManager::Initialize(bool tryConnect, bool detectDevices, bool start init_finished = true; } +void ResourceManager::InitializeServer() +{ + /*-----------------------------------------------------*\ + | Initialize Server Instance | + | If configured, pass through full controller list | + | including clients. Otherwise, pass only local | + | hardware controllers | + \*-----------------------------------------------------*/ + json server_settings = settings_manager->GetSettings("Server"); + bool legacy_workaround = false; + + server = new NetworkServer(); + + /*-----------------------------------------------------*\ + | Set server name | + \*-----------------------------------------------------*/ + std::string titleString = "OpenRGB "; + titleString.append(VERSION_STRING); + + server->SetName(titleString); + server->SetSettingsManager(settings_manager); + + /*-----------------------------------------------------*\ + | Enable legacy SDK workaround in server if configured | + \*-----------------------------------------------------*/ + if(server_settings.contains("legacy_workaround")) + { + legacy_workaround = server_settings["legacy_workaround"]; + } + + if(legacy_workaround) + { + server->SetLegacyWorkaroundEnable(true); + } + + server->SetProfileManager(profile_manager); + + if(plugin_manager) + { + server->SetPluginManager(plugin_manager); + } + + /*-----------------------------------------------------*\ + | If the server host and port have been set on the CLI, | + | use those values. Otherwise, get default server host | + | and port from settings if configured. | + \*-----------------------------------------------------*/ + if(default_server_host != "") + { + server->SetHost(default_server_host); + } + + if(default_server_port != 0) + { + server->SetPort(default_server_port); + } +} + void ResourceManager::WaitForInitialization() { /*-----------------------------------------------------*\ diff --git a/ResourceManager.h b/ResourceManager.h index 4135dd8f6..292c43ef1 100644 --- a/ResourceManager.h +++ b/ResourceManager.h @@ -52,6 +52,8 @@ public: \*-----------------------------------------------------*/ std::vector& GetClients(); filesystem::path GetConfigurationDirectory(); + std::string GetDefaultServerHost(); + unsigned short GetDefaultServerPort(); LogManager* GetLogManager(); std::vector& GetI2CBuses(); PluginManagerInterface* GetPluginManager(); @@ -61,6 +63,8 @@ public: SettingsManager* GetSettingsManager(); void SetConfigurationDirectory(const filesystem::path &directory); + void SetDefaultServerHost(std::string server_host); + void SetDefaultServerPort(unsigned short server_port); void SetPluginManager(PluginManagerInterface* plugin_manager_ptr); /*-----------------------------------------------------*\ @@ -99,6 +103,7 @@ public: void SignalResourceManagerUpdate(unsigned int update_reason); void Initialize(bool tryConnect, bool detectDevices, bool startServer, bool applyPostOptions); + void InitializeServer(); void WaitForInitialization(); @@ -170,6 +175,8 @@ private: | Network Server | \*-----------------------------------------------------*/ NetworkServer* server; + std::string default_server_host; + unsigned short default_server_port; /*-----------------------------------------------------*\ | Network Clients | diff --git a/SettingsManager.cpp b/SettingsManager.cpp index a21d3a636..e87d04e11 100644 --- a/SettingsManager.cpp +++ b/SettingsManager.cpp @@ -27,7 +27,6 @@ static const std::string ui_settings_keys[7] = "Plugins", "Client", "LogManager", - "Server" }; SettingsManager::SettingsManager() diff --git a/cli.cpp b/cli.cpp index a52bc203f..0ba1139ac 100644 --- a/cli.cpp +++ b/cli.cpp @@ -1269,8 +1269,6 @@ unsigned int cli_pre_detection(int argc, char* argv[]) int arg_index = 1; unsigned int cfg_args = 0; unsigned int ret_flags = 0; - std::string server_host = OPENRGB_SDK_HOST; - unsigned short server_port = OPENRGB_SDK_PORT; bool server_start = false; bool print_help = false; @@ -1408,14 +1406,14 @@ unsigned int cli_pre_detection(int argc, char* argv[]) \*---------------------------------------------------------*/ else if(option == "--server-port") { - if (argument != "") + if(argument != "") { try { int port = std::stoi(argument); - if (port >= 1024 && port <= 65535) + if(port >= 1024 && port <= 65535) { - server_port = port; + ResourceManager::get()->SetDefaultServerPort(port); server_start = true; } else @@ -1446,11 +1444,9 @@ unsigned int cli_pre_detection(int argc, char* argv[]) \*---------------------------------------------------------*/ else if(option == "--server-host") { - if (argument != "") + if(argument != "") { - std::string host = argument; - - server_host = host; + ResourceManager::get()->SetDefaultServerHost(argument); server_start = true; } else @@ -1694,9 +1690,6 @@ unsigned int cli_pre_detection(int argc, char* argv[]) if(server_start) { - NetworkServer * server = ResourceManager::get()->GetServer(); - server->SetHost(server_host); - server->SetPort(server_port); ret_flags |= RET_FLAG_START_SERVER; } diff --git a/qt/OpenRGBDialog/OpenRGBDialog.cpp b/qt/OpenRGBDialog/OpenRGBDialog.cpp index 9dd15f047..32f3f77a6 100644 --- a/qt/OpenRGBDialog/OpenRGBDialog.cpp +++ b/qt/OpenRGBDialog/OpenRGBDialog.cpp @@ -871,9 +871,12 @@ void OpenRGBDialog::AddServerTab() /*-----------------------------------------------------*\ | Add server information tab if there is a server | \*-----------------------------------------------------*/ - OpenRGBServerInfoPage *ServerInfoPage = new OpenRGBServerInfoPage(ResourceManager::get()->GetServer()); - ServerInfoPage->setObjectName(QString("SDK Server")); - ui->MainTabBar->insertTab(2, ServerInfoPage, tr("SDK Server")); + if(!ResourceManager::get()->IsLocalClient()) + { + OpenRGBServerInfoPage *ServerInfoPage = new OpenRGBServerInfoPage(); + ServerInfoPage->setObjectName(QString("SDK Server")); + ui->MainTabBar->insertTab(2, ServerInfoPage, tr("SDK Server")); + } } void OpenRGBDialog::ClearDevicesList() diff --git a/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.cpp b/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.cpp index 76285559b..b3dfa2781 100644 --- a/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.cpp +++ b/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.cpp @@ -17,18 +17,21 @@ static void UpdateInfoCallback(void * this_ptr) QMetaObject::invokeMethod(this_obj, "UpdateInfo", Qt::QueuedConnection); } -OpenRGBServerInfoPage::OpenRGBServerInfoPage(NetworkServer * server, QWidget *parent) : +OpenRGBServerInfoPage::OpenRGBServerInfoPage(QWidget *parent) : QFrame(parent), ui(new Ui::OpenRGBServerInfoPage) { - network_server = server; - ui->setupUi(this); - UpdateInfo(); + network_server = ResourceManager::get()->GetServer(); - network_server->RegisterClientInfoChangeCallback(UpdateInfoCallback, this); - network_server->RegisterServerListeningChangeCallback(UpdateInfoCallback, this); + if(network_server) + { + network_server->RegisterClientInfoChangeCallback(UpdateInfoCallback, this); + network_server->RegisterServerListeningChangeCallback(UpdateInfoCallback, this); + } + + UpdateInfo(); } OpenRGBServerInfoPage::~OpenRGBServerInfoPage() @@ -46,10 +49,18 @@ void OpenRGBServerInfoPage::changeEvent(QEvent *event) void OpenRGBServerInfoPage::UpdateInfo() { - ui->ServerHostValue->setText(network_server->GetHost().c_str()); - ui->ServerPortValue->setText(std::to_string(network_server->GetPort()).c_str()); + if(network_server) + { + ui->ServerHostValue->setText(network_server->GetHost().c_str()); + ui->ServerPortValue->setText(std::to_string(network_server->GetPort()).c_str()); + } + else + { + ui->ServerHostValue->setText(ResourceManager::get()->GetDefaultServerHost().c_str()); + ui->ServerPortValue->setText(std::to_string(ResourceManager::get()->GetDefaultServerPort()).c_str()); + } - if(network_server->GetListening() && !network_server->GetOnline()) + if(network_server && network_server->GetListening() && !network_server->GetOnline()) { ui->ServerStatusValue->setText(tr("Stopping...")); ui->ServerStartButton->setEnabled(false); @@ -57,7 +68,7 @@ void OpenRGBServerInfoPage::UpdateInfo() ui->ServerHostValue->setEnabled(false); ui->ServerPortValue->setEnabled(false); } - else if(network_server->GetListening()) + else if(network_server && network_server->GetListening()) { ui->ServerStatusValue->setText(tr("Online")); ui->ServerStartButton->setEnabled(false); @@ -75,20 +86,33 @@ void OpenRGBServerInfoPage::UpdateInfo() } ui->ServerClientTree->clear(); - for(unsigned int client_idx = 0; client_idx < network_server->GetNumClients(); client_idx++) + + if(network_server) { - QTreeWidgetItem * new_item = new QTreeWidgetItem(); + for(unsigned int client_idx = 0; client_idx < network_server->GetNumClients(); client_idx++) + { + QTreeWidgetItem * new_item = new QTreeWidgetItem(); - new_item->setText(0, network_server->GetClientIP(client_idx)); - new_item->setText(1, QString::number(network_server->GetClientProtocolVersion(client_idx))); - new_item->setText(2, network_server->GetClientString(client_idx)); + new_item->setText(0, network_server->GetClientIP(client_idx)); + new_item->setText(1, QString::number(network_server->GetClientProtocolVersion(client_idx))); + new_item->setText(2, network_server->GetClientString(client_idx)); - ui->ServerClientTree->addTopLevelItem(new_item); + ui->ServerClientTree->addTopLevelItem(new_item); + } } } void OpenRGBServerInfoPage::on_ServerStartButton_clicked() { + if(!network_server) + { + ResourceManager::get()->InitializeServer(); + network_server = ResourceManager::get()->GetServer(); + + network_server->RegisterClientInfoChangeCallback(UpdateInfoCallback, this); + network_server->RegisterServerListeningChangeCallback(UpdateInfoCallback, this); + } + if(network_server->GetOnline() == false) { network_server->SetHost(ui->ServerHostValue->text().toStdString()); @@ -101,10 +125,13 @@ void OpenRGBServerInfoPage::on_ServerStartButton_clicked() void OpenRGBServerInfoPage::on_ServerStopButton_clicked() { - if(network_server->GetOnline() == true) + if(network_server) { - network_server->StopServer(); + if(network_server->GetOnline() == true) + { + network_server->StopServer(); - UpdateInfo(); + UpdateInfo(); + } } } diff --git a/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.h b/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.h index a43f60d21..2c9c1516f 100644 --- a/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.h +++ b/qt/OpenRGBServerInfoPage/OpenRGBServerInfoPage.h @@ -23,7 +23,7 @@ class OpenRGBServerInfoPage : public QFrame Q_OBJECT public: - explicit OpenRGBServerInfoPage(NetworkServer * server, QWidget *parent = nullptr); + explicit OpenRGBServerInfoPage(QWidget *parent = nullptr); ~OpenRGBServerInfoPage(); public slots: diff --git a/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.cpp b/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.cpp index 7b0878b7e..e0cff04d0 100644 --- a/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.cpp +++ b/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.cpp @@ -317,6 +317,18 @@ OpenRGBSettingsPage::OpenRGBSettingsPage(QWidget *parent) : ui->CheckboxLegacyWorkaround->setChecked(legacy_workaround); } + if(server_settings.contains("default_host")) + { + std::string host = server_settings["default_host"]; + ui->LineEditServerDefaultHost->setText(QString::fromStdString(host)); + } + + if(server_settings.contains("default_port")) + { + unsigned short port = server_settings["default_port"]; + ui->SpinBoxServerDefaultPort->setValue(port); + } + UpdateProfiles(); /*---------------------------------------------------------*\ @@ -1179,3 +1191,19 @@ void OpenRGBSettingsPage::on_CheckboxShowLEDView_clicked() ResourceManager::get()->GetSettingsManager()->SetSettings("UserInterface", ui_settings); SaveSettings(); } + +void OpenRGBSettingsPage::on_LineEditServerDefaultHost_textChanged(const QString server_default_host) +{ + json server_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Server"); + server_settings["default_host"] = server_default_host.toStdString(); + ResourceManager::get()->GetSettingsManager()->SetSettings("Server", server_settings); + SaveSettings(); +} + +void OpenRGBSettingsPage::on_SpinBoxServerDefaultPort_valueChanged(int server_default_port) +{ + json server_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Server"); + server_settings["default_port"] = (unsigned short)server_default_port; + ResourceManager::get()->GetSettingsManager()->SetSettings("Server", server_settings); + SaveSettings(); +} diff --git a/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.h b/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.h index 5632740d6..6b9e19037 100644 --- a/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.h +++ b/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.h @@ -96,4 +96,6 @@ private slots: void on_CheckboxShowLEDView_clicked(); void on_CheckboxAllDevices_clicked(bool checked); void on_CheckboxLegacyWorkaround_clicked(bool checked); + void on_LineEditServerDefaultHost_textChanged(const QString server_default_host); + void on_SpinBoxServerDefaultPort_valueChanged(int server_default_port); }; diff --git a/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.ui b/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.ui index 6548b0753..d56ec145c 100644 --- a/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.ui +++ b/qt/OpenRGBSettingsPage/OpenRGBSettingsPage.ui @@ -220,17 +220,48 @@ Server - + + + + 127.0.0.1 + + + + + + + Server Default Host + + + + + + + Legacy Workaround + + + + Serve All Devices (Including those from client connections) - - + + - Legacy Workaround + Server Default Port + + + + + + + 65535 + + + 6742