Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
michael@0 | 1 | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- |
michael@0 | 2 | * |
michael@0 | 3 | * This Source Code Form is subject to the terms of the Mozilla Public |
michael@0 | 4 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
michael@0 | 5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
michael@0 | 6 | |
michael@0 | 7 | #include "WidgetUtils.h" |
michael@0 | 8 | |
michael@0 | 9 | #include "mozilla/TextEvents.h" |
michael@0 | 10 | |
michael@0 | 11 | #include "nsIBaseWindow.h" |
michael@0 | 12 | #include "nsIDocShellTreeItem.h" |
michael@0 | 13 | #include "nsIDocShell.h" |
michael@0 | 14 | #include "nsIInterfaceRequestorUtils.h" |
michael@0 | 15 | |
michael@0 | 16 | namespace mozilla { |
michael@0 | 17 | namespace widget { |
michael@0 | 18 | |
michael@0 | 19 | //static |
michael@0 | 20 | already_AddRefed<nsIWidget> |
michael@0 | 21 | WidgetUtils::DOMWindowToWidget(nsIDOMWindow *aDOMWindow) |
michael@0 | 22 | { |
michael@0 | 23 | nsCOMPtr<nsIWidget> widget; |
michael@0 | 24 | |
michael@0 | 25 | nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aDOMWindow); |
michael@0 | 26 | if (window) { |
michael@0 | 27 | nsCOMPtr<nsIBaseWindow> baseWin(do_QueryInterface(window->GetDocShell())); |
michael@0 | 28 | |
michael@0 | 29 | while (!widget && baseWin) { |
michael@0 | 30 | baseWin->GetParentWidget(getter_AddRefs(widget)); |
michael@0 | 31 | if (!widget) { |
michael@0 | 32 | nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(baseWin)); |
michael@0 | 33 | if (!docShellAsItem) |
michael@0 | 34 | return nullptr; |
michael@0 | 35 | |
michael@0 | 36 | nsCOMPtr<nsIDocShellTreeItem> parent; |
michael@0 | 37 | docShellAsItem->GetParent(getter_AddRefs(parent)); |
michael@0 | 38 | |
michael@0 | 39 | window = do_GetInterface(parent); |
michael@0 | 40 | if (!window) |
michael@0 | 41 | return nullptr; |
michael@0 | 42 | |
michael@0 | 43 | baseWin = do_QueryInterface(window->GetDocShell()); |
michael@0 | 44 | } |
michael@0 | 45 | } |
michael@0 | 46 | } |
michael@0 | 47 | |
michael@0 | 48 | return widget.forget(); |
michael@0 | 49 | } |
michael@0 | 50 | |
michael@0 | 51 | // static |
michael@0 | 52 | uint32_t |
michael@0 | 53 | WidgetUtils::ComputeKeyCodeFromChar(uint32_t aCharCode) |
michael@0 | 54 | { |
michael@0 | 55 | if (aCharCode >= 'A' && aCharCode <= 'Z') { |
michael@0 | 56 | return aCharCode - 'A' + NS_VK_A; |
michael@0 | 57 | } |
michael@0 | 58 | if (aCharCode >= 'a' && aCharCode <= 'z') { |
michael@0 | 59 | return aCharCode - 'a' + NS_VK_A; |
michael@0 | 60 | } |
michael@0 | 61 | if (aCharCode >= '0' && aCharCode <= '9') { |
michael@0 | 62 | return aCharCode - '0' + NS_VK_0; |
michael@0 | 63 | } |
michael@0 | 64 | switch (aCharCode) { |
michael@0 | 65 | case ' ': return NS_VK_SPACE; |
michael@0 | 66 | case '\t': return NS_VK_TAB; |
michael@0 | 67 | case ':': return NS_VK_COLON; |
michael@0 | 68 | case ';': return NS_VK_SEMICOLON; |
michael@0 | 69 | case '<': return NS_VK_LESS_THAN; |
michael@0 | 70 | case '=': return NS_VK_EQUALS; |
michael@0 | 71 | case '>': return NS_VK_GREATER_THAN; |
michael@0 | 72 | case '?': return NS_VK_QUESTION_MARK; |
michael@0 | 73 | case '@': return NS_VK_AT; |
michael@0 | 74 | case '^': return NS_VK_CIRCUMFLEX; |
michael@0 | 75 | case '!': return NS_VK_EXCLAMATION; |
michael@0 | 76 | case '"': return NS_VK_DOUBLE_QUOTE; |
michael@0 | 77 | case '#': return NS_VK_HASH; |
michael@0 | 78 | case '$': return NS_VK_DOLLAR; |
michael@0 | 79 | case '%': return NS_VK_PERCENT; |
michael@0 | 80 | case '&': return NS_VK_AMPERSAND; |
michael@0 | 81 | case '_': return NS_VK_UNDERSCORE; |
michael@0 | 82 | case '(': return NS_VK_OPEN_PAREN; |
michael@0 | 83 | case ')': return NS_VK_CLOSE_PAREN; |
michael@0 | 84 | case '*': return NS_VK_ASTERISK; |
michael@0 | 85 | case '+': return NS_VK_PLUS; |
michael@0 | 86 | case '|': return NS_VK_PIPE; |
michael@0 | 87 | case '-': return NS_VK_HYPHEN_MINUS; |
michael@0 | 88 | case '{': return NS_VK_OPEN_CURLY_BRACKET; |
michael@0 | 89 | case '}': return NS_VK_CLOSE_CURLY_BRACKET; |
michael@0 | 90 | case '~': return NS_VK_TILDE; |
michael@0 | 91 | case ',': return NS_VK_COMMA; |
michael@0 | 92 | case '.': return NS_VK_PERIOD; |
michael@0 | 93 | case '/': return NS_VK_SLASH; |
michael@0 | 94 | case '`': return NS_VK_BACK_QUOTE; |
michael@0 | 95 | case '[': return NS_VK_OPEN_BRACKET; |
michael@0 | 96 | case '\\': return NS_VK_BACK_SLASH; |
michael@0 | 97 | case ']': return NS_VK_CLOSE_BRACKET; |
michael@0 | 98 | case '\'': return NS_VK_QUOTE; |
michael@0 | 99 | } |
michael@0 | 100 | return 0; |
michael@0 | 101 | } |
michael@0 | 102 | |
michael@0 | 103 | // static |
michael@0 | 104 | void |
michael@0 | 105 | WidgetUtils::GetLatinCharCodeForKeyCode(uint32_t aKeyCode, |
michael@0 | 106 | bool aIsCapsLock, |
michael@0 | 107 | uint32_t* aUnshiftedCharCode, |
michael@0 | 108 | uint32_t* aShiftedCharCode) |
michael@0 | 109 | { |
michael@0 | 110 | MOZ_ASSERT(aUnshiftedCharCode && aShiftedCharCode, |
michael@0 | 111 | "aUnshiftedCharCode and aShiftedCharCode must not be NULL"); |
michael@0 | 112 | |
michael@0 | 113 | if (aKeyCode >= NS_VK_A && aKeyCode <= NS_VK_Z) { |
michael@0 | 114 | *aUnshiftedCharCode = *aShiftedCharCode = aKeyCode; |
michael@0 | 115 | if (aIsCapsLock) { |
michael@0 | 116 | *aShiftedCharCode += 0x20; |
michael@0 | 117 | } else { |
michael@0 | 118 | *aUnshiftedCharCode += 0x20; |
michael@0 | 119 | } |
michael@0 | 120 | return; |
michael@0 | 121 | } |
michael@0 | 122 | |
michael@0 | 123 | // aShiftedCharCode must be zero for non-alphabet keys. |
michael@0 | 124 | *aShiftedCharCode = 0; |
michael@0 | 125 | |
michael@0 | 126 | if (aKeyCode >= NS_VK_0 && aKeyCode <= NS_VK_9) { |
michael@0 | 127 | *aUnshiftedCharCode = aKeyCode; |
michael@0 | 128 | return; |
michael@0 | 129 | } |
michael@0 | 130 | |
michael@0 | 131 | switch (aKeyCode) { |
michael@0 | 132 | case NS_VK_SPACE: *aUnshiftedCharCode = ' '; break; |
michael@0 | 133 | case NS_VK_COLON: *aUnshiftedCharCode = ':'; break; |
michael@0 | 134 | case NS_VK_SEMICOLON: *aUnshiftedCharCode = ';'; break; |
michael@0 | 135 | case NS_VK_LESS_THAN: *aUnshiftedCharCode = '<'; break; |
michael@0 | 136 | case NS_VK_EQUALS: *aUnshiftedCharCode = '='; break; |
michael@0 | 137 | case NS_VK_GREATER_THAN: *aUnshiftedCharCode = '>'; break; |
michael@0 | 138 | case NS_VK_QUESTION_MARK: *aUnshiftedCharCode = '?'; break; |
michael@0 | 139 | case NS_VK_AT: *aUnshiftedCharCode = '@'; break; |
michael@0 | 140 | case NS_VK_CIRCUMFLEX: *aUnshiftedCharCode = '^'; break; |
michael@0 | 141 | case NS_VK_EXCLAMATION: *aUnshiftedCharCode = '!'; break; |
michael@0 | 142 | case NS_VK_DOUBLE_QUOTE: *aUnshiftedCharCode = '"'; break; |
michael@0 | 143 | case NS_VK_HASH: *aUnshiftedCharCode = '#'; break; |
michael@0 | 144 | case NS_VK_DOLLAR: *aUnshiftedCharCode = '$'; break; |
michael@0 | 145 | case NS_VK_PERCENT: *aUnshiftedCharCode = '%'; break; |
michael@0 | 146 | case NS_VK_AMPERSAND: *aUnshiftedCharCode = '&'; break; |
michael@0 | 147 | case NS_VK_UNDERSCORE: *aUnshiftedCharCode = '_'; break; |
michael@0 | 148 | case NS_VK_OPEN_PAREN: *aUnshiftedCharCode = '('; break; |
michael@0 | 149 | case NS_VK_CLOSE_PAREN: *aUnshiftedCharCode = ')'; break; |
michael@0 | 150 | case NS_VK_ASTERISK: *aUnshiftedCharCode = '*'; break; |
michael@0 | 151 | case NS_VK_PLUS: *aUnshiftedCharCode = '+'; break; |
michael@0 | 152 | case NS_VK_PIPE: *aUnshiftedCharCode = '|'; break; |
michael@0 | 153 | case NS_VK_HYPHEN_MINUS: *aUnshiftedCharCode = '-'; break; |
michael@0 | 154 | case NS_VK_OPEN_CURLY_BRACKET: *aUnshiftedCharCode = '{'; break; |
michael@0 | 155 | case NS_VK_CLOSE_CURLY_BRACKET: *aUnshiftedCharCode = '}'; break; |
michael@0 | 156 | case NS_VK_TILDE: *aUnshiftedCharCode = '~'; break; |
michael@0 | 157 | case NS_VK_COMMA: *aUnshiftedCharCode = ','; break; |
michael@0 | 158 | case NS_VK_PERIOD: *aUnshiftedCharCode = '.'; break; |
michael@0 | 159 | case NS_VK_SLASH: *aUnshiftedCharCode = '/'; break; |
michael@0 | 160 | case NS_VK_BACK_QUOTE: *aUnshiftedCharCode = '`'; break; |
michael@0 | 161 | case NS_VK_OPEN_BRACKET: *aUnshiftedCharCode = '['; break; |
michael@0 | 162 | case NS_VK_BACK_SLASH: *aUnshiftedCharCode = '\\'; break; |
michael@0 | 163 | case NS_VK_CLOSE_BRACKET: *aUnshiftedCharCode = ']'; break; |
michael@0 | 164 | case NS_VK_QUOTE: *aUnshiftedCharCode = '\''; break; |
michael@0 | 165 | default: *aUnshiftedCharCode = 0; break; |
michael@0 | 166 | } |
michael@0 | 167 | } |
michael@0 | 168 | |
michael@0 | 169 | // static |
michael@0 | 170 | KeyNameIndex |
michael@0 | 171 | WidgetUtils::GetDeadKeyNameIndex(char16_t aChar) |
michael@0 | 172 | { |
michael@0 | 173 | switch (aChar) { |
michael@0 | 174 | case '`': |
michael@0 | 175 | case 0x02CB: // MODIFIER LETTER GRAVE ACCENT |
michael@0 | 176 | case 0x0300: // COMBINING GRAVE ACCENT |
michael@0 | 177 | return KEY_NAME_INDEX_DeadGrave; |
michael@0 | 178 | case '\'': |
michael@0 | 179 | case 0x00B4: // ACUTE ACCENT |
michael@0 | 180 | case 0x02B9: // MODIFIER LETTER PRIME |
michael@0 | 181 | case 0x02CA: // MODIFIER LETTER ACUTE ACCENT |
michael@0 | 182 | case 0x0301: // COMBINING ACUTE ACCENT |
michael@0 | 183 | case 0x0384: // GREEK TONOS |
michael@0 | 184 | return KEY_NAME_INDEX_DeadAcute; |
michael@0 | 185 | case '^': |
michael@0 | 186 | case 0x02C6: // MODIFIER LETTER CIRCUMFLEX ACCENT |
michael@0 | 187 | case 0x0302: // COMBINING CIRCUMFLEX ACCENT |
michael@0 | 188 | return KEY_NAME_INDEX_DeadCircumflex; |
michael@0 | 189 | case '~': |
michael@0 | 190 | case 0x02DC: // SMALL TILDE |
michael@0 | 191 | case 0x0303: // COMBINING TILDE |
michael@0 | 192 | return KEY_NAME_INDEX_DeadTilde; |
michael@0 | 193 | case 0x00AF: // MACRON |
michael@0 | 194 | case 0x02C9: // MODIFIER LETTER MACRON |
michael@0 | 195 | case 0x0304: // COMBINING MACRON |
michael@0 | 196 | return KEY_NAME_INDEX_DeadMacron; |
michael@0 | 197 | case 0x02D8: // BRAVE |
michael@0 | 198 | case 0xA67C: // COMBINING CYRILLIC KAVYKA |
michael@0 | 199 | case 0x0306: // COMBINING BRAVE |
michael@0 | 200 | return KEY_NAME_INDEX_DeadBreve; |
michael@0 | 201 | case 0x02D9: // DOT ABOVE |
michael@0 | 202 | case 0x0307: // COMBINING DOT ABOVE |
michael@0 | 203 | return KEY_NAME_INDEX_DeadAboveDot; |
michael@0 | 204 | case 0x00A8: // DIAERESIS |
michael@0 | 205 | case 0x0308: // COMBINING DIAERESIS |
michael@0 | 206 | return KEY_NAME_INDEX_DeadUmlaut; |
michael@0 | 207 | case 0x00B0: // DEGREE SIGN |
michael@0 | 208 | case 0x02DA: // RING ABOVE |
michael@0 | 209 | case 0x030A: // COMBINING RING ABOVE |
michael@0 | 210 | return KEY_NAME_INDEX_DeadAboveRing; |
michael@0 | 211 | case '"': |
michael@0 | 212 | case 0x02BA: // MODIFIER LETTER DOUBLE PRIME |
michael@0 | 213 | case 0x02DD: // DOUBLE ACUTE ACCENT |
michael@0 | 214 | case 0x030B: // COMBINING DOUBLE ACUTE ACCENT |
michael@0 | 215 | return KEY_NAME_INDEX_DeadDoubleacute; |
michael@0 | 216 | case 0x02C7: // CARON |
michael@0 | 217 | case 0x030C: // COMBINING CARON |
michael@0 | 218 | return KEY_NAME_INDEX_DeadCaron; |
michael@0 | 219 | case 0x00B8: // CEDILLA |
michael@0 | 220 | case 0x0327: // COMBINING CEDILLA |
michael@0 | 221 | return KEY_NAME_INDEX_DeadCedilla; |
michael@0 | 222 | case 0x02DB: // OGONEK |
michael@0 | 223 | case 0x0328: // COMBINING OGONEK |
michael@0 | 224 | return KEY_NAME_INDEX_DeadOgonek; |
michael@0 | 225 | case 0x0345: // COMBINING GREEK YPOGEGRAMMENI |
michael@0 | 226 | case 0x037A: // GREEK YPOGEGRAMMENI |
michael@0 | 227 | case 0x0399: // GREEK CAPITAL LETTER IOTA |
michael@0 | 228 | return KEY_NAME_INDEX_DeadIota; |
michael@0 | 229 | case 0x3099: // COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK |
michael@0 | 230 | case 0x309B: // KATAKANA-HIRAGANA VOICED SOUND MARK |
michael@0 | 231 | return KEY_NAME_INDEX_DeadVoicedSound; |
michael@0 | 232 | case 0x309A: // COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK |
michael@0 | 233 | case 0x309C: // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK |
michael@0 | 234 | return KEY_NAME_INDEX_DeadSemivoicedSound; |
michael@0 | 235 | default: |
michael@0 | 236 | return KEY_NAME_INDEX_Unidentified; |
michael@0 | 237 | } |
michael@0 | 238 | } |
michael@0 | 239 | |
michael@0 | 240 | } // namespace widget |
michael@0 | 241 | } // namespace mozilla |