diff --git a/hyprctl/main.cpp b/hyprctl/main.cpp index a282b5d0..db8f48a3 100644 --- a/hyprctl/main.cpp +++ b/hyprctl/main.cpp @@ -35,6 +35,7 @@ commands: hyprpaper reload setcursor + getoption flags: -j -> output in JSON @@ -264,6 +265,7 @@ int main(int argc, char** argv) { else if (fullRequest.contains("/splash")) request(fullRequest); else if (fullRequest.contains("/devices")) request(fullRequest); else if (fullRequest.contains("/reload")) request(fullRequest); + else if (fullRequest.contains("/getoption")) request(fullRequest); else if (fullRequest.contains("/setcursor")) setcursorRequest(argc, argv); else if (fullRequest.contains("/dispatch")) dispatchRequest(argc, argv); else if (fullRequest.contains("/keyword")) keywordRequest(argc, argv); diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 4b47e096..9e3a1bd3 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1331,6 +1331,15 @@ SConfigValue* CConfigManager::getConfigValuePtr(std::string val) { return &configValues[val]; } +SConfigValue* CConfigManager::getConfigValuePtrSafe(std::string val) { + const auto IT = configValues.find(val); + + if (IT == configValues.end()) + return nullptr; + + return &(IT->second); +} + bool CConfigManager::deviceConfigExists(const std::string& dev) { const auto it = deviceConfigs.find(dev); diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 4eef417f..a4e4091b 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -83,6 +83,7 @@ public: bool shouldBlurLS(const std::string&); SConfigValue* getConfigValuePtr(std::string); + SConfigValue* getConfigValuePtrSafe(std::string); SMonitorRule getMonitorRuleFor(std::string); diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index 3042be2e..e09e4f8b 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -572,6 +572,47 @@ std::string dispatchSetCursor(std::string request) { return "ok"; } +std::string dispatchGetOption(std::string request, HyprCtl::eHyprCtlOutputFormat format) { + std::string curitem = ""; + + auto nextItem = [&]() { + auto idx = request.find_first_of(' '); + + if (idx != std::string::npos) { + curitem = request.substr(0, idx); + request = request.substr(idx + 1); + } else { + curitem = request; + request = ""; + } + + curitem = removeBeginEndSpacesTabs(curitem); + }; + + nextItem(); + nextItem(); + + const auto PCFGOPT = g_pConfigManager->getConfigValuePtrSafe(curitem); + + if (!PCFGOPT) + return "no such option"; + + if (format == HyprCtl::eHyprCtlOutputFormat::FORMAT_NORMAL) + return getFormat("option %s\n\tint: %i\n\tfloat: %f\n\tstr: \"%s\"", curitem.c_str(), PCFGOPT->intValue, PCFGOPT->floatValue, PCFGOPT->strValue.c_str()); + else { + return getFormat( +R"#( +{ + "option": "%s", + "int": %i, + "float": %f, + "str": "%s" +} +)#", curitem.c_str(), PCFGOPT->intValue, PCFGOPT->floatValue, PCFGOPT->strValue.c_str() + ); + } +} + std::string getReply(std::string request) { auto format = HyprCtl::FORMAT_NORMAL; @@ -619,6 +660,8 @@ std::string getReply(std::string request) { return dispatchKeyword(request); else if (request.find("setcursor") == 0) return dispatchSetCursor(request); + else if (request.find("getoption") == 0) + return dispatchGetOption(request, format); else if (request.find("[[BATCH]]") == 0) return dispatchBatch(request);