1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/keyboard/keyboard_util.h"
#include <string>
#include "base/command_line.h"
#include "base/logging.h"
#include "base/strings/string16.h"
#include "grit/keyboard_resources.h"
#include "grit/keyboard_resources_map.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/root_window.h"
#include "ui/base/ime/input_method.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/keyboard/keyboard_switches.h"
namespace keyboard {
bool IsKeyboardEnabled() {
return CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableVirtualKeyboard);
}
bool InsertText(const base::string16& text, aura::RootWindow* root_window) {
if (!root_window)
return false;
// Handle Backspace and Enter specially: using TextInputClient::InsertText is
// very unreliable for these characters.
// TODO(bryeung): remove this code once virtual keyboards are able to send
// these events directly via the Input Injection API.
if (text.length() == 1) {
ui::KeyboardCode code = ui::VKEY_UNKNOWN;
if (text[0] == L'\n')
code = ui::VKEY_RETURN;
else if (text[0] == L'\b')
code = ui::VKEY_BACK;
if (code != ui::VKEY_UNKNOWN) {
ui::KeyEvent press_event(ui::ET_KEY_PRESSED, code, 0, 0);
root_window->AsRootWindowHostDelegate()->OnHostKeyEvent(&press_event);
ui::KeyEvent release_event(ui::ET_KEY_RELEASED, code, 0, 0);
root_window->AsRootWindowHostDelegate()->OnHostKeyEvent(&release_event);
return true;
}
}
ui::InputMethod* input_method = root_window->GetProperty(
aura::client::kRootWindowInputMethodKey);
if (!input_method)
return false;
ui::TextInputClient* tic = input_method->GetTextInputClient();
if (!tic || tic->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE)
return false;
tic->InsertText(text);
return true;
}
const GritResourceMap* GetKeyboardExtensionResources(size_t* size) {
// This looks a lot like the contents of a resource map; however it is
// necessary to have a custom path for the extension path, so the resource
// map cannot be used directly.
static const GritResourceMap kKeyboardResources[] = {
{"keyboard/api_adapter.js", IDR_KEYBOARD_API_ADAPTER_JS},
{"keyboard/constants.js", IDR_KEYBOARD_CONSTANTS_JS},
{"keyboard/elements/kb-accent-container.html",
IDR_KEYBOARD_ELEMENTS_ACCENT_CONTAINER},
{"keyboard/elements/kb-accent-key.html", IDR_KEYBOARD_ELEMENTS_ACCENT_KEY},
{"keyboard/elements/kb-accent-set.html", IDR_KEYBOARD_ELEMENTS_ACCENT_SET},
{"keyboard/elements/kb-key.html", IDR_KEYBOARD_ELEMENTS_KEY},
{"keyboard/elements/kb-key-base.html", IDR_KEYBOARD_ELEMENTS_KEY_BASE},
{"keyboard/elements/kb-keyboard.html", IDR_KEYBOARD_ELEMENTS_KEYBOARD},
{"keyboard/elements/kb-keyset.html", IDR_KEYBOARD_ELEMENTS_KEYSET},
{"keyboard/elements/kb-row.html", IDR_KEYBOARD_ELEMENTS_ROW},
{"keyboard/images/keyboard.svg", IDR_KEYBOARD_IMAGES_KEYBOARD},
{"keyboard/images/microphone.svg", IDR_KEYBOARD_IMAGES_MICROPHONE},
{"keyboard/images/microphone-green.svg",
IDR_KEYBOARD_IMAGES_MICROPHONE_GREEN},
{"keyboard/index.html", IDR_KEYBOARD_INDEX},
{"keyboard/layouts/qwerty.html", IDR_KEYBOARD_QWERTY},
{"keyboard/main.js", IDR_KEYBOARD_MAIN_JS},
{"keyboard/manifest.json", IDR_KEYBOARD_MANIFEST},
{"keyboard/main.css", IDR_KEYBOARD_MAIN_CSS},
{"keyboard/polymer.min.js", IDR_KEYBOARD_POLYMER},
{"keyboard/voice_input.js", IDR_KEYBOARD_VOICE_INPUT_JS},
};
static const size_t kKeyboardResourcesSize = arraysize(kKeyboardResources);
*size = kKeyboardResourcesSize;
return kKeyboardResources;
}
} // namespace keyboard
|