From 51d92454cee402ded7df8f161bf8ff97f534c551 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 13:39:55 +0800 Subject: [PATCH 1/9] Map all single symbols in the keyboard to accelerators. --- browser/ui/accelerator_util.cc | 135 ++++++++++++++++++++------------- 1 file changed, 83 insertions(+), 52 deletions(-) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index fe1b7a962..908eda9f0 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -15,7 +15,7 @@ namespace accelerator_util { namespace { -// Convert "Command" to "Ctrl" on non-Mac +// Convert "Command" to "Ctrl" on non-Mac. std::string NormalizeShortcutSuggestion(const std::string& suggestion) { #if defined(OS_MACOSX) return suggestion; @@ -25,16 +25,84 @@ std::string NormalizeShortcutSuggestion(const std::string& suggestion) { std::vector tokens; base::SplitString(suggestion, '+', &tokens); for (size_t i = 0; i < tokens.size(); i++) { - if (tokens[i] == "Command") - tokens[i] = "Ctrl"; + if (LowerCaseEqualsASCII(tokens[i], "command")) + tokens[i] = "ctrl"; } return JoinString(tokens, '+'); } +// Return key code of the char. +ui::KeyboardCode KeyboardCodeFromCharCode(char c, bool* shifted) { + *shifted = false; + switch (c) { + case 8: case 0x7F: return ui::VKEY_BACK; + case 9: return ui::VKEY_TAB; + case 0xD: case 3: return ui::VKEY_RETURN; + case 0x1B: return ui::VKEY_ESCAPE; + case ' ': return ui::VKEY_SPACE; + + case 'A': case 'a': return ui::VKEY_A; + case 'B': case 'b': return ui::VKEY_B; + case 'C': case 'c': return ui::VKEY_C; + case 'D': case 'd': return ui::VKEY_D; + case 'E': case 'e': return ui::VKEY_E; + case 'F': case 'f': return ui::VKEY_F; + case 'G': case 'g': return ui::VKEY_G; + case 'H': case 'h': return ui::VKEY_H; + case 'I': case 'i': return ui::VKEY_I; + case 'J': case 'j': return ui::VKEY_J; + case 'K': case 'k': return ui::VKEY_K; + case 'L': case 'l': return ui::VKEY_L; + case 'M': case 'm': return ui::VKEY_M; + case 'N': case 'n': return ui::VKEY_N; + case 'O': case 'o': return ui::VKEY_O; + case 'P': case 'p': return ui::VKEY_P; + case 'Q': case 'q': return ui::VKEY_Q; + case 'R': case 'r': return ui::VKEY_R; + case 'S': case 's': return ui::VKEY_S; + case 'T': case 't': return ui::VKEY_T; + case 'U': case 'u': return ui::VKEY_U; + case 'V': case 'v': return ui::VKEY_V; + case 'W': case 'w': return ui::VKEY_W; + case 'X': case 'x': return ui::VKEY_X; + case 'Y': case 'y': return ui::VKEY_Y; + case 'Z': case 'z': return ui::VKEY_Z; + + case ')': *shifted = true; case '0': return ui::VKEY_0; + case '!': *shifted = true; case '1': return ui::VKEY_1; + case '@': *shifted = true; case '2': return ui::VKEY_2; + case '#': *shifted = true; case '3': return ui::VKEY_3; + case '$': *shifted = true; case '4': return ui::VKEY_4; + case '%': *shifted = true; case '5': return ui::VKEY_5; + case '^': *shifted = true; case '6': return ui::VKEY_6; + case '&': *shifted = true; case '7': return ui::VKEY_7; + case '*': *shifted = true; case '8': return ui::VKEY_8; + case '(': *shifted = true; case '9': return ui::VKEY_9; + + case ':': *shifted = true; case ';': return ui::VKEY_OEM_1; + case '+': *shifted = true; case '=': return ui::VKEY_OEM_PLUS; + case '<': *shifted = true; case ',': return ui::VKEY_OEM_COMMA; + case '_': *shifted = true; case '-': return ui::VKEY_OEM_MINUS; + case '>': *shifted = true; case '.': return ui::VKEY_OEM_PERIOD; + case '?': *shifted = true; case '/': return ui::VKEY_OEM_2; + case '~': *shifted = true; case '`': return ui::VKEY_OEM_3; + case '{': *shifted = true; case '[': return ui::VKEY_OEM_4; + case '|': *shifted = true; case '\\': return ui::VKEY_OEM_5; + case '}': *shifted = true; case ']': return ui::VKEY_OEM_6; + case '"': *shifted = true; case '\'': return ui::VKEY_OEM_7; + + default: return ui::VKEY_UNKNOWN; + } +} + } // namespace bool StringToAccelerator(const std::string& description, ui::Accelerator* accelerator) { + if (!IsStringASCII(description)) { + LOG(ERROR) << "The accelerator string can only contain ASCII characters"; + return false; + } std::string shortcut(NormalizeShortcutSuggestion(description)); std::vector tokens; @@ -48,65 +116,28 @@ bool StringToAccelerator(const std::string& description, int modifiers = ui::EF_NONE; ui::KeyboardCode key = ui::VKEY_UNKNOWN; for (size_t i = 0; i < tokens.size(); i++) { - if (tokens[i] == "Ctrl") { + if (LowerCaseEqualsASCII(tokens[i], "ctrl")) { modifiers |= ui::EF_CONTROL_DOWN; - } else if (tokens[i] == "Command") { + } else if (LowerCaseEqualsASCII(tokens[i], "command")) { modifiers |= ui::EF_COMMAND_DOWN; - } else if (tokens[i] == "Alt") { + } else if (LowerCaseEqualsASCII(tokens[i], "alt")) { modifiers |= ui::EF_ALT_DOWN; - } else if (tokens[i] == "Shift") { + } else if (LowerCaseEqualsASCII(tokens[i], "shift")) { modifiers |= ui::EF_SHIFT_DOWN; } else if (tokens[i].size() == 1) { - char token = tokens[i][0]; - if (key != ui::VKEY_UNKNOWN) { // Multiple key assignments. key = ui::VKEY_UNKNOWN; return false; } - if (token >= 'A' && token <= 'Z') { - key = static_cast(ui::VKEY_A + (token - 'A')); - } else if (token >= '0' && token <= '9') { - key = static_cast(ui::VKEY_0 + (token - '0')); - } else if (token >= '*' && token <= '/') { - // *+,-./ - key = static_cast( - ui::VKEY_MULTIPLY + (token - '*')); - } else { - switch (token) { - case ':': - case ';': - key = ui::VKEY_OEM_1; - break; - case '?': - case '/': - key = ui::VKEY_OEM_2; - break; - case '~': - case '`': - key = ui::VKEY_OEM_3; - break; - case '{': - case '[': - key = ui::VKEY_OEM_4; - break; - case '|': - case '\\': - key = ui::VKEY_OEM_5; - break; - case '}': - case ']': - key = ui::VKEY_OEM_6; - break; - case '\"': - case '\'': - key = ui::VKEY_OEM_7; - break; - default: - LOG(WARNING) << "Invalid accelerator character: " << tokens[i]; - key = ui::VKEY_UNKNOWN; - return false; - } + + bool shifted = false; + key = KeyboardCodeFromCharCode(tokens[i][0], &shifted); + if (key == ui::VKEY_UNKNOWN) { + LOG(WARNING) << "Invalid accelerator token: " << tokens[i]; + return false; + } else if (shifted) { + modifiers |= ui::EF_SHIFT_DOWN; } } else { LOG(WARNING) << "Invalid accelerator token: " << tokens[i]; From 534ff5efdb3f290cab5b093b3d4e7091ba0af48a Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 13:46:37 +0800 Subject: [PATCH 2/9] Be case-insensible of accelerators. --- browser/ui/accelerator_util.cc | 65 +++++++++++++++++----------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index 908eda9f0..449a5d639 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -25,7 +25,7 @@ std::string NormalizeShortcutSuggestion(const std::string& suggestion) { std::vector tokens; base::SplitString(suggestion, '+', &tokens); for (size_t i = 0; i < tokens.size(); i++) { - if (LowerCaseEqualsASCII(tokens[i], "command")) + if (tokens[i] == "command") tokens[i] = "ctrl"; } return JoinString(tokens, '+'); @@ -41,32 +41,32 @@ ui::KeyboardCode KeyboardCodeFromCharCode(char c, bool* shifted) { case 0x1B: return ui::VKEY_ESCAPE; case ' ': return ui::VKEY_SPACE; - case 'A': case 'a': return ui::VKEY_A; - case 'B': case 'b': return ui::VKEY_B; - case 'C': case 'c': return ui::VKEY_C; - case 'D': case 'd': return ui::VKEY_D; - case 'E': case 'e': return ui::VKEY_E; - case 'F': case 'f': return ui::VKEY_F; - case 'G': case 'g': return ui::VKEY_G; - case 'H': case 'h': return ui::VKEY_H; - case 'I': case 'i': return ui::VKEY_I; - case 'J': case 'j': return ui::VKEY_J; - case 'K': case 'k': return ui::VKEY_K; - case 'L': case 'l': return ui::VKEY_L; - case 'M': case 'm': return ui::VKEY_M; - case 'N': case 'n': return ui::VKEY_N; - case 'O': case 'o': return ui::VKEY_O; - case 'P': case 'p': return ui::VKEY_P; - case 'Q': case 'q': return ui::VKEY_Q; - case 'R': case 'r': return ui::VKEY_R; - case 'S': case 's': return ui::VKEY_S; - case 'T': case 't': return ui::VKEY_T; - case 'U': case 'u': return ui::VKEY_U; - case 'V': case 'v': return ui::VKEY_V; - case 'W': case 'w': return ui::VKEY_W; - case 'X': case 'x': return ui::VKEY_X; - case 'Y': case 'y': return ui::VKEY_Y; - case 'Z': case 'z': return ui::VKEY_Z; + case 'a': return ui::VKEY_A; + case 'b': return ui::VKEY_B; + case 'c': return ui::VKEY_C; + case 'd': return ui::VKEY_D; + case 'e': return ui::VKEY_E; + case 'f': return ui::VKEY_F; + case 'g': return ui::VKEY_G; + case 'h': return ui::VKEY_H; + case 'i': return ui::VKEY_I; + case 'j': return ui::VKEY_J; + case 'k': return ui::VKEY_K; + case 'l': return ui::VKEY_L; + case 'm': return ui::VKEY_M; + case 'n': return ui::VKEY_N; + case 'o': return ui::VKEY_O; + case 'p': return ui::VKEY_P; + case 'q': return ui::VKEY_Q; + case 'r': return ui::VKEY_R; + case 's': return ui::VKEY_S; + case 't': return ui::VKEY_T; + case 'u': return ui::VKEY_U; + case 'v': return ui::VKEY_V; + case 'w': return ui::VKEY_W; + case 'x': return ui::VKEY_X; + case 'y': return ui::VKEY_Y; + case 'z': return ui::VKEY_Z; case ')': *shifted = true; case '0': return ui::VKEY_0; case '!': *shifted = true; case '1': return ui::VKEY_1; @@ -103,7 +103,8 @@ bool StringToAccelerator(const std::string& description, LOG(ERROR) << "The accelerator string can only contain ASCII characters"; return false; } - std::string shortcut(NormalizeShortcutSuggestion(description)); + std::string shortcut(StringToLowerASCII(description)); + shortcut = NormalizeShortcutSuggestion(shortcut); std::vector tokens; base::SplitString(shortcut, '+', &tokens); @@ -116,13 +117,13 @@ bool StringToAccelerator(const std::string& description, int modifiers = ui::EF_NONE; ui::KeyboardCode key = ui::VKEY_UNKNOWN; for (size_t i = 0; i < tokens.size(); i++) { - if (LowerCaseEqualsASCII(tokens[i], "ctrl")) { + if (tokens[i] == "ctrl") { modifiers |= ui::EF_CONTROL_DOWN; - } else if (LowerCaseEqualsASCII(tokens[i], "command")) { + } else if (tokens[i] == "command") { modifiers |= ui::EF_COMMAND_DOWN; - } else if (LowerCaseEqualsASCII(tokens[i], "alt")) { + } else if (tokens[i] == "alt") { modifiers |= ui::EF_ALT_DOWN; - } else if (LowerCaseEqualsASCII(tokens[i], "shift")) { + } else if (tokens[i] == "shift") { modifiers |= ui::EF_SHIFT_DOWN; } else if (tokens[i].size() == 1) { if (key != ui::VKEY_UNKNOWN) { From f091352c56e83d094672823e7c28c641920f3d19 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 14:05:43 +0800 Subject: [PATCH 3/9] Slightly optimize accelerator token comparing. --- browser/ui/accelerator_util.cc | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index 449a5d639..41cce2c19 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -117,7 +117,12 @@ bool StringToAccelerator(const std::string& description, int modifiers = ui::EF_NONE; ui::KeyboardCode key = ui::VKEY_UNKNOWN; for (size_t i = 0; i < tokens.size(); i++) { - if (tokens[i] == "ctrl") { + if (tokens[i].size() == 1) { + bool shifted = false; + key = KeyboardCodeFromCharCode(tokens[i][0], &shifted); + if (shifted) + modifiers |= ui::EF_SHIFT_DOWN; + } else if (tokens[i] == "ctrl") { modifiers |= ui::EF_CONTROL_DOWN; } else if (tokens[i] == "command") { modifiers |= ui::EF_COMMAND_DOWN; @@ -125,27 +130,17 @@ bool StringToAccelerator(const std::string& description, modifiers |= ui::EF_ALT_DOWN; } else if (tokens[i] == "shift") { modifiers |= ui::EF_SHIFT_DOWN; - } else if (tokens[i].size() == 1) { - if (key != ui::VKEY_UNKNOWN) { - // Multiple key assignments. - key = ui::VKEY_UNKNOWN; - return false; - } - - bool shifted = false; - key = KeyboardCodeFromCharCode(tokens[i][0], &shifted); - if (key == ui::VKEY_UNKNOWN) { - LOG(WARNING) << "Invalid accelerator token: " << tokens[i]; - return false; - } else if (shifted) { - modifiers |= ui::EF_SHIFT_DOWN; - } } else { LOG(WARNING) << "Invalid accelerator token: " << tokens[i]; return false; } } + if (key == ui::VKEY_UNKNOWN) { + LOG(WARNING) << "The accelerator doesn't contain a valid key"; + return false; + } + *accelerator = ui::Accelerator(key, modifiers); SetPlatformAccelerator(accelerator); return true; From 6e4f74ae35c4c0da9fa8a2d3020992106a151ccd Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 14:25:36 +0800 Subject: [PATCH 4/9] Allow more special keys in the accelerator. --- browser/ui/accelerator_util.cc | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index 41cce2c19..64aae0bc6 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -117,6 +117,8 @@ bool StringToAccelerator(const std::string& description, int modifiers = ui::EF_NONE; ui::KeyboardCode key = ui::VKEY_UNKNOWN; for (size_t i = 0; i < tokens.size(); i++) { + // We use straight comparing instead of map because the accelerator tends + // to be correct and usually only uses few special tokens. if (tokens[i].size() == 1) { bool shifted = false; key = KeyboardCodeFromCharCode(tokens[i][0], &shifted); @@ -130,6 +132,46 @@ bool StringToAccelerator(const std::string& description, modifiers |= ui::EF_ALT_DOWN; } else if (tokens[i] == "shift") { modifiers |= ui::EF_SHIFT_DOWN; + } else if (tokens[i] == "tab") { + key = ui::VKEY_TAB; + } else if (tokens[i] == "backspace") { + key = ui::VKEY_BACK; + } else if (tokens[i] == "delete") { + key = ui::VKEY_DELETE; + } else if (tokens[i] == "enter" || tokens[i] == "return") { + key = ui::VKEY_RETURN; + } else if (tokens[i] == "up") { + key = ui::VKEY_UP; + } else if (tokens[i] == "down") { + key = ui::VKEY_DOWN; + } else if (tokens[i] == "left") { + key = ui::VKEY_LEFT; + } else if (tokens[i] == "right") { + key = ui::VKEY_RIGHT; + } else if (tokens[i] == "home") { + key = ui::VKEY_HOME; + } else if (tokens[i] == "end") { + key = ui::VKEY_END; + } else if (tokens[i] == "pagedown") { + key = ui::VKEY_PRIOR; + } else if (tokens[i] == "pageup") { + key = ui::VKEY_NEXT; + } else if (tokens[i] == "esc") { + key = ui::VKEY_ESCAPE; + } else if (tokens[i] == "volumemute") { + key = ui::VKEY_VOLUME_MUTE; + } else if (tokens[i] == "volumeup") { + key = ui::VKEY_VOLUME_UP; + } else if (tokens[i] == "volumedown") { + key = ui::VKEY_VOLUME_DOWN; + } else if (tokens[i] == "medianexttrack") { + key = ui::VKEY_MEDIA_NEXT_TRACK; + } else if (tokens[i] == "mediaprevioustrack") { + key = ui::VKEY_MEDIA_PREV_TRACK; + } else if (tokens[i] == "mediastop") { + key = ui::VKEY_MEDIA_STOP; + } else if (tokens[i] == "mediaplaypause") { + key = ui::VKEY_MEDIA_PLAY_PAUSE; } else { LOG(WARNING) << "Invalid accelerator token: " << tokens[i]; return false; From a6eb261af0ec67d3ccebfc1dc08c45641cd45ca5 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 14:34:25 +0800 Subject: [PATCH 5/9] Get rid of the NormalizeShortcutSuggestion function. --- browser/ui/accelerator_util.cc | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index 64aae0bc6..32ff423a7 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -15,22 +15,6 @@ namespace accelerator_util { namespace { -// Convert "Command" to "Ctrl" on non-Mac. -std::string NormalizeShortcutSuggestion(const std::string& suggestion) { -#if defined(OS_MACOSX) - return suggestion; -#endif - - std::string key; - std::vector tokens; - base::SplitString(suggestion, '+', &tokens); - for (size_t i = 0; i < tokens.size(); i++) { - if (tokens[i] == "command") - tokens[i] = "ctrl"; - } - return JoinString(tokens, '+'); -} - // Return key code of the char. ui::KeyboardCode KeyboardCodeFromCharCode(char c, bool* shifted) { *shifted = false; @@ -104,7 +88,6 @@ bool StringToAccelerator(const std::string& description, return false; } std::string shortcut(StringToLowerASCII(description)); - shortcut = NormalizeShortcutSuggestion(shortcut); std::vector tokens; base::SplitString(shortcut, '+', &tokens); @@ -127,7 +110,13 @@ bool StringToAccelerator(const std::string& description, } else if (tokens[i] == "ctrl") { modifiers |= ui::EF_CONTROL_DOWN; } else if (tokens[i] == "command") { + // The "Command" would be translated to "Ctrl" on platforms other than + // OS X. +#if defined(OS_MACOSX) modifiers |= ui::EF_COMMAND_DOWN; +#else + modifiers |= ui::EF_CONTROL_DOWN; +#endif } else if (tokens[i] == "alt") { modifiers |= ui::EF_ALT_DOWN; } else if (tokens[i] == "shift") { From 30eabfb9f6982020471b6b09a22b342713f8fa73 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 15:33:19 +0800 Subject: [PATCH 6/9] Allow "F1" - "F24" in accelerator. --- browser/ui/accelerator_util.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index 32ff423a7..f8af678b5 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -4,6 +4,8 @@ #include "browser/ui/accelerator_util.h" +#include + #include #include "base/string_util.h" @@ -15,6 +17,13 @@ namespace accelerator_util { namespace { +// The sscanf is deprecated in Windows. +#if defined(OS_WIN) +#define SSCANF sscanf_s +#else +#define SSCANF sscanf +#endif + // Return key code of the char. ui::KeyboardCode KeyboardCodeFromCharCode(char c, bool* shifted) { *shifted = false; @@ -161,6 +170,15 @@ bool StringToAccelerator(const std::string& description, key = ui::VKEY_MEDIA_STOP; } else if (tokens[i] == "mediaplaypause") { key = ui::VKEY_MEDIA_PLAY_PAUSE; + } else if (tokens[i].size() > 1 && tokens[i][0] == 'f') { + // F1 - F24. + int n; + if (SSCANF(tokens[i].c_str(), "f%d", &n) == 1 && n > 0 && n < 25) { + key = static_cast(ui::VKEY_F1 + n - 1); + } else { + LOG(WARNING) << tokens[i] << "is not available on keyboard"; + return false; + } } else { LOG(WARNING) << "Invalid accelerator token: " << tokens[i]; return false; From 94e40441604e98f6712078f2ef85515ec3778976 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 15:35:54 +0800 Subject: [PATCH 7/9] Allow "Space" in accelerator. --- browser/ui/accelerator_util.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index f8af678b5..e4cf70dd4 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -132,6 +132,8 @@ bool StringToAccelerator(const std::string& description, modifiers |= ui::EF_SHIFT_DOWN; } else if (tokens[i] == "tab") { key = ui::VKEY_TAB; + } else if (tokens[i] == "space") { + key = ui::VKEY_SPACE; } else if (tokens[i] == "backspace") { key = ui::VKEY_BACK; } else if (tokens[i] == "delete") { From 5ce66fca5c37ceed043e82e625a290956707a4e7 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 15:54:37 +0800 Subject: [PATCH 8/9] Do not use sscanf. --- browser/ui/accelerator_util.cc | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/browser/ui/accelerator_util.cc b/browser/ui/accelerator_util.cc index e4cf70dd4..c1563ca12 100644 --- a/browser/ui/accelerator_util.cc +++ b/browser/ui/accelerator_util.cc @@ -17,13 +17,6 @@ namespace accelerator_util { namespace { -// The sscanf is deprecated in Windows. -#if defined(OS_WIN) -#define SSCANF sscanf_s -#else -#define SSCANF sscanf -#endif - // Return key code of the char. ui::KeyboardCode KeyboardCodeFromCharCode(char c, bool* shifted) { *shifted = false; @@ -175,7 +168,7 @@ bool StringToAccelerator(const std::string& description, } else if (tokens[i].size() > 1 && tokens[i][0] == 'f') { // F1 - F24. int n; - if (SSCANF(tokens[i].c_str(), "f%d", &n) == 1 && n > 0 && n < 25) { + if (base::StringToInt(tokens[i].c_str() + 1, &n)) { key = static_cast(ui::VKEY_F1 + n - 1); } else { LOG(WARNING) << tokens[i] << "is not available on keyboard"; From 27be89d39aee95297eae1689cadc5768157d83fc Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 21 Oct 2013 16:48:52 +0800 Subject: [PATCH 9/9] Should not touch process.argv when starting the default_app. --- browser/default_app/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/default_app/main.js b/browser/default_app/main.js index 3bfb5b510..2aff83e30 100644 --- a/browser/default_app/main.js +++ b/browser/default_app/main.js @@ -1,6 +1,7 @@ var app = require('app'); var dialog = require('dialog'); var path = require('path'); +var optimist = require('optimist'); // Quit when all windows are closed and no other one is listening to this. app.on('window-all-closed', function() { @@ -8,8 +9,7 @@ app.on('window-all-closed', function() { app.quit(); }); -process.argv.splice(1, 0, 'dummyScript'); -var argv = require('optimist').argv; +var argv = optimist(process.argv.slice(1)).argv; // Start the specified app if there is one specified in command line, otherwise // start the default app.