| 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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 // static | 155 // static |
| 156 const int TabDragController::kVerticalDetachMagnetism = 15; | 156 const int TabDragController::kVerticalDetachMagnetism = 15; |
| 157 | 157 |
| 158 TabDragController::TabDragController() | 158 TabDragController::TabDragController() |
| 159 : detach_into_browser_(true), | 159 : detach_into_browser_(true), |
| 160 event_source_(EVENT_SOURCE_MOUSE), | 160 event_source_(EVENT_SOURCE_MOUSE), |
| 161 source_tabstrip_(NULL), | 161 source_tabstrip_(NULL), |
| 162 attached_tabstrip_(NULL), | 162 attached_tabstrip_(NULL), |
| 163 screen_(NULL), | 163 screen_(NULL), |
| 164 host_desktop_type_(chrome::HOST_DESKTOP_TYPE_NATIVE), | 164 host_desktop_type_(chrome::HOST_DESKTOP_TYPE_NATIVE), |
| 165 use_aura_capture_policy_(false), |
| 165 offset_to_width_ratio_(0), | 166 offset_to_width_ratio_(0), |
| 166 old_focused_view_id_( | 167 old_focused_view_id_( |
| 167 views::ViewStorage::GetInstance()->CreateStorageID()), | 168 views::ViewStorage::GetInstance()->CreateStorageID()), |
| 168 last_move_screen_loc_(0), | 169 last_move_screen_loc_(0), |
| 169 started_drag_(false), | 170 started_drag_(false), |
| 170 active_(true), | 171 active_(true), |
| 171 source_tab_index_(std::numeric_limits<size_t>::max()), | 172 source_tab_index_(std::numeric_limits<size_t>::max()), |
| 172 initial_move_(true), | 173 initial_move_(true), |
| 173 detach_behavior_(DETACHABLE), | 174 detach_behavior_(DETACHABLE), |
| 174 move_behavior_(REORDER), | 175 move_behavior_(REORDER), |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 EventSource event_source) { | 230 EventSource event_source) { |
| 230 DCHECK(!tabs.empty()); | 231 DCHECK(!tabs.empty()); |
| 231 DCHECK(std::find(tabs.begin(), tabs.end(), source_tab) != tabs.end()); | 232 DCHECK(std::find(tabs.begin(), tabs.end(), source_tab) != tabs.end()); |
| 232 source_tabstrip_ = source_tabstrip; | 233 source_tabstrip_ = source_tabstrip; |
| 233 was_source_maximized_ = source_tabstrip->GetWidget()->IsMaximized(); | 234 was_source_maximized_ = source_tabstrip->GetWidget()->IsMaximized(); |
| 234 was_source_fullscreen_ = source_tabstrip->GetWidget()->IsFullscreen(); | 235 was_source_fullscreen_ = source_tabstrip->GetWidget()->IsFullscreen(); |
| 235 screen_ = gfx::Screen::GetScreenFor( | 236 screen_ = gfx::Screen::GetScreenFor( |
| 236 source_tabstrip->GetWidget()->GetNativeView()); | 237 source_tabstrip->GetWidget()->GetNativeView()); |
| 237 host_desktop_type_ = chrome::GetHostDesktopTypeForNativeView( | 238 host_desktop_type_ = chrome::GetHostDesktopTypeForNativeView( |
| 238 source_tabstrip->GetWidget()->GetNativeView()); | 239 source_tabstrip->GetWidget()->GetNativeView()); |
| 240 #if defined(OS_LINUX) |
| 241 use_aura_capture_policy_ = true; |
| 242 #else |
| 243 use_aura_capture_policy_ = |
| 244 (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH); |
| 245 #endif |
| 239 start_point_in_screen_ = gfx::Point(source_tab_offset, mouse_offset.y()); | 246 start_point_in_screen_ = gfx::Point(source_tab_offset, mouse_offset.y()); |
| 240 views::View::ConvertPointToScreen(source_tab, &start_point_in_screen_); | 247 views::View::ConvertPointToScreen(source_tab, &start_point_in_screen_); |
| 241 event_source_ = event_source; | 248 event_source_ = event_source; |
| 242 mouse_offset_ = mouse_offset; | 249 mouse_offset_ = mouse_offset; |
| 243 detach_behavior_ = detach_behavior; | 250 detach_behavior_ = detach_behavior; |
| 244 move_behavior_ = move_behavior; | 251 move_behavior_ = move_behavior; |
| 245 last_point_in_screen_ = start_point_in_screen_; | 252 last_point_in_screen_ = start_point_in_screen_; |
| 246 last_move_screen_loc_ = start_point_in_screen_.x(); | 253 last_move_screen_loc_ = start_point_in_screen_.x(); |
| 247 initial_tab_positions_ = source_tabstrip->GetTabXCoordinates(); | 254 initial_tab_positions_ = source_tabstrip->GetTabXCoordinates(); |
| 248 if (detach_behavior == NOT_DETACHABLE) | 255 if (detach_behavior == NOT_DETACHABLE) |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 652 "point_in_screen", point_in_screen.ToString()); | 659 "point_in_screen", point_in_screen.ToString()); |
| 653 | 660 |
| 654 if (!target_tabstrip) { | 661 if (!target_tabstrip) { |
| 655 DetachIntoNewBrowserAndRunMoveLoop(point_in_screen); | 662 DetachIntoNewBrowserAndRunMoveLoop(point_in_screen); |
| 656 return DRAG_BROWSER_RESULT_STOP; | 663 return DRAG_BROWSER_RESULT_STOP; |
| 657 } | 664 } |
| 658 if (is_dragging_window_) { | 665 if (is_dragging_window_) { |
| 659 // ReleaseCapture() is going to result in calling back to us (because it | 666 // ReleaseCapture() is going to result in calling back to us (because it |
| 660 // results in a move). That'll cause all sorts of problems. Reset the | 667 // results in a move). That'll cause all sorts of problems. Reset the |
| 661 // observer so we don't get notified and process the event. | 668 // observer so we don't get notified and process the event. |
| 662 if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { | 669 if (use_aura_capture_policy_) { |
| 663 move_loop_widget_->RemoveObserver(this); | 670 move_loop_widget_->RemoveObserver(this); |
| 664 move_loop_widget_ = NULL; | 671 move_loop_widget_ = NULL; |
| 665 } | 672 } |
| 666 views::Widget* browser_widget = GetAttachedBrowserWidget(); | 673 views::Widget* browser_widget = GetAttachedBrowserWidget(); |
| 667 // Need to release the drag controller before starting the move loop as it's | 674 // Need to release the drag controller before starting the move loop as it's |
| 668 // going to trigger capture lost, which cancels drag. | 675 // going to trigger capture lost, which cancels drag. |
| 669 attached_tabstrip_->ReleaseDragController(); | 676 attached_tabstrip_->ReleaseDragController(); |
| 670 target_tabstrip->OwnDragController(this); | 677 target_tabstrip->OwnDragController(this); |
| 671 // Disable animations so that we don't see a close animation on aero. | 678 // Disable animations so that we don't see a close animation on aero. |
| 672 browser_widget->SetVisibilityChangedAnimationsEnabled(false); | 679 browser_widget->SetVisibilityChangedAnimationsEnabled(false); |
| 673 // For aura we can't release capture, otherwise it'll cancel a gesture. | 680 // For aura we can't release capture, otherwise it'll cancel a gesture. |
| 674 // Instead we have to directly change capture. | 681 // Instead we have to directly change capture. |
| 675 if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) | 682 if (use_aura_capture_policy_) |
| 676 target_tabstrip->GetWidget()->SetCapture(attached_tabstrip_); | 683 target_tabstrip->GetWidget()->SetCapture(attached_tabstrip_); |
| 677 else | 684 else |
| 678 browser_widget->ReleaseCapture(); | 685 browser_widget->ReleaseCapture(); |
| 679 #if defined(OS_WIN) | 686 #if defined(OS_WIN) |
| 680 // The Gesture recognizer does not work well currently when capture changes | 687 // The Gesture recognizer does not work well currently when capture changes |
| 681 // while a touch gesture is in progress. So we need to manually transfer | 688 // while a touch gesture is in progress. So we need to manually transfer |
| 682 // gesture sequence and the GR's touch events queue to the new window. This | 689 // gesture sequence and the GR's touch events queue to the new window. This |
| 683 // should really be done somewhere in capture change code and or inside the | 690 // should really be done somewhere in capture change code and or inside the |
| 684 // GR. But we currently do not have a consistent way for doing it that would | 691 // GR. But we currently do not have a consistent way for doing it that would |
| 685 // work in all cases. Hence this hack. | 692 // work in all cases. Hence this hack. |
| 686 ui::GestureRecognizer::Get()->TransferEventsTo( | 693 ui::GestureRecognizer::Get()->TransferEventsTo( |
| 687 browser_widget->GetNativeView(), | 694 browser_widget->GetNativeView(), |
| 688 target_tabstrip->GetWidget()->GetNativeView()); | 695 target_tabstrip->GetWidget()->GetNativeView()); |
| 689 #endif | 696 #endif |
| 690 | 697 |
| 691 // The window is going away. Since the drag is still on going we don't want | 698 // The window is going away. Since the drag is still on going we don't want |
| 692 // that to effect the position of any windows. | 699 // that to effect the position of any windows. |
| 693 SetWindowPositionManaged(browser_widget->GetNativeView(), false); | 700 SetWindowPositionManaged(browser_widget->GetNativeView(), false); |
| 694 | 701 |
| 702 #if !defined(OS_LINUX) || defined(OS_CHROMEOS) |
| 695 // EndMoveLoop is going to snap the window back to its original location. | 703 // EndMoveLoop is going to snap the window back to its original location. |
| 696 // Hide it so users don't see this. | 704 // Hide it so users don't see this. Hiding a window in Linux aura causes |
| 705 // it to lose capture so skip it. |
| 697 browser_widget->Hide(); | 706 browser_widget->Hide(); |
| 707 #endif |
| 698 browser_widget->EndMoveLoop(); | 708 browser_widget->EndMoveLoop(); |
| 699 | 709 |
| 700 // Ideally we would always swap the tabs now, but on non-ash it seems that | 710 // Ideally we would always swap the tabs now, but on non-ash it seems that |
| 701 // running the move loop implicitly activates the window when done, leading | 711 // running the move loop implicitly activates the window when done, leading |
| 702 // to all sorts of flicker. So, on non-ash, instead we process the move | 712 // to all sorts of flicker. So, on non-ash, instead we process the move |
| 703 // after the loop completes. But on chromeos, we can do tab swapping now to | 713 // after the loop completes. But on chromeos, we can do tab swapping now to |
| 704 // avoid the tab flashing issue(crbug.com/116329). | 714 // avoid the tab flashing issue(crbug.com/116329). |
| 705 if (host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH) { | 715 if (use_aura_capture_policy_) { |
| 706 is_dragging_window_ = false; | 716 is_dragging_window_ = false; |
| 707 Detach(DONT_RELEASE_CAPTURE); | 717 Detach(DONT_RELEASE_CAPTURE); |
| 708 Attach(target_tabstrip, point_in_screen); | 718 Attach(target_tabstrip, point_in_screen); |
| 709 // Move the tabs into position. | 719 // Move the tabs into position. |
| 710 MoveAttached(point_in_screen); | 720 MoveAttached(point_in_screen); |
| 711 attached_tabstrip_->GetWidget()->Activate(); | 721 attached_tabstrip_->GetWidget()->Activate(); |
| 712 } else { | 722 } else { |
| 713 tab_strip_to_attach_to_after_exit_ = target_tabstrip; | 723 tab_strip_to_attach_to_after_exit_ = target_tabstrip; |
| 714 } | 724 } |
| 715 | 725 |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1120 std::vector<gfx::Rect> drag_bounds = CalculateBoundsForDraggedTabs(); | 1130 std::vector<gfx::Rect> drag_bounds = CalculateBoundsForDraggedTabs(); |
| 1121 OffsetX(GetAttachedDragPoint(point_in_screen).x(), &drag_bounds); | 1131 OffsetX(GetAttachedDragPoint(point_in_screen).x(), &drag_bounds); |
| 1122 | 1132 |
| 1123 gfx::Vector2d drag_offset; | 1133 gfx::Vector2d drag_offset; |
| 1124 Browser* browser = CreateBrowserForDrag( | 1134 Browser* browser = CreateBrowserForDrag( |
| 1125 attached_tabstrip_, point_in_screen, &drag_offset, &drag_bounds); | 1135 attached_tabstrip_, point_in_screen, &drag_offset, &drag_bounds); |
| 1126 #if defined(OS_WIN) | 1136 #if defined(OS_WIN) |
| 1127 gfx::NativeView attached_native_view = | 1137 gfx::NativeView attached_native_view = |
| 1128 attached_tabstrip_->GetWidget()->GetNativeView(); | 1138 attached_tabstrip_->GetWidget()->GetNativeView(); |
| 1129 #endif | 1139 #endif |
| 1130 Detach(host_desktop_type_ == chrome::HOST_DESKTOP_TYPE_ASH ? | 1140 Detach(use_aura_capture_policy_ ? DONT_RELEASE_CAPTURE : RELEASE_CAPTURE); |
| 1131 DONT_RELEASE_CAPTURE : RELEASE_CAPTURE); | |
| 1132 BrowserView* dragged_browser_view = | 1141 BrowserView* dragged_browser_view = |
| 1133 BrowserView::GetBrowserViewForBrowser(browser); | 1142 BrowserView::GetBrowserViewForBrowser(browser); |
| 1134 views::Widget* dragged_widget = dragged_browser_view->GetWidget(); | 1143 views::Widget* dragged_widget = dragged_browser_view->GetWidget(); |
| 1135 #if defined(OS_WIN) | 1144 #if defined(OS_WIN) |
| 1136 // The Gesture recognizer does not work well currently when capture changes | 1145 // The Gesture recognizer does not work well currently when capture changes |
| 1137 // while a touch gesture is in progress. So we need to manually transfer | 1146 // while a touch gesture is in progress. So we need to manually transfer |
| 1138 // gesture sequence and the GR's touch events queue to the new window. This | 1147 // gesture sequence and the GR's touch events queue to the new window. This |
| 1139 // should really be done somewhere in capture change code and or inside the | 1148 // should really be done somewhere in capture change code and or inside the |
| 1140 // GR. But we currently do not have a consistent way for doing it that would | 1149 // GR. But we currently do not have a consistent way for doing it that would |
| 1141 // work in all cases. Hence this hack. | 1150 // work in all cases. Hence this hack. |
| (...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1897 aura::Window* dragged_window = | 1906 aura::Window* dragged_window = |
| 1898 attached_tabstrip_->GetWidget()->GetNativeView(); | 1907 attached_tabstrip_->GetWidget()->GetNativeView(); |
| 1899 if (dragged_window) | 1908 if (dragged_window) |
| 1900 exclude.insert(dragged_window); | 1909 exclude.insert(dragged_window); |
| 1901 } | 1910 } |
| 1902 return GetLocalProcessWindowAtPoint(host_desktop_type_, | 1911 return GetLocalProcessWindowAtPoint(host_desktop_type_, |
| 1903 screen_point, | 1912 screen_point, |
| 1904 exclude); | 1913 exclude); |
| 1905 | 1914 |
| 1906 } | 1915 } |
| OLD | NEW |