| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/views/tabs/tab_drag_controller.h" | 5 #include "chrome/browser/ui/views/tabs/tab_drag_controller.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 const int TabDragController::kTouchVerticalDetachMagnetism = 50; | 190 const int TabDragController::kTouchVerticalDetachMagnetism = 50; |
| 191 | 191 |
| 192 // static | 192 // static |
| 193 const int TabDragController::kVerticalDetachMagnetism = 15; | 193 const int TabDragController::kVerticalDetachMagnetism = 15; |
| 194 | 194 |
| 195 TabDragController::TabDragController() | 195 TabDragController::TabDragController() |
| 196 : event_source_(EVENT_SOURCE_MOUSE), | 196 : event_source_(EVENT_SOURCE_MOUSE), |
| 197 source_tabstrip_(NULL), | 197 source_tabstrip_(NULL), |
| 198 attached_tabstrip_(NULL), | 198 attached_tabstrip_(NULL), |
| 199 screen_(NULL), | 199 screen_(NULL), |
| 200 host_desktop_type_(chrome::HOST_DESKTOP_TYPE_NATIVE), | 200 host_desktop_type_(ui::HOST_DESKTOP_TYPE_NATIVE), |
| 201 can_release_capture_(true), | 201 can_release_capture_(true), |
| 202 offset_to_width_ratio_(0), | 202 offset_to_width_ratio_(0), |
| 203 old_focused_view_id_( | 203 old_focused_view_id_(views::ViewStorage::GetInstance() |
| 204 views::ViewStorage::GetInstance()->CreateStorageID()), | 204 ->CreateStorageID()), |
| 205 last_move_screen_loc_(0), | 205 last_move_screen_loc_(0), |
| 206 started_drag_(false), | 206 started_drag_(false), |
| 207 active_(true), | 207 active_(true), |
| 208 source_tab_index_(std::numeric_limits<size_t>::max()), | 208 source_tab_index_(std::numeric_limits<size_t>::max()), |
| 209 initial_move_(true), | 209 initial_move_(true), |
| 210 detach_behavior_(DETACHABLE), | 210 detach_behavior_(DETACHABLE), |
| 211 move_behavior_(REORDER), | 211 move_behavior_(REORDER), |
| 212 mouse_move_direction_(0), | 212 mouse_move_direction_(0), |
| 213 is_dragging_window_(false), | 213 is_dragging_window_(false), |
| 214 is_dragging_new_browser_(false), | 214 is_dragging_new_browser_(false), |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 // Do not release capture when transferring capture between widgets on: | 268 // Do not release capture when transferring capture between widgets on: |
| 269 // - Desktop Linux | 269 // - Desktop Linux |
| 270 // Mouse capture is not synchronous on desktop Linux. Chrome makes | 270 // Mouse capture is not synchronous on desktop Linux. Chrome makes |
| 271 // transferring capture between widgets without releasing capture appear | 271 // transferring capture between widgets without releasing capture appear |
| 272 // synchronous on desktop Linux, so use that. | 272 // synchronous on desktop Linux, so use that. |
| 273 // - Ash | 273 // - Ash |
| 274 // Releasing capture on Ash cancels gestures so avoid it. | 274 // Releasing capture on Ash cancels gestures so avoid it. |
| 275 #if defined(OS_LINUX) | 275 #if defined(OS_LINUX) |
| 276 can_release_capture_ = false; | 276 can_release_capture_ = false; |
| 277 #else | 277 #else |
| 278 can_release_capture_ = | 278 can_release_capture_ = (host_desktop_type_ != ui::HOST_DESKTOP_TYPE_ASH); |
| 279 (host_desktop_type_ != chrome::HOST_DESKTOP_TYPE_ASH); | |
| 280 #endif | 279 #endif |
| 281 start_point_in_screen_ = gfx::Point(source_tab_offset, mouse_offset.y()); | 280 start_point_in_screen_ = gfx::Point(source_tab_offset, mouse_offset.y()); |
| 282 views::View::ConvertPointToScreen(source_tab, &start_point_in_screen_); | 281 views::View::ConvertPointToScreen(source_tab, &start_point_in_screen_); |
| 283 event_source_ = event_source; | 282 event_source_ = event_source; |
| 284 mouse_offset_ = mouse_offset; | 283 mouse_offset_ = mouse_offset; |
| 285 move_behavior_ = move_behavior; | 284 move_behavior_ = move_behavior; |
| 286 last_point_in_screen_ = start_point_in_screen_; | 285 last_point_in_screen_ = start_point_in_screen_; |
| 287 last_move_screen_loc_ = start_point_in_screen_.x(); | 286 last_move_screen_loc_ = start_point_in_screen_.x(); |
| 288 initial_tab_positions_ = source_tabstrip->GetTabXCoordinates(); | 287 initial_tab_positions_ = source_tabstrip->GetTabXCoordinates(); |
| 289 | 288 |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 // Only Aura windows are gesture consumers. | 596 // Only Aura windows are gesture consumers. |
| 598 ui::GestureRecognizer::Get()->TransferEventsTo( | 597 ui::GestureRecognizer::Get()->TransferEventsTo( |
| 599 GetAttachedBrowserWidget()->GetNativeView(), | 598 GetAttachedBrowserWidget()->GetNativeView(), |
| 600 target_tabstrip->GetWidget()->GetNativeView()); | 599 target_tabstrip->GetWidget()->GetNativeView()); |
| 601 #endif | 600 #endif |
| 602 | 601 |
| 603 if (is_dragging_window_) { | 602 if (is_dragging_window_) { |
| 604 // ReleaseCapture() is going to result in calling back to us (because it | 603 // ReleaseCapture() is going to result in calling back to us (because it |
| 605 // results in a move). That'll cause all sorts of problems. Reset the | 604 // results in a move). That'll cause all sorts of problems. Reset the |
| 606 // observer so we don't get notified and process the event. | 605 // observer so we don't get notified and process the event. |
| 607 if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { | 606 if (host_desktop_type_ == ui::HOST_DESKTOP_TYPE_ASH) { |
| 608 move_loop_widget_->RemoveObserver(this); | 607 move_loop_widget_->RemoveObserver(this); |
| 609 move_loop_widget_ = NULL; | 608 move_loop_widget_ = NULL; |
| 610 } | 609 } |
| 611 views::Widget* browser_widget = GetAttachedBrowserWidget(); | 610 views::Widget* browser_widget = GetAttachedBrowserWidget(); |
| 612 // Need to release the drag controller before starting the move loop as it's | 611 // Need to release the drag controller before starting the move loop as it's |
| 613 // going to trigger capture lost, which cancels drag. | 612 // going to trigger capture lost, which cancels drag. |
| 614 attached_tabstrip_->ReleaseDragController(); | 613 attached_tabstrip_->ReleaseDragController(); |
| 615 target_tabstrip->OwnDragController(this); | 614 target_tabstrip->OwnDragController(this); |
| 616 // Disable animations so that we don't see a close animation on aero. | 615 // Disable animations so that we don't see a close animation on aero. |
| 617 browser_widget->SetVisibilityChangedAnimationsEnabled(false); | 616 browser_widget->SetVisibilityChangedAnimationsEnabled(false); |
| (...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1537 contentses, window_bounds, widget->IsMaximized()); | 1536 contentses, window_bounds, widget->IsMaximized()); |
| 1538 ResetSelection(new_browser->tab_strip_model()); | 1537 ResetSelection(new_browser->tab_strip_model()); |
| 1539 new_browser->window()->Show(); | 1538 new_browser->window()->Show(); |
| 1540 } | 1539 } |
| 1541 } | 1540 } |
| 1542 | 1541 |
| 1543 void TabDragController::MaximizeAttachedWindow() { | 1542 void TabDragController::MaximizeAttachedWindow() { |
| 1544 GetAttachedBrowserWidget()->Maximize(); | 1543 GetAttachedBrowserWidget()->Maximize(); |
| 1545 #if defined(USE_ASH) | 1544 #if defined(USE_ASH) |
| 1546 if (was_source_fullscreen_ && | 1545 if (was_source_fullscreen_ && |
| 1547 host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { | 1546 host_desktop_type_ == ui::HOST_DESKTOP_TYPE_ASH) { |
| 1548 // In fullscreen mode it is only possible to get here if the source | 1547 // In fullscreen mode it is only possible to get here if the source |
| 1549 // was in "immersive fullscreen" mode, so toggle it back on. | 1548 // was in "immersive fullscreen" mode, so toggle it back on. |
| 1550 ash::accelerators::ToggleFullscreen(); | 1549 ash::accelerators::ToggleFullscreen(); |
| 1551 } | 1550 } |
| 1552 #endif | 1551 #endif |
| 1553 } | 1552 } |
| 1554 | 1553 |
| 1555 gfx::Rect TabDragController::GetViewScreenBounds( | 1554 gfx::Rect TabDragController::GetViewScreenBounds( |
| 1556 views::View* view) const { | 1555 views::View* view) const { |
| 1557 gfx::Point view_topleft; | 1556 gfx::Point view_topleft; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1570 if (!GetTabStripForWindow(window)) | 1569 if (!GetTabStripForWindow(window)) |
| 1571 return; | 1570 return; |
| 1572 | 1571 |
| 1573 if (window) { | 1572 if (window) { |
| 1574 views::Widget* widget_window = views::Widget::GetWidgetForNativeWindow( | 1573 views::Widget* widget_window = views::Widget::GetWidgetForNativeWindow( |
| 1575 window); | 1574 window); |
| 1576 if (!widget_window) | 1575 if (!widget_window) |
| 1577 return; | 1576 return; |
| 1578 | 1577 |
| 1579 #if defined(USE_ASH) | 1578 #if defined(USE_ASH) |
| 1580 if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { | 1579 if (host_desktop_type_ == ui::HOST_DESKTOP_TYPE_ASH) { |
| 1581 // TODO(varkha): The code below ensures that the phantom drag widget | 1580 // TODO(varkha): The code below ensures that the phantom drag widget |
| 1582 // is shown on top of browser windows. The code should be moved to ash/ | 1581 // is shown on top of browser windows. The code should be moved to ash/ |
| 1583 // and the phantom should be able to assert its top-most state on its own. | 1582 // and the phantom should be able to assert its top-most state on its own. |
| 1584 // One strategy would be for DragWindowController to | 1583 // One strategy would be for DragWindowController to |
| 1585 // be able to observe stacking changes to the phantom drag widget's | 1584 // be able to observe stacking changes to the phantom drag widget's |
| 1586 // siblings in order to keep it on top. One way is to implement a | 1585 // siblings in order to keep it on top. One way is to implement a |
| 1587 // notification that is sent to a window parent's observers when a | 1586 // notification that is sent to a window parent's observers when a |
| 1588 // stacking order is changed among the children of that same parent. | 1587 // stacking order is changed among the children of that same parent. |
| 1589 // Note that OnWindowStackingChanged is sent only to the child that is the | 1588 // Note that OnWindowStackingChanged is sent only to the child that is the |
| 1590 // argument of one of the Window::StackChildX calls and not to all its | 1589 // argument of one of the Window::StackChildX calls and not to all its |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1755 SetWindowPositionManaged(browser->window()->GetNativeWindow(), false); | 1754 SetWindowPositionManaged(browser->window()->GetNativeWindow(), false); |
| 1756 // If the window is created maximized then the bounds we supplied are ignored. | 1755 // If the window is created maximized then the bounds we supplied are ignored. |
| 1757 // We need to reset them again so they are honored. | 1756 // We need to reset them again so they are honored. |
| 1758 browser->window()->SetBounds(new_bounds); | 1757 browser->window()->SetBounds(new_bounds); |
| 1759 | 1758 |
| 1760 return browser; | 1759 return browser; |
| 1761 } | 1760 } |
| 1762 | 1761 |
| 1763 gfx::Point TabDragController::GetCursorScreenPoint() { | 1762 gfx::Point TabDragController::GetCursorScreenPoint() { |
| 1764 #if defined(USE_ASH) | 1763 #if defined(USE_ASH) |
| 1765 if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH && | 1764 if (host_desktop_type_ == ui::HOST_DESKTOP_TYPE_ASH && |
| 1766 event_source_ == EVENT_SOURCE_TOUCH && | 1765 event_source_ == EVENT_SOURCE_TOUCH && |
| 1767 aura::Env::GetInstance()->is_touch_down()) { | 1766 aura::Env::GetInstance()->is_touch_down()) { |
| 1768 views::Widget* widget = GetAttachedBrowserWidget(); | 1767 views::Widget* widget = GetAttachedBrowserWidget(); |
| 1769 DCHECK(widget); | 1768 DCHECK(widget); |
| 1770 aura::Window* widget_window = widget->GetNativeWindow(); | 1769 aura::Window* widget_window = widget->GetNativeWindow(); |
| 1771 DCHECK(widget_window->GetRootWindow()); | 1770 DCHECK(widget_window->GetRootWindow()); |
| 1772 gfx::PointF touch_point_f; | 1771 gfx::PointF touch_point_f; |
| 1773 bool got_touch_point = ui::GestureRecognizer::Get()-> | 1772 bool got_touch_point = ui::GestureRecognizer::Get()-> |
| 1774 GetLastTouchPointForTarget(widget_window, &touch_point_f); | 1773 GetLastTouchPointForTarget(widget_window, &touch_point_f); |
| 1775 CHECK(got_touch_point); | 1774 CHECK(got_touch_point); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1803 attached_tabstrip_->GetWidget()->GetNativeWindow(); | 1802 attached_tabstrip_->GetWidget()->GetNativeWindow(); |
| 1804 if (dragged_window) | 1803 if (dragged_window) |
| 1805 exclude.insert(dragged_window); | 1804 exclude.insert(dragged_window); |
| 1806 } | 1805 } |
| 1807 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 1806 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 1808 // Exclude windows which are pending deletion via Browser::TabStripEmpty(). | 1807 // Exclude windows which are pending deletion via Browser::TabStripEmpty(). |
| 1809 // These windows can be returned in the Linux Aura port because the browser | 1808 // These windows can be returned in the Linux Aura port because the browser |
| 1810 // window which was used for dragging is not hidden once all of its tabs are | 1809 // window which was used for dragging is not hidden once all of its tabs are |
| 1811 // attached to another browser window in DragBrowserToNewTabStrip(). | 1810 // attached to another browser window in DragBrowserToNewTabStrip(). |
| 1812 // TODO(pkotwicz): Fix this properly (crbug.com/358482) | 1811 // TODO(pkotwicz): Fix this properly (crbug.com/358482) |
| 1813 BrowserList* browser_list = BrowserList::GetInstance( | 1812 BrowserList* browser_list = |
| 1814 chrome::HOST_DESKTOP_TYPE_NATIVE); | 1813 BrowserList::GetInstance(ui::HOST_DESKTOP_TYPE_NATIVE); |
| 1815 for (BrowserList::const_iterator it = browser_list->begin(); | 1814 for (BrowserList::const_iterator it = browser_list->begin(); |
| 1816 it != browser_list->end(); ++it) { | 1815 it != browser_list->end(); ++it) { |
| 1817 if ((*it)->tab_strip_model()->empty()) | 1816 if ((*it)->tab_strip_model()->empty()) |
| 1818 exclude.insert((*it)->window()->GetNativeWindow()); | 1817 exclude.insert((*it)->window()->GetNativeWindow()); |
| 1819 } | 1818 } |
| 1820 #endif | 1819 #endif |
| 1821 return GetLocalProcessWindowAtPoint(host_desktop_type_, | 1820 return GetLocalProcessWindowAtPoint(host_desktop_type_, |
| 1822 screen_point, | 1821 screen_point, |
| 1823 exclude); | 1822 exclude); |
| 1824 | 1823 |
| 1825 } | 1824 } |
| OLD | NEW |