2013-08-09 08:01:20 +08:00
|
|
|
// Aseprite UI Library
|
2013-01-27 23:13:13 +08:00
|
|
|
// Copyright (C) 2001-2013 David Capello
|
2010-09-28 06:18:17 +08:00
|
|
|
//
|
2014-03-30 07:08:05 +08:00
|
|
|
// This file is released under the terms of the MIT license.
|
|
|
|
|
// Read LICENSE.txt for more information.
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2013-08-06 08:20:19 +08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
2009-07-13 04:29:16 +08:00
|
|
|
#include "config.h"
|
2013-08-06 08:20:19 +08:00
|
|
|
#endif
|
2009-07-13 04:29:16 +08:00
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
#include "ui/accelerator.h"
|
|
|
|
|
|
|
|
|
|
#include "base/unique_ptr.h"
|
2014-08-25 10:40:33 +08:00
|
|
|
#include "base/split_string.h"
|
|
|
|
|
#include "base/string.h"
|
2012-07-18 08:42:02 +08:00
|
|
|
|
2007-09-19 07:57:02 +08:00
|
|
|
#include <allegro/keyboard.h>
|
|
|
|
|
#include <ctype.h>
|
2014-08-25 10:40:33 +08:00
|
|
|
#include <string>
|
|
|
|
|
#include <vector>
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2013-07-29 08:17:07 +08:00
|
|
|
// #define REPORT_KEYS
|
2008-01-04 07:22:04 +08:00
|
|
|
#define PREPROCESS_KEYS
|
|
|
|
|
|
2012-06-18 09:02:54 +08:00
|
|
|
namespace ui {
|
|
|
|
|
|
2013-10-15 06:58:11 +08:00
|
|
|
void Accelerator::addKey(KeyModifiers modifiers, KeyScancode scancode, int unicodeChar)
|
2007-09-19 07:57:02 +08:00
|
|
|
{
|
2012-07-18 08:42:02 +08:00
|
|
|
KeyCombo key;
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2013-07-29 08:17:07 +08:00
|
|
|
key.modifiers = modifiers;
|
2012-07-18 08:42:02 +08:00
|
|
|
key.scancode = scancode;
|
2013-10-15 06:58:11 +08:00
|
|
|
key.unicodeChar = unicodeChar;
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
m_combos.push_back(key);
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
|
2014-08-25 10:40:33 +08:00
|
|
|
void Accelerator::addKeysFromString(const std::string& str)
|
2007-09-19 07:57:02 +08:00
|
|
|
{
|
2013-07-29 08:17:07 +08:00
|
|
|
KeyModifiers modifiers = kKeyNoneModifier;
|
|
|
|
|
KeyScancode scancode = kKeyNil;
|
2013-10-15 06:58:11 +08:00
|
|
|
int unicodeChar = 0;
|
2010-08-13 04:29:06 +08:00
|
|
|
|
|
|
|
|
// Special case: plus sign
|
2014-08-25 10:40:33 +08:00
|
|
|
if (str == "+") {
|
|
|
|
|
addKey(kKeyNoneModifier, kKeyNil, '+');
|
2010-08-13 04:29:06 +08:00
|
|
|
return;
|
|
|
|
|
}
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2014-08-25 10:40:33 +08:00
|
|
|
std::vector<std::string> tokens;
|
|
|
|
|
base::split_string(str, tokens, "+");
|
|
|
|
|
for (std::string tok : tokens) {
|
|
|
|
|
tok = base::string_to_lower(tok);
|
|
|
|
|
|
|
|
|
|
if (scancode == kKeySpace) {
|
|
|
|
|
modifiers = (KeyModifiers)((int)modifiers | (int)kKeySpaceModifier);
|
|
|
|
|
scancode = kKeyNil;
|
|
|
|
|
}
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2014-08-25 10:40:33 +08:00
|
|
|
// Modifiers
|
|
|
|
|
if (tok == "shift") {
|
2013-07-29 08:17:07 +08:00
|
|
|
modifiers = (KeyModifiers)((int)modifiers | (int)kKeyShiftModifier);
|
2010-08-13 04:29:06 +08:00
|
|
|
}
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "alt") {
|
2013-07-29 08:17:07 +08:00
|
|
|
modifiers = (KeyModifiers)((int)modifiers | (int)kKeyAltModifier);
|
2010-10-20 11:07:48 +08:00
|
|
|
}
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "ctrl") {
|
2013-07-29 08:17:07 +08:00
|
|
|
modifiers = (KeyModifiers)((int)modifiers | (int)kKeyCtrlModifier);
|
2010-08-13 04:29:06 +08:00
|
|
|
}
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "cmd") {
|
2014-08-06 11:42:50 +08:00
|
|
|
modifiers = (KeyModifiers)((int)modifiers | (int)kKeyCmdModifier);
|
|
|
|
|
}
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2013-07-29 08:17:07 +08:00
|
|
|
// Scancode
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2010-08-13 04:29:06 +08:00
|
|
|
// word with one character
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok.size() == 1) {
|
|
|
|
|
if ((tok[0] >= 'a') && (tok[0] <= 'z')) {
|
|
|
|
|
unicodeChar = tok[0];
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
else {
|
2014-08-25 10:40:33 +08:00
|
|
|
unicodeChar = tok[0];
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
2010-08-13 04:29:06 +08:00
|
|
|
|
2014-08-25 10:40:33 +08:00
|
|
|
if ((tok[0] >= 'a') && (tok[0] <= 'z'))
|
|
|
|
|
scancode = (KeyScancode)((int)kKeyA + tolower(tok[0]) - 'a');
|
|
|
|
|
else if ((tok[0] >= '0') && (tok[0] <= '9'))
|
|
|
|
|
scancode = (KeyScancode)((int)kKey0 + tok[0] - '0');
|
2007-09-19 07:57:02 +08:00
|
|
|
else {
|
2014-08-25 10:40:33 +08:00
|
|
|
switch (tok[0]) {
|
2013-07-29 08:17:07 +08:00
|
|
|
case '~': scancode = kKeyTilde; break;
|
|
|
|
|
case '-': scancode = kKeyMinus; break;
|
|
|
|
|
case '=': scancode = kKeyEquals; break;
|
|
|
|
|
case '[': scancode = kKeyOpenbrace; break;
|
|
|
|
|
case ']': scancode = kKeyClosebrace; break;
|
|
|
|
|
case ';': scancode = kKeyColon; break;
|
|
|
|
|
case '\'': scancode = kKeyQuote; break;
|
|
|
|
|
case '\\': scancode = kKeyBackslash; break;
|
|
|
|
|
case ',': scancode = kKeyComma; break;
|
|
|
|
|
case '.': scancode = kKeyStop; break;
|
|
|
|
|
case '/': scancode = kKeySlash; break;
|
|
|
|
|
case '*': scancode = kKeyAsterisk; break;
|
2012-01-06 06:45:03 +08:00
|
|
|
}
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* other ones */
|
|
|
|
|
else {
|
|
|
|
|
/* F1, F2, ..., F11, F12 */
|
2014-08-25 10:40:33 +08:00
|
|
|
if (tok[0] == 'f' && (tok.size() <= 3)) {
|
|
|
|
|
int num = strtol(tok.c_str()+1, NULL, 10);
|
2012-01-06 06:45:03 +08:00
|
|
|
if ((num >= 1) && (num <= 12))
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = (KeyScancode)((int)kKeyF1 + num - 1);
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
2014-08-25 10:40:33 +08:00
|
|
|
else if ((tok == "escape") || (tok == "esc"))
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyEsc;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "backspace")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyBackspace;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "tab")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyTab;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "enter")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyEnter;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "space")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeySpace;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if ((tok == "insert") || (tok == "ins"))
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyInsert;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if ((tok == "delete") || (tok == "del"))
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyDel;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "home")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyHome;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "end")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyEnd;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if ((tok == "page up") || (tok == "pgup"))
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyPageUp;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if ((tok == "page down") || (tok == "pgdn"))
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyPageDown;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "left")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyLeft;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "right")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyRight;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "up")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyUp;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "down")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyDown;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "0 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey0Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "1 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey1Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "2 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey2Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "3 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey3Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "4 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey4Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "5 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey5Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "6 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey6Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "7 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey7Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "8 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey8Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "9 pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKey9Pad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "slash pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeySlashPad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "asterisk")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyAsterisk;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "minus pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyMinusPad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "plus pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyPlusPad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "del pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyDelPad;
|
2014-08-25 10:40:33 +08:00
|
|
|
else if (tok == "enter pad")
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyEnterPad;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-25 10:40:33 +08:00
|
|
|
addKey(modifiers, scancode, unicodeChar);
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
std::string Accelerator::KeyCombo::toString()
|
2007-09-19 07:57:02 +08:00
|
|
|
{
|
2013-07-29 08:17:07 +08:00
|
|
|
// Same order that Allegro scancodes
|
2007-09-19 07:57:02 +08:00
|
|
|
static const char *table[] = {
|
|
|
|
|
NULL,
|
|
|
|
|
"A",
|
|
|
|
|
"B",
|
|
|
|
|
"C",
|
|
|
|
|
"D",
|
|
|
|
|
"E",
|
|
|
|
|
"F",
|
|
|
|
|
"G",
|
|
|
|
|
"H",
|
|
|
|
|
"I",
|
|
|
|
|
"J",
|
|
|
|
|
"K",
|
|
|
|
|
"L",
|
|
|
|
|
"M",
|
|
|
|
|
"N",
|
|
|
|
|
"O",
|
|
|
|
|
"P",
|
|
|
|
|
"Q",
|
|
|
|
|
"R",
|
|
|
|
|
"S",
|
|
|
|
|
"T",
|
|
|
|
|
"U",
|
|
|
|
|
"V",
|
|
|
|
|
"W",
|
|
|
|
|
"X",
|
|
|
|
|
"Y",
|
|
|
|
|
"Z",
|
|
|
|
|
"0",
|
|
|
|
|
"1",
|
|
|
|
|
"2",
|
|
|
|
|
"3",
|
|
|
|
|
"4",
|
|
|
|
|
"5",
|
|
|
|
|
"6",
|
|
|
|
|
"7",
|
|
|
|
|
"8",
|
|
|
|
|
"9",
|
|
|
|
|
"0 Pad",
|
|
|
|
|
"1 Pad",
|
|
|
|
|
"2 Pad",
|
|
|
|
|
"3 Pad",
|
|
|
|
|
"4 Pad",
|
|
|
|
|
"5 Pad",
|
|
|
|
|
"6 Pad",
|
|
|
|
|
"7 Pad",
|
|
|
|
|
"8 Pad",
|
|
|
|
|
"9 Pad",
|
|
|
|
|
"F1",
|
|
|
|
|
"F2",
|
|
|
|
|
"F3",
|
|
|
|
|
"F4",
|
|
|
|
|
"F5",
|
|
|
|
|
"F6",
|
|
|
|
|
"F7",
|
|
|
|
|
"F8",
|
|
|
|
|
"F9",
|
|
|
|
|
"F10",
|
|
|
|
|
"F11",
|
|
|
|
|
"F12",
|
|
|
|
|
"Esc",
|
|
|
|
|
"~",
|
|
|
|
|
"-",
|
|
|
|
|
"=",
|
|
|
|
|
"Backspace",
|
|
|
|
|
"Tab",
|
|
|
|
|
"[",
|
|
|
|
|
"]",
|
|
|
|
|
"Enter",
|
|
|
|
|
";",
|
|
|
|
|
"\'",
|
|
|
|
|
"\\",
|
|
|
|
|
"KEY_BACKSLASH2",
|
|
|
|
|
",",
|
|
|
|
|
".",
|
|
|
|
|
"/",
|
|
|
|
|
"Space",
|
|
|
|
|
"Ins",
|
|
|
|
|
"Del",
|
|
|
|
|
"Home",
|
|
|
|
|
"End",
|
|
|
|
|
"PgUp",
|
|
|
|
|
"PgDn",
|
|
|
|
|
"Left",
|
|
|
|
|
"Right",
|
|
|
|
|
"Up",
|
|
|
|
|
"Down",
|
|
|
|
|
"/ Pad",
|
|
|
|
|
"* Pad",
|
|
|
|
|
"- Pad",
|
|
|
|
|
"+ Pad",
|
|
|
|
|
"Delete Pad",
|
|
|
|
|
"Enter Pad",
|
|
|
|
|
"PrtScr",
|
|
|
|
|
"Pause",
|
|
|
|
|
"KEY_ABNT_C1",
|
|
|
|
|
"Yen",
|
|
|
|
|
"Kana",
|
|
|
|
|
"KEY_CONVERT",
|
|
|
|
|
"KEY_NOCONVERT",
|
|
|
|
|
"KEY_AT",
|
|
|
|
|
"KEY_CIRCUMFLEX",
|
|
|
|
|
"KEY_COLON2",
|
|
|
|
|
"Kanji",
|
|
|
|
|
};
|
|
|
|
|
|
2014-08-25 10:40:33 +08:00
|
|
|
std::string buf;
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
// Shifts
|
2014-08-25 10:40:33 +08:00
|
|
|
if (this->modifiers & kKeyCtrlModifier) buf += "Ctrl+";
|
|
|
|
|
if (this->modifiers & kKeyCmdModifier) buf += "Cmd+";
|
|
|
|
|
if (this->modifiers & kKeyAltModifier) buf += "Alt+";
|
|
|
|
|
if (this->modifiers & kKeyShiftModifier) buf += "Shift+";
|
|
|
|
|
if (this->modifiers & kKeySpaceModifier) buf += "Space+";
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
// Key
|
2013-10-15 06:58:11 +08:00
|
|
|
if (this->unicodeChar)
|
2014-08-25 10:40:33 +08:00
|
|
|
buf += (wchar_t)toupper(this->unicodeChar);
|
2012-07-18 08:42:02 +08:00
|
|
|
else if (this->scancode)
|
2014-08-25 10:40:33 +08:00
|
|
|
buf += table[this->scancode];
|
|
|
|
|
else if (!buf.empty() && buf[buf.size()-1] == '+')
|
|
|
|
|
buf.erase(buf.size()-1);
|
2012-07-18 08:42:02 +08:00
|
|
|
|
|
|
|
|
return buf;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
std::string Accelerator::toString()
|
2007-09-19 07:57:02 +08:00
|
|
|
{
|
2012-07-18 08:42:02 +08:00
|
|
|
ASSERT(!m_combos.empty());
|
|
|
|
|
return m_combos.front().toString();
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
|
2013-10-15 06:58:11 +08:00
|
|
|
bool Accelerator::check(KeyModifiers modifiers, KeyScancode scancode, int unicodeChar)
|
2007-09-19 07:57:02 +08:00
|
|
|
{
|
|
|
|
|
#ifdef REPORT_KEYS
|
|
|
|
|
char buf[256];
|
2012-07-18 08:42:02 +08:00
|
|
|
std::string buf2;
|
2007-09-19 07:57:02 +08:00
|
|
|
#endif
|
|
|
|
|
|
2013-07-29 08:17:07 +08:00
|
|
|
// Preprocess the character to be compared with the accelerator
|
2007-09-19 07:57:02 +08:00
|
|
|
#ifdef PREPROCESS_KEYS
|
2013-07-29 08:17:07 +08:00
|
|
|
// Directly scancode
|
2014-08-25 10:40:33 +08:00
|
|
|
if ((scancode >= kKeyF1 && scancode <= kKeyF12) ||
|
2013-07-29 08:17:07 +08:00
|
|
|
(scancode == kKeyEsc) ||
|
|
|
|
|
(scancode == kKeyBackspace) ||
|
|
|
|
|
(scancode == kKeyTab) ||
|
|
|
|
|
(scancode == kKeyEnter) ||
|
|
|
|
|
(scancode == kKeyBackslash) ||
|
|
|
|
|
(scancode == kKeyBackslash2) ||
|
|
|
|
|
(scancode >= kKeySpace && scancode <= kKeyDown) ||
|
|
|
|
|
(scancode >= kKeyEnterPad && scancode <= kKeyNoconvert) ||
|
|
|
|
|
(scancode == kKeyKanji)) {
|
2013-10-15 06:58:11 +08:00
|
|
|
unicodeChar = 0;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
2013-07-29 08:17:07 +08:00
|
|
|
// For Ctrl+number
|
2013-10-15 06:58:11 +08:00
|
|
|
/* scancode unicodeChar
|
2007-09-19 07:57:02 +08:00
|
|
|
Ctrl+0 27 0
|
|
|
|
|
Ctrl+1 28 2
|
|
|
|
|
Ctrl+2 29 0
|
|
|
|
|
Ctrl+3 30 27
|
|
|
|
|
Ctrl+4 31 28
|
|
|
|
|
Ctrl+5 32 29
|
|
|
|
|
Ctrl+6 33 30
|
|
|
|
|
Ctrl+7 34 31
|
|
|
|
|
Ctrl+8 35 127
|
|
|
|
|
Ctrl+9 36 2
|
|
|
|
|
*/
|
2013-07-29 08:17:07 +08:00
|
|
|
else if ((scancode >= kKey0 && scancode <= kKey9) &&
|
2013-10-15 06:58:11 +08:00
|
|
|
(unicodeChar < 32 || unicodeChar == 127)) {
|
|
|
|
|
unicodeChar = '0' + scancode - kKey0;
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyNil;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
2013-07-29 08:17:07 +08:00
|
|
|
// For Ctrl+letter
|
2013-10-15 06:58:11 +08:00
|
|
|
else if (unicodeChar >= 1 && unicodeChar <= 'z'-'a'+1) {
|
|
|
|
|
unicodeChar = 'a'+unicodeChar-1;
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyNil;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
2013-10-15 06:58:11 +08:00
|
|
|
// For any other legal Unicode code
|
|
|
|
|
else if (unicodeChar >= ' ') {
|
|
|
|
|
unicodeChar = tolower(unicodeChar);
|
2007-09-19 07:57:02 +08:00
|
|
|
|
|
|
|
|
/* without shift (because characters like '*' can be trigger with
|
|
|
|
|
"Shift+8", so we don't want "Shift+*") */
|
2013-10-15 06:58:11 +08:00
|
|
|
if (!(unicodeChar >= 'a' && unicodeChar <= 'z'))
|
2013-07-29 08:17:07 +08:00
|
|
|
modifiers = (KeyModifiers)((int)modifiers & ((int)~kKeyShiftModifier));
|
2007-09-19 07:57:02 +08:00
|
|
|
|
2013-07-29 08:17:07 +08:00
|
|
|
scancode = kKeyNil;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef REPORT_KEYS
|
|
|
|
|
{
|
2013-08-06 08:20:19 +08:00
|
|
|
base::UniquePtr<Accelerator> a2(new Accelerator);
|
2013-10-15 06:58:11 +08:00
|
|
|
a2->addKey(modifiers, scancode, unicodeChar);
|
2012-07-18 08:42:02 +08:00
|
|
|
buf2 = a2->getString();
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
for (KeyCombos::iterator it = m_combos.begin(), end = m_combos.end();
|
|
|
|
|
it != end; ++it) {
|
2007-09-19 07:57:02 +08:00
|
|
|
#ifdef REPORT_KEYS
|
|
|
|
|
printf("%3d==%3d %3d==%3d %s==%s ",
|
2013-10-15 06:58:11 +08:00
|
|
|
it->scancode, scancode, it->unicodeChar, unicodeChar,
|
2012-07-18 08:42:02 +08:00
|
|
|
it->getString().c_str(), buf2.c_str();
|
2007-09-19 07:57:02 +08:00
|
|
|
#endif
|
2010-10-28 08:02:48 +08:00
|
|
|
|
2013-07-29 08:17:07 +08:00
|
|
|
if ((it->modifiers == modifiers) &&
|
|
|
|
|
((it->scancode != kKeyNil && it->scancode == scancode) ||
|
2013-10-15 06:58:11 +08:00
|
|
|
(it->unicodeChar && it->unicodeChar == unicodeChar))) {
|
2010-10-28 08:02:48 +08:00
|
|
|
|
2007-09-19 07:57:02 +08:00
|
|
|
#ifdef REPORT_KEYS
|
2009-07-10 09:34:37 +08:00
|
|
|
printf("true\n");
|
2007-09-19 07:57:02 +08:00
|
|
|
#endif
|
2010-10-28 08:02:48 +08:00
|
|
|
|
2009-07-10 09:34:37 +08:00
|
|
|
return true;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
|
|
|
|
#ifdef REPORT_KEYS
|
2009-07-10 09:34:37 +08:00
|
|
|
printf("false\n");
|
2007-09-19 07:57:02 +08:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-10 09:34:37 +08:00
|
|
|
return false;
|
2007-09-19 07:57:02 +08:00
|
|
|
}
|
2010-10-28 08:02:48 +08:00
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
bool Accelerator::checkFromAllegroKeyArray()
|
2010-10-28 08:02:48 +08:00
|
|
|
{
|
2013-07-29 08:17:07 +08:00
|
|
|
KeyModifiers modifiers = kKeyNoneModifier;
|
2010-10-28 08:02:48 +08:00
|
|
|
|
2013-07-29 08:17:07 +08:00
|
|
|
if (key[KEY_LSHIFT] ) modifiers = (KeyModifiers)((int)modifiers | (int)kKeyShiftModifier);
|
|
|
|
|
if (key[KEY_RSHIFT] ) modifiers = (KeyModifiers)((int)modifiers | (int)kKeyShiftModifier);
|
|
|
|
|
if (key[KEY_LCONTROL]) modifiers = (KeyModifiers)((int)modifiers | (int)kKeyCtrlModifier);
|
|
|
|
|
if (key[KEY_RCONTROL]) modifiers = (KeyModifiers)((int)modifiers | (int)kKeyCtrlModifier);
|
|
|
|
|
if (key[KEY_ALT] ) modifiers = (KeyModifiers)((int)modifiers | (int)kKeyAltModifier);
|
2014-08-06 11:42:50 +08:00
|
|
|
if (key[KEY_COMMAND ]) modifiers = (KeyModifiers)((int)modifiers | (int)kKeyCmdModifier);
|
2010-10-28 08:02:48 +08:00
|
|
|
|
2012-07-18 08:42:02 +08:00
|
|
|
for (KeyCombos::iterator it = m_combos.begin(), end = m_combos.end();
|
|
|
|
|
it != end; ++it) {
|
|
|
|
|
if ((it->scancode == 0 || key[it->scancode]) &&
|
2013-07-29 08:17:07 +08:00
|
|
|
(it->modifiers == modifiers)) {
|
2010-10-28 08:02:48 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2012-06-18 09:02:54 +08:00
|
|
|
|
|
|
|
|
} // namespace ui
|