1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/widget/shared/SharedWidgetUtils.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,241 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + * 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "WidgetUtils.h" 1.11 + 1.12 +#include "mozilla/TextEvents.h" 1.13 + 1.14 +#include "nsIBaseWindow.h" 1.15 +#include "nsIDocShellTreeItem.h" 1.16 +#include "nsIDocShell.h" 1.17 +#include "nsIInterfaceRequestorUtils.h" 1.18 + 1.19 +namespace mozilla { 1.20 +namespace widget { 1.21 + 1.22 +//static 1.23 +already_AddRefed<nsIWidget> 1.24 +WidgetUtils::DOMWindowToWidget(nsIDOMWindow *aDOMWindow) 1.25 +{ 1.26 + nsCOMPtr<nsIWidget> widget; 1.27 + 1.28 + nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aDOMWindow); 1.29 + if (window) { 1.30 + nsCOMPtr<nsIBaseWindow> baseWin(do_QueryInterface(window->GetDocShell())); 1.31 + 1.32 + while (!widget && baseWin) { 1.33 + baseWin->GetParentWidget(getter_AddRefs(widget)); 1.34 + if (!widget) { 1.35 + nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(baseWin)); 1.36 + if (!docShellAsItem) 1.37 + return nullptr; 1.38 + 1.39 + nsCOMPtr<nsIDocShellTreeItem> parent; 1.40 + docShellAsItem->GetParent(getter_AddRefs(parent)); 1.41 + 1.42 + window = do_GetInterface(parent); 1.43 + if (!window) 1.44 + return nullptr; 1.45 + 1.46 + baseWin = do_QueryInterface(window->GetDocShell()); 1.47 + } 1.48 + } 1.49 + } 1.50 + 1.51 + return widget.forget(); 1.52 +} 1.53 + 1.54 +// static 1.55 +uint32_t 1.56 +WidgetUtils::ComputeKeyCodeFromChar(uint32_t aCharCode) 1.57 +{ 1.58 + if (aCharCode >= 'A' && aCharCode <= 'Z') { 1.59 + return aCharCode - 'A' + NS_VK_A; 1.60 + } 1.61 + if (aCharCode >= 'a' && aCharCode <= 'z') { 1.62 + return aCharCode - 'a' + NS_VK_A; 1.63 + } 1.64 + if (aCharCode >= '0' && aCharCode <= '9') { 1.65 + return aCharCode - '0' + NS_VK_0; 1.66 + } 1.67 + switch (aCharCode) { 1.68 + case ' ': return NS_VK_SPACE; 1.69 + case '\t': return NS_VK_TAB; 1.70 + case ':': return NS_VK_COLON; 1.71 + case ';': return NS_VK_SEMICOLON; 1.72 + case '<': return NS_VK_LESS_THAN; 1.73 + case '=': return NS_VK_EQUALS; 1.74 + case '>': return NS_VK_GREATER_THAN; 1.75 + case '?': return NS_VK_QUESTION_MARK; 1.76 + case '@': return NS_VK_AT; 1.77 + case '^': return NS_VK_CIRCUMFLEX; 1.78 + case '!': return NS_VK_EXCLAMATION; 1.79 + case '"': return NS_VK_DOUBLE_QUOTE; 1.80 + case '#': return NS_VK_HASH; 1.81 + case '$': return NS_VK_DOLLAR; 1.82 + case '%': return NS_VK_PERCENT; 1.83 + case '&': return NS_VK_AMPERSAND; 1.84 + case '_': return NS_VK_UNDERSCORE; 1.85 + case '(': return NS_VK_OPEN_PAREN; 1.86 + case ')': return NS_VK_CLOSE_PAREN; 1.87 + case '*': return NS_VK_ASTERISK; 1.88 + case '+': return NS_VK_PLUS; 1.89 + case '|': return NS_VK_PIPE; 1.90 + case '-': return NS_VK_HYPHEN_MINUS; 1.91 + case '{': return NS_VK_OPEN_CURLY_BRACKET; 1.92 + case '}': return NS_VK_CLOSE_CURLY_BRACKET; 1.93 + case '~': return NS_VK_TILDE; 1.94 + case ',': return NS_VK_COMMA; 1.95 + case '.': return NS_VK_PERIOD; 1.96 + case '/': return NS_VK_SLASH; 1.97 + case '`': return NS_VK_BACK_QUOTE; 1.98 + case '[': return NS_VK_OPEN_BRACKET; 1.99 + case '\\': return NS_VK_BACK_SLASH; 1.100 + case ']': return NS_VK_CLOSE_BRACKET; 1.101 + case '\'': return NS_VK_QUOTE; 1.102 + } 1.103 + return 0; 1.104 +} 1.105 + 1.106 +// static 1.107 +void 1.108 +WidgetUtils::GetLatinCharCodeForKeyCode(uint32_t aKeyCode, 1.109 + bool aIsCapsLock, 1.110 + uint32_t* aUnshiftedCharCode, 1.111 + uint32_t* aShiftedCharCode) 1.112 +{ 1.113 + MOZ_ASSERT(aUnshiftedCharCode && aShiftedCharCode, 1.114 + "aUnshiftedCharCode and aShiftedCharCode must not be NULL"); 1.115 + 1.116 + if (aKeyCode >= NS_VK_A && aKeyCode <= NS_VK_Z) { 1.117 + *aUnshiftedCharCode = *aShiftedCharCode = aKeyCode; 1.118 + if (aIsCapsLock) { 1.119 + *aShiftedCharCode += 0x20; 1.120 + } else { 1.121 + *aUnshiftedCharCode += 0x20; 1.122 + } 1.123 + return; 1.124 + } 1.125 + 1.126 + // aShiftedCharCode must be zero for non-alphabet keys. 1.127 + *aShiftedCharCode = 0; 1.128 + 1.129 + if (aKeyCode >= NS_VK_0 && aKeyCode <= NS_VK_9) { 1.130 + *aUnshiftedCharCode = aKeyCode; 1.131 + return; 1.132 + } 1.133 + 1.134 + switch (aKeyCode) { 1.135 + case NS_VK_SPACE: *aUnshiftedCharCode = ' '; break; 1.136 + case NS_VK_COLON: *aUnshiftedCharCode = ':'; break; 1.137 + case NS_VK_SEMICOLON: *aUnshiftedCharCode = ';'; break; 1.138 + case NS_VK_LESS_THAN: *aUnshiftedCharCode = '<'; break; 1.139 + case NS_VK_EQUALS: *aUnshiftedCharCode = '='; break; 1.140 + case NS_VK_GREATER_THAN: *aUnshiftedCharCode = '>'; break; 1.141 + case NS_VK_QUESTION_MARK: *aUnshiftedCharCode = '?'; break; 1.142 + case NS_VK_AT: *aUnshiftedCharCode = '@'; break; 1.143 + case NS_VK_CIRCUMFLEX: *aUnshiftedCharCode = '^'; break; 1.144 + case NS_VK_EXCLAMATION: *aUnshiftedCharCode = '!'; break; 1.145 + case NS_VK_DOUBLE_QUOTE: *aUnshiftedCharCode = '"'; break; 1.146 + case NS_VK_HASH: *aUnshiftedCharCode = '#'; break; 1.147 + case NS_VK_DOLLAR: *aUnshiftedCharCode = '$'; break; 1.148 + case NS_VK_PERCENT: *aUnshiftedCharCode = '%'; break; 1.149 + case NS_VK_AMPERSAND: *aUnshiftedCharCode = '&'; break; 1.150 + case NS_VK_UNDERSCORE: *aUnshiftedCharCode = '_'; break; 1.151 + case NS_VK_OPEN_PAREN: *aUnshiftedCharCode = '('; break; 1.152 + case NS_VK_CLOSE_PAREN: *aUnshiftedCharCode = ')'; break; 1.153 + case NS_VK_ASTERISK: *aUnshiftedCharCode = '*'; break; 1.154 + case NS_VK_PLUS: *aUnshiftedCharCode = '+'; break; 1.155 + case NS_VK_PIPE: *aUnshiftedCharCode = '|'; break; 1.156 + case NS_VK_HYPHEN_MINUS: *aUnshiftedCharCode = '-'; break; 1.157 + case NS_VK_OPEN_CURLY_BRACKET: *aUnshiftedCharCode = '{'; break; 1.158 + case NS_VK_CLOSE_CURLY_BRACKET: *aUnshiftedCharCode = '}'; break; 1.159 + case NS_VK_TILDE: *aUnshiftedCharCode = '~'; break; 1.160 + case NS_VK_COMMA: *aUnshiftedCharCode = ','; break; 1.161 + case NS_VK_PERIOD: *aUnshiftedCharCode = '.'; break; 1.162 + case NS_VK_SLASH: *aUnshiftedCharCode = '/'; break; 1.163 + case NS_VK_BACK_QUOTE: *aUnshiftedCharCode = '`'; break; 1.164 + case NS_VK_OPEN_BRACKET: *aUnshiftedCharCode = '['; break; 1.165 + case NS_VK_BACK_SLASH: *aUnshiftedCharCode = '\\'; break; 1.166 + case NS_VK_CLOSE_BRACKET: *aUnshiftedCharCode = ']'; break; 1.167 + case NS_VK_QUOTE: *aUnshiftedCharCode = '\''; break; 1.168 + default: *aUnshiftedCharCode = 0; break; 1.169 + } 1.170 +} 1.171 + 1.172 +// static 1.173 +KeyNameIndex 1.174 +WidgetUtils::GetDeadKeyNameIndex(char16_t aChar) 1.175 +{ 1.176 + switch (aChar) { 1.177 + case '`': 1.178 + case 0x02CB: // MODIFIER LETTER GRAVE ACCENT 1.179 + case 0x0300: // COMBINING GRAVE ACCENT 1.180 + return KEY_NAME_INDEX_DeadGrave; 1.181 + case '\'': 1.182 + case 0x00B4: // ACUTE ACCENT 1.183 + case 0x02B9: // MODIFIER LETTER PRIME 1.184 + case 0x02CA: // MODIFIER LETTER ACUTE ACCENT 1.185 + case 0x0301: // COMBINING ACUTE ACCENT 1.186 + case 0x0384: // GREEK TONOS 1.187 + return KEY_NAME_INDEX_DeadAcute; 1.188 + case '^': 1.189 + case 0x02C6: // MODIFIER LETTER CIRCUMFLEX ACCENT 1.190 + case 0x0302: // COMBINING CIRCUMFLEX ACCENT 1.191 + return KEY_NAME_INDEX_DeadCircumflex; 1.192 + case '~': 1.193 + case 0x02DC: // SMALL TILDE 1.194 + case 0x0303: // COMBINING TILDE 1.195 + return KEY_NAME_INDEX_DeadTilde; 1.196 + case 0x00AF: // MACRON 1.197 + case 0x02C9: // MODIFIER LETTER MACRON 1.198 + case 0x0304: // COMBINING MACRON 1.199 + return KEY_NAME_INDEX_DeadMacron; 1.200 + case 0x02D8: // BRAVE 1.201 + case 0xA67C: // COMBINING CYRILLIC KAVYKA 1.202 + case 0x0306: // COMBINING BRAVE 1.203 + return KEY_NAME_INDEX_DeadBreve; 1.204 + case 0x02D9: // DOT ABOVE 1.205 + case 0x0307: // COMBINING DOT ABOVE 1.206 + return KEY_NAME_INDEX_DeadAboveDot; 1.207 + case 0x00A8: // DIAERESIS 1.208 + case 0x0308: // COMBINING DIAERESIS 1.209 + return KEY_NAME_INDEX_DeadUmlaut; 1.210 + case 0x00B0: // DEGREE SIGN 1.211 + case 0x02DA: // RING ABOVE 1.212 + case 0x030A: // COMBINING RING ABOVE 1.213 + return KEY_NAME_INDEX_DeadAboveRing; 1.214 + case '"': 1.215 + case 0x02BA: // MODIFIER LETTER DOUBLE PRIME 1.216 + case 0x02DD: // DOUBLE ACUTE ACCENT 1.217 + case 0x030B: // COMBINING DOUBLE ACUTE ACCENT 1.218 + return KEY_NAME_INDEX_DeadDoubleacute; 1.219 + case 0x02C7: // CARON 1.220 + case 0x030C: // COMBINING CARON 1.221 + return KEY_NAME_INDEX_DeadCaron; 1.222 + case 0x00B8: // CEDILLA 1.223 + case 0x0327: // COMBINING CEDILLA 1.224 + return KEY_NAME_INDEX_DeadCedilla; 1.225 + case 0x02DB: // OGONEK 1.226 + case 0x0328: // COMBINING OGONEK 1.227 + return KEY_NAME_INDEX_DeadOgonek; 1.228 + case 0x0345: // COMBINING GREEK YPOGEGRAMMENI 1.229 + case 0x037A: // GREEK YPOGEGRAMMENI 1.230 + case 0x0399: // GREEK CAPITAL LETTER IOTA 1.231 + return KEY_NAME_INDEX_DeadIota; 1.232 + case 0x3099: // COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK 1.233 + case 0x309B: // KATAKANA-HIRAGANA VOICED SOUND MARK 1.234 + return KEY_NAME_INDEX_DeadVoicedSound; 1.235 + case 0x309A: // COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 1.236 + case 0x309C: // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 1.237 + return KEY_NAME_INDEX_DeadSemivoicedSound; 1.238 + default: 1.239 + return KEY_NAME_INDEX_Unidentified; 1.240 + } 1.241 +} 1.242 + 1.243 +} // namespace widget 1.244 +} // namespace mozilla