mirror of https://github.com/hyprwm/Hyprland
add input:kb_file
This commit is contained in:
parent
6cae44e2c0
commit
69d17bf424
|
@ -12,6 +12,7 @@ monitor=,preferred,auto,1
|
||||||
workspace=DP-1,1
|
workspace=DP-1,1
|
||||||
|
|
||||||
input {
|
input {
|
||||||
|
kb_file=
|
||||||
kb_layout=
|
kb_layout=
|
||||||
kb_variant=
|
kb_variant=
|
||||||
kb_model=
|
kb_model=
|
||||||
|
@ -112,4 +113,4 @@ bind=ALT,9,movetoworkspace,9
|
||||||
bind=ALT,0,movetoworkspace,10
|
bind=ALT,0,movetoworkspace,10
|
||||||
|
|
||||||
bind=SUPER,mouse_down,workspace,e+1
|
bind=SUPER,mouse_down,workspace,e+1
|
||||||
bind=SUPER,mouse_up,workspace,e-1
|
bind=SUPER,mouse_up,workspace,e-1
|
||||||
|
|
|
@ -119,6 +119,7 @@ void CConfigManager::setDefaultVars() {
|
||||||
configValues["animations:workspaces"].intValue = 1;
|
configValues["animations:workspaces"].intValue = 1;
|
||||||
|
|
||||||
configValues["input:sensitivity"].floatValue = 0.f;
|
configValues["input:sensitivity"].floatValue = 0.f;
|
||||||
|
configValues["input:kb_file"].strValue = STRVAL_EMPTY;
|
||||||
configValues["input:kb_layout"].strValue = "us";
|
configValues["input:kb_layout"].strValue = "us";
|
||||||
configValues["input:kb_variant"].strValue = STRVAL_EMPTY;
|
configValues["input:kb_variant"].strValue = STRVAL_EMPTY;
|
||||||
configValues["input:kb_options"].strValue = STRVAL_EMPTY;
|
configValues["input:kb_options"].strValue = STRVAL_EMPTY;
|
||||||
|
@ -155,6 +156,7 @@ void CConfigManager::setDeviceDefaultVars(const std::string& dev) {
|
||||||
auto& cfgValues = deviceConfigs[dev];
|
auto& cfgValues = deviceConfigs[dev];
|
||||||
|
|
||||||
cfgValues["sensitivity"].floatValue = 0.f;
|
cfgValues["sensitivity"].floatValue = 0.f;
|
||||||
|
cfgValues["kb_file"].strValue = STRVAL_EMPTY;
|
||||||
cfgValues["kb_layout"].strValue = "us";
|
cfgValues["kb_layout"].strValue = "us";
|
||||||
cfgValues["kb_variant"].strValue = STRVAL_EMPTY;
|
cfgValues["kb_variant"].strValue = STRVAL_EMPTY;
|
||||||
cfgValues["kb_options"].strValue = STRVAL_EMPTY;
|
cfgValues["kb_options"].strValue = STRVAL_EMPTY;
|
||||||
|
@ -774,28 +776,13 @@ void CConfigManager::handleSubmap(const std::string& command, const std::string&
|
||||||
void CConfigManager::handleSource(const std::string& command, const std::string& rawpath) {
|
void CConfigManager::handleSource(const std::string& command, const std::string& rawpath) {
|
||||||
static const char* const ENVHOME = getenv("HOME");
|
static const char* const ENVHOME = getenv("HOME");
|
||||||
|
|
||||||
auto value = rawpath;
|
if (rawpath.length() < 2) {
|
||||||
|
|
||||||
if (value.length() < 2) {
|
|
||||||
Debug::log(ERR, "source= path garbage");
|
Debug::log(ERR, "source= path garbage");
|
||||||
parseError = "source path " + value + " bogus!";
|
parseError = "source path " + rawpath + " bogus!";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value[0] == '.') {
|
auto value = absolutePath(rawpath);
|
||||||
auto currentDir = configCurrentPath.substr(0, configCurrentPath.find_last_of('/'));
|
|
||||||
|
|
||||||
if (value[1] == '.') {
|
|
||||||
auto parentDir = currentDir.substr(0, currentDir.find_last_of('/'));
|
|
||||||
value.replace(0, 2, parentDir);
|
|
||||||
} else {
|
|
||||||
value.replace(0, 1, currentDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value[0] == '~') {
|
|
||||||
value.replace(0, 1, std::string(ENVHOME));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!std::filesystem::exists(value)) {
|
if (!std::filesystem::exists(value)) {
|
||||||
Debug::log(ERR, "source= file doesnt exist");
|
Debug::log(ERR, "source= file doesnt exist");
|
||||||
|
@ -889,6 +876,28 @@ std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::
|
||||||
return parseError;
|
return parseError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CConfigManager::absolutePath(const std::string& rawpath) {
|
||||||
|
auto value = rawpath;
|
||||||
|
|
||||||
|
if (value[0] == '.') {
|
||||||
|
auto currentDir = configCurrentPath.substr(0, configCurrentPath.find_last_of('/'));
|
||||||
|
|
||||||
|
if (value[1] == '.') {
|
||||||
|
auto parentDir = currentDir.substr(0, currentDir.find_last_of('/'));
|
||||||
|
value.replace(0, 2, parentDir);
|
||||||
|
} else {
|
||||||
|
value.replace(0, 1, currentDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value[0] == '~') {
|
||||||
|
static const char* const ENVHOME = getenv("HOME");
|
||||||
|
value.replace(0, 1, std::string(ENVHOME));
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
void CConfigManager::applyUserDefinedVars(std::string& line, const size_t equalsPlace) {
|
void CConfigManager::applyUserDefinedVars(std::string& line, const size_t equalsPlace) {
|
||||||
auto dollarPlace = line.find_first_of('$', equalsPlace);
|
auto dollarPlace = line.find_first_of('$', equalsPlace);
|
||||||
|
|
||||||
|
@ -1379,4 +1388,4 @@ SAnimationPropertyConfig* CConfigManager::getAnimationPropertyConfig(const std::
|
||||||
void CConfigManager::addParseError(const std::string& err) {
|
void CConfigManager::addParseError(const std::string& err) {
|
||||||
if (parseError == "")
|
if (parseError == "")
|
||||||
parseError = err;
|
parseError = err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,6 +101,7 @@ public:
|
||||||
void ensureDPMS();
|
void ensureDPMS();
|
||||||
|
|
||||||
std::string parseKeyword(const std::string&, const std::string&, bool dynamic = false);
|
std::string parseKeyword(const std::string&, const std::string&, bool dynamic = false);
|
||||||
|
std::string absolutePath(const std::string&);
|
||||||
|
|
||||||
void addParseError(const std::string&);
|
void addParseError(const std::string&);
|
||||||
|
|
||||||
|
@ -159,4 +160,4 @@ private:
|
||||||
void handleBlurLS(const std::string&, const std::string&);
|
void handleBlurLS(const std::string&, const std::string&);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::unique_ptr<CConfigManager> g_pConfigManager;
|
inline std::unique_ptr<CConfigManager> g_pConfigManager;
|
||||||
|
|
|
@ -20,6 +20,7 @@ autogenerated=1 # remove this line to get rid of the warning on top.
|
||||||
monitor=,preferred,auto,1
|
monitor=,preferred,auto,1
|
||||||
|
|
||||||
input {
|
input {
|
||||||
|
kb_file=
|
||||||
kb_layout=
|
kb_layout=
|
||||||
kb_variant=
|
kb_variant=
|
||||||
kb_model=
|
kb_model=
|
||||||
|
@ -122,4 +123,4 @@ bind=ALT,0,movetoworkspace,10
|
||||||
|
|
||||||
bind=SUPER,mouse_down,workspace,e+1
|
bind=SUPER,mouse_down,workspace,e+1
|
||||||
bind=SUPER,mouse_up,workspace,e-1
|
bind=SUPER,mouse_up,workspace,e-1
|
||||||
)#";
|
)#";
|
||||||
|
|
|
@ -103,6 +103,7 @@ struct SKeyboard {
|
||||||
xkb_layout_index_t activeLayout = 0;
|
xkb_layout_index_t activeLayout = 0;
|
||||||
|
|
||||||
std::string name = "";
|
std::string name = "";
|
||||||
|
std::string xkbFilePath = "";
|
||||||
|
|
||||||
SStringRuleNames currentRules;
|
SStringRuleNames currentRules;
|
||||||
int repeatRate = 0;
|
int repeatRate = 0;
|
||||||
|
@ -316,4 +317,4 @@ struct SIMEPopup {
|
||||||
bool operator==(const SIMEPopup& other) {
|
bool operator==(const SIMEPopup& other) {
|
||||||
return pSurface == other.pSurface;
|
return pSurface == other.pSurface;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -519,6 +519,7 @@ void CInputManager::applyConfigToKeyboard(SKeyboard* pKeyboard) {
|
||||||
|
|
||||||
const auto NUMLOCKON = HASCONFIG ? g_pConfigManager->getDeviceInt(devname, "numlock_by_default") : g_pConfigManager->getInt("input:numlock_by_default");
|
const auto NUMLOCKON = HASCONFIG ? g_pConfigManager->getDeviceInt(devname, "numlock_by_default") : g_pConfigManager->getInt("input:numlock_by_default");
|
||||||
|
|
||||||
|
const auto FILEPATH = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_file") : g_pConfigManager->getString("input:kb_file");
|
||||||
const auto RULES = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_rules") : g_pConfigManager->getString("input:kb_rules");
|
const auto RULES = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_rules") : g_pConfigManager->getString("input:kb_rules");
|
||||||
const auto MODEL = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_model") : g_pConfigManager->getString("input:kb_model");
|
const auto MODEL = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_model") : g_pConfigManager->getString("input:kb_model");
|
||||||
const auto LAYOUT = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_layout") : g_pConfigManager->getString("input:kb_layout");
|
const auto LAYOUT = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_layout") : g_pConfigManager->getString("input:kb_layout");
|
||||||
|
@ -526,7 +527,7 @@ void CInputManager::applyConfigToKeyboard(SKeyboard* pKeyboard) {
|
||||||
const auto OPTIONS = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_options") : g_pConfigManager->getString("input:kb_options");
|
const auto OPTIONS = HASCONFIG ? g_pConfigManager->getDeviceString(devname, "kb_options") : g_pConfigManager->getString("input:kb_options");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (NUMLOCKON == pKeyboard->numlockOn && REPEATDELAY == pKeyboard->repeatDelay && REPEATRATE == pKeyboard->repeatRate && RULES != "" && RULES == pKeyboard->currentRules.rules && MODEL == pKeyboard->currentRules.model && LAYOUT == pKeyboard->currentRules.layout && VARIANT == pKeyboard->currentRules.variant && OPTIONS == pKeyboard->currentRules.options) {
|
if (NUMLOCKON == pKeyboard->numlockOn && REPEATDELAY == pKeyboard->repeatDelay && REPEATRATE == pKeyboard->repeatRate && RULES != "" && RULES == pKeyboard->currentRules.rules && MODEL == pKeyboard->currentRules.model && LAYOUT == pKeyboard->currentRules.layout && VARIANT == pKeyboard->currentRules.variant && OPTIONS == pKeyboard->currentRules.options && FILEPATH == pKeyboard->xkbFilePath) {
|
||||||
Debug::log(LOG, "Not applying config to keyboard, it did not change.");
|
Debug::log(LOG, "Not applying config to keyboard, it did not change.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -540,6 +541,7 @@ void CInputManager::applyConfigToKeyboard(SKeyboard* pKeyboard) {
|
||||||
pKeyboard->repeatDelay = REPEATDELAY;
|
pKeyboard->repeatDelay = REPEATDELAY;
|
||||||
pKeyboard->repeatRate = REPEATRATE;
|
pKeyboard->repeatRate = REPEATRATE;
|
||||||
pKeyboard->numlockOn = NUMLOCKON;
|
pKeyboard->numlockOn = NUMLOCKON;
|
||||||
|
pKeyboard->xkbFilePath = FILEPATH.c_str();
|
||||||
|
|
||||||
xkb_rule_names rules = {
|
xkb_rule_names rules = {
|
||||||
.rules = RULES.c_str(),
|
.rules = RULES.c_str(),
|
||||||
|
@ -563,7 +565,21 @@ void CInputManager::applyConfigToKeyboard(SKeyboard* pKeyboard) {
|
||||||
|
|
||||||
Debug::log(LOG, "Attempting to create a keymap for layout %s with variant %s (rules: %s, model: %s, options: %s)", rules.layout, rules.variant, rules.rules, rules.model, rules.options);
|
Debug::log(LOG, "Attempting to create a keymap for layout %s with variant %s (rules: %s, model: %s, options: %s)", rules.layout, rules.variant, rules.rules, rules.model, rules.options);
|
||||||
|
|
||||||
auto KEYMAP = xkb_keymap_new_from_names(CONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
xkb_keymap * KEYMAP = NULL;
|
||||||
|
|
||||||
|
if (!FILEPATH.empty()) {
|
||||||
|
auto path = g_pConfigManager->absolutePath(FILEPATH);
|
||||||
|
|
||||||
|
if (!std::filesystem::exists(path)) {
|
||||||
|
Debug::log(ERR, "input:kb_file= file doesnt exist");
|
||||||
|
} else {
|
||||||
|
KEYMAP = xkb_keymap_new_from_file(CONTEXT, fopen(path.c_str(), "r"), XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!KEYMAP) {
|
||||||
|
KEYMAP = xkb_keymap_new_from_names(CONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
|
||||||
|
}
|
||||||
|
|
||||||
if (!KEYMAP) {
|
if (!KEYMAP) {
|
||||||
g_pConfigManager->addParseError("Invalid keyboard layout passed. ( rules: " + RULES + ", model: " + MODEL + ", variant: " + VARIANT + ", options: " + OPTIONS + ", layout: " + LAYOUT + " )");
|
g_pConfigManager->addParseError("Invalid keyboard layout passed. ( rules: " + RULES + ", model: " + MODEL + ", variant: " + VARIANT + ", options: " + OPTIONS + ", layout: " + LAYOUT + " )");
|
||||||
|
@ -942,4 +958,4 @@ void CInputManager::disableAllKeyboards(bool virt) {
|
||||||
|
|
||||||
k.active = false;
|
k.active = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue