Skip to content

Commit

Permalink
Update the keyboard's bounds when the views desktop's bounds are chan…
Browse files Browse the repository at this point in the history
…ged.

This depends on (and builds upon)
http://codereview.chromium.org/7864030/

BUG=None
TEST=None

Review URL: http://codereview.chromium.org/7889004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@101109 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
vollick@chromium.org committed Sep 14, 2011
1 parent 5738ca2 commit 3d20c2c
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 13 deletions.
12 changes: 7 additions & 5 deletions chrome/browser/ui/touch/frame/touch_browser_frame_view.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ const char TouchBrowserFrameView::kViewClassName[] =

TouchBrowserFrameView::TouchBrowserFrameView(BrowserFrame* frame,
BrowserView* browser_view)
: OpaqueBrowserFrameView(frame, browser_view) {
: OpaqueBrowserFrameView(frame, browser_view),
initialized_screen_rotation_(false) {
// Make sure the singleton KeyboardManager object is initialized.
KeyboardManager::GetInstance();
sensors::Provider::GetInstance()->AddListener(this);
Expand Down Expand Up @@ -102,15 +103,16 @@ void TouchBrowserFrameView::OnScreenOrientationChanged(
}

if (!initialized_screen_rotation_) {
to_rotate->SetPaintToLayer(true);
to_rotate->SetLayerPropertySetter(
ScreenRotationSetterFactory::Create(to_rotate));
initialized_screen_rotation_ = true;
to_rotate->SetPaintToLayer(true);
to_rotate->SetLayerPropertySetter(
ScreenRotationSetterFactory::Create(to_rotate));
initialized_screen_rotation_ = true;
}

ui::Transform xform = SideToTransform(change.upward,
to_rotate->GetTransform(),
to_rotate->size());

to_rotate->SetTransform(xform);
}

52 changes: 45 additions & 7 deletions chrome/browser/ui/touch/keyboard/keyboard_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,19 @@ const int kKeyboardSlideDuration = 300; // In milliseconds
const char kOnTextInputTypeChanged[] =
"experimental.input.onTextInputTypeChanged";

// The default position of the keyboard widget should be at the bottom,
// spanning the entire width of the desktop.
gfx::Rect GetKeyboardPosition(int height) {
views::View* desktop = views::desktop::DesktopWindowView::desktop_window_view;
gfx::Rect area;
if (desktop)
area = desktop->bounds();
else
area = gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point());
return gfx::Rect(area.x(), area.y() + area.height() - height,
area.width(), height);
}

} // namespace

// TODO(sad): Is the default profile always going to be the one we want?
Expand All @@ -63,6 +76,9 @@ class KeyboardWidget
// TODO(sad): Allow specifying the type of keyboard to show.
void ShowKeyboardForWidget(views::Widget* widget);

// Updates the bounds to reflect the current screen/desktop bounds.
void ResetBounds();

// Overridden from views::Widget
void Hide() OVERRIDE;

Expand Down Expand Up @@ -138,16 +154,10 @@ KeyboardWidget::KeyboardWidget()
target_(NULL),
keyboard_height_(kDefaultKeyboardHeight) {

// The default position of the keyboard widget should be at the bottom,
// spanning the entire width of the screen.
gfx::Rect area = gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point());

// Initialize the widget first.
views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
params.transparent = true;
params.bounds = gfx::Rect(area.x(),
area.y() + area.height() - keyboard_height_,
area.width(), keyboard_height_);
params.bounds = GetKeyboardPosition(keyboard_height_);
Init(params);

// Setup the DOM view to host the keyboard.
Expand Down Expand Up @@ -221,6 +231,10 @@ void KeyboardWidget::ShowKeyboardForWidget(views::Widget* widget) {
Details<bool>(&visible));
}

void KeyboardWidget::ResetBounds() {
SetBounds(GetKeyboardPosition(keyboard_height_));
}

