aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/config/ConfigManager.cpp39
-rw-r--r--src/debug/HyprCtl.cpp14
-rw-r--r--src/managers/KeybindManager.hpp36
3 files changed, 51 insertions, 38 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 6bb24e46..80af063b 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -6,6 +6,7 @@
#include "helpers/varlist/VarList.hpp"
#include "../protocols/LayerShell.hpp"
+#include <cstddef>
#include <cstdint>
#include <string.h>
#include <string>
@@ -1957,15 +1958,16 @@ std::optional<std::string> CConfigManager::handleBind(const std::string& command
// bind[fl]=SUPER,G,exec,dmenu_run <args>
// flags
- bool locked = false;
- bool release = false;
- bool repeat = false;
- bool mouse = false;
- bool nonConsuming = false;
- bool transparent = false;
- bool ignoreMods = false;
- bool multiKey = false;
- const auto BINDARGS = command.substr(4);
+ bool locked = false;
+ bool release = false;
+ bool repeat = false;
+ bool mouse = false;
+ bool nonConsuming = false;
+ bool transparent = false;
+ bool ignoreMods = false;
+ bool multiKey = false;
+ bool hasDescription = false;
+ const auto BINDARGS = command.substr(4);
for (auto& arg : BINDARGS) {
if (arg == 'l') {
@@ -1984,6 +1986,8 @@ std::optional<std::string> CConfigManager::handleBind(const std::string& command
ignoreMods = true;
} else if (arg == 's') {
multiKey = true;
+ } else if (arg == 'd') {
+ hasDescription = true;
} else {
return "bind: invalid flag";
}
@@ -1995,11 +1999,13 @@ std::optional<std::string> CConfigManager::handleBind(const std::string& command
if (mouse && (repeat || release || locked))
return "flag m is exclusive";
- const auto ARGS = CVarList(value, 4);
+ const int numbArgs = hasDescription ? 5 : 4;
+ const auto ARGS = CVarList(value, numbArgs);
+ const int DESCR_OFFSET = hasDescription ? 1 : 0;
if ((ARGS.size() < 3 && !mouse) || (ARGS.size() < 3 && mouse))
return "bind: too few args";
- else if ((ARGS.size() > 4 && !mouse) || (ARGS.size() > 3 && mouse))
+ else if ((ARGS.size() > (size_t)4 + DESCR_OFFSET && !mouse) || (ARGS.size() > (size_t)3 + DESCR_OFFSET && mouse))
return "bind: too many args";
std::set<xkb_keysym_t> KEYSYMS;
@@ -2018,12 +2024,11 @@ std::optional<std::string> CConfigManager::handleBind(const std::string& command
const auto KEY = multiKey ? "" : ARGS[1];
- auto HANDLER = ARGS[2];
+ const auto DESCRIPTION = hasDescription ? ARGS[2] : "";
- const auto COMMAND = mouse ? HANDLER : ARGS[3];
+ auto HANDLER = ARGS[2 + DESCR_OFFSET];
- if (mouse)
- HANDLER = "mouse";
+ const auto COMMAND = mouse ? HANDLER : ARGS[3 + DESCR_OFFSET];
// to lower
std::transform(HANDLER.begin(), HANDLER.end(), HANDLER.begin(), ::tolower);
@@ -2048,8 +2053,8 @@ std::optional<std::string> CConfigManager::handleBind(const std::string& command
return "Invalid catchall, catchall keybinds are only allowed in submaps.";
}
- g_pKeybindManager->addKeybind(SKeybind{parsedKey.key, KEYSYMS, parsedKey.keycode, parsedKey.catchAll, MOD, MODS, HANDLER, COMMAND, locked, m_szCurrentSubmap, release,
- repeat, mouse, nonConsuming, transparent, ignoreMods, multiKey});
+ g_pKeybindManager->addKeybind(SKeybind{parsedKey.key, KEYSYMS, parsedKey.keycode, parsedKey.catchAll, MOD, MODS, HANDLER, COMMAND, locked, m_szCurrentSubmap, DESCRIPTION,
+ release, repeat, mouse, nonConsuming, transparent, ignoreMods, multiKey, hasDescription});
}
return {};
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index 6f4d74b7..a7e714bd 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -1,5 +1,6 @@
#include "HyprCtl.hpp"
+#include <format>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
@@ -28,6 +29,7 @@ using namespace Hyprutils::String;
#include "../devices/ITouch.hpp"
#include "../devices/Tablet.hpp"
#include "config/ConfigManager.hpp"
+#include "helpers/MiscFunctions.hpp"
static void trimTrailingComma(std::string& str) {
if (!str.empty() && str.back() == ',')
@@ -792,9 +794,11 @@ std::string bindsRequest(eHyprCtlOutputFormat format, std::string request) {
ret += "e";
if (kb.nonConsuming)
ret += "n";
+ if (kb.hasDescription)
+ ret += "d";
- ret += std::format("\n\tmodmask: {}\n\tsubmap: {}\n\tkey: {}\n\tkeycode: {}\n\tcatchall: {}\n\tdispatcher: {}\n\targ: {}\n\n", kb.modmask, kb.submap, kb.key,
- kb.keycode, kb.catchAll, kb.handler, kb.arg);
+ ret += std::format("\n\tmodmask: {}\n\tsubmap: {}\n\tkey: {}\n\tkeycode: {}\n\tcatchall: {}\n\tdescription: {}\n\tdispatcher: {}\n\targ: {}\n\n", kb.modmask, kb.submap,
+ kb.key, kb.keycode, kb.catchAll, kb.description, kb.handler, kb.arg);
}
} else {
// json
@@ -808,17 +812,19 @@ std::string bindsRequest(eHyprCtlOutputFormat format, std::string request) {
"release": {},
"repeat": {},
"non_consuming": {},
+ "has_description": {},
"modmask": {},
"submap": "{}",
"key": "{}",
"keycode": {},
"catch_all": {},
+ "description": "{}",
"dispatcher": "{}",
"arg": "{}"
}},)#",
kb.locked ? "true" : "false", kb.mouse ? "true" : "false", kb.release ? "true" : "false", kb.repeat ? "true" : "false", kb.nonConsuming ? "true" : "false",
- kb.modmask, escapeJSONStrings(kb.submap), escapeJSONStrings(kb.key), kb.keycode, kb.catchAll ? "true" : "false", escapeJSONStrings(kb.handler),
- escapeJSONStrings(kb.arg));
+ kb.hasDescription ? "true" : "false", kb.modmask, escapeJSONStrings(kb.submap), escapeJSONStrings(kb.key), kb.keycode, kb.catchAll ? "true" : "false",
+ escapeJSONStrings(kb.description), escapeJSONStrings(kb.handler), escapeJSONStrings(kb.arg));
}
trimTrailingComma(ret);
ret += "]";
diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp
index 305e563f..ecab6ee1 100644
--- a/src/managers/KeybindManager.hpp
+++ b/src/managers/KeybindManager.hpp
@@ -14,23 +14,25 @@ class CPluginSystem;
class IKeyboard;
struct SKeybind {
- std::string key = "";
- std::set<xkb_keysym_t> sMkKeys = {};
- uint32_t keycode = 0;
- bool catchAll = false;
- uint32_t modmask = 0;
- std::set<xkb_keysym_t> sMkMods = {};
- std::string handler = "";
- std::string arg = "";
- bool locked = false;
- std::string submap = "";
- bool release = false;
- bool repeat = false;
- bool mouse = false;
- bool nonConsuming = false;
- bool transparent = false;
- bool ignoreMods = false;
- bool multiKey = false;
+ std::string key = "";
+ std::set<xkb_keysym_t> sMkKeys = {};
+ uint32_t keycode = 0;
+ bool catchAll = false;
+ uint32_t modmask = 0;
+ std::set<xkb_keysym_t> sMkMods = {};
+ std::string handler = "";
+ std::string arg = "";
+ bool locked = false;
+ std::string submap = "";
+ std::string description = "";
+ bool release = false;
+ bool repeat = false;
+ bool mouse = false;
+ bool nonConsuming = false;
+ bool transparent = false;
+ bool ignoreMods = false;
+ bool multiKey = false;
+ bool hasDescription = false;
// DO NOT INITIALIZE
bool shadowed = false;