Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: ui/keyboard/keyboard_controller.cc

Issue 25111002: Only show virtual keyboard on primary root window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add a TODO Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/keyboard/keyboard_controller.h ('k') | ui/keyboard/keyboard_controller_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/keyboard/keyboard_controller.h" 5 #include "ui/keyboard/keyboard_controller.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "ui/aura/layout_manager.h" 8 #include "ui/aura/layout_manager.h"
9 #include "ui/aura/window.h" 9 #include "ui/aura/window.h"
10 #include "ui/aura/window_delegate.h" 10 #include "ui/aura/window_delegate.h"
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 115
116 private: 116 private:
117 aura::Window* container_; 117 aura::Window* container_;
118 aura::Window* keyboard_; 118 aura::Window* keyboard_;
119 119
120 DISALLOW_COPY_AND_ASSIGN(KeyboardLayoutManager); 120 DISALLOW_COPY_AND_ASSIGN(KeyboardLayoutManager);
121 }; 121 };
122 122
123 KeyboardController::KeyboardController(KeyboardControllerProxy* proxy) 123 KeyboardController::KeyboardController(KeyboardControllerProxy* proxy)
124 : proxy_(proxy), 124 : proxy_(proxy),
125 container_(NULL),
126 input_method_(NULL), 125 input_method_(NULL),
127 keyboard_visible_(false), 126 keyboard_visible_(false),
128 weak_factory_(this) { 127 weak_factory_(this) {
129 CHECK(proxy); 128 CHECK(proxy);
130 input_method_ = proxy_->GetInputMethod(); 129 input_method_ = proxy_->GetInputMethod();
131 input_method_->AddObserver(this); 130 input_method_->AddObserver(this);
132 } 131 }
133 132
134 KeyboardController::~KeyboardController() { 133 KeyboardController::~KeyboardController() {
135 if (container_) 134 if (container_.get())
136 container_->RemoveObserver(this); 135 container_->RemoveObserver(this);
137 if (input_method_) 136 if (input_method_)
138 input_method_->RemoveObserver(this); 137 input_method_->RemoveObserver(this);
139 } 138 }
140 139
141 aura::Window* KeyboardController::GetContainerWindow() { 140 aura::Window* KeyboardController::GetContainerWindow() {
142 if (!container_) { 141 if (!container_.get()) {
143 container_ = new aura::Window(new KeyboardWindowDelegate()); 142 container_.reset(new aura::Window(new KeyboardWindowDelegate()));
144 container_->SetName("KeyboardContainer"); 143 container_->SetName("KeyboardContainer");
144 container_->set_owned_by_parent(false);
145 container_->Init(ui::LAYER_NOT_DRAWN); 145 container_->Init(ui::LAYER_NOT_DRAWN);
146 container_->AddObserver(this); 146 container_->AddObserver(this);
147 container_->SetLayoutManager(new KeyboardLayoutManager(container_)); 147 container_->SetLayoutManager(new KeyboardLayoutManager(container_.get()));
148 } 148 }
149 return container_; 149 return container_.get();
150 } 150 }
151 151
152 void KeyboardController::HideKeyboard() { 152 void KeyboardController::HideKeyboard() {
153 keyboard_visible_ = false; 153 keyboard_visible_ = false;
154 154
155 FOR_EACH_OBSERVER(KeyboardControllerObserver, 155 FOR_EACH_OBSERVER(KeyboardControllerObserver,
156 observer_list_, 156 observer_list_,
157 OnKeyboardBoundsChanging(gfx::Rect())); 157 OnKeyboardBoundsChanging(gfx::Rect()));
158 158
159 proxy_->HideKeyboardContainer(container_); 159 proxy_->HideKeyboardContainer(container_.get());
160 } 160 }
161 161
162 void KeyboardController::AddObserver(KeyboardControllerObserver* observer) { 162 void KeyboardController::AddObserver(KeyboardControllerObserver* observer) {
163 observer_list_.AddObserver(observer); 163 observer_list_.AddObserver(observer);
164 } 164 }
165 165
166 void KeyboardController::RemoveObserver(KeyboardControllerObserver* observer) { 166 void KeyboardController::RemoveObserver(KeyboardControllerObserver* observer) {
167 observer_list_.RemoveObserver(observer); 167 observer_list_.RemoveObserver(observer);
168 } 168 }
169 169
170 void KeyboardController::OnWindowHierarchyChanged( 170 void KeyboardController::OnWindowHierarchyChanged(
171 const HierarchyChangeParams& params) { 171 const HierarchyChangeParams& params) {
172 if (params.new_parent && params.target == container_) 172 if (params.new_parent && params.target == container_.get())
173 OnTextInputStateChanged(proxy_->GetInputMethod()->GetTextInputClient()); 173 OnTextInputStateChanged(proxy_->GetInputMethod()->GetTextInputClient());
174 } 174 }
175 175
176 void KeyboardController::OnWindowDestroying(aura::Window* window) {
177 DCHECK_EQ(container_, window);
178 container_ = NULL;
179 }
180
181 void KeyboardController::OnTextInputStateChanged( 176 void KeyboardController::OnTextInputStateChanged(
182 const ui::TextInputClient* client) { 177 const ui::TextInputClient* client) {
183 if (!container_) 178 if (!container_.get())
184 return; 179 return;
185 180
186 bool was_showing = keyboard_visible_; 181 bool was_showing = keyboard_visible_;
187 bool should_show = was_showing; 182 bool should_show = was_showing;
188 ui::TextInputType type = 183 ui::TextInputType type =
189 client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE; 184 client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE;
190 if (type == ui::TEXT_INPUT_TYPE_NONE) { 185 if (type == ui::TEXT_INPUT_TYPE_NONE) {
191 should_show = false; 186 should_show = false;
192 } else { 187 } else {
193 if (container_->children().empty()) { 188 if (container_->children().empty()) {
194 aura::Window* keyboard = proxy_->GetKeyboardWindow(); 189 aura::Window* keyboard = proxy_->GetKeyboardWindow();
195 keyboard->Show(); 190 keyboard->Show();
196 container_->AddChild(keyboard); 191 container_->AddChild(keyboard);
197 container_->layout_manager()->OnWindowResized(); 192 container_->layout_manager()->OnWindowResized();
198 } 193 }
199 proxy_->SetUpdateInputType(type); 194 proxy_->SetUpdateInputType(type);
200 container_->parent()->StackChildAtTop(container_); 195 container_->parent()->StackChildAtTop(container_.get());
201 should_show = true; 196 should_show = true;
202 } 197 }
203 198
204 if (was_showing != should_show) { 199 if (was_showing != should_show) {
205 if (should_show) { 200 if (should_show) {
206 keyboard_visible_ = true; 201 keyboard_visible_ = true;
207 weak_factory_.InvalidateWeakPtrs(); 202 weak_factory_.InvalidateWeakPtrs();
208 if (container_->IsVisible()) 203 if (container_->IsVisible())
209 return; 204 return;
210 205
211 FOR_EACH_OBSERVER( 206 FOR_EACH_OBSERVER(
212 KeyboardControllerObserver, 207 KeyboardControllerObserver,
213 observer_list_, 208 observer_list_,
214 OnKeyboardBoundsChanging(container_->children()[0]->bounds())); 209 OnKeyboardBoundsChanging(container_->children()[0]->bounds()));
215 proxy_->ShowKeyboardContainer(container_); 210 proxy_->ShowKeyboardContainer(container_.get());
216 } else { 211 } else {
217 // Set the visibility state here so that any queries for visibility 212 // Set the visibility state here so that any queries for visibility
218 // before the timer fires returns the correct future value. 213 // before the timer fires returns the correct future value.
219 keyboard_visible_ = false; 214 keyboard_visible_ = false;
220 base::MessageLoop::current()->PostDelayedTask( 215 base::MessageLoop::current()->PostDelayedTask(
221 FROM_HERE, 216 FROM_HERE,
222 base::Bind(&KeyboardController::HideKeyboard, 217 base::Bind(&KeyboardController::HideKeyboard,
223 weak_factory_.GetWeakPtr()), 218 weak_factory_.GetWeakPtr()),
224 base::TimeDelta::FromMilliseconds(kHideKeyboardDelayMs)); 219 base::TimeDelta::FromMilliseconds(kHideKeyboardDelayMs));
225 } 220 }
226 } 221 }
227 // TODO(bryeung): whenever the TextInputClient changes we need to notify the 222 // TODO(bryeung): whenever the TextInputClient changes we need to notify the
228 // keyboard (with the TextInputType) so that it can reset it's state (e.g. 223 // keyboard (with the TextInputType) so that it can reset it's state (e.g.
229 // abandon compositions in progress) 224 // abandon compositions in progress)
230 } 225 }
231 226
232 void KeyboardController::OnInputMethodDestroyed( 227 void KeyboardController::OnInputMethodDestroyed(
233 const ui::InputMethod* input_method) { 228 const ui::InputMethod* input_method) {
234 DCHECK_EQ(input_method_, input_method); 229 DCHECK_EQ(input_method_, input_method);
235 input_method_ = NULL; 230 input_method_ = NULL;
236 } 231 }
237 232
238 bool KeyboardController::WillHideKeyboard() const { 233 bool KeyboardController::WillHideKeyboard() const {
239 return weak_factory_.HasWeakPtrs(); 234 return weak_factory_.HasWeakPtrs();
240 } 235 }
241 236
242 } // namespace keyboard 237 } // namespace keyboard
OLDNEW
« no previous file with comments | « ui/keyboard/keyboard_controller.h ('k') | ui/keyboard/keyboard_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698