void KeyboardWidget::Hide() {
animation_->Hide();

Expand Down Expand Up @@ -425,10 +439,30 @@ void KeyboardWidget::OnWidgetActivationChanged(Widget* widget, bool active) {
KeyboardManager::KeyboardManager()
: keyboard_(new KeyboardWidget()) {
keyboard_->AddObserver(this);

views::desktop::DesktopWindowView* desktop =
views::desktop::DesktopWindowView::desktop_window_view;

// We are either not in views desktop mode, or we are and we are not yet
// observing the desktop.
DCHECK(!desktop || !desktop->HasObserver(this));

if (desktop)
desktop->AddObserver(this);
}

KeyboardManager::~KeyboardManager() {
DCHECK(!keyboard_);

views::desktop::DesktopWindowView* desktop =
views::desktop::DesktopWindowView::desktop_window_view;

// We are either not in views desktop mode, or we are and we have been
// observing the desktop
DCHECK(!desktop || desktop->HasObserver(this));

if (desktop)
desktop->RemoveObserver(this);
}

void KeyboardManager::ShowKeyboardForWidget(views::Widget* widget) {
Expand All @@ -448,6 +482,10 @@ void KeyboardManager::OnWidgetClosing(views::Widget* widget) {
keyboard_ = NULL;
}

void KeyboardManager::OnDesktopBoundsChanged(const gfx::Rect& prev_bounds) {
keyboard_->ResetBounds();
}

// static
KeyboardManager* KeyboardManager::GetInstance() {
return Singleton<KeyboardManager>::get();
Expand Down
7 changes: 6 additions & 1 deletion chrome/browser/ui/touch/keyboard/keyboard_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
#pragma once

#include "base/memory/singleton.h"
#include "views/desktop/desktop_window_view.h"
#include "views/widget/widget.h"

class KeyboardWidget;

// A singleton object to manage the virtual keyboard.
class KeyboardManager : public views::Widget::Observer {
class KeyboardManager : public views::Widget::Observer,
public views::desktop::DesktopWindowView::Observer {
public:
// Returns the singleton object.
static KeyboardManager* GetInstance();
Expand All @@ -37,6 +39,9 @@ class KeyboardManager : public views::Widget::Observer {
// Overridden from views::Widget::Observer.
virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE;

// Overridden from views::desktop::DesktopWindowView::Observer
virtual void OnDesktopBoundsChanged(const gfx::Rect& prev_bounds) OVERRIDE;

KeyboardWidget* keyboard_;

DISALLOW_COPY_AND_ASSIGN(KeyboardManager);
Expand Down
15 changes: 15 additions & 0 deletions views/desktop/desktop_window_view.cc
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,18 @@ void DesktopWindowView::CreateTestWindow(const std::wstring& title,
SetLayerPropertySetter(LayerPropertySetter::CreateAnimatingSetter());
}

void DesktopWindowView::AddObserver(DesktopWindowView::Observer* observer) {
observers_.AddObserver(observer);
}

void DesktopWindowView::RemoveObserver(DesktopWindowView::Observer* observer) {
observers_.RemoveObserver(observer);
}

bool DesktopWindowView::HasObserver(DesktopWindowView::Observer* observer) {
return observers_.HasObserver(observer);
}

////////////////////////////////////////////////////////////////////////////////
// DesktopWindowView, View overrides:

Expand All @@ -179,6 +191,9 @@ void DesktopWindowView::Layout() {
void DesktopWindowView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
static_cast<DesktopWindowManager*>(WindowManager::Get())->
UpdateWindowsAfterScreenSizeChanged(bounds());

FOR_EACH_OBSERVER(Observer, observers_,
OnDesktopBoundsChanged(previous_bounds));
}

void DesktopWindowView::ViewHierarchyChanged(
Expand Down
16 changes: 16 additions & 0 deletions views/desktop/desktop_window_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef VIEWS_DESKTOP_DESKTOP_WINDOW_H_
#define VIEWS_DESKTOP_DESKTOP_WINDOW_H_

#include "base/observer_list.h"
#include "views/view.h"
#include "views/widget/widget_delegate.h"

Expand All @@ -16,6 +17,15 @@ namespace desktop {

class DesktopWindowView : public WidgetDelegateView {
public:
// Observers can listen to various events on the desktop.
class Observer {
public:
virtual void OnDesktopBoundsChanged(const gfx::Rect& previous_bounds) = 0;

protected:
virtual ~Observer() {}
};

// The look and feel will be slightly different for different kinds of
// desktop.
enum DesktopType {
Expand All @@ -38,6 +48,11 @@ class DesktopWindowView : public WidgetDelegateView {

DesktopType type() const { return type_; }

// Add/remove observer.
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
bool HasObserver(Observer* observer);

private:
// Overridden from View:
virtual void Layout() OVERRIDE;
Expand All @@ -58,6 +73,7 @@ class DesktopWindowView : public WidgetDelegateView {
virtual View* GetContentsView() OVERRIDE;
virtual NonClientFrameView* CreateNonClientFrameView() OVERRIDE;

ObserverList<Observer> observers_;
DesktopType type_;
Widget* widget_;

Expand Down

0 comments on commit 3d20c2c

Please sign in to comment.