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

Side by Side Diff: views/widget/tooltip_manager_views.cc

Issue 8418028: Destroy tooltip manager if the native window is destroyed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: modified according to comments Created 9 years, 1 month 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 | « views/widget/tooltip_manager_views.h ('k') | 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "views/widget/tooltip_manager_views.h" 5 #include "views/widget/tooltip_manager_views.h"
6 6
7 #if defined(USE_X11) 7 #if defined(USE_X11)
8 #include <X11/Xlib.h> 8 #include <X11/Xlib.h>
9 #include <X11/extensions/XInput2.h> 9 #include <X11/extensions/XInput2.h>
10 #endif 10 #endif
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 gfx::Rect monitor_bounds = 68 gfx::Rect monitor_bounds =
69 gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point(x, y)); 69 gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point(x, y));
70 // GtkLabel (gtk_label_ensure_layout) forces wrapping at this size. We mirror 70 // GtkLabel (gtk_label_ensure_layout) forces wrapping at this size. We mirror
71 // the size here otherwise tooltips wider than the size used by gtklabel end 71 // the size here otherwise tooltips wider than the size used by gtklabel end
72 // up with extraneous empty lines. 72 // up with extraneous empty lines.
73 return monitor_bounds.width() == 0 ? 800 : (monitor_bounds.width() + 1) / 2; 73 return monitor_bounds.width() == 0 ? 800 : (monitor_bounds.width() + 1) / 2;
74 } 74 }
75 75
76 TooltipManagerViews::TooltipManagerViews(views::View* root_view) 76 TooltipManagerViews::TooltipManagerViews(views::View* root_view)
77 : root_view_(root_view), 77 : root_view_(root_view),
78 tooltip_view_(NULL), 78 tooltip_view_(NULL) {
79 widget_closed_(false) {
80 tooltip_label_.set_background( 79 tooltip_label_.set_background(
81 views::Background::CreateSolidBackground(kTooltipBackground)); 80 views::Background::CreateSolidBackground(kTooltipBackground));
82 tooltip_widget_.reset(CreateTooltip()); 81 tooltip_widget_.reset(CreateTooltip());
83 tooltip_widget_->SetContentsView(&tooltip_label_); 82 tooltip_widget_->SetContentsView(&tooltip_label_);
84 tooltip_widget_->Activate(); 83 tooltip_widget_->Activate();
85 tooltip_widget_->SetAlwaysOnTop(true); 84 tooltip_widget_->SetAlwaysOnTop(true);
86 tooltip_timer_.Start(FROM_HERE, 85 tooltip_timer_.Start(FROM_HERE,
87 base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs), 86 base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs),
88 this, &TooltipManagerViews::TooltipTimerFired); 87 this, &TooltipManagerViews::TooltipTimerFired);
89 MessageLoopForUI::current()->AddObserver(this); 88 MessageLoopForUI::current()->AddObserver(this);
90 root_view_->GetWidget()->AddObserver(this);
91 } 89 }
92 90
93 TooltipManagerViews::~TooltipManagerViews() { 91 TooltipManagerViews::~TooltipManagerViews() {
94 MessageLoopForUI::current()->RemoveObserver(this); 92 MessageLoopForUI::current()->RemoveObserver(this);
95 tooltip_widget_->CloseNow(); 93 tooltip_widget_->CloseNow();
96 } 94 }
97 95
98 void TooltipManagerViews::UpdateTooltip() { 96 void TooltipManagerViews::UpdateTooltip() {
99 UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); 97 UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false);
100 } 98 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 const base::NativeEvent& event) { 143 const base::NativeEvent& event) {
146 if (event.message == WM_MOUSEMOVE) 144 if (event.message == WM_MOUSEMOVE)
147 OnMouseMoved(GET_X_LPARAM(event.lParam), GET_Y_LPARAM(event.lParam)); 145 OnMouseMoved(GET_X_LPARAM(event.lParam), GET_Y_LPARAM(event.lParam));
148 return base::EVENT_CONTINUE; 146 return base::EVENT_CONTINUE;
149 } 147 }
150 148
151 void TooltipManagerViews::DidProcessEvent(const base::NativeEvent& event) { 149 void TooltipManagerViews::DidProcessEvent(const base::NativeEvent& event) {
152 } 150 }
153 #endif 151 #endif
154 152
155 void TooltipManagerViews::OnWidgetClosing(Widget* widget) {
156 tooltip_timer_.Stop();
157 widget_closed_ = true;
158 }
159
160 void TooltipManagerViews::TooltipTimerFired() { 153 void TooltipManagerViews::TooltipTimerFired() {
161 UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); 154 UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false);
162 } 155 }
163 156
164 View* TooltipManagerViews::GetViewForTooltip(int x, int y, bool for_keyboard) { 157 View* TooltipManagerViews::GetViewForTooltip(int x, int y, bool for_keyboard) {
165 View* view = NULL; 158 View* view = NULL;
166 if (!for_keyboard) { 159 if (!for_keyboard) {
167 // Convert x,y from screen coordinates to |root_view_| coordinates. 160 // Convert x,y from screen coordinates to |root_view_| coordinates.
168 gfx::Point point(x, y); 161 gfx::Point point(x, y);
169 gfx::Rect r = root_view_->GetWidget()->GetClientAreaScreenBounds(); 162 gfx::Rect r = root_view_->GetWidget()->GetClientAreaScreenBounds();
170 point.SetPoint(point.x() - r.x(), point.y() - r.y()); 163 point.SetPoint(point.x() - r.x(), point.y() - r.y());
171 View::ConvertPointFromWidget(root_view_, &point); 164 View::ConvertPointFromWidget(root_view_, &point);
172 view = root_view_->GetEventHandlerForPoint(point); 165 view = root_view_->GetEventHandlerForPoint(point);
173 } else { 166 } else {
174 FocusManager* focus_manager = root_view_->GetFocusManager(); 167 FocusManager* focus_manager = root_view_->GetFocusManager();
175 if (focus_manager) 168 if (focus_manager)
176 view = focus_manager->GetFocusedView(); 169 view = focus_manager->GetFocusedView();
177 } 170 }
178 return view; 171 return view;
179 } 172 }
180 173
181 void TooltipManagerViews::UpdateIfRequired(int x, int y, bool for_keyboard) { 174 void TooltipManagerViews::UpdateIfRequired(int x, int y, bool for_keyboard) {
182 if (widget_closed_)
183 return;
184
185 View* view = GetViewForTooltip(x, y, for_keyboard); 175 View* view = GetViewForTooltip(x, y, for_keyboard);
186 string16 tooltip_text; 176 string16 tooltip_text;
187 if (view) 177 if (view)
188 view->GetTooltipText(gfx::Point(x, y), &tooltip_text); 178 view->GetTooltipText(gfx::Point(x, y), &tooltip_text);
189 179
190 #if defined(USE_AURA) 180 #if defined(USE_AURA)
191 // In aura, and aura::Window can also have a tooltip. If the view doesnot have 181 // In aura, and aura::Window can also have a tooltip. If the view doesnot have
192 // a tooltip, we must also check for the aura::Window underneath the cursor. 182 // a tooltip, we must also check for the aura::Window underneath the cursor.
193 if (tooltip_text.empty()) { 183 if (tooltip_text.empty()) {
194 aura::Window* root = reinterpret_cast<aura::Window*>( 184 aura::Window* root = reinterpret_cast<aura::Window*>(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 if (tooltip_timer_.IsRunning()) 247 if (tooltip_timer_.IsRunning())
258 tooltip_timer_.Reset(); 248 tooltip_timer_.Reset();
259 curr_mouse_pos_.SetPoint(x, y); 249 curr_mouse_pos_.SetPoint(x, y);
260 250
261 // If tooltip is visible, we may want to hide it. If it is not, we are ok. 251 // If tooltip is visible, we may want to hide it. If it is not, we are ok.
262 if (tooltip_widget_->IsVisible()) 252 if (tooltip_widget_->IsVisible())
263 UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false); 253 UpdateIfRequired(curr_mouse_pos_.x(), curr_mouse_pos_.y(), false);
264 } 254 }
265 255
266 } // namespace views 256 } // namespace views
OLDNEW
« no previous file with comments | « views/widget/tooltip_manager_views.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698