| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/chromeos/login/screen_locker.h" | 5 #include "chrome/browser/chromeos/login/screen_locker.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 : views::WidgetGtk(views::WidgetGtk::TYPE_CHILD), | 265 : views::WidgetGtk(views::WidgetGtk::TYPE_CHILD), |
| 266 screen_locker_(screen_locker), | 266 screen_locker_(screen_locker), |
| 267 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), | 267 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), |
| 268 grab_failure_count_(0), | 268 grab_failure_count_(0), |
| 269 kbd_grab_status_(GDK_GRAB_INVALID_TIME), | 269 kbd_grab_status_(GDK_GRAB_INVALID_TIME), |
| 270 mouse_grab_status_(GDK_GRAB_INVALID_TIME) { | 270 mouse_grab_status_(GDK_GRAB_INVALID_TIME) { |
| 271 } | 271 } |
| 272 | 272 |
| 273 virtual void Show() { | 273 virtual void Show() { |
| 274 views::WidgetGtk::Show(); | 274 views::WidgetGtk::Show(); |
| 275 // Now steal all inputs. | |
| 276 TryGrabAllInputs(); | |
| 277 } | 275 } |
| 278 | 276 |
| 279 void ClearGrab() { | 277 void ClearGrab() { |
| 280 GtkWidget* current_grab_window; | 278 GtkWidget* current_grab_window; |
| 281 // Grab gtk input first so that the menu holding grab will close itself. | 279 // Grab gtk input first so that the menu holding grab will close itself. |
| 282 gtk_grab_add(window_contents()); | 280 gtk_grab_add(window_contents()); |
| 283 | 281 |
| 284 // Make sure there is no grab widget so that gtk simply propagates | 282 // Make sure there is no grab widget so that gtk simply propagates |
| 285 // an event. This is necessary to allow message bubble and password | 283 // an event. This is necessary to allow message bubble and password |
| 286 // field, button to process events simultaneously. GTK | 284 // field, button to process events simultaneously. GTK |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 void ScreenLocker::Init() { | 559 void ScreenLocker::Init() { |
| 562 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); | 560 authenticator_ = LoginUtils::Get()->CreateAuthenticator(this); |
| 563 | 561 |
| 564 gfx::Point left_top(1, 1); | 562 gfx::Point left_top(1, 1); |
| 565 gfx::Rect init_bounds(views::Screen::GetMonitorAreaNearestPoint(left_top)); | 563 gfx::Rect init_bounds(views::Screen::GetMonitorAreaNearestPoint(left_top)); |
| 566 | 564 |
| 567 LockWindow* lock_window = new LockWindow(); | 565 LockWindow* lock_window = new LockWindow(); |
| 568 lock_window_ = lock_window; | 566 lock_window_ = lock_window; |
| 569 lock_window_->Init(NULL, init_bounds); | 567 lock_window_->Init(NULL, init_bounds); |
| 570 | 568 |
| 571 // Add the window to its own group so that its grab won't be stolen if | |
| 572 // gtk_grab_add() gets called on behalf on a non-screen-locker widget (e.g. | |
| 573 // a modal dialog) -- see http://crosbug.com/8999. | |
| 574 GtkWindowGroup* window_group = gtk_window_group_new(); | |
| 575 gtk_window_group_add_window(window_group, | |
| 576 GTK_WINDOW(lock_window_->GetNativeView())); | |
| 577 g_object_unref(window_group); | |
| 578 | |
| 579 g_signal_connect(lock_window_->GetNativeView(), "client-event", | 569 g_signal_connect(lock_window_->GetNativeView(), "client-event", |
| 580 G_CALLBACK(OnClientEventThunk), this); | 570 G_CALLBACK(OnClientEventThunk), this); |
| 581 | 571 |
| 582 // GTK does not like zero width/height. | 572 // GTK does not like zero width/height. |
| 583 if (!unlock_on_input_) { | 573 if (!unlock_on_input_) { |
| 584 screen_lock_view_ = new ScreenLockView(this); | 574 screen_lock_view_ = new ScreenLockView(this); |
| 585 screen_lock_view_->Init(); | 575 screen_lock_view_->Init(); |
| 586 screen_lock_view_->SetEnabled(false); | 576 screen_lock_view_->SetEnabled(false); |
| 587 } else { | 577 } else { |
| 588 input_event_observer_.reset(new InputEventObserver(this)); | 578 input_event_observer_.reset(new InputEventObserver(this)); |
| 589 MessageLoopForUI::current()->AddObserver(input_event_observer_.get()); | 579 MessageLoopForUI::current()->AddObserver(input_event_observer_.get()); |
| 590 } | 580 } |
| 591 | 581 |
| 592 lock_widget_ = new GrabWidget(this); | 582 // Hang on to a cast version of the grab widget so we can call its |
| 583 // TryGrabAllInputs() method later. (Nobody else needs to use it, so moving |
| 584 // its declaration to the header instead of keeping it in an anonymous |
| 585 // namespace feels a bit ugly.) |
| 586 GrabWidget* cast_lock_widget = new GrabWidget(this); |
| 587 lock_widget_ = cast_lock_widget; |
| 593 lock_widget_->MakeTransparent(); | 588 lock_widget_->MakeTransparent(); |
| 594 lock_widget_->InitWithWidget(lock_window_, gfx::Rect()); | 589 lock_widget_->InitWithWidget(lock_window_, gfx::Rect()); |
| 595 if (screen_lock_view_) { | 590 if (screen_lock_view_) { |
| 596 lock_widget_->SetContentsView( | 591 lock_widget_->SetContentsView( |
| 597 new GrabWidgetRootView(screen_lock_view_)); | 592 new GrabWidgetRootView(screen_lock_view_)); |
| 598 } | 593 } |
| 594 lock_widget_->Show(); |
| 599 | 595 |
| 600 // Configuring the background url. | 596 // Configuring the background url. |
| 601 std::string url_string = | 597 std::string url_string = |
| 602 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 598 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 603 switches::kScreenSaverUrl); | 599 switches::kScreenSaverUrl); |
| 604 background_view_ = new ScreenLockerBackgroundView(lock_widget_, | 600 background_view_ = new ScreenLockerBackgroundView(lock_widget_, |
| 605 screen_lock_view_); | 601 screen_lock_view_); |
| 606 background_view_->Init(GURL(url_string)); | 602 background_view_->Init(GURL(url_string)); |
| 607 if (background_view_->ScreenSaverEnabled()) | 603 if (background_view_->ScreenSaverEnabled()) |
| 608 StartScreenSaver(); | 604 StartScreenSaver(); |
| 609 | 605 |
| 610 DCHECK(GTK_WIDGET_REALIZED(lock_window_->GetNativeView())); | 606 DCHECK(GTK_WIDGET_REALIZED(lock_window_->GetNativeView())); |
| 611 WmIpc::instance()->SetWindowType( | 607 WmIpc::instance()->SetWindowType( |
| 612 lock_window_->GetNativeView(), | 608 lock_window_->GetNativeView(), |
| 613 WM_IPC_WINDOW_CHROME_SCREEN_LOCKER, | 609 WM_IPC_WINDOW_CHROME_SCREEN_LOCKER, |
| 614 NULL); | 610 NULL); |
| 615 | 611 |
| 616 lock_window_->SetContentsView(background_view_); | 612 lock_window_->SetContentsView(background_view_); |
| 617 lock_window_->Show(); | 613 lock_window_->Show(); |
| 618 | 614 |
| 619 // Show lock_widget after the lock_window is shown so that | 615 cast_lock_widget->TryGrabAllInputs(); |
| 620 // we can grab inputs immediately. | 616 |
| 621 lock_widget_->Show(); | 617 // Add the window to its own group so that its grab won't be stolen if |
| 618 // gtk_grab_add() gets called on behalf on a non-screen-locker widget (e.g. |
| 619 // a modal dialog) -- see http://crosbug.com/8999. We intentionally do this |
| 620 // after calling TryGrabAllInputs(), as want to be in the default window group |
| 621 // then so we can break any existing GTK grabs. |
| 622 GtkWindowGroup* window_group = gtk_window_group_new(); |
| 623 gtk_window_group_add_window(window_group, |
| 624 GTK_WINDOW(lock_window_->GetNativeView())); |
| 625 g_object_unref(window_group); |
| 622 | 626 |
| 623 // Don't let X draw default background, which was causing flash on | 627 // Don't let X draw default background, which was causing flash on |
| 624 // resume. | 628 // resume. |
| 625 gdk_window_set_back_pixmap(lock_window_->GetNativeView()->window, | 629 gdk_window_set_back_pixmap(lock_window_->GetNativeView()->window, |
| 626 NULL, false); | 630 NULL, false); |
| 627 gdk_window_set_back_pixmap(lock_widget_->GetNativeView()->window, | 631 gdk_window_set_back_pixmap(lock_widget_->GetNativeView()->window, |
| 628 NULL, false); | 632 NULL, false); |
| 629 lock_window->set_toplevel_focus_widget(lock_widget_->window_contents()); | 633 lock_window->set_toplevel_focus_widget(lock_widget_->window_contents()); |
| 630 | 634 |
| 631 // Create the SystemKeyEventListener so it can listen for system keyboard | 635 // Create the SystemKeyEventListener so it can listen for system keyboard |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 921 | 925 |
| 922 bool ScreenLocker::AcceleratorPressed(const views::Accelerator& accelerator) { | 926 bool ScreenLocker::AcceleratorPressed(const views::Accelerator& accelerator) { |
| 923 if (!background_view_->IsScreenSaverVisible()) { | 927 if (!background_view_->IsScreenSaverVisible()) { |
| 924 StartScreenSaver(); | 928 StartScreenSaver(); |
| 925 return true; | 929 return true; |
| 926 } | 930 } |
| 927 return false; | 931 return false; |
| 928 } | 932 } |
| 929 | 933 |
| 930 } // namespace chromeos | 934 } // namespace chromeos |
| OLD | NEW |