Use XDG-compliant configuration directory (APPDATA on Windows)

This commit is contained in:
Adam Honse 2020-11-04 23:24:26 -06:00
parent 7b54787dd7
commit f7d187f5b2
4 changed files with 49 additions and 9 deletions

View file

@ -1,4 +1,5 @@
#include "ProfileManager.h" #include "ProfileManager.h"
#include "ResourceManager.h"
#include "RGBController_Dummy.h" #include "RGBController_Dummy.h"
#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
#include <experimental/filesystem> #include <experimental/filesystem>
@ -8,8 +9,9 @@
namespace fs = std::experimental::filesystem; namespace fs = std::experimental::filesystem;
ProfileManager::ProfileManager(std::vector<RGBController *>& control) : controllers(control) ProfileManager::ProfileManager(std::vector<RGBController *>& control, std::string config_dir) : controllers(control)
{ {
configuration_directory = config_dir;
UpdateProfileList(); UpdateProfileList();
} }
@ -28,7 +30,7 @@ bool ProfileManager::SaveProfile(std::string profile_name)
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Open an output file in binary mode | | Open an output file in binary mode |
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
std::ofstream controller_file(profile_name, std::ios::out | std::ios::binary); std::ofstream controller_file(configuration_directory + profile_name, std::ios::out | std::ios::binary);
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Write header | | Write header |
@ -90,7 +92,7 @@ std::vector<RGBController*> ProfileManager::LoadProfileToList
unsigned int controller_offset = 0; unsigned int controller_offset = 0;
bool ret_val = false; bool ret_val = false;
std::string filename = profile_name; std::string filename = configuration_directory + profile_name;
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Open input file in binary mode | | Open input file in binary mode |
@ -259,7 +261,7 @@ bool ProfileManager::LoadProfileWithOptions
std::vector<bool> temp_controller_used; std::vector<bool> temp_controller_used;
bool ret_val = false; bool ret_val = false;
std::string filename = profile_name; std::string filename = configuration_directory + profile_name;
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Open input file in binary mode | | Open input file in binary mode |
@ -313,7 +315,7 @@ void ProfileManager::UpdateProfileList()
/*---------------------------------------------------------*\ /*---------------------------------------------------------*\
| Load profiles by looking for .orp files in current dir | | Load profiles by looking for .orp files in current dir |
\*---------------------------------------------------------*/ \*---------------------------------------------------------*/
for(const auto & entry : fs::directory_iterator(".")) for(const auto & entry : fs::directory_iterator(configuration_directory))
{ {
std::string filename = entry.path().filename().string(); std::string filename = entry.path().filename().string();

View file

@ -5,7 +5,7 @@
class ProfileManager class ProfileManager
{ {
public: public:
ProfileManager(std::vector<RGBController *>& control); ProfileManager(std::vector<RGBController *>& control, std::string config_dir);
~ProfileManager(); ~ProfileManager();
bool SaveProfile(std::string profile_name); bool SaveProfile(std::string profile_name);
@ -33,6 +33,8 @@ protected:
std::vector<RGBController *>& controllers; std::vector<RGBController *>& controllers;
private: private:
std::string configuration_directory;
void UpdateProfileList(); void UpdateProfileList();
bool LoadProfileWithOptions bool LoadProfileWithOptions
( (

View file

@ -12,6 +12,7 @@
#include "ResourceManager.h" #include "ResourceManager.h"
#include "ProfileManager.h" #include "ProfileManager.h"
#include <stdlib.h>
#include <string> #include <string>
std::unique_ptr<ResourceManager> ResourceManager::instance; std::unique_ptr<ResourceManager> ResourceManager::instance;
@ -46,14 +47,14 @@ ResourceManager::ResourceManager()
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
| Load sizes list from file | | Load sizes list from file |
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
profile_manager = new ProfileManager(rgb_controllers); profile_manager = new ProfileManager(rgb_controllers, GetConfigurationDirectory());
rgb_controllers_sizes = profile_manager->LoadProfileToList("sizes.ors"); rgb_controllers_sizes = profile_manager->LoadProfileToList("sizes.ors");
/*-------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------*\
| Load settings from file | | Load settings from file |
\*-------------------------------------------------------------------------*/ \*-------------------------------------------------------------------------*/
settings_manager = new SettingsManager(); settings_manager = new SettingsManager();
settings_manager->LoadSettings("OpenRGB.json"); settings_manager->LoadSettings(GetConfigurationDirectory() + "OpenRGB.json");
} }
ResourceManager::~ResourceManager() ResourceManager::~ResourceManager()
@ -184,6 +185,39 @@ void ResourceManager::DetectionProgressChanged()
DetectionProgressMutex.unlock(); DetectionProgressMutex.unlock();
} }
std::string ResourceManager::GetConfigurationDirectory()
{
std::string config_dir = "";
const char* xdg_config_home = getenv("XDG_CONFIG_HOME");
const char* appdata = getenv("APPDATA");
/*-----------------------------------------------------*\
| Check both XDG_CONFIG_HOME and APPDATA environment |
| variables. If neither exist, use current directory |
\*-----------------------------------------------------*/
if(xdg_config_home != NULL)
{
config_dir = xdg_config_home;
}
else
{
if(appdata != NULL)
{
config_dir = appdata;
}
}
/*-----------------------------------------------------*\
| If a configuration directory was found, append OpenRGB|
\*-----------------------------------------------------*/
if(config_dir != "")
{
config_dir = config_dir + "/OpenRGB/";
}
return(config_dir);
}
NetworkServer* ResourceManager::GetServer() NetworkServer* ResourceManager::GetServer()
{ {
return(server); return(server);

View file

@ -55,6 +55,8 @@ public:
unsigned int GetDetectionPercent(); unsigned int GetDetectionPercent();
const char* GetDetectionString(); const char* GetDetectionString();
std::string GetConfigurationDirectory();
std::vector<NetworkClient*>& GetClients(); std::vector<NetworkClient*>& GetClients();
NetworkServer* GetServer(); NetworkServer* GetServer();