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

Unified Diff: ui/aura_shell/toplevel_window_event_filter.cc

Issue 9035001: Move some more WM functionality down into ash. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years 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
Index: ui/aura_shell/toplevel_window_event_filter.cc
===================================================================
--- ui/aura_shell/toplevel_window_event_filter.cc (revision 115655)
+++ ui/aura_shell/toplevel_window_event_filter.cc (working copy)
@@ -1,353 +0,0 @@
-// Copyright (c) 2011 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 "ui/aura_shell/toplevel_window_event_filter.h"
-
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/cursor.h"
-#include "ui/aura/event.h"
-#include "ui/aura/root_window.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_delegate.h"
-#include "ui/aura_shell/window_util.h"
-#include "ui/base/hit_test.h"
-#include "ui/base/ui_base_types.h"
-
-namespace aura_shell {
-
-namespace {
-
-// Identifies the types of bounds change operations performed by a drag to a
-// particular window component.
-const int kBoundsChange_None = 0;
-const int kBoundsChange_Repositions = 1;
-const int kBoundsChange_Resizes = 2;
-
-int GetBoundsChangeForWindowComponent(int window_component) {
- int bounds_change = kBoundsChange_None;
- switch (window_component) {
- case HTTOPLEFT:
- case HTTOP:
- case HTTOPRIGHT:
- case HTLEFT:
- case HTBOTTOMLEFT:
- bounds_change |= kBoundsChange_Repositions | kBoundsChange_Resizes;
- break;
- case HTCAPTION:
- bounds_change |= kBoundsChange_Repositions;
- break;
- case HTRIGHT:
- case HTBOTTOMRIGHT:
- case HTBOTTOM:
- case HTGROWBOX:
- bounds_change |= kBoundsChange_Resizes;
- break;
- default:
- break;
- }
- return bounds_change;
-}
-
-// Possible directions for changing bounds.
-
-const int kBoundsChangeDirection_None = 0;
-const int kBoundsChangeDirection_Horizontal = 1;
-const int kBoundsChangeDirection_Vertical = 2;
-
-int GetPositionChangeDirectionForWindowComponent(int window_component) {
- int pos_change_direction = kBoundsChangeDirection_None;
- switch (window_component) {
- case HTTOPLEFT:
- case HTBOTTOMRIGHT:
- case HTGROWBOX:
- case HTCAPTION:
- pos_change_direction |=
- kBoundsChangeDirection_Horizontal | kBoundsChangeDirection_Vertical;
- break;
- case HTTOP:
- case HTTOPRIGHT:
- case HTBOTTOM:
- pos_change_direction |= kBoundsChangeDirection_Vertical;
- break;
- case HTBOTTOMLEFT:
- case HTRIGHT:
- case HTLEFT:
- pos_change_direction |= kBoundsChangeDirection_Horizontal;
- break;
- default:
- break;
- }
- return pos_change_direction;
-}
-
-int GetSizeChangeDirectionForWindowComponent(int window_component) {
- int size_change_direction = kBoundsChangeDirection_None;
- switch (window_component) {
- case HTTOPLEFT:
- case HTTOPRIGHT:
- case HTBOTTOMLEFT:
- case HTBOTTOMRIGHT:
- case HTGROWBOX:
- case HTCAPTION:
- size_change_direction |=
- kBoundsChangeDirection_Horizontal | kBoundsChangeDirection_Vertical;
- break;
- case HTTOP:
- case HTBOTTOM:
- size_change_direction |= kBoundsChangeDirection_Vertical;
- break;
- case HTRIGHT:
- case HTLEFT:
- size_change_direction |= kBoundsChangeDirection_Horizontal;
- break;
- default:
- break;
- }
- return size_change_direction;
-}
-
-// Returns true for resize components along the right edge, where a drag in
-// positive x will make the window larger.
-bool IsRightEdge(int window_component) {
- return window_component == HTTOPRIGHT ||
- window_component == HTRIGHT ||
- window_component == HTBOTTOMRIGHT ||
- window_component == HTGROWBOX;
-}
-
-// Returns true for resize components in along the bottom edge, where a drag
-// in positive y will make the window larger.
-bool IsBottomEdge(int window_component) {
- return window_component == HTBOTTOMLEFT ||
- window_component == HTBOTTOM ||
- window_component == HTBOTTOMRIGHT ||
- window_component == HTGROWBOX;
-}
-
-void ToggleMaximizedState(aura::Window* window) {
- window->SetIntProperty(aura::client::kShowStateKey,
- IsWindowMaximized(window) ?
- ui::SHOW_STATE_NORMAL : ui::SHOW_STATE_MAXIMIZED);
-}
-
-} // namespace
-
-ToplevelWindowEventFilter::ToplevelWindowEventFilter(aura::Window* owner)
- : EventFilter(owner),
- window_component_(HTNOWHERE) {
-}
-
-ToplevelWindowEventFilter::~ToplevelWindowEventFilter() {
-}
-
-bool ToplevelWindowEventFilter::PreHandleKeyEvent(aura::Window* target,
- aura::KeyEvent* event) {
- return false;
-}
-
-bool ToplevelWindowEventFilter::PreHandleMouseEvent(aura::Window* target,
- aura::MouseEvent* event) {
- // Process EventFilters implementation first so that it processes
- // activation/focus first.
- switch (event->type()) {
- case ui::ET_MOUSE_MOVED:
- UpdateWindowComponentForEvent(target, event);
- break;
- case ui::ET_MOUSE_PRESSED:
- // We also update the current window component here because for the
- // mouse-drag-release-press case, where the mouse is released and
- // pressed without mouse move event.
- UpdateWindowComponentForEvent(target, event);
- if (window_component_ == HTCAPTION &&
- event->flags() & ui::EF_IS_DOUBLE_CLICK) {
- ToggleMaximizedState(target);
- }
- UpdateLocationFromEvent(target, event);
- return GetBoundsChangeForWindowComponent(window_component_) !=
- kBoundsChange_None;
- case ui::ET_MOUSE_DRAGGED:
- return HandleDrag(target, event);
- case ui::ET_MOUSE_RELEASED:
- window_component_ = HTNOWHERE;
- break;
- default:
- break;
- }
- return false;
-}
-
-ui::TouchStatus ToplevelWindowEventFilter::PreHandleTouchEvent(
- aura::Window* target,
- aura::TouchEvent* event) {
- // Process EventFilters implementation first so that it processes
- // activation/focus first.
- // TODO(sad): Allow resizing/maximizing etc. from touch?
- UpdateWindowComponentForEvent(target, event);
- int bounds_change = GetBoundsChangeForWindowComponent(window_component_);
- if (bounds_change == kBoundsChange_None)
- return ui::TOUCH_STATUS_UNKNOWN;
-
- // Handle touch move by simulate mouse drag with single touch.
- switch (event->type()) {
- case ui::ET_TOUCH_PRESSED:
- UpdateLocationFromEvent(target, event);
- pressed_touch_ids_.insert(event->touch_id());
- if (pressed_touch_ids_.size() == 1)
- return ui::TOUCH_STATUS_START;
- break;
- case ui::ET_TOUCH_MOVED:
- if (pressed_touch_ids_.size() == 1) {
- if (HandleDrag(target, event))
- return ui::TOUCH_STATUS_CONTINUE;
- }
- break;
- case ui::ET_TOUCH_RELEASED:
- pressed_touch_ids_.erase(event->touch_id());
- if (pressed_touch_ids_.empty()) {
- window_component_ = HTNOWHERE;
- return ui::TOUCH_STATUS_END;
- }
- break;
- default:
- break;
- }
- return ui::TOUCH_STATUS_UNKNOWN;
-}
-
-void ToplevelWindowEventFilter::MoveWindowToFront(aura::Window* target) {
- aura::Window* parent = target->parent();
- aura::Window* child = target;
- while (parent) {
- parent->StackChildAtTop(child);
- if (parent == owner())
- break;
- parent = parent->parent();
- child = child->parent();
- }
-}
-
-bool ToplevelWindowEventFilter::HandleDrag(aura::Window* target,
- aura::LocatedEvent* event) {
- // This function only be triggered to move window
- // by mouse drag or touch move event.
- DCHECK(event->type() == ui::ET_MOUSE_DRAGGED ||
- event->type() == ui::ET_TOUCH_MOVED);
-
- int bounds_change = GetBoundsChangeForWindowComponent(window_component_);
- if (bounds_change == kBoundsChange_None)
- return false;
-
- // Only a normal/default window can be moved/resized.
- if (target->GetIntProperty(aura::client::kShowStateKey) !=
- ui::SHOW_STATE_NORMAL &&
- target->GetIntProperty(aura::client::kShowStateKey) !=
- ui::SHOW_STATE_DEFAULT)
- return false;
-
- // Dragging a window moves the local coordinate frame, so do arithmetic
- // in the parent coordinate frame.
- gfx::Point event_location_in_parent(event->location());
- aura::Window::ConvertPointToWindow(target, target->parent(),
- &event_location_in_parent);
- int delta_x = event_location_in_parent.x() - mouse_down_offset_in_parent_.x();
- int delta_y = event_location_in_parent.y() - mouse_down_offset_in_parent_.y();
-
- // The minimize size constraint may limit how much we change the window
- // position. For example, dragging the left edge to the right should stop
- // repositioning the window when the minimize size is reached.
- gfx::Size size = GetSizeForDrag(bounds_change, target, &delta_x, &delta_y);
- gfx::Point origin = GetOriginForDrag(bounds_change, delta_x, delta_y);
-
- target->SetBounds(gfx::Rect(origin, size));
- return true;
-}
-
-void ToplevelWindowEventFilter::UpdateLocationFromEvent(
- aura::Window* target,
- aura::LocatedEvent* event) {
- mouse_down_bounds_ = target->bounds();
- mouse_down_offset_in_parent_ = event->location();
- aura::Window::ConvertPointToWindow(target, target->parent(),
- &mouse_down_offset_in_parent_);
-}
-
-void ToplevelWindowEventFilter::UpdateWindowComponentForEvent(
- aura::Window* target,
- aura::LocatedEvent* event) {
- window_component_ =
- target->delegate()->GetNonClientComponent(event->location());
-}
-
-gfx::Point ToplevelWindowEventFilter::GetOriginForDrag(
- int bounds_change,
- int delta_x,
- int delta_y) const {
- gfx::Point origin = mouse_down_bounds_.origin();
- if (bounds_change & kBoundsChange_Repositions) {
- int pos_change_direction =
- GetPositionChangeDirectionForWindowComponent(window_component_);
- if (pos_change_direction & kBoundsChangeDirection_Horizontal)
- origin.Offset(delta_x, 0);
- if (pos_change_direction & kBoundsChangeDirection_Vertical)
- origin.Offset(0, delta_y);
- }
- return origin;
-}
-
-gfx::Size ToplevelWindowEventFilter::GetSizeForDrag(
- int bounds_change,
- aura::Window* target,
- int* delta_x,
- int* delta_y) const {
- gfx::Size size = mouse_down_bounds_.size();
- if (bounds_change & kBoundsChange_Resizes) {
- gfx::Size min_size = target->delegate()->GetMinimumSize();
- int size_change_direction =
- GetSizeChangeDirectionForWindowComponent(window_component_);
- size.SetSize(
- GetWidthForDrag(size_change_direction, min_size.width(), delta_x),
- GetHeightForDrag(size_change_direction, min_size.height(), delta_y));
- }
- return size;
-}
-
-int ToplevelWindowEventFilter::GetWidthForDrag(int size_change_direction,
- int min_width,
- int* delta_x) const {
- int width = mouse_down_bounds_.width();
- if (size_change_direction & kBoundsChangeDirection_Horizontal) {
- // Along the right edge, positive delta_x increases the window size.
- int x_multiplier = IsRightEdge(window_component_) ? 1 : -1;
- width += x_multiplier * (*delta_x);
-
- // Ensure we don't shrink past the minimum width and clamp delta_x
- // for the window origin computation.
- if (width < min_width) {
- width = min_width;
- *delta_x = -x_multiplier * (mouse_down_bounds_.width() - min_width);
- }
- }
- return width;
-}
-
-int ToplevelWindowEventFilter::GetHeightForDrag(int size_change_direction,
- int min_height,
- int* delta_y) const {
- int height = mouse_down_bounds_.height();
- if (size_change_direction & kBoundsChangeDirection_Vertical) {
- // Along the bottom edge, positive delta_y increases the window size.
- int y_multiplier = IsBottomEdge(window_component_) ? 1 : -1;
- height += y_multiplier * (*delta_y);
-
- // Ensure we don't shrink past the minimum height and clamp delta_y
- // for the window origin computation.
- if (height < min_height) {
- height = min_height;
- *delta_y = -y_multiplier * (mouse_down_bounds_.height() - min_height);
- }
- }
- return height;
-}
-
-} // namespace aura
« no previous file with comments | « ui/aura_shell/toplevel_window_event_filter.h ('k') | ui/aura_shell/toplevel_window_event_filter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698