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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 | 372 |
373 // On windows SaveFocus() may trigger a capture lost, which destroys us. | 373 // On windows SaveFocus() may trigger a capture lost, which destroys us. |
374 { | 374 { |
375 base::WeakPtr<TabDragController> ref(weak_factory_.GetWeakPtr()); | 375 base::WeakPtr<TabDragController> ref(weak_factory_.GetWeakPtr()); |
376 SaveFocus(); | 376 SaveFocus(); |
377 if (!ref) | 377 if (!ref) |
378 return; | 378 return; |
379 } | 379 } |
380 started_drag_ = true; | 380 started_drag_ = true; |
381 Attach(source_tabstrip_, gfx::Point()); | 381 Attach(source_tabstrip_, gfx::Point()); |
382 gfx::Point drag_point_in_screen = point_in_screen; | |
383 if (static_cast<int>(drag_data_.size()) == | 382 if (static_cast<int>(drag_data_.size()) == |
384 GetModel(source_tabstrip_)->count()) { | 383 GetModel(source_tabstrip_)->count()) { |
385 if (was_source_maximized_ || was_source_fullscreen_) { | 384 if (was_source_maximized_ || was_source_fullscreen_) { |
386 did_restore_window_ = true; | 385 did_restore_window_ = true; |
387 // When all tabs in a maximized browser are dragged the browser gets | 386 // When all tabs in a maximized browser are dragged the browser gets |
388 // restored during the drag and maximized back when the drag ends. | 387 // restored during the drag and maximized back when the drag ends. |
389 views::Widget* widget = GetAttachedBrowserWidget(); | 388 views::Widget* widget = GetAttachedBrowserWidget(); |
390 const int last_tabstrip_width = attached_tabstrip_->GetTabAreaWidth(); | 389 const int last_tabstrip_width = attached_tabstrip_->GetTabAreaWidth(); |
391 std::vector<gfx::Rect> drag_bounds = CalculateBoundsForDraggedTabs(); | 390 std::vector<gfx::Rect> drag_bounds = CalculateBoundsForDraggedTabs(); |
392 OffsetX(GetAttachedDragPoint(point_in_screen).x(), &drag_bounds); | 391 OffsetX(GetAttachedDragPoint(point_in_screen).x(), &drag_bounds); |
393 gfx::Rect new_bounds(CalculateDraggedBrowserBounds(source_tabstrip_, | 392 gfx::Rect new_bounds(CalculateDraggedBrowserBounds(source_tabstrip_, |
394 point_in_screen, | 393 point_in_screen, |
395 &drag_bounds)); | 394 &drag_bounds)); |
396 new_bounds.Offset(-widget->GetRestoredBounds().x() + | 395 new_bounds.Offset(-widget->GetRestoredBounds().x() + |
397 point_in_screen.x() - | 396 point_in_screen.x() - |
398 mouse_offset_.x(), 0); | 397 mouse_offset_.x(), 0); |
399 widget->SetVisibilityChangedAnimationsEnabled(false); | 398 widget->SetVisibilityChangedAnimationsEnabled(false); |
400 widget->Restore(); | 399 widget->Restore(); |
401 widget->SetBounds(new_bounds); | 400 widget->SetBounds(new_bounds); |
402 AdjustBrowserAndTabBoundsForDrag(last_tabstrip_width, | 401 AdjustBrowserAndTabBoundsForDrag(last_tabstrip_width, |
403 point_in_screen, | 402 point_in_screen, |
404 &drag_bounds); | 403 &drag_bounds); |
405 widget->SetVisibilityChangedAnimationsEnabled(true); | 404 widget->SetVisibilityChangedAnimationsEnabled(true); |
406 } else { | 405 } else { |
407 #if !defined(OS_LINUX) || defined(OS_CHROMEOS) | |
408 // The user has to move the mouse some amount of pixels before the drag | 406 // The user has to move the mouse some amount of pixels before the drag |
409 // starts. Offset the window by this amount so that the relative offset | 407 // starts. Offset the window by this amount so that the relative offset |
410 // of the initial location is consistent. See crbug.com/518740 | 408 // of the initial location is consistent. See crbug.com/518740 |
411 views::Widget* widget = GetAttachedBrowserWidget(); | 409 views::Widget* widget = GetAttachedBrowserWidget(); |
412 gfx::Rect bounds = widget->GetWindowBoundsInScreen(); | 410 gfx::Rect bounds = widget->GetWindowBoundsInScreen(); |
413 bounds.Offset(point_in_screen.x() - start_point_in_screen_.x(), | 411 bounds.Offset(point_in_screen.x() - start_point_in_screen_.x(), |
414 point_in_screen.y() - start_point_in_screen_.y()); | 412 point_in_screen.y() - start_point_in_screen_.y()); |
415 widget->SetBounds(bounds); | 413 widget->SetBounds(bounds); |
416 #else | |
417 // Linux does not need the window offset behavior above because all drag | |
418 // implementations move windows relative to a passed-in cursor position | |
419 // instead of the implicit current cursor position like on Windows. | |
420 drag_point_in_screen = start_point_in_screen_; | |
421 #endif | |
422 } | 414 } |
423 RunMoveLoop(GetWindowOffset(drag_point_in_screen)); | 415 RunMoveLoop(GetWindowOffset(point_in_screen)); |
424 return; | 416 return; |
425 } | 417 } |
426 } | 418 } |
427 | 419 |
428 if (ContinueDragging(point_in_screen) == Liveness::DELETED) | 420 if (ContinueDragging(point_in_screen) == Liveness::DELETED) |
429 return; | 421 return; |
430 } | 422 } |
431 | 423 |
432 void TabDragController::EndDrag(EndDragReason reason) { | 424 void TabDragController::EndDrag(EndDragReason reason) { |
433 TRACE_EVENT0("views", "TabDragController::EndDrag"); | 425 TRACE_EVENT0("views", "TabDragController::EndDrag"); |
(...skipping 1412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1846 // TODO(pkotwicz): Fix this properly (crbug.com/358482) | 1838 // TODO(pkotwicz): Fix this properly (crbug.com/358482) |
1847 for (auto* browser : *BrowserList::GetInstance()) { | 1839 for (auto* browser : *BrowserList::GetInstance()) { |
1848 if (browser->tab_strip_model()->empty()) | 1840 if (browser->tab_strip_model()->empty()) |
1849 exclude.insert(browser->window()->GetNativeWindow()); | 1841 exclude.insert(browser->window()->GetNativeWindow()); |
1850 } | 1842 } |
1851 #endif | 1843 #endif |
1852 base::WeakPtr<TabDragController> ref(weak_factory_.GetWeakPtr()); | 1844 base::WeakPtr<TabDragController> ref(weak_factory_.GetWeakPtr()); |
1853 *window = window_finder_->GetLocalProcessWindowAtPoint(screen_point, exclude); | 1845 *window = window_finder_->GetLocalProcessWindowAtPoint(screen_point, exclude); |
1854 return ref ? Liveness::ALIVE : Liveness::DELETED; | 1846 return ref ? Liveness::ALIVE : Liveness::DELETED; |
1855 } | 1847 } |
OLD | NEW |