summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/config/ConfigManager.cpp69
-rw-r--r--src/config/ConfigManager.hpp18
-rw-r--r--src/meson.build4
-rw-r--r--src/render/OpenGL.cpp2
4 files changed, 46 insertions, 47 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 04d29f3a..944aa0b2 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -8,6 +8,7 @@
#include <cstddef>
#include <cstdint>
+#include <hyprutils/path/Path.hpp>
#include <string.h>
#include <string>
#include <sys/stat.h>
@@ -628,25 +629,49 @@ CConfigManager::CConfigManager() {
g_pHyprError->queueCreate(ERR.value(), CColor{1.0, 0.1, 0.1, 1.0});
}
-std::string CConfigManager::getConfigDir() {
- static const char* xdgConfigHome = getenv("XDG_CONFIG_HOME");
+std::optional<std::string> CConfigManager::generateConfig(std::string configPath) {
+ std::string parentPath = std::filesystem::path(configPath).parent_path();
- if (xdgConfigHome && std::filesystem::path(xdgConfigHome).is_absolute())
- return xdgConfigHome;
+ if (!std::filesystem::is_directory(parentPath)) {
+ Debug::log(WARN, "Creating config home directory");
+ try {
+ std::filesystem::create_directories(parentPath);
+ } catch (std::exception e) { throw e; }
+ }
- static const char* home = getenv("HOME");
+ Debug::log(WARN, "No config file found; attempting to generate.");
+ std::ofstream ofs;
+ ofs.open(configPath, std::ios::trunc);
+ ofs << AUTOCONFIG;
+ ofs.close();
- if (!home)
- throw std::runtime_error("Neither HOME nor XDG_CONFIG_HOME is set in the environment. Cannot determine config directory.");
+ if (!std::filesystem::exists(configPath))
+ return "Config could not be generated.";
- return home + std::string("/.config");
+ return configPath;
}
std::string CConfigManager::getMainConfigPath() {
if (!g_pCompositor->explicitConfigPath.empty())
return g_pCompositor->explicitConfigPath;
- return getConfigDir() + "/hypr/" + (ISDEBUG ? "hyprlandd.conf" : "hyprland.conf");
+ static const auto paths = Hyprutils::Path::findConfig(ISDEBUG ? "hyprlandd" : "hyprland");
+ if (paths.first.has_value()) {
+ return paths.first.value();
+ } else if (paths.second.has_value()) {
+ auto configPath = Hyprutils::Path::fullConfigPath(paths.second.value(), ISDEBUG ? "hyprlandd" : "hyprland");
+ return generateConfig(configPath).value();
+ } else
+ throw std::runtime_error("Neither HOME nor XDG_CONFIG_HOME are set in the environment. Could not find config in XDG_CONFIG_DIRS or /etc/xdg.");
+}
+
+std::optional<std::string> CConfigManager::verifyConfigExists() {
+ std::string mainConfigPath = getMainConfigPath();
+
+ if (!std::filesystem::exists(mainConfigPath))
+ return "broken config dir?";
+
+ return {};
}
const std::string CConfigManager::getConfigString() {
@@ -742,32 +767,6 @@ void CConfigManager::setDefaultAnimationVars() {
CREATEANIMCFG("specialWorkspace", "workspaces");
}
-std::optional<std::string> CConfigManager::verifyConfigExists() {
- std::string mainConfigPath = getMainConfigPath();
-
- if (g_pCompositor->explicitConfigPath.empty() && !std::filesystem::exists(mainConfigPath)) {
- std::string configPath = std::filesystem::path(mainConfigPath).parent_path();
-
- if (!std::filesystem::is_directory(configPath)) {
- Debug::log(WARN, "Creating config home directory");
- try {
- std::filesystem::create_directories(configPath);
- } catch (...) { return "Broken config file! (Could not create config directory)"; }
- }
-
- Debug::log(WARN, "No config file found; attempting to generate.");
- std::ofstream ofs;
- ofs.open(mainConfigPath, std::ios::trunc);
- ofs << AUTOCONFIG;
- ofs.close();
- }
-
- if (!std::filesystem::exists(mainConfigPath))
- return "broken config dir?";
-
- return {};
-}
-
std::optional<std::string> CConfigManager::resetHLConfig() {
m_dMonitorRules.clear();
m_dWindowRules.clear();
diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp
index 10021187..df7c202b 100644
--- a/src/config/ConfigManager.hpp
+++ b/src/config/ConfigManager.hpp
@@ -101,7 +101,6 @@ class CConfigManager {
void* const* getConfigValuePtr(const std::string&);
Hyprlang::CConfigValue* getHyprlangConfigValuePtr(const std::string& name, const std::string& specialCat = "");
void onPluginLoadUnload(const std::string& name, bool load);
- static std::string getConfigDir();
static std::string getMainConfigPath();
const std::string getConfigString();
@@ -224,14 +223,15 @@ class CConfigManager {
std::string m_szConfigErrors = "";
// internal methods
- void setAnimForChildren(SAnimationPropertyConfig* const);
- void updateBlurredLS(const std::string&, const bool);
- void setDefaultAnimationVars();
- std::optional<std::string> resetHLConfig();
- std::optional<std::string> verifyConfigExists();
- void postConfigReload(const Hyprlang::CParseResult& result);
- void reload();
- SWorkspaceRule mergeWorkspaceRules(const SWorkspaceRule&, const SWorkspaceRule&);
+ void setAnimForChildren(SAnimationPropertyConfig* const);
+ void updateBlurredLS(const std::string&, const bool);
+ void setDefaultAnimationVars();
+ std::optional<std::string> resetHLConfig();
+ static std::optional<std::string> generateConfig(std::string configPath);
+ static std::optional<std::string> verifyConfigExists();
+ void postConfigReload(const Hyprlang::CParseResult& result);
+ void reload();
+ SWorkspaceRule mergeWorkspaceRules(const SWorkspaceRule&, const SWorkspaceRule&);
};
inline std::unique_ptr<CConfigManager> g_pConfigManager;
diff --git a/src/meson.build b/src/meson.build
index ccb1922a..f6ae043d 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -11,9 +11,9 @@ executable('Hyprland', src,
dependency('wayland-client'),
wlroots.get_variable('wlroots'),
dependency('cairo'),
- dependency('hyprcursor'),
+ dependency('hyprcursor', version: '>=0.1.7'),
dependency('hyprlang', version: '>= 0.3.2'),
- dependency('hyprutils', version: '>= 0.1.1'),
+ dependency('hyprutils', version: '>= 0.2.0'),
dependency('libdrm'),
dependency('egl'),
dependency('xkbcommon'),
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index cb3d2e71..8229e210 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -842,7 +842,7 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) {
if (path == "" || path == STRVAL_EMPTY)
return;
- std::ifstream infile(absolutePath(path, g_pConfigManager->getConfigDir()));
+ std::ifstream infile(absolutePath(path, g_pConfigManager->getMainConfigPath()));
if (!infile.good()) {
g_pConfigManager->addParseError("Screen shader parser: Screen shader path not found");