aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorvaxerski <[email protected]>2022-04-21 16:56:27 +0200
committervaxerski <[email protected]>2022-04-21 16:56:27 +0200
commit07080498fd050a6a6660eb68c36d12eb3f87a003 (patch)
treefe1c8949b78bce5f97a4e96fd3ec3e277e3d50d7
parentb618fc1caa4063bbed8373935db7e00b2f0cc9fe (diff)
downloadHyprland-07080498fd050a6a6660eb68c36d12eb3f87a003.tar.gz
Hyprland-07080498fd050a6a6660eb68c36d12eb3f87a003.zip
Added hyprctl keyword
-rw-r--r--hyprctl/main.cpp13
-rw-r--r--src/config/ConfigManager.cpp63
-rw-r--r--src/config/ConfigManager.hpp2
-rw-r--r--src/debug/HyprCtl.cpp17
4 files changed, 68 insertions, 27 deletions
diff --git a/hyprctl/main.cpp b/hyprctl/main.cpp
index 0382901a..7fe745da 100644
--- a/hyprctl/main.cpp
+++ b/hyprctl/main.cpp
@@ -23,6 +23,7 @@ usage: hyprctl [command] [(opt)args]
activewindow
layers
dispatch
+ keyword
)#";
void request(std::string arg) {
@@ -109,6 +110,17 @@ void dispatchRequest(int argc, char** argv) {
request(rq);
}
+void keywordRequest(int argc, char** argv) {
+ if (argc < 4) {
+ std::cout << "keyword requires 2 params";
+ return;
+ }
+
+ std::string rq = "keyword " + std::string(argv[2]) + " " + std::string(argv[3]);
+
+ request(rq);
+}
+
int main(int argc, char** argv) {
int bflag = 0, sflag = 0, index, c;
@@ -123,6 +135,7 @@ int main(int argc, char** argv) {
else if (!strcmp(argv[1], "activewindow")) request("activewindow");
else if (!strcmp(argv[1], "layers")) request("layers");
else if (!strcmp(argv[1], "dispatch")) dispatchRequest(argc, argv);
+ else if (!strcmp(argv[1], "keyword")) keywordRequest(argc, argv);
else {
printf(USAGE.c_str());
return 1;
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index db5f5a8a..976c38b5 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -253,6 +253,41 @@ void CConfigManager::handleDefaultWorkspace(const std::string& command, const st
}
}
+std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::string& VALUE, bool dynamic) {
+ if (dynamic)
+ parseError = "";
+
+ if (COMMAND == "exec") {
+ if (isFirstLaunch) {
+ firstExecRequests.push_back(VALUE);
+ } else {
+ handleRawExec(COMMAND, VALUE);
+ }
+ } else if (COMMAND == "exec-once") {
+ if (isFirstLaunch) {
+ firstExecRequests.push_back(VALUE);
+ }
+ } else if (COMMAND == "monitor") {
+ handleMonitor(COMMAND, VALUE);
+ } else if (COMMAND == "bind") {
+ handleBind(COMMAND, VALUE);
+ } else if (COMMAND == "workspace") {
+ handleDefaultWorkspace(COMMAND, VALUE);
+ } else if (COMMAND == "windowrule") {
+ handleWindowRule(COMMAND, VALUE);
+ } else {
+ configSetValueSafe(currentCategory + (currentCategory == "" ? "" : ":") + COMMAND, VALUE);
+ }
+
+ if (dynamic) {
+ std::string retval = parseError;
+ parseError = "";
+ return retval;
+ }
+
+ return parseError;
+}
+
void CConfigManager::parseLine(std::string& line) {
// first check if its not a comment
const auto COMMENTSTART = line.find_first_of('#');
@@ -298,33 +333,7 @@ void CConfigManager::parseLine(std::string& line) {
const auto VALUE = removeBeginEndSpacesTabs(line.substr(EQUALSPLACE + 1));
//
- if (COMMAND == "exec") {
- if (isFirstLaunch) {
- firstExecRequests.push_back(VALUE);
- } else {
- handleRawExec(COMMAND, VALUE);
- }
- return;
- } else if (COMMAND == "exec-once") {
- if (isFirstLaunch) {
- firstExecRequests.push_back(VALUE);
- }
- return;
- } else if (COMMAND == "monitor") {
- handleMonitor(COMMAND, VALUE);
- return;
- } else if (COMMAND == "bind") {
- handleBind(COMMAND, VALUE);
- return;
- } else if (COMMAND == "workspace") {
- handleDefaultWorkspace(COMMAND, VALUE);
- return;
- } else if (COMMAND == "windowrule") {
- handleWindowRule(COMMAND, VALUE);
- return;
- }
-
- configSetValueSafe(currentCategory + (currentCategory == "" ? "" : ":") + COMMAND, VALUE);
+ parseKeyword(COMMAND, VALUE);
}
void CConfigManager::loadConfigLoadVars() {
diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp
index 314592a9..2f071a13 100644
--- a/src/config/ConfigManager.hpp
+++ b/src/config/ConfigManager.hpp
@@ -58,6 +58,8 @@ public:
void performMonitorReload();
bool m_bWantsMonitorReload = false;
+ std::string parseKeyword(const std::string&, const std::string&, bool dynamic = false);
+
private:
std::unordered_map<std::string, SConfigValue> configValues;
time_t lastModifyTime = 0; // for reloading the config if changed
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index 998ea360..21023ef6 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -88,6 +88,22 @@ std::string dispatchRequest(std::string in) {
return "ok";
}
+std::string dispatchKeyword(std::string in) {
+ // get rid of the keyword keyword
+ in = in.substr(in.find_first_of(' ') + 1);
+
+ const auto COMMAND = in.substr(0, in.find_first_of(' '));
+
+ const auto VALUE = in.substr(in.find_first_of(' ') + 1);
+
+ std::string retval = g_pConfigManager->parseKeyword(COMMAND, VALUE, true);
+
+ if (retval == "")
+ return "ok";
+
+ return retval;
+}
+
void HyprCtl::startHyprCtlSocket() {
std::thread([&]() {
uint16_t connectPort = 9187;
@@ -149,6 +165,7 @@ void HyprCtl::startHyprCtlSocket() {
else if (request == "activewindow") reply = activeWindowRequest();
else if (request == "layers") reply = layersRequest();
else if (request.find("dispatch") == 0) reply = dispatchRequest(request);
+ else if (request.find("keyword") == 0) reply = dispatchKeyword(request);
} catch (std::exception& e) {
Debug::log(ERR, "Error in request: %s", e.what());
reply = "Err: " + std::string(e.what());