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

Side by Side Diff: chrome/browser/ui/views/app_list/app_list_controller_win.cc

Issue 12334115: [win] Ensure the app launcher always comes up on screen. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 // Used to position the view relative to a point, which requires |anchor| to be
544 // in the center of the desired view location. This helper function updates 544 // in the center of the desired view location. This helper function updates
545 // |anchor| thus, using the location of the point in |point|, the distance 545 // |anchor| thus, using the location of the point in |point|, the distance
546 // to move the view from |point| in |offset|, and the direction to move 546 // to move the view from |point| in |offset|, and the direction to move
547 // represented in |direction|. 547 // represented in |direction|.
548 // The function will also ensure the view is within |offset| of the screen
549 // edges.
548 // To position relative to a screen corner, the absolute values of |direction|.x 550 // To position relative to a screen corner, the absolute values of |direction|.x
549 // and |direction.y| should both be 1. To position relative to some point on the 551 // and |direction.y| should both be 1. To position relative to some point on the
550 // taskbar, one of the absolute values of |direction.x| and |direction.y| should 552 // taskbar, one of the absolute values of |direction.x| and |direction.y| should
551 // be 1 and the other 0. 553 // be 1 and the other 0.
552 void FloatFromPoint(const gfx::Point& point, 554 void FloatFromPoint(const gfx::Point& point,
553 const gfx::Size& offset, 555 const gfx::Size& offset,
554 const gfx::Point& direction, 556 const gfx::Point& direction,
557 const gfx::Rect& screen_rect,
tapted 2013/02/27 08:41:59 bounds_rect, Then,
555 gfx::Point* anchor) { 558 gfx::Point* anchor) {
556 anchor->set_x(point.x() + direction.x() * offset.width()); 559 anchor->set_x(point.x() + direction.x() * offset.width());
557 anchor->set_y(point.y() + direction.y() * offset.height()); 560 anchor->set_y(point.y() + direction.y() * offset.height());
561
562 if (anchor->x() - offset.width() < screen_rect.x())
tapted 2013/02/27 08:41:59 I think these 11 lines can be just anchor.ClampTo
563 anchor->set_x(screen_rect.x() + offset.width());
564
565 if (anchor->x() + offset.width() > screen_rect.right())
566 anchor->set_x(screen_rect.right() - offset.width());
567
568 if (anchor->y() - offset.height() < screen_rect.y())
569 anchor->set_y(screen_rect.y() + offset.height());
570
571 if (anchor->y() + offset.height() > screen_rect.bottom())
572 anchor->set_y(screen_rect.bottom() - offset.height());
558 } 573 }
559 574
560 void AppListController::SnapArrowLocationToTaskbarEdge( 575 void AppListController::SnapArrowLocationToTaskbarEdge(
561 const gfx::Display& display, 576 const gfx::Display& display,
562 gfx::Point* anchor) { 577 gfx::Point* anchor) {
563 const int kSnapDistance = 50; 578 const int kSnapDistance = 50;
564 const int kSnapOffset = 5; 579 const int kSnapOffset = 5;
565 580
566 gfx::Rect taskbar_rect; 581 gfx::Rect taskbar_rect;
567 gfx::Size float_offset = current_view_->GetPreferredSize(); 582 gfx::Size float_offset = current_view_->GetPreferredSize();
568 float_offset.set_width(float_offset.width() / 2); 583 float_offset.set_width(float_offset.width() / 2);
569 float_offset.set_height(float_offset.height() / 2); 584 float_offset.set_height(float_offset.height() / 2);
570 float_offset.Enlarge(kSnapOffset, kSnapOffset); 585 float_offset.Enlarge(kSnapOffset, kSnapOffset);
tapted 2013/02/27 08:42:30 [ I think with this Enlarge, it also gets a margin
571 586
587 const gfx::Rect& screen_rect = display.bounds();
tapted 2013/02/27 08:41:59 With gfx::Rect& bounds_rect = display.bounds(); b
tapted 2013/02/27 08:41:59 Does it need to take into account the taskbar, to
588
572 // If we can't find the taskbar, snap to the bottom left. 589 // If we can't find the taskbar, snap to the bottom left.
573 // If the display size is the same as the work area, and does not contain the 590 // If the display size is the same as the work area, and does not contain the
574 // taskbar, either the taskbar is hidden or on another monitor, so just snap 591 // taskbar, either the taskbar is hidden or on another monitor, so just snap
575 // to the bottom left. 592 // to the bottom left.
576 if (!GetTaskbarRect(&taskbar_rect) || 593 if (!GetTaskbarRect(&taskbar_rect) ||
577 (display.work_area() == display.bounds() && 594 (display.work_area() == display.bounds() &&
578 !display.work_area().Contains(taskbar_rect))) { 595 !display.work_area().Contains(taskbar_rect))) {
579 FloatFromPoint(display.work_area().bottom_left(), 596 FloatFromPoint(display.work_area().bottom_left(),
580 float_offset, 597 float_offset,
581 gfx::Point(1, -1), 598 gfx::Point(1, -1),
599 screen_rect,
582 anchor); 600 anchor);
583 return; 601 return;
584 } 602 }
585 603
586 const gfx::Rect& screen_rect = display.bounds();
587
588 // Snap to the taskbar edge. If the cursor is greater than kSnapDistance away, 604 // 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). 605 // also move to the left (for horizontal taskbars) or top (for vertical).
590 606
591 // First handle taskbar on bottom. 607 // First handle taskbar on bottom.
592 if (taskbar_rect.width() == screen_rect.width()) { 608 if (taskbar_rect.width() == screen_rect.width()) {
593 if (taskbar_rect.bottom() == screen_rect.bottom()) { 609 if (taskbar_rect.bottom() == screen_rect.bottom()) {
594 if (taskbar_rect.y() - anchor->y() > kSnapDistance) { 610 if (taskbar_rect.y() - anchor->y() > kSnapDistance) {
595 FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.y()), 611 FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.y()),
596 float_offset, 612 float_offset,
597 gfx::Point(1, -1), 613 gfx::Point(1, -1),
614 screen_rect,
598 anchor); 615 anchor);
599 return; 616 return;
600 } 617 }
601 618
602 FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.y()), 619 FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.y()),
603 float_offset, 620 float_offset,
604 gfx::Point(0, -1), 621 gfx::Point(0, -1),
622 screen_rect,
605 anchor); 623 anchor);
606 return; 624 return;
607 } 625 }
608 626
609 // Now try on the top. 627 // Now try on the top.
610 if (anchor->y() - taskbar_rect.bottom() > kSnapDistance) { 628 if (anchor->y() - taskbar_rect.bottom() > kSnapDistance) {
611 FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.bottom()), 629 FloatFromPoint(gfx::Point(screen_rect.x(), taskbar_rect.bottom()),
612 float_offset, 630 float_offset,
613 gfx::Point(1, 1), 631 gfx::Point(1, 1),
632 screen_rect,
614 anchor); 633 anchor);
615 return; 634 return;
616 } 635 }
617 636
618 FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.bottom()), 637 FloatFromPoint(gfx::Point(anchor->x(), taskbar_rect.bottom()),
619 float_offset, 638 float_offset,
620 gfx::Point(0, 1), 639 gfx::Point(0, 1),
640 screen_rect,
621 anchor); 641 anchor);
622 return; 642 return;
623 } 643 }
624 644
625 // Now try the left. 645 // Now try the left.
626 if (taskbar_rect.x() == screen_rect.x()) { 646 if (taskbar_rect.x() == screen_rect.x()) {
627 if (anchor->x() - taskbar_rect.right() > kSnapDistance) { 647 if (anchor->x() - taskbar_rect.right() > kSnapDistance) {
628 FloatFromPoint(gfx::Point(taskbar_rect.right(), screen_rect.y()), 648 FloatFromPoint(gfx::Point(taskbar_rect.right(), screen_rect.y()),
629 float_offset, 649 float_offset,
630 gfx::Point(1, 1), 650 gfx::Point(1, 1),
651 screen_rect,
631 anchor); 652 anchor);
632 return; 653 return;
633 } 654 }
634 655
635 FloatFromPoint(gfx::Point(taskbar_rect.right(), anchor->y()), 656 FloatFromPoint(gfx::Point(taskbar_rect.right(), anchor->y()),
636 float_offset, 657 float_offset,
637 gfx::Point(1, 0), 658 gfx::Point(1, 0),
659 screen_rect,
638 anchor); 660 anchor);
639 return; 661 return;
640 } 662 }
641 663
642 // Finally, try the right. 664 // Finally, try the right.
643 if (taskbar_rect.x() - anchor->x() > kSnapDistance) { 665 if (taskbar_rect.x() - anchor->x() > kSnapDistance) {
644 FloatFromPoint(gfx::Point(taskbar_rect.x(), screen_rect.y()), 666 FloatFromPoint(gfx::Point(taskbar_rect.x(), screen_rect.y()),
645 float_offset, 667 float_offset,
646 gfx::Point(-1, 1), 668 gfx::Point(-1, 1),
669 screen_rect,
647 anchor); 670 anchor);
648 return; 671 return;
649 } 672 }
650 673
651 FloatFromPoint(gfx::Point(taskbar_rect.x(), anchor->y()), 674 FloatFromPoint(gfx::Point(taskbar_rect.x(), anchor->y()),
652 float_offset, 675 float_offset,
653 gfx::Point(-1, 0), 676 gfx::Point(-1, 0),
677 screen_rect,
654 anchor); 678 anchor);
655 } 679 }
656 680
657 void AppListController::UpdateArrowPositionAndAnchorPoint( 681 void AppListController::UpdateArrowPositionAndAnchorPoint(
658 const gfx::Point& cursor) { 682 const gfx::Point& cursor) {
659 gfx::Point anchor(cursor); 683 gfx::Point anchor(cursor);
660 gfx::Screen* screen = 684 gfx::Screen* screen =
661 gfx::Screen::GetScreenFor(current_view_->GetWidget()->GetNativeView()); 685 gfx::Screen::GetScreenFor(current_view_->GetWidget()->GetNativeView());
662 gfx::Display display = screen->GetDisplayNearestPoint(anchor); 686 gfx::Display display = screen->GetDisplayNearestPoint(anchor);
663 687
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
875 899
876 Profile* GetCurrentAppListProfile() { 900 Profile* GetCurrentAppListProfile() {
877 return GetCurrentAppListController()->profile(); 901 return GetCurrentAppListController()->profile();
878 } 902 }
879 903
880 bool IsAppListVisible() { 904 bool IsAppListVisible() {
881 return GetCurrentAppListController()->IsAppListVisible(); 905 return GetCurrentAppListController()->IsAppListVisible();
882 } 906 }
883 907
884 } // namespace chrome 908 } // namespace chrome
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698