mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-22 17:25:59 +01:00
cursormgr: add a new setting to sync gsettings (#7253)
cursor:sync_gsettings_theme is set to default true and if enabled it will now sync xcursor theme loading with gsettings if it can, meaning CSD clients will now also change to the appropiate theme upon start and hyprctl setcursor THEME SIZE .
This commit is contained in:
parent
fd1d4e288e
commit
8b37e81374
6 changed files with 65 additions and 0 deletions
|
@ -117,6 +117,7 @@ pkg_check_modules(
|
||||||
libliftoff
|
libliftoff
|
||||||
libudev
|
libudev
|
||||||
gbm
|
gbm
|
||||||
|
gio-2.0
|
||||||
hyprlang>=0.3.2
|
hyprlang>=0.3.2
|
||||||
hyprcursor>=0.1.7
|
hyprcursor>=0.1.7
|
||||||
hyprutils>=0.2.1)
|
hyprutils>=0.2.1)
|
||||||
|
|
|
@ -34,6 +34,8 @@ xcb_render_dep = dependency('xcb-render', required: get_option('xwayland'))
|
||||||
xcb_res_dep = dependency('xcb-res', required: get_option('xwayland'))
|
xcb_res_dep = dependency('xcb-res', required: get_option('xwayland'))
|
||||||
xcb_xfixes_dep = dependency('xcb-xfixes', required: get_option('xwayland'))
|
xcb_xfixes_dep = dependency('xcb-xfixes', required: get_option('xwayland'))
|
||||||
|
|
||||||
|
gio_dep = dependency('gio-2.0', required:true)
|
||||||
|
|
||||||
cmake = import('cmake')
|
cmake = import('cmake')
|
||||||
udis = cmake.subproject('udis86')
|
udis = cmake.subproject('udis86')
|
||||||
udis86 = udis.dependency('libudis86')
|
udis86 = udis.dependency('libudis86')
|
||||||
|
|
|
@ -539,6 +539,7 @@ CConfigManager::CConfigManager() {
|
||||||
m_pConfig->addConfigValue("cursor:zoom_factor", {1.f});
|
m_pConfig->addConfigValue("cursor:zoom_factor", {1.f});
|
||||||
m_pConfig->addConfigValue("cursor:zoom_rigid", Hyprlang::INT{0});
|
m_pConfig->addConfigValue("cursor:zoom_rigid", Hyprlang::INT{0});
|
||||||
m_pConfig->addConfigValue("cursor:enable_hyprcursor", Hyprlang::INT{1});
|
m_pConfig->addConfigValue("cursor:enable_hyprcursor", Hyprlang::INT{1});
|
||||||
|
m_pConfig->addConfigValue("cursor:sync_gsettings_theme", Hyprlang::INT{1});
|
||||||
m_pConfig->addConfigValue("cursor:hide_on_key_press", Hyprlang::INT{0});
|
m_pConfig->addConfigValue("cursor:hide_on_key_press", Hyprlang::INT{0});
|
||||||
m_pConfig->addConfigValue("cursor:hide_on_touch", Hyprlang::INT{1});
|
m_pConfig->addConfigValue("cursor:hide_on_touch", Hyprlang::INT{1});
|
||||||
m_pConfig->addConfigValue("cursor:allow_dumb_copy", Hyprlang::INT{0});
|
m_pConfig->addConfigValue("cursor:allow_dumb_copy", Hyprlang::INT{0});
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
#include <gio/gsettingsschema.h>
|
||||||
|
#include "config/ConfigValue.hpp"
|
||||||
#include "helpers/CursorShapes.hpp"
|
#include "helpers/CursorShapes.hpp"
|
||||||
#include "debug/Log.hpp"
|
#include "debug/Log.hpp"
|
||||||
#include "XCursorManager.hpp"
|
#include "XCursorManager.hpp"
|
||||||
|
@ -146,6 +149,10 @@ void CXCursorManager::loadTheme(std::string const& name, int size) {
|
||||||
|
|
||||||
cursors.emplace_back(cursor);
|
cursors.emplace_back(cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static auto SYNCGSETTINGS = CConfigValue<Hyprlang::INT>("cursor:sync_gsettings_theme");
|
||||||
|
if (*SYNCGSETTINGS)
|
||||||
|
syncGsettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
SP<SXCursors> CXCursorManager::getShape(std::string const& shape, int size) {
|
SP<SXCursors> CXCursorManager::getShape(std::string const& shape, int size) {
|
||||||
|
@ -542,3 +549,55 @@ std::vector<SP<SXCursors>> CXCursorManager::loadAllFromDir(std::string const& pa
|
||||||
|
|
||||||
return newCursors;
|
return newCursors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CXCursorManager::syncGsettings() {
|
||||||
|
auto checkParamExists = [](std::string const& paramName, std::string const& category) {
|
||||||
|
auto* gSettingsSchemaSource = g_settings_schema_source_get_default();
|
||||||
|
|
||||||
|
if (!gSettingsSchemaSource) {
|
||||||
|
Debug::log(WARN, "GSettings default schema source does not exist, cant sync GSettings");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* gSettingsSchema = g_settings_schema_source_lookup(gSettingsSchemaSource, category.c_str(), true);
|
||||||
|
bool hasParam = false;
|
||||||
|
|
||||||
|
if (gSettingsSchema != NULL) {
|
||||||
|
hasParam = gSettingsSchema && g_settings_schema_has_key(gSettingsSchema, paramName.c_str());
|
||||||
|
g_settings_schema_unref(gSettingsSchema);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hasParam;
|
||||||
|
};
|
||||||
|
|
||||||
|
using SettingValue = std::variant<std::string, int>;
|
||||||
|
auto setValue = [&checkParamExists](std::string const& paramName, const SettingValue& paramValue, std::string const& category) {
|
||||||
|
if (!checkParamExists(paramName, category)) {
|
||||||
|
Debug::log(WARN, "GSettings parameter doesnt exist {} in {}", paramName, category);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* gsettings = g_settings_new(category.c_str());
|
||||||
|
|
||||||
|
if (!gsettings) {
|
||||||
|
Debug::log(WARN, "GSettings failed to allocate new settings with category {}", category);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::visit(
|
||||||
|
[&](auto&& value) {
|
||||||
|
using T = std::decay_t<decltype(value)>;
|
||||||
|
if constexpr (std::is_same_v<T, std::string>)
|
||||||
|
g_settings_set_string(gsettings, paramName.c_str(), value.c_str());
|
||||||
|
else if constexpr (std::is_same_v<T, int>)
|
||||||
|
g_settings_set_int(gsettings, paramName.c_str(), value);
|
||||||
|
},
|
||||||
|
paramValue);
|
||||||
|
|
||||||
|
g_settings_sync();
|
||||||
|
g_object_unref(gsettings);
|
||||||
|
};
|
||||||
|
|
||||||
|
setValue("cursor-theme", themeName, "org.gnome.desktop.interface");
|
||||||
|
setValue("cursor-size", lastLoadSize, "org.gnome.desktop.interface");
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ class CXCursorManager {
|
||||||
std::string getLegacyShapeName(std::string const& shape);
|
std::string getLegacyShapeName(std::string const& shape);
|
||||||
std::vector<SP<SXCursors>> loadStandardCursors(std::string const& name, int size);
|
std::vector<SP<SXCursors>> loadStandardCursors(std::string const& name, int size);
|
||||||
std::vector<SP<SXCursors>> loadAllFromDir(std::string const& path, int size);
|
std::vector<SP<SXCursors>> loadAllFromDir(std::string const& path, int size);
|
||||||
|
void syncGsettings();
|
||||||
|
|
||||||
int lastLoadSize = 0;
|
int lastLoadSize = 0;
|
||||||
std::string themeName = "";
|
std::string themeName = "";
|
||||||
|
|
|
@ -28,6 +28,7 @@ executable('Hyprland', src,
|
||||||
xcb_xfixes_dep,
|
xcb_xfixes_dep,
|
||||||
backtrace_dep,
|
backtrace_dep,
|
||||||
epoll_dep,
|
epoll_dep,
|
||||||
|
gio_dep,
|
||||||
udis86,
|
udis86,
|
||||||
|
|
||||||
dependency('pixman-1'),
|
dependency('pixman-1'),
|
||||||
|
|
Loading…
Reference in a new issue