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 <sstream> | 5 #include <sstream> |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
533 return false; | 533 return false; |
534 | 534 |
535 RECT win_rect; | 535 RECT win_rect; |
536 if (!GetWindowRect(taskbar_hwnd, &win_rect)) | 536 if (!GetWindowRect(taskbar_hwnd, &win_rect)) |
537 return false; | 537 return false; |
538 | 538 |
539 *rect = gfx::Rect(win_rect); | 539 *rect = gfx::Rect(win_rect); |
540 return true; | 540 return true; |
541 } | 541 } |
542 | 542 |
543 // Used to position the view relative to a point, which requires |anchor| to be | 543 gfx::Point FindReferencePoint(const gfx::Display& display, |
544 // in the center of the desired view location. This helper function updates | 544 gfx::Point* anchor) { |
tapted
2013/02/27 11:58:48
i think |anchor| can be const reference now
benwells
2013/02/27 22:35:42
Yeah, and in the next function. Done.
| |
545 // |anchor| thus, using the location of the point in |point|, the distance | 545 const int kSnapDistance = 50; |
546 // to move the view from |point| in |offset|, and the direction to move | 546 |
547 // represented in |direction|. | 547 // If we can't find the taskbar, snap to the bottom left. |
548 // To position relative to a screen corner, the absolute values of |direction|.x | 548 // If the display size is the same as the work area, and does not contain the |
549 // and |direction.y| should both be 1. To position relative to some point on the | 549 // taskbar, either the taskbar is hidden or on another monitor, so just snap |
550 // taskbar, one of the absolute values of |direction.x| and |direction.y| should | 550 // to the bottom left. |
551 // be 1 and the other 0. | 551 gfx::Rect taskbar_rect; |
552 void FloatFromPoint(const gfx::Point& point, | 552 if (!GetTaskbarRect(&taskbar_rect) || |
553 const gfx::Size& offset, | 553 (display.work_area() == display.bounds() && |
554 const gfx::Point& direction, | 554 !display.work_area().Contains(taskbar_rect))) { |
555 gfx::Point* anchor) { | 555 return display.work_area().bottom_left(); |
556 anchor->set_x(point.x() + direction.x() * offset.width()); | 556 } |
557 anchor->set_y(point.y() + direction.y() * offset.height()); | 557 |
558 // Snap to the taskbar edge. If the cursor is greater than kSnapDistance away, | |
559 // also move to the left (for horizontal taskbars) or top (for vertical). | |
560 const gfx::Rect& screen_rect = display.bounds(); | |
561 // First handle taskbar on bottom. | |
562 if (taskbar_rect.width() == screen_rect.width()) { | |
563 if (taskbar_rect.bottom() == screen_rect.bottom()) { | |
564 if (taskbar_rect.y() - anchor->y() > kSnapDistance) | |
565 return gfx::Point(screen_rect.x(), taskbar_rect.y()); | |
566 | |
567 return gfx::Point(anchor->x(), taskbar_rect.y()); | |
568 } | |
569 | |
570 // Now try on the top. | |
571 if (anchor->y() - taskbar_rect.bottom() > kSnapDistance) | |
572 return gfx::Point(screen_rect.x(), taskbar_rect.bottom()); | |
573 | |
574 return gfx::Point(anchor->x(), taskbar_rect.bottom()); | |
575 } | |
576 | |
577 // Now try the left. | |
578 if (taskbar_rect.x() == screen_rect.x()) { | |
579 if (anchor->x() - taskbar_rect.right() > kSnapDistance) | |
580 return gfx::Point(taskbar_rect.right(), screen_rect.y()); | |
581 | |
582 return gfx::Point(taskbar_rect.right(), anchor->y()); | |
583 } | |
584 | |
585 // Finally, try the right. | |
586 if (taskbar_rect.x() - anchor->x() > kSnapDistance) | |
587 return gfx::Point(taskbar_rect.x(), screen_rect.y()); | |
588 | |
589 return gfx::Point(taskbar_rect.x(), anchor->y()); | |
558 } | 590 } |
559 | 591 |
560 void AppListController::SnapArrowLocationToTaskbarEdge( | 592 void AppListController::SnapArrowLocationToTaskbarEdge( |
561 const gfx::Display& display, | 593 const gfx::Display& display, |
562 gfx::Point* anchor) { | 594 gfx::Point* anchor) { |
563 const int kSnapDistance = 50; | 595 const int kSnapOffset = 3; |
564 const int kSnapOffset = 5; | |
565 | 596 |
566 gfx::Rect taskbar_rect; | 597 gfx::Rect bounds_rect(display.work_area()); |
567 gfx::Size float_offset = current_view_->GetPreferredSize(); | 598 gfx::Size view_size(current_view_->GetPreferredSize()); |
568 float_offset.set_width(float_offset.width() / 2); | 599 bounds_rect.Inset(view_size.width() / 2 + kSnapOffset, |
569 float_offset.set_height(float_offset.height() / 2); | 600 view_size.height() / 2 + kSnapOffset); |
570 float_offset.Enlarge(kSnapOffset, kSnapOffset); | |
571 | 601 |
572 // If we can't find the taskbar, snap to the bottom left. | 602 gfx::Point ref_point(FindReferencePoint(display, anchor)); |
573 // If the display size is the same as the work area, and does not contain the | 603 anchor->SetPoint(ref_point.x(), ref_point.y()); |
tapted
2013/02/27 11:58:48
I don't... think default assignment operator has b
benwells
2013/02/27 22:35:42
Yep, good one.
| |
574 // taskbar, either the taskbar is hidden or on another monitor, so just snap | 604 anchor->ClampToMin(bounds_rect.origin()); |
tapted
2013/02/27 11:58:48
ah, origin - of course ;). (Cocoa has had me think
| |
575 // to the bottom left. | 605 anchor->ClampToMax(bounds_rect.bottom_right()); |
576 if (!GetTaskbarRect(&taskbar_rect) || | |
577 (display.work_area() == display.bounds() && | |
578 !display.work_area().Contains(taskbar_rect))) { | |
579 FloatFromPoint(display.work_area().bottom_left(), | |
580 float_offset, | |
581 gfx::Point(1, -1), | |
582 anchor); | |
583 return; | |
584 } | |
585 | |
586 const gfx::Rect& screen_rect = display.bounds(); | |
587 | |
588 // Snap to the taskbar edge. If the cursor is greater than kSnapDistance away, | |
589 // also move to the left (for horizontal taskbars) or top (for vertical). | |
590 | |
591 // First handle taskbar on bottom. | |
592 if (taskbar_rect.width() == screen_rect.width()) { | |
593 if (taskbar_rect.bottom() == screen_rect.bottom()) { | |
594 if (taskbar_rect.y() - anchor->y() > kSnapDistance) { | |
595 FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.y()), | |
596 float_offset, | |
597 gfx::Point(1, -1), | |
598 anchor); | |
599 return; | |
600 } | |
601 | |
602 FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.y()), | |
603 float_offset, | |
604 gfx::Point(0, -1), | |
605 anchor); | |
606 return; | |
607 } | |
608 | |
609 // Now try on the top. | |
610 if (anchor->y() - taskbar_rect.bottom() > kSnapDistance) { | |
611 FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.bottom()), | |
612 float_offset, | |
613 gfx::Point(1, 1), | |
614 anchor); | |
615 return; | |
616 } | |
617 | |
618 FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.bottom()), | |
619 float_offset, | |
620 gfx::Point(0, 1), | |
621 anchor); | |
622 return; | |
623 } | |
624 | |
625 // Now try the left. | |
626 if (taskbar_rect.x() == screen_rect.x()) { | |
627 if (anchor->x() - taskbar_rect.right() > kSnapDistance) { | |
628 FloatFromPoint(gfx::Point(taskbar_rect.right(), screen_rect.y()), | |
629 float_offset, | |
630 gfx::Point(1, 1), | |
631 anchor); | |
632 return; | |
633 } | |
634 | |
635 FloatFromPoint(gfx::Point(taskbar_rect.right(), anchor->y()), | |
636 float_offset, | |
637 gfx::Point(1, 0), | |
638 anchor); | |
639 return; | |
640 } | |
641 | |
642 // Finally, try the right. | |
643 if (taskbar_rect.x() - anchor->x() > kSnapDistance) { | |
644 FloatFromPoint(gfx::Point(taskbar_rect.x(), screen_rect.y()), | |
645 float_offset, | |
646 gfx::Point(-1, 1), | |
647 anchor); | |
648 return; | |
649 } | |
650 | |
651 FloatFromPoint(gfx::Point(taskbar_rect.x(), anchor->y()), | |
652 float_offset, | |
653 gfx::Point(-1, 0), | |
654 anchor); | |
655 } | 606 } |
656 | 607 |
657 void AppListController::UpdateArrowPositionAndAnchorPoint( | 608 void AppListController::UpdateArrowPositionAndAnchorPoint( |
658 const gfx::Point& cursor) { | 609 const gfx::Point& cursor) { |
659 gfx::Point anchor(cursor); | 610 gfx::Point anchor(cursor); |
660 gfx::Screen* screen = | 611 gfx::Screen* screen = |
661 gfx::Screen::GetScreenFor(current_view_->GetWidget()->GetNativeView()); | 612 gfx::Screen::GetScreenFor(current_view_->GetWidget()->GetNativeView()); |
662 gfx::Display display = screen->GetDisplayNearestPoint(anchor); | 613 gfx::Display display = screen->GetDisplayNearestPoint(anchor); |
663 | 614 |
664 SnapArrowLocationToTaskbarEdge(display, &anchor); | 615 SnapArrowLocationToTaskbarEdge(display, &anchor); |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
875 | 826 |
876 Profile* GetCurrentAppListProfile() { | 827 Profile* GetCurrentAppListProfile() { |
877 return GetCurrentAppListController()->profile(); | 828 return GetCurrentAppListController()->profile(); |
878 } | 829 } |
879 | 830 |
880 bool IsAppListVisible() { | 831 bool IsAppListVisible() { |
881 return GetCurrentAppListController()->IsAppListVisible(); | 832 return GetCurrentAppListController()->IsAppListVisible(); |
882 } | 833 } |
883 | 834 |
884 } // namespace chrome | 835 } // namespace chrome |
OLD | NEW |