summaryrefslogtreecommitdiffstats
path: root/xbmc/input/KeyboardTranslator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/input/KeyboardTranslator.cpp')
-rw-r--r--xbmc/input/KeyboardTranslator.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/xbmc/input/KeyboardTranslator.cpp b/xbmc/input/KeyboardTranslator.cpp
new file mode 100644
index 0000000..1b50151
--- /dev/null
+++ b/xbmc/input/KeyboardTranslator.cpp
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "KeyboardTranslator.h"
+
+#include "Key.h"
+#include "XBMC_keytable.h"
+#include "utils/StringUtils.h"
+#include "utils/XBMCTinyXML.h"
+#include "utils/log.h"
+
+#include <string>
+#include <vector>
+
+uint32_t CKeyboardTranslator::TranslateButton(const TiXmlElement* pButton)
+{
+ uint32_t button_id = 0;
+ const char* szButton = pButton->Value();
+
+ if (szButton == nullptr)
+ return 0;
+
+ const std::string strKey = szButton;
+ if (strKey == "key")
+ {
+ std::string strID;
+ if (pButton->QueryValueAttribute("id", &strID) == TIXML_SUCCESS)
+ {
+ const char* str = strID.c_str();
+ char* endptr;
+ long int id = strtol(str, &endptr, 0);
+ if (endptr - str != (int)strlen(str) || id <= 0 || id > 0x00FFFFFF)
+ CLog::Log(LOGDEBUG, "{} - invalid key id {}", __FUNCTION__, strID);
+ else
+ button_id = (uint32_t)id;
+ }
+ else
+ CLog::Log(LOGERROR, "Keyboard Translator: `key' button has no id");
+ }
+ else
+ button_id = TranslateString(szButton);
+
+ // Process the ctrl/shift/alt modifiers
+ std::string strMod;
+ if (pButton->QueryValueAttribute("mod", &strMod) == TIXML_SUCCESS)
+ {
+ StringUtils::ToLower(strMod);
+
+ std::vector<std::string> modArray = StringUtils::Split(strMod, ",");
+ for (auto substr : modArray)
+ {
+ StringUtils::Trim(substr);
+
+ if (substr == "ctrl" || substr == "control")
+ button_id |= CKey::MODIFIER_CTRL;
+ else if (substr == "shift")
+ button_id |= CKey::MODIFIER_SHIFT;
+ else if (substr == "alt")
+ button_id |= CKey::MODIFIER_ALT;
+ else if (substr == "super" || substr == "win")
+ button_id |= CKey::MODIFIER_SUPER;
+ else if (substr == "meta" || substr == "cmd")
+ button_id |= CKey::MODIFIER_META;
+ else if (substr == "longpress")
+ button_id |= CKey::MODIFIER_LONG;
+ else
+ CLog::Log(LOGERROR, "Keyboard Translator: Unknown key modifier {} in {}", substr, strMod);
+ }
+ }
+
+ return button_id;
+}
+
+uint32_t CKeyboardTranslator::TranslateString(const std::string& szButton)
+{
+ uint32_t buttonCode = 0;
+ XBMCKEYTABLE keytable;
+
+ // Look up the key name
+ if (KeyTableLookupName(szButton, &keytable))
+ {
+ buttonCode = keytable.vkey;
+ }
+ else
+ {
+ // The lookup failed i.e. the key name wasn't found
+ CLog::Log(LOGERROR, "Keyboard Translator: Can't find button {}", szButton);
+ }
+
+ buttonCode |= KEY_VKEY;
+
+ return buttonCode;
+}