diff --git a/CMakeLists.txt b/CMakeLists.txt index d41dd6e5..07fa8cf6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,7 +113,7 @@ pkg_check_modules(deps REQUIRED IMPORTED_TARGET wayland-server wayland-client wayland-cursor wayland-protocols cairo pango pangocairo pixman-1 libdrm libinput hwdata libseat libdisplay-info libliftoff libudev gbm - hyprlang>=0.3.2 hyprcursor>=0.1.7 hyprutils>=0.1.5 + hyprlang>=0.3.2 hyprcursor>=0.1.7 hyprutils>=0.2.0 ) find_package(hyprwayland-scanner 0.3.10 REQUIRED) diff --git a/flake.lock b/flake.lock index 1066e37b..b5f5738a 100644 --- a/flake.lock +++ b/flake.lock @@ -87,11 +87,11 @@ ] }, "locked": { - "lastModified": 1720545076, - "narHash": "sha256-Pxacc2uoxI00koXp5+CyNqHOTQlqNlK0rlRHDBHX4+g=", + "lastModified": 1721071737, + "narHash": "sha256-qmC9jGfbE4+EIBbbSAkrfR/p49wShjpv4/KztgE/P54=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "6174a2a25f4e216c0f1d0c4278adc23c476b1d09", + "rev": "eb1ceff2b87f6820789249f63faa8e9dcb54d05f", "type": "github" }, "original": { @@ -125,11 +125,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1720542800, - "narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=", + "lastModified": 1720957393, + "narHash": "sha256-oedh2RwpjEa+TNxhg5Je9Ch6d3W1NKi7DbRO1ziHemA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "feb2849fdeb70028c70d73b848214b00d324a497", + "rev": "693bc46d169f5af9c992095736e82c3488bf7dbb", "type": "github" }, "original": { diff --git a/nix/overlays.nix b/nix/overlays.nix index cc66e1b5..a4e1df37 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -25,7 +25,6 @@ in { inputs.hyprlang.overlays.default inputs.hyprutils.overlays.default inputs.hyprwayland-scanner.overlays.default - self.overlays.xwayland # Hyprland packages themselves (final: prev: let @@ -63,14 +62,4 @@ in { hyprland-extras = lib.composeManyExtensions [ inputs.xdph.overlays.xdg-desktop-portal-hyprland ]; - - # Patches XWayland's pkgconfig file to not include Cflags or includedir - # The above two variables trip up CMake and the build fails - xwayland = final: prev: { - xwayland = prev.xwayland.overrideAttrs (old: { - postInstall = '' - sed -i '/includedir/d' $out/lib/pkgconfig/xwayland.pc - ''; - }); - }; } 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 #include +#include #include #include #include @@ -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 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 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 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 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 resetHLConfig(); - std::optional 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 resetHLConfig(); + static std::optional generateConfig(std::string configPath); + static std::optional verifyConfigExists(); + void postConfigReload(const Hyprlang::CParseResult& result); + void reload(); + SWorkspaceRule mergeWorkspaceRules(const SWorkspaceRule&, const SWorkspaceRule&); }; inline std::unique_ptr 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");