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

Unified Diff: ash/wm/workspace/frame_maximize_button.cc

Issue 23498031: Move code related to the window controls to ash/wm/caption_buttons (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/wm/workspace/frame_maximize_button.h ('k') | ash/wm/workspace/maximize_bubble_frame_state.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/workspace/frame_maximize_button.cc
diff --git a/ash/wm/workspace/frame_maximize_button.cc b/ash/wm/workspace/frame_maximize_button.cc
deleted file mode 100644
index 08980c287f9f399a2899eebb7687d82e7ee1c877..0000000000000000000000000000000000000000
--- a/ash/wm/workspace/frame_maximize_button.cc
+++ /dev/null
@@ -1,619 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/wm/workspace/frame_maximize_button.h"
-
-#include "ash/launcher/launcher.h"
-#include "ash/screen_ash.h"
-#include "ash/shelf/shelf_widget.h"
-#include "ash/shell.h"
-#include "ash/shell_delegate.h"
-#include "ash/touch/touch_uma.h"
-#include "ash/wm/maximize_bubble_controller.h"
-#include "ash/wm/property_util.h"
-#include "ash/wm/window_animations.h"
-#include "ash/wm/window_settings.h"
-#include "ash/wm/workspace/phantom_window_controller.h"
-#include "ash/wm/workspace/snap_sizer.h"
-#include "grit/ash_strings.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/window.h"
-#include "ui/base/events/event.h"
-#include "ui/base/events/event_handler.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/image/image.h"
-#include "ui/gfx/screen.h"
-#include "ui/views/widget/widget.h"
-#include "ui/views/window/non_client_view.h"
-
-using ash::internal::SnapSizer;
-
-namespace ash {
-
-namespace {
-
-// Delay before forcing an update of the snap location.
-const int kUpdateDelayMS = 400;
-
-// The delay of the bubble appearance.
-const int kBubbleAppearanceDelayMS = 500;
-
-// The minimum sanp size in percent of the screen width.
-const int kMinSnapSizePercent = 50;
-}
-
-// EscapeEventFilter is installed on the RootWindow to track when the escape key
-// is pressed. We use an EventFilter for this as the FrameMaximizeButton
-// normally does not get focus.
-class FrameMaximizeButton::EscapeEventFilter : public ui::EventHandler {
- public:
- explicit EscapeEventFilter(FrameMaximizeButton* button);
- virtual ~EscapeEventFilter();
-
- // EventFilter overrides:
- virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE;
-
- private:
- FrameMaximizeButton* button_;
-
- DISALLOW_COPY_AND_ASSIGN(EscapeEventFilter);
-};
-
-FrameMaximizeButton::EscapeEventFilter::EscapeEventFilter(
- FrameMaximizeButton* button)
- : button_(button) {
- Shell::GetInstance()->AddPreTargetHandler(this);
-}
-
-FrameMaximizeButton::EscapeEventFilter::~EscapeEventFilter() {
- Shell::GetInstance()->RemovePreTargetHandler(this);
-}
-
-void FrameMaximizeButton::EscapeEventFilter::OnKeyEvent(
- ui::KeyEvent* event) {
- if (event->type() == ui::ET_KEY_PRESSED &&
- event->key_code() == ui::VKEY_ESCAPE) {
- button_->Cancel(false);
- }
-}
-
-// FrameMaximizeButton ---------------------------------------------------------
-
-FrameMaximizeButton::FrameMaximizeButton(views::ButtonListener* listener,
- views::NonClientFrameView* frame)
- : ImageButton(listener),
- frame_(frame),
- is_snap_enabled_(false),
- exceeded_drag_threshold_(false),
- widget_(NULL),
- press_is_gesture_(false),
- snap_type_(SNAP_NONE),
- bubble_appearance_delay_ms_(kBubbleAppearanceDelayMS) {
- // TODO(sky): nuke this. It's temporary while we don't have good images.
- SetImageAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
-
- if (ash::Shell::IsForcedMaximizeMode())
- views::View::SetVisible(false);
-}
-
-FrameMaximizeButton::~FrameMaximizeButton() {
- // Before the window gets destroyed, the maximizer dialog needs to be shut
- // down since it would otherwise call into a deleted object.
- maximizer_.reset();
- if (widget_)
- OnWindowDestroying(widget_->GetNativeWindow());
-}
-
-void FrameMaximizeButton::SnapButtonHovered(SnapType type) {
- // Make sure to only show hover operations when no button is pressed and
- // a similar snap operation in progress does not get re-applied.
- if (is_snap_enabled_ || (type == snap_type_ && snap_sizer_))
- return;
- // Prime the mouse location with the center of the (local) button.
- press_location_ = gfx::Point(width() / 2, height() / 2);
- // Then get an adjusted mouse position to initiate the effect.
- gfx::Point location = press_location_;
- switch (type) {
- case SNAP_LEFT:
- location.set_x(location.x() - width());
- break;
- case SNAP_RIGHT:
- location.set_x(location.x() + width());
- break;
- case SNAP_MINIMIZE:
- location.set_y(location.y() + height());
- break;
- case SNAP_RESTORE:
- // Simulate a mouse button move over the according button.
- if (GetMaximizeBubbleFrameState() == FRAME_STATE_SNAP_LEFT)
- location.set_x(location.x() - width());
- else if (GetMaximizeBubbleFrameState() == FRAME_STATE_SNAP_RIGHT)
- location.set_x(location.x() + width());
- break;
- case SNAP_MAXIMIZE:
- break;
- case SNAP_NONE:
- Cancel(true);
- return;
- default:
- // We should not come here.
- NOTREACHED();
- }
- // Note: There is no hover with touch - we can therefore pass false for touch
- // operations.
- UpdateSnap(location, true, false);
-}
-
-void FrameMaximizeButton::ExecuteSnapAndCloseMenu(SnapType snap_type) {
- // We can come here with no snap type set in case that the mouse opened the
- // maximize button and a touch event "touched" a button.
- if (snap_type_ == SNAP_NONE)
- SnapButtonHovered(snap_type);
-
- Cancel(true);
- // Tell our menu to close.
- maximizer_.reset();
- snap_type_ = snap_type;
- // Since Snap might destroy |this|, but the snap_sizer needs to be destroyed,
- // The ownership of the snap_sizer is taken now.
- scoped_ptr<SnapSizer> snap_sizer(snap_sizer_.release());
- Snap(*snap_sizer.get());
-}
-
-void FrameMaximizeButton::DestroyMaximizeMenu() {
- Cancel(false);
-}
-
-void FrameMaximizeButton::OnWindowBoundsChanged(
- aura::Window* window,
- const gfx::Rect& old_bounds,
- const gfx::Rect& new_bounds) {
- Cancel(false);
-}
-
-void FrameMaximizeButton::OnWindowPropertyChanged(aura::Window* window,
- const void* key,
- intptr_t old) {
- Cancel(false);
-}
-
-void FrameMaximizeButton::OnWindowDestroying(aura::Window* window) {
- maximizer_.reset();
- if (widget_) {
- CHECK_EQ(widget_->GetNativeWindow(), window);
- widget_->GetNativeWindow()->RemoveObserver(this);
- widget_->RemoveObserver(this);
- widget_ = NULL;
- }
-}
-
-void FrameMaximizeButton::OnWidgetActivationChanged(views::Widget* widget,
- bool active) {
- // Upon losing focus, the control bubble should hide.
- if (!active && maximizer_)
- maximizer_.reset();
-}
-
-bool FrameMaximizeButton::OnMousePressed(const ui::MouseEvent& event) {
- // If we are already in a mouse click / drag operation, a second button down
- // call will cancel (this addresses crbug.com/143755).
- if (is_snap_enabled_) {
- Cancel(false);
- } else {
- is_snap_enabled_ = event.IsOnlyLeftMouseButton();
- if (is_snap_enabled_)
- ProcessStartEvent(event);
- }
- ImageButton::OnMousePressed(event);
- return true;
-}
-
-void FrameMaximizeButton::OnMouseEntered(const ui::MouseEvent& event) {
- ImageButton::OnMouseEntered(event);
- if (!maximizer_) {
- DCHECK(GetWidget());
- if (!widget_) {
- widget_ = frame_->GetWidget();
- widget_->GetNativeWindow()->AddObserver(this);
- widget_->AddObserver(this);
- }
- maximizer_.reset(new MaximizeBubbleController(
- this,
- GetMaximizeBubbleFrameState(),
- bubble_appearance_delay_ms_));
- }
-}
-
-void FrameMaximizeButton::OnMouseExited(const ui::MouseEvent& event) {
- ImageButton::OnMouseExited(event);
- // Remove the bubble menu when the button is not pressed and the mouse is not
- // within the bubble.
- if (!is_snap_enabled_ && maximizer_) {
- if (maximizer_->GetBubbleWindow()) {
- gfx::Point screen_location = Shell::GetScreen()->GetCursorScreenPoint();
- if (!maximizer_->GetBubbleWindow()->GetBoundsInScreen().Contains(
- screen_location)) {
- maximizer_.reset();
- // Make sure that all remaining snap hover states get removed.
- SnapButtonHovered(SNAP_NONE);
- }
- } else {
- // The maximize dialog does not show up immediately after creating the
- // |mazimizer_|. Destroy the dialog therefore before it shows up.
- maximizer_.reset();
- }
- }
-}
-
-bool FrameMaximizeButton::OnMouseDragged(const ui::MouseEvent& event) {
- if (is_snap_enabled_)
- ProcessUpdateEvent(event);
- return ImageButton::OnMouseDragged(event);
-}
-
-void FrameMaximizeButton::OnMouseReleased(const ui::MouseEvent& event) {
- maximizer_.reset();
- bool snap_was_enabled = is_snap_enabled_;
- if (!ProcessEndEvent(event) && snap_was_enabled)
- ImageButton::OnMouseReleased(event);
- // At this point |this| might be already destroyed.
-}
-
-void FrameMaximizeButton::OnMouseCaptureLost() {
- Cancel(false);
- ImageButton::OnMouseCaptureLost();
-}
-
-void FrameMaximizeButton::OnGestureEvent(ui::GestureEvent* event) {
- if (event->type() == ui::ET_GESTURE_TAP_DOWN) {
- is_snap_enabled_ = true;
- ProcessStartEvent(*event);
- event->SetHandled();
- return;
- }
-
- if (event->type() == ui::ET_GESTURE_TAP ||
- (event->type() == ui::ET_GESTURE_SCROLL_END && is_snap_enabled_) ||
- event->type() == ui::ET_SCROLL_FLING_START) {
- // The position of the event may have changed from the previous event (both
- // for TAP and SCROLL_END). So it is necessary to update the snap-state for
- // the current event.
- ProcessUpdateEvent(*event);
- if (event->type() == ui::ET_GESTURE_TAP) {
- snap_type_ = SnapTypeForLocation(event->location());
- TouchUMA::GetInstance()->RecordGestureAction(
- TouchUMA::GESTURE_FRAMEMAXIMIZE_TAP);
- }
- ProcessEndEvent(*event);
- event->SetHandled();
- return;
- }
-
- if (is_snap_enabled_) {
- if (event->type() == ui::ET_GESTURE_END &&
- event->details().touch_points() == 1) {
- // The position of the event may have changed from the previous event. So
- // it is necessary to update the snap-state for the current event.
- ProcessUpdateEvent(*event);
- snap_type_ = SnapTypeForLocation(event->location());
- ProcessEndEvent(*event);
- event->SetHandled();
- return;
- }
-
- if (event->type() == ui::ET_GESTURE_SCROLL_UPDATE ||
- event->type() == ui::ET_GESTURE_SCROLL_BEGIN) {
- ProcessUpdateEvent(*event);
- event->SetHandled();
- return;
- }
- }
-
- ImageButton::OnGestureEvent(event);
-}
-
-void FrameMaximizeButton::SetVisible(bool visible) {
- // In the enforced maximized mode we do not allow to be made visible.
- if (ash::Shell::IsForcedMaximizeMode())
- return;
-
- views::View::SetVisible(visible);
-}
-
-void FrameMaximizeButton::ProcessStartEvent(const ui::LocatedEvent& event) {
- DCHECK(is_snap_enabled_);
- // Prepare the help menu.
- if (!maximizer_) {
- maximizer_.reset(new MaximizeBubbleController(
- this,
- GetMaximizeBubbleFrameState(),
- bubble_appearance_delay_ms_));
- } else {
- // If the menu did not show up yet, we delay it even a bit more.
- maximizer_->DelayCreation();
- }
- snap_sizer_.reset(NULL);
- InstallEventFilter();
- snap_type_ = SNAP_NONE;
- press_location_ = event.location();
- press_is_gesture_ = event.IsGestureEvent();
- exceeded_drag_threshold_ = false;
- update_timer_.Start(
- FROM_HERE,
- base::TimeDelta::FromMilliseconds(kUpdateDelayMS),
- this,
- &FrameMaximizeButton::UpdateSnapFromEventLocation);
-}
-
-void FrameMaximizeButton::ProcessUpdateEvent(const ui::LocatedEvent& event) {
- DCHECK(is_snap_enabled_);
- if (!exceeded_drag_threshold_) {
- exceeded_drag_threshold_ = views::View::ExceededDragThreshold(
- event.location() - press_location_);
- }
- if (exceeded_drag_threshold_)
- UpdateSnap(event.location(), false, event.IsGestureEvent());
-}
-
-bool FrameMaximizeButton::ProcessEndEvent(const ui::LocatedEvent& event) {
- update_timer_.Stop();
- UninstallEventFilter();
- bool should_snap = is_snap_enabled_;
- is_snap_enabled_ = false;
-
- // Remove our help bubble.
- maximizer_.reset();
-
- if (!should_snap || snap_type_ == SNAP_NONE)
- return false;
-
- SetState(views::CustomButton::STATE_NORMAL);
- // SetState will not call SchedulePaint() if state was already set to
- // STATE_NORMAL during a drag.
- SchedulePaint();
- phantom_window_.reset();
- // Since Snap might destroy |this|, but the snap_sizer needs to be destroyed,
- // The ownership of the snap_sizer is taken now.
- scoped_ptr<SnapSizer> snap_sizer(snap_sizer_.release());
- Snap(*snap_sizer.get());
- return true;
-}
-
-void FrameMaximizeButton::Cancel(bool keep_menu_open) {
- if (!keep_menu_open) {
- maximizer_.reset();
- UninstallEventFilter();
- is_snap_enabled_ = false;
- snap_sizer_.reset();
- }
- phantom_window_.reset();
- snap_type_ = SNAP_NONE;
- update_timer_.Stop();
- SchedulePaint();
-}
-
-void FrameMaximizeButton::InstallEventFilter() {
- if (escape_event_filter_)
- return;
-
- escape_event_filter_.reset(new EscapeEventFilter(this));
-}
-
-void FrameMaximizeButton::UninstallEventFilter() {
- escape_event_filter_.reset(NULL);
-}
-
-void FrameMaximizeButton::UpdateSnapFromEventLocation() {
- // If the drag threshold has been exceeded the snap location is up to date.
- if (exceeded_drag_threshold_)
- return;
- exceeded_drag_threshold_ = true;
- UpdateSnap(press_location_, false, press_is_gesture_);
-}
-
-void FrameMaximizeButton::UpdateSnap(const gfx::Point& location,
- bool select_default,
- bool is_touch) {
- SnapType type = SnapTypeForLocation(location);
- if (type == snap_type_) {
- if (snap_sizer_) {
- snap_sizer_->Update(LocationForSnapSizer(location));
- phantom_window_->Show(ScreenAsh::ConvertRectToScreen(
- frame_->GetWidget()->GetNativeView()->parent(),
- snap_sizer_->target_bounds()));
- }
- return;
- }
-
- snap_type_ = type;
- snap_sizer_.reset();
- SchedulePaint();
-
- if (snap_type_ == SNAP_NONE) {
- phantom_window_.reset();
- return;
- }
-
- if (snap_type_ == SNAP_LEFT || snap_type_ == SNAP_RIGHT) {
- SnapSizer::Edge snap_edge = snap_type_ == SNAP_LEFT ?
- SnapSizer::LEFT_EDGE : SnapSizer::RIGHT_EDGE;
- SnapSizer::InputType input_type =
- is_touch ? SnapSizer::TOUCH_MAXIMIZE_BUTTON_INPUT :
- SnapSizer::OTHER_INPUT;
- snap_sizer_.reset(new SnapSizer(frame_->GetWidget()->GetNativeWindow(),
- LocationForSnapSizer(location),
- snap_edge,
- input_type));
- if (select_default)
- snap_sizer_->SelectDefaultSizeAndDisableResize();
- }
- if (!phantom_window_) {
- phantom_window_.reset(new internal::PhantomWindowController(
- frame_->GetWidget()->GetNativeWindow()));
- }
- if (maximizer_) {
- phantom_window_->set_phantom_below_window(maximizer_->GetBubbleWindow());
- maximizer_->SetSnapType(snap_type_);
- }
- phantom_window_->Show(
- ScreenBoundsForType(snap_type_, *snap_sizer_.get()));
-}
-
-SnapType FrameMaximizeButton::SnapTypeForLocation(
- const gfx::Point& location) const {
- MaximizeBubbleFrameState maximize_type = GetMaximizeBubbleFrameState();
- gfx::Vector2d delta(location - press_location_);
- if (!views::View::ExceededDragThreshold(delta))
- return maximize_type != FRAME_STATE_FULL ? SNAP_MAXIMIZE : SNAP_RESTORE;
- if (delta.x() < 0 && delta.y() > delta.x() && delta.y() < -delta.x())
- return maximize_type == FRAME_STATE_SNAP_LEFT ? SNAP_RESTORE : SNAP_LEFT;
- if (delta.x() > 0 && delta.y() > -delta.x() && delta.y() < delta.x())
- return maximize_type == FRAME_STATE_SNAP_RIGHT ? SNAP_RESTORE : SNAP_RIGHT;
- if (delta.y() > 0)
- return SNAP_MINIMIZE;
- return maximize_type != FRAME_STATE_FULL ? SNAP_MAXIMIZE : SNAP_RESTORE;
-}
-
-gfx::Rect FrameMaximizeButton::ScreenBoundsForType(
- SnapType type,
- const SnapSizer& snap_sizer) const {
- aura::Window* window = frame_->GetWidget()->GetNativeWindow();
- switch (type) {
- case SNAP_LEFT:
- case SNAP_RIGHT:
- return ScreenAsh::ConvertRectToScreen(
- frame_->GetWidget()->GetNativeView()->parent(),
- snap_sizer.target_bounds());
- case SNAP_MAXIMIZE:
- return ScreenAsh::ConvertRectToScreen(
- window->parent(),
- ScreenAsh::GetMaximizedWindowBoundsInParent(window));
- case SNAP_MINIMIZE: {
- gfx::Rect rect = GetMinimizeAnimationTargetBoundsInScreen(window);
- if (!rect.IsEmpty()) {
- // PhantomWindowController insets slightly, outset it so the phantom
- // doesn't appear inset.
- rect.Inset(-8, -8);
- }
- return rect;
- }
- case SNAP_RESTORE: {
- const gfx::Rect* restore = GetRestoreBoundsInScreen(window);
- return restore ?
- *restore : frame_->GetWidget()->GetWindowBoundsInScreen();
- }
- case SNAP_NONE:
- NOTREACHED();
- }
- return gfx::Rect();
-}
-
-gfx::Point FrameMaximizeButton::LocationForSnapSizer(
- const gfx::Point& location) const {
- gfx::Point result(location);
- views::View::ConvertPointToScreen(this, &result);
- return result;
-}
-
-void FrameMaximizeButton::Snap(const SnapSizer& snap_sizer) {
- ash::Shell* shell = ash::Shell::GetInstance();
- views::Widget* widget = frame_->GetWidget();
- switch (snap_type_) {
- case SNAP_LEFT:
- case SNAP_RIGHT: {
- shell->delegate()->RecordUserMetricsAction(
- snap_type_ == SNAP_LEFT ?
- ash::UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE_LEFT :
- ash::UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE_RIGHT);
- // Get the bounds in screen coordinates for restore purposes.
- gfx::Rect restore = widget->GetWindowBoundsInScreen();
- if (widget->IsMaximized() || widget->IsFullscreen()) {
- aura::Window* window = widget->GetNativeWindow();
- // In case of maximized we have a restore boundary.
- DCHECK(ash::GetRestoreBoundsInScreen(window));
- // If it was maximized we need to recover the old restore set.
- restore = *ash::GetRestoreBoundsInScreen(window);
-
- // The auto position manager will kick in when this is the only window.
- // To avoid interference with it we tell it temporarily to not change
- // the coordinates of this window.
- wm::WindowSettings* settings = wm::GetWindowSettings(window);
- bool was_managed = settings->window_position_managed();
- settings->set_window_position_managed(false);
-
- // Set the restore size we want to restore to.
- ash::SetRestoreBoundsInScreen(window,
- ScreenBoundsForType(snap_type_,
- snap_sizer));
- widget->Restore();
-
- // After the window is where we want it to be we allow the window to be
- // auto managed again.
- settings->set_window_position_managed(was_managed);
- } else {
- // Others might also have set up a restore rectangle already. If so,
- // we should not overwrite the restore rectangle.
- bool restore_set =
- GetRestoreBoundsInScreen(widget->GetNativeWindow()) != NULL;
- widget->SetBounds(ScreenBoundsForType(snap_type_, snap_sizer));
- if (restore_set)
- break;
- }
- // Remember the widow's bounds for restoration.
- ash::SetRestoreBoundsInScreen(widget->GetNativeWindow(), restore);
- break;
- }
- case SNAP_MAXIMIZE:
- widget->Maximize();
- shell->delegate()->RecordUserMetricsAction(
- ash::UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE);
- break;
- case SNAP_MINIMIZE:
- widget->Minimize();
- shell->delegate()->RecordUserMetricsAction(
- ash::UMA_WINDOW_MAXIMIZE_BUTTON_MINIMIZE);
- break;
- case SNAP_RESTORE:
- widget->Restore();
- shell->delegate()->RecordUserMetricsAction(
- ash::UMA_WINDOW_MAXIMIZE_BUTTON_RESTORE);
- break;
- case SNAP_NONE:
- NOTREACHED();
- }
-}
-
-MaximizeBubbleFrameState
-FrameMaximizeButton::GetMaximizeBubbleFrameState() const {
- // When there are no restore bounds, we are in normal mode.
- if (!ash::GetRestoreBoundsInScreen(
- frame_->GetWidget()->GetNativeWindow()))
- return FRAME_STATE_NONE;
- // The normal maximized test can be used.
- if (frame_->GetWidget()->IsMaximized())
- return FRAME_STATE_FULL;
- // For Left/right maximize we need to check the dimensions.
- gfx::Rect bounds = frame_->GetWidget()->GetWindowBoundsInScreen();
- gfx::Rect screen = Shell::GetScreen()->GetDisplayNearestWindow(
- frame_->GetWidget()->GetNativeView()).work_area();
- if (bounds.width() < (screen.width() * kMinSnapSizePercent) / 100)
- return FRAME_STATE_NONE;
- // We might still have a horizontally filled window at this point which we
- // treat as no special state.
- if (bounds.y() != screen.y() || bounds.height() != screen.height())
- return FRAME_STATE_NONE;
-
- // We have to be in a maximize mode at this point.
- if (bounds.x() == screen.x())
- return FRAME_STATE_SNAP_LEFT;
- if (bounds.right() == screen.right())
- return FRAME_STATE_SNAP_RIGHT;
- // If we come here, it is likely caused by the fact that the
- // "VerticalResizeDoubleClick" stored a restore rectangle. In that case
- // we allow all maximize operations (and keep the restore rectangle).
- return FRAME_STATE_NONE;
-}
-
-} // namespace ash
« no previous file with comments | « ash/wm/workspace/frame_maximize_button.h ('k') | ash/wm/workspace/maximize_bubble_frame_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698