| Index: ash/wm/app_list_controller.cc
|
| diff --git a/ash/wm/app_list_controller.cc b/ash/wm/app_list_controller.cc
|
| index 45915c49ae1a7a95b52cf913843f787d38097a0e..6acf1aef33e2e868892ad2757babfeb9d190a142 100644
|
| --- a/ash/wm/app_list_controller.cc
|
| +++ b/ash/wm/app_list_controller.cc
|
| @@ -44,6 +44,9 @@ const int kMaxOverScrollShift = 48;
|
| // result of minimal bubble arrow sizes and offsets.
|
| const int kMinimalAnchorPositionOffset = 57;
|
|
|
| +// The minimal margin (in pixels) around the app list when in centered mode.
|
| +const int kMinimalCenteredAppListMargin = 10;
|
| +
|
| ui::Layer* GetLayer(views::Widget* widget) {
|
| return widget->GetNativeView()->layer();
|
| }
|
| @@ -115,8 +118,11 @@ gfx::Vector2d GetAnchorPositionOffsetToShelf(
|
| }
|
|
|
| // Gets the point at the center of the display that a particular view is on.
|
| -// This calculation excludes the virtual keyboard area.
|
| -gfx::Point GetCenterOfDisplayForView(const views::View* view) {
|
| +// This calculation excludes the virtual keyboard area. If the height of the
|
| +// display area is less than |minimum_height|, its bottom will be extended to
|
| +// that height (so that the app list never starts above the top of the screen).
|
| +gfx::Point GetCenterOfDisplayForView(const views::View* view,
|
| + int minimum_height) {
|
| gfx::Rect bounds = Shell::GetScreen()->GetDisplayNearestWindow(
|
| view->GetWidget()->GetNativeView()).bounds();
|
|
|
| @@ -129,9 +135,18 @@ gfx::Point GetCenterOfDisplayForView(const views::View* view) {
|
| if (keyboard_controller && keyboard_controller->keyboard_visible())
|
| bounds.Subtract(keyboard_controller->current_keyboard_bounds());
|
|
|
| + // Apply the |minimum_height|.
|
| + if (bounds.height() < minimum_height)
|
| + bounds.set_height(minimum_height);
|
| +
|
| return bounds.CenterPoint();
|
| }
|
|
|
| +// Gets the minimum height of the rectangle to center the app list in.
|
| +int GetMinimumBoundsHeightForAppList(const app_list::AppListView* app_list) {
|
| + return app_list->bounds().height() + 2 * kMinimalCenteredAppListMargin;
|
| +}
|
| +
|
| } // namespace
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -189,15 +204,19 @@ void AppListController::SetVisible(bool visible, aura::Window* window) {
|
| Shelf::ForWindow(container)->GetAppListButtonView();
|
| is_centered_ = view->ShouldCenterWindow();
|
| if (is_centered_) {
|
| - // The experimental app list is centered over the display of the app list
|
| - // button that was pressed (if triggered via keyboard, this is the display
|
| - // with the currently focused window).
|
| + // Note: We can't center the app list until we have its dimensions, so we
|
| + // init at (0, 0) and then reset its anchor point.
|
| view->InitAsBubbleAtFixedLocation(
|
| container,
|
| pagination_model_.get(),
|
| - GetCenterOfDisplayForView(applist_button),
|
| + gfx::Point(),
|
| views::BubbleBorder::FLOAT,
|
| true /* border_accepts_events */);
|
| + // The experimental app list is centered over the display of the app list
|
| + // button that was pressed (if triggered via keyboard, this is the display
|
| + // with the currently focused window).
|
| + view->SetAnchorPoint(GetCenterOfDisplayForView(
|
| + applist_button, GetMinimumBoundsHeightForAppList(view)));
|
| } else {
|
| gfx::Rect applist_button_bounds = applist_button->GetBoundsInScreen();
|
| // We need the location of the button within the local screen.
|
| @@ -340,7 +359,8 @@ void AppListController::UpdateBounds() {
|
| view_->UpdateBounds();
|
|
|
| if (is_centered_)
|
| - view_->SetAnchorPoint(GetCenterOfDisplayForView(view_));
|
| + view_->SetAnchorPoint(GetCenterOfDisplayForView(
|
| + view_, GetMinimumBoundsHeightForAppList(view_)));
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|