OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/ui/views/immersive_mode_controller.h" | 5 #include "chrome/browser/ui/views/immersive_mode_controller.h" |
6 | 6 |
7 #include "chrome/browser/ui/views/frame/browser_frame.h" | 7 #include "chrome/browser/ui/views/frame/browser_frame.h" |
8 #include "chrome/browser/ui/views/frame/browser_view.h" | 8 #include "chrome/browser/ui/views/frame/browser_view.h" |
9 #include "chrome/browser/ui/views/frame/contents_container.h" | 9 #include "chrome/browser/ui/views/frame/contents_container.h" |
10 #include "chrome/browser/ui/views/tabs/tab_strip.h" | 10 #include "chrome/browser/ui/views/tabs/tab_strip.h" |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 | 237 |
238 virtual ~WindowObserver() { | 238 virtual ~WindowObserver() { |
239 controller_->native_window_->RemoveObserver(this); | 239 controller_->native_window_->RemoveObserver(this); |
240 } | 240 } |
241 | 241 |
242 // aura::WindowObserver overrides: | 242 // aura::WindowObserver overrides: |
243 virtual void OnWindowPropertyChanged(aura::Window* window, | 243 virtual void OnWindowPropertyChanged(aura::Window* window, |
244 const void* key, | 244 const void* key, |
245 intptr_t old) OVERRIDE { | 245 intptr_t old) OVERRIDE { |
246 using aura::client::kShowStateKey; | 246 using aura::client::kShowStateKey; |
247 if (key != kShowStateKey) | 247 if (key == kShowStateKey) { |
248 return; | 248 // Disable immersive mode when leaving the maximized state. |
249 // Disable immersive mode when leaving the maximized state. | 249 if (window->GetProperty(kShowStateKey) != ui::SHOW_STATE_MAXIMIZED) |
250 if (window->GetProperty(kShowStateKey) != ui::SHOW_STATE_MAXIMIZED) | 250 controller_->SetEnabled(false); |
251 controller_->SetEnabled(false); | 251 return; |
| 252 } |
| 253 #if defined(USE_ASH) |
| 254 using ash::internal::kImmersiveModeKey; |
| 255 if (key == kImmersiveModeKey) { |
| 256 // Another component has toggled immersive mode. |
| 257 controller_->SetEnabled(window->GetProperty(kImmersiveModeKey)); |
| 258 return; |
| 259 } |
| 260 #endif |
252 } | 261 } |
253 | 262 |
254 private: | 263 private: |
255 ImmersiveModeController* controller_; // Not owned. | 264 ImmersiveModeController* controller_; // Not owned. |
256 | 265 |
257 DISALLOW_COPY_AND_ASSIGN(WindowObserver); | 266 DISALLOW_COPY_AND_ASSIGN(WindowObserver); |
258 }; | 267 }; |
259 #endif // defined(USE_AURA) | 268 #endif // defined(USE_AURA) |
260 | 269 |
261 //////////////////////////////////////////////////////////////////////////////// | 270 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 11 matching lines...) Expand all Loading... |
273 EndReveal(ANIMATE_NO, LAYOUT_NO); | 282 EndReveal(ANIMATE_NO, LAYOUT_NO); |
274 // Clean up our window observers. | 283 // Clean up our window observers. |
275 EnableWindowObservers(false); | 284 EnableWindowObservers(false); |
276 } | 285 } |
277 | 286 |
278 void ImmersiveModeController::Init() { | 287 void ImmersiveModeController::Init() { |
279 // Browser view is detached from its widget during destruction. Cache the | 288 // Browser view is detached from its widget during destruction. Cache the |
280 // window pointer so |this| can stop observing during destruction. | 289 // window pointer so |this| can stop observing during destruction. |
281 native_window_ = browser_view_->GetNativeWindow(); | 290 native_window_ = browser_view_->GetNativeWindow(); |
282 DCHECK(native_window_); | 291 DCHECK(native_window_); |
| 292 EnableWindowObservers(true); |
283 | 293 |
284 #if defined(USE_ASH) | 294 #if defined(USE_ASH) |
285 // Optionally allow the tab indicators to be hidden. | 295 // Optionally allow the tab indicators to be hidden. |
286 hide_tab_indicators_ = CommandLine::ForCurrentProcess()-> | 296 hide_tab_indicators_ = CommandLine::ForCurrentProcess()-> |
287 HasSwitch(ash::switches::kAshImmersiveHideTabIndicators); | 297 HasSwitch(ash::switches::kAshImmersiveHideTabIndicators); |
288 #endif | 298 #endif |
289 } | 299 } |
290 | 300 |
291 void ImmersiveModeController::SetEnabled(bool enabled) { | 301 void ImmersiveModeController::SetEnabled(bool enabled) { |
292 if (enabled_ == enabled) | 302 if (enabled_ == enabled) |
293 return; | 303 return; |
294 enabled_ = enabled; | 304 enabled_ = enabled; |
295 | 305 |
296 if (!enabled_) { | 306 if (!enabled_) { |
297 // Layout occurs below because EndReveal() only performs layout if the view | 307 // Layout occurs below because EndReveal() only performs layout if the view |
298 // is already revealed. | 308 // is already revealed. |
299 EndReveal(ANIMATE_NO, LAYOUT_NO); | 309 EndReveal(ANIMATE_NO, LAYOUT_NO); |
300 // Stop cursor-at-top tracking. | 310 // Stop cursor-at-top tracking. |
301 top_timer_.Stop(); | 311 top_timer_.Stop(); |
302 } | 312 } |
303 | 313 |
304 #if defined(USE_ASH) | 314 #if defined(USE_ASH) |
| 315 // This causes a no-op call to SetEnabled() since enabled_ is already set. |
305 native_window_->SetProperty(ash::internal::kImmersiveModeKey, enabled_); | 316 native_window_->SetProperty(ash::internal::kImmersiveModeKey, enabled_); |
306 // Ash on Windows may not have a shell. | 317 // Ash on Windows may not have a shell. |
307 if (ash::Shell::HasInstance()) { | 318 if (ash::Shell::HasInstance()) { |
308 // Shelf auto-hides in immersive mode. | 319 // Shelf auto-hides in immersive mode. |
309 ash::Shell::GetInstance()->UpdateShelfVisibility(); | 320 ash::Shell::GetInstance()->UpdateShelfVisibility(); |
310 } | 321 } |
311 #endif | 322 #endif |
312 | 323 |
313 // Ensure window caption buttons are shown/hidden appropriately. | 324 // Ensure window caption buttons are shown/hidden appropriately. |
314 browser_view_->frame()->non_client_view()->frame_view()-> | 325 browser_view_->frame()->non_client_view()->frame_view()-> |
315 ResetWindowControls(); | 326 ResetWindowControls(); |
316 | 327 |
317 // Always ensure tab strip is in correct state. | 328 // Always ensure tab strip is in correct state. |
318 browser_view_->tabstrip()->SetImmersiveStyle(enabled_); | 329 browser_view_->tabstrip()->SetImmersiveStyle(enabled_); |
319 browser_view_->Layout(); | 330 browser_view_->Layout(); |
320 | |
321 EnableWindowObservers(enabled_); | |
322 } | 331 } |
323 | 332 |
324 views::View* ImmersiveModeController::reveal_view() { | 333 views::View* ImmersiveModeController::reveal_view() { |
325 return reveal_view_.get(); | 334 return reveal_view_.get(); |
326 } | 335 } |
327 | 336 |
328 void ImmersiveModeController::MaybeStackViewAtTop() { | 337 void ImmersiveModeController::MaybeStackViewAtTop() { |
329 #if defined(USE_AURA) | 338 #if defined(USE_AURA) |
330 if (enabled_ && revealed_ && reveal_view_.get()) { | 339 if (enabled_ && revealed_ && reveal_view_.get()) { |
331 ui::Layer* reveal_layer = reveal_view_->layer(); | 340 ui::Layer* reveal_layer = reveal_view_->layer(); |
332 reveal_layer->parent()->StackAtTop(reveal_layer); | 341 reveal_layer->parent()->StackAtTop(reveal_layer); |
333 } | 342 } |
334 #endif | 343 #endif |
335 } | 344 } |
336 | 345 |
337 void ImmersiveModeController::MaybeStartReveal() { | 346 void ImmersiveModeController::MaybeStartReveal() { |
338 if (enabled_ && !revealed_) | 347 if (enabled_ && !revealed_) |
339 StartReveal(); | 348 StartReveal(); |
340 } | 349 } |
341 | 350 |
342 void ImmersiveModeController::CancelReveal() { | 351 void ImmersiveModeController::CancelReveal() { |
343 EndReveal(ANIMATE_NO, LAYOUT_YES); | 352 EndReveal(ANIMATE_NO, LAYOUT_YES); |
344 } | 353 } |
345 | 354 |
346 //////////////////////////////////////////////////////////////////////////////// | 355 //////////////////////////////////////////////////////////////////////////////// |
347 | 356 |
348 // ui::EventHandler overrides: | 357 // ui::EventHandler overrides: |
349 void ImmersiveModeController::OnMouseEvent(ui::MouseEvent* event) { | 358 void ImmersiveModeController::OnMouseEvent(ui::MouseEvent* event) { |
350 if (event->type() != ui::ET_MOUSE_MOVED) | 359 if (!enabled_ || event->type() != ui::ET_MOUSE_MOVED) |
351 return; | 360 return; |
352 if (event->location().y() == 0) { | 361 if (event->location().y() == 0) { |
353 // Start a reveal if the mouse touches the top of the screen and then stops | 362 // Start a reveal if the mouse touches the top of the screen and then stops |
354 // moving for a little while. This mirrors the Ash launcher behavior. | 363 // moving for a little while. This mirrors the Ash launcher behavior. |
355 top_timer_.Stop(); | 364 top_timer_.Stop(); |
356 top_timer_.Start(FROM_HERE, | 365 top_timer_.Start(FROM_HERE, |
357 base::TimeDelta::FromMilliseconds(kTopEdgeRevealDelayMs), | 366 base::TimeDelta::FromMilliseconds(kTopEdgeRevealDelayMs), |
358 this, &ImmersiveModeController::StartReveal); | 367 this, &ImmersiveModeController::StartReveal); |
359 } else { | 368 } else { |
360 // Cursor left the top edge. | 369 // Cursor left the top edge. |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 base::TimeDelta::FromMilliseconds(kRevealAnimationDurationMs)); | 510 base::TimeDelta::FromMilliseconds(kRevealAnimationDurationMs)); |
502 settings.AddObserver(this); // Resets |reveal_view_| on completion. | 511 settings.AddObserver(this); // Resets |reveal_view_| on completion. |
503 gfx::Transform transform; | 512 gfx::Transform transform; |
504 transform.Translate(0, -layer->bounds().height()); | 513 transform.Translate(0, -layer->bounds().height()); |
505 layer->SetTransform(transform); | 514 layer->SetTransform(transform); |
506 } | 515 } |
507 | 516 |
508 void ImmersiveModeController::OnHideAnimationCompleted() { | 517 void ImmersiveModeController::OnHideAnimationCompleted() { |
509 reveal_view_.reset(); // Also removes from parent. | 518 reveal_view_.reset(); // Also removes from parent. |
510 } | 519 } |
OLD | NEW |