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

Unified Diff: chrome/browser/views/tabs/tab_strip.cc

Issue 5025: Scrolling through tabs by using mouse-wheel on tab bar Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 12 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/views/tabs/tab_strip.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/views/tabs/tab_strip.cc
===================================================================
--- chrome/browser/views/tabs/tab_strip.cc (revision 2596)
+++ chrome/browser/views/tabs/tab_strip.cc (working copy)
@@ -442,7 +442,7 @@
// Overridden from AnimationDelegate:
virtual void AnimationEnded(const Animation* animation) {
- tabstrip_->resize_layout_scheduled_ = false;
+ tabstrip_->needs_resize_layout_ = false;
TabStrip::TabAnimation::AnimationEnded(animation);
}
@@ -487,7 +487,7 @@
: model_(model),
resize_layout_factory_(this),
added_as_message_loop_observer_(false),
- resize_layout_scheduled_(false),
+ needs_resize_layout_(false),
current_unselected_width_(Tab::GetStandardSize().width()),
current_selected_width_(Tab::GetStandardSize().width()),
available_width_for_tabs_(-1) {
@@ -869,7 +869,7 @@
// We have "tiny tabs" if the tabs are so tiny that the unselected ones are
// a different size to the selected ones.
bool tiny_tabs = current_unselected_width_ != current_selected_width_;
- if (!IsAnimating() && (!resize_layout_scheduled_ || tiny_tabs)) {
+ if (!IsAnimating() && (!needs_resize_layout_ || tiny_tabs)) {
Layout();
} else {
SchedulePaint();
@@ -947,8 +947,7 @@
// Tabs are not resized until a later time (when the mouse pointer leaves
// the TabStrip).
available_width_for_tabs_ = GetAvailableWidthForTabs(last_tab);
- resize_layout_scheduled_ = true;
- AddMessageLoopObserver();
+ needs_resize_layout_ = true;
model_->CloseTabContentsAt(tab_index);
}
}
@@ -1053,34 +1052,36 @@
}
void TabStrip::DidProcessMessage(const MSG& msg) {
- // We spy on three different Windows messages here to see if the mouse has
- // moved out of the bounds of the tabstrip, which we use as our cue to kick
- // of the resize animation. The messages are:
- //
- // WM_MOUSEMOVE:
- // For when the mouse moves from the tabstrip over into the rest of the
- // browser UI, i.e. within the bounds of the same windows HWND.
- // WM_MOUSELEAVE:
- // For when the mouse moves very rapidly from a tab closed in the middle of
- // the tabstrip (_not_ the end) out of the bounds of the browser's HWND and
- // over some other HWND.
- // WM_NCMOUSELEAVE:
- // For when the mouse moves very rapidly from the end of the tabstrip (when
- // the last tab is closed and the mouse is left floating over the title
- // bar). Because the empty area of the tabstrip at the end of the title bar
- // is registered by the ChromeFrame as part of the "caption" area of the
- // window (the frame's OnNCHitTest method returns HTCAPTION for this
- // region), the frame's HWND receives a WM_MOUSEMOVE message immediately,
- // because as far as it is concerned the mouse has _left_ the client area
- // of the window (and is now over the non-client area). To be notified
- // again when the mouse leaves the _non-client_ area, we use the
- // WM_NCMOUSELEAVE message, which causes us to re-evaluate the cursor
- // position and correctly resize the tabstrip.
- //
switch (msg.message) {
+ // We spy on three different Windows messages here to see if the mouse has
+ // moved out of the bounds of the tabstrip, which we use as our cue to kick
+ // of the resize animation. The messages are:
+ //
+ // WM_MOUSEMOVE:
+ // For when the mouse moves from the tabstrip over into the rest of the
+ // browser UI, i.e. within the bounds of the same windows HWND.
+ // WM_MOUSELEAVE:
+ // For when the mouse moves very rapidly from a tab closed in the middle
+ // of the tabstrip (_not_ the end) out of the bounds of the browser's
+ // HWND and over some other HWND.
+ // WM_NCMOUSELEAVE:
+ // For when the mouse moves very rapidly from the end of the tabstrip
+ // (when the last tab is closed and the mouse is left floating over the
+ // title bar). Because the empty area of the tabstrip at the end of the
+ // title bar is registered by the ChromeFrame as part of the "caption"
+ // area of the window (the frame's OnNCHitTest method returns HTCAPTION
+ // for this region), the frame's HWND receives a WM_MOUSEMOVE message
+ // immediately, because as far as it is concerned the mouse has _left_
+ // the client area of the window (and is now over the non-client area).
+ // To be notified again when the mouse leaves the _non-client_ area, we
+ // use the WM_NCMOUSELEAVE message, which causes us to re-evaluate the
+ // cursor position and correctly resize the tabstrip.
+ //
case WM_MOUSEMOVE:
case WM_MOUSELEAVE:
case WM_NCMOUSELEAVE:
+ if (!needs_resize_layout_)
+ break;
if (!IsCursorInTabStripZone()) {
// Mouse moved outside the tab slop zone, start a timer to do a resize
// layout after a short while...
@@ -1097,6 +1098,20 @@
resize_layout_factory_.RevokeAll();
}
break;
+ // We also watch out for mouse-wheel messages here to allow the user to
+ // leaf through the tabs by scrolling while the mouse cursor is in the tab
+ // strip zone.
+ case WM_MOUSEWHEEL:
+ if (!IsCursorInTabStripZone())
+ break;
+ CHECK(model_);
+ // A positive value indicates that the wheel was rotated away from the
+ // user; a negative value indicates rotation toward the user.
+ if (GET_WHEEL_DELTA_WPARAM(msg.wParam) > 0)
+ model_->SelectPreviousTab();
+ else
+ model_->SelectNextTab();
+ break;
}
}
@@ -1129,6 +1144,8 @@
drop_indicator_width = drop_image->width();
drop_indicator_height = drop_image->height();
}
+
+ AddMessageLoopObserver();
}
Tab* TabStrip::GetTabAt(int index) const {
@@ -1224,10 +1241,6 @@
void TabStrip::ResizeLayoutTabs() {
resize_layout_factory_.RevokeAll();
- // It is critically important that this is unhooked here, otherwise we will
- // keep spying on messages forever.
- RemoveMessageLoopObserver();
-
available_width_for_tabs_ = -1;
double unselected, selected;
GetDesiredTabWidths(GetTabCount(), &unselected, &selected);
@@ -1461,7 +1474,7 @@
void TabStrip::LayoutNewTabButton(double last_tab_right,
double unselected_width) {
int delta = abs(Round(unselected_width) - Tab::GetStandardSize().width());
- if (delta > 1 && !resize_layout_scheduled_) {
+ if (delta > 1 && !needs_resize_layout_) {
// We're shrinking tabs, so we need to anchor the New Tab button to the
// right edge of the TabStrip's bounds, rather than the right edge of the
// right-most Tab, otherwise it'll bounce when animating.
« no previous file with comments | « chrome/browser/views/tabs/tab_strip.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698