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

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

Issue 703643004: Revert of Do not interchange MOUSE_MOVED and MOUSE_DRAGGED events in Widget (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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
« no previous file with comments | « ui/views/widget/widget.h ('k') | ui/views/widget/widget_unittest.cc » ('j') | 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 "ui/views/widget/widget.h" 5 #include "ui/views/widget/widget.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET), 161 ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET),
162 is_secondary_widget_(true), 162 is_secondary_widget_(true),
163 frame_type_(FRAME_TYPE_DEFAULT), 163 frame_type_(FRAME_TYPE_DEFAULT),
164 disable_inactive_rendering_(false), 164 disable_inactive_rendering_(false),
165 widget_closed_(false), 165 widget_closed_(false),
166 saved_show_state_(ui::SHOW_STATE_DEFAULT), 166 saved_show_state_(ui::SHOW_STATE_DEFAULT),
167 focus_on_creation_(true), 167 focus_on_creation_(true),
168 is_top_level_(false), 168 is_top_level_(false),
169 native_widget_initialized_(false), 169 native_widget_initialized_(false),
170 native_widget_destroyed_(false), 170 native_widget_destroyed_(false),
171 is_mouse_button_pressed_(false),
171 ignore_capture_loss_(false), 172 ignore_capture_loss_(false),
172 last_mouse_event_was_move_(false), 173 last_mouse_event_was_move_(false),
173 auto_release_capture_(true), 174 auto_release_capture_(true),
174 root_layers_dirty_(false), 175 root_layers_dirty_(false),
175 movement_disabled_(false), 176 movement_disabled_(false),
176 observer_manager_(this) { 177 observer_manager_(this) {
177 } 178 }
178 179
179 Widget::~Widget() { 180 Widget::~Widget() {
180 DestroyRootView(); 181 DestroyRootView();
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 344
344 widget_delegate_ = params.delegate ? 345 widget_delegate_ = params.delegate ?
345 params.delegate : new DefaultWidgetDelegate(this); 346 params.delegate : new DefaultWidgetDelegate(this);
346 widget_delegate_->set_can_activate(can_activate); 347 widget_delegate_->set_can_activate(can_activate);
347 348
348 ownership_ = params.ownership; 349 ownership_ = params.ownership;
349 native_widget_ = CreateNativeWidget(params.native_widget, this)-> 350 native_widget_ = CreateNativeWidget(params.native_widget, this)->
350 AsNativeWidgetPrivate(); 351 AsNativeWidgetPrivate();
351 root_view_.reset(CreateRootView()); 352 root_view_.reset(CreateRootView());
352 default_theme_provider_.reset(new ui::DefaultThemeProvider); 353 default_theme_provider_.reset(new ui::DefaultThemeProvider);
354 if (params.type == InitParams::TYPE_MENU) {
355 is_mouse_button_pressed_ =
356 internal::NativeWidgetPrivate::IsMouseButtonDown();
357 }
353 native_widget_->InitNativeWidget(params); 358 native_widget_->InitNativeWidget(params);
354 if (RequiresNonClientView(params.type)) { 359 if (RequiresNonClientView(params.type)) {
355 non_client_view_ = new NonClientView; 360 non_client_view_ = new NonClientView;
356 non_client_view_->SetFrameView(CreateNonClientFrameView()); 361 non_client_view_->SetFrameView(CreateNonClientFrameView());
357 // Create the ClientView, add it to the NonClientView and add the 362 // Create the ClientView, add it to the NonClientView and add the
358 // NonClientView to the RootView. This will cause everything to be parented. 363 // NonClientView to the RootView. This will cause everything to be parented.
359 non_client_view_->set_client_view(widget_delegate_->CreateClientView(this)); 364 non_client_view_->set_client_view(widget_delegate_->CreateClientView(this));
360 non_client_view_->SetOverlayView(widget_delegate_->CreateOverlayView()); 365 non_client_view_->SetOverlayView(widget_delegate_->CreateOverlayView());
361 SetContentsView(non_client_view_); 366 SetContentsView(non_client_view_);
362 // Initialize the window's title before setting the window's initial bounds; 367 // Initialize the window's title before setting the window's initial bounds;
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 941
937 void Widget::SetCapture(View* view) { 942 void Widget::SetCapture(View* view) {
938 if (!native_widget_->HasCapture()) { 943 if (!native_widget_->HasCapture()) {
939 native_widget_->SetCapture(); 944 native_widget_->SetCapture();
940 945
941 // Early return if setting capture was unsuccessful. 946 // Early return if setting capture was unsuccessful.
942 if (!native_widget_->HasCapture()) 947 if (!native_widget_->HasCapture())
943 return; 948 return;
944 } 949 }
945 950
951 if (internal::NativeWidgetPrivate::IsMouseButtonDown())
952 is_mouse_button_pressed_ = true;
946 root_view_->SetMouseHandler(view); 953 root_view_->SetMouseHandler(view);
947 } 954 }
948 955
949 void Widget::ReleaseCapture() { 956 void Widget::ReleaseCapture() {
950 if (native_widget_->HasCapture()) 957 if (native_widget_->HasCapture())
951 native_widget_->ReleaseCapture(); 958 native_widget_->ReleaseCapture();
952 } 959 }
953 960
954 bool Widget::HasCapture() { 961 bool Widget::HasCapture() {
955 return native_widget_->HasCapture(); 962 return native_widget_->HasCapture();
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 } 1183 }
1177 1184
1178 void Widget::OnKeyEvent(ui::KeyEvent* event) { 1185 void Widget::OnKeyEvent(ui::KeyEvent* event) {
1179 SendEventToProcessor(event); 1186 SendEventToProcessor(event);
1180 } 1187 }
1181 1188
1182 // TODO(tdanderson): We should not be calling the OnMouse*() functions on 1189 // TODO(tdanderson): We should not be calling the OnMouse*() functions on
1183 // RootView from anywhere in Widget. Use 1190 // RootView from anywhere in Widget. Use
1184 // SendEventToProcessor() instead. See crbug.com/348087. 1191 // SendEventToProcessor() instead. See crbug.com/348087.
1185 void Widget::OnMouseEvent(ui::MouseEvent* event) { 1192 void Widget::OnMouseEvent(ui::MouseEvent* event) {
1186 if (event->type() != ui::ET_MOUSE_MOVED)
1187 last_mouse_event_was_move_ = false;
1188
1189 View* root_view = GetRootView(); 1193 View* root_view = GetRootView();
1190 switch (event->type()) { 1194 switch (event->type()) {
1191 case ui::ET_MOUSE_PRESSED: { 1195 case ui::ET_MOUSE_PRESSED: {
1196 last_mouse_event_was_move_ = false;
1197
1192 // We may get deleted by the time we return from OnMousePressed. So we 1198 // We may get deleted by the time we return from OnMousePressed. So we
1193 // use an observer to make sure we are still alive. 1199 // use an observer to make sure we are still alive.
1194 WidgetDeletionObserver widget_deletion_observer(this); 1200 WidgetDeletionObserver widget_deletion_observer(this);
1195 1201
1196 // Make sure we're still visible before we attempt capture as the mouse 1202 // Make sure we're still visible before we attempt capture as the mouse
1197 // press processing may have made the window hide (as happens with menus). 1203 // press processing may have made the window hide (as happens with menus).
1198 1204
1199 // It is possible for a View to show a context menu on mouse-press. Since 1205 // It is possible for a View to show a context menu on mouse-press. Since
1200 // the menu does a capture and starts a nested message-loop, the release 1206 // the menu does a capture and starts a nested message-loop, the release
1201 // would go to the menu. The next click (i.e. both mouse-press and release 1207 // would go to the menu. The next click (i.e. both mouse-press and release
1202 // events) also go to the menu. The menu (and the nested message-loop) 1208 // events) also go to the menu. The menu (and the nested message-loop)
1203 // gets closed after this second release event. The code then resumes from 1209 // gets closed after this second release event. The code then resumes from
1204 // here. So make sure that the mouse-button is still down before doing a 1210 // here. So make sure that the mouse-button is still down before doing a
1205 // capture. 1211 // capture.
1206 if (root_view && root_view->OnMousePressed(*event) && 1212 if (root_view && root_view->OnMousePressed(*event) &&
1207 widget_deletion_observer.IsWidgetAlive() && IsVisible() && 1213 widget_deletion_observer.IsWidgetAlive() && IsVisible() &&
1208 internal::NativeWidgetPrivate::IsMouseButtonDown()) { 1214 internal::NativeWidgetPrivate::IsMouseButtonDown()) {
1215 is_mouse_button_pressed_ = true;
1209 if (!native_widget_->HasCapture()) 1216 if (!native_widget_->HasCapture())
1210 native_widget_->SetCapture(); 1217 native_widget_->SetCapture();
1211 event->SetHandled(); 1218 event->SetHandled();
1212 } 1219 }
1213 return; 1220 return;
1214 } 1221 }
1215 1222
1216 case ui::ET_MOUSE_RELEASED: 1223 case ui::ET_MOUSE_RELEASED:
1224 last_mouse_event_was_move_ = false;
1225 is_mouse_button_pressed_ = false;
1217 // Release capture first, to avoid confusion if OnMouseReleased blocks. 1226 // Release capture first, to avoid confusion if OnMouseReleased blocks.
1218 if (auto_release_capture_ && native_widget_->HasCapture()) { 1227 if (auto_release_capture_ && native_widget_->HasCapture()) {
1219 base::AutoReset<bool> resetter(&ignore_capture_loss_, true); 1228 base::AutoReset<bool> resetter(&ignore_capture_loss_, true);
1220 native_widget_->ReleaseCapture(); 1229 native_widget_->ReleaseCapture();
1221 } 1230 }
1222 if (root_view) 1231 if (root_view)
1223 root_view->OnMouseReleased(*event); 1232 root_view->OnMouseReleased(*event);
1224 if ((event->flags() & ui::EF_IS_NON_CLIENT) == 0) 1233 if ((event->flags() & ui::EF_IS_NON_CLIENT) == 0)
1225 event->SetHandled(); 1234 event->SetHandled();
1226 return; 1235 return;
1227 1236
1228 case ui::ET_MOUSE_MOVED: 1237 case ui::ET_MOUSE_MOVED:
1229 if (!last_mouse_event_was_move_ || 1238 case ui::ET_MOUSE_DRAGGED:
1230 last_mouse_event_position_ != event->location()) { 1239 if (native_widget_->HasCapture() && is_mouse_button_pressed_) {
1240 last_mouse_event_was_move_ = false;
1241 if (root_view)
1242 root_view->OnMouseDragged(*event);
1243 } else if (!last_mouse_event_was_move_ ||
1244 last_mouse_event_position_ != event->location()) {
1231 last_mouse_event_position_ = event->location(); 1245 last_mouse_event_position_ = event->location();
1232 last_mouse_event_was_move_ = true; 1246 last_mouse_event_was_move_ = true;
1233 if (root_view) 1247 if (root_view)
1234 root_view->OnMouseMoved(*event); 1248 root_view->OnMouseMoved(*event);
1235 } 1249 }
1236 return; 1250 return;
1237 1251
1238 case ui::ET_MOUSE_DRAGGED:
1239 if (root_view)
1240 root_view->OnMouseDragged(*event);
1241 return;
1242
1243 case ui::ET_MOUSE_EXITED: 1252 case ui::ET_MOUSE_EXITED:
1253 last_mouse_event_was_move_ = false;
1244 if (root_view) 1254 if (root_view)
1245 root_view->OnMouseExited(*event); 1255 root_view->OnMouseExited(*event);
1246 return; 1256 return;
1247 1257
1248 case ui::ET_MOUSEWHEEL: 1258 case ui::ET_MOUSEWHEEL:
1249 if (root_view && root_view->OnMouseWheel( 1259 if (root_view && root_view->OnMouseWheel(
1250 static_cast<const ui::MouseWheelEvent&>(*event))) 1260 static_cast<const ui::MouseWheelEvent&>(*event)))
1251 event->SetHandled(); 1261 event->SetHandled();
1252 return; 1262 return;
1253 1263
1254 default: 1264 default:
1255 return; 1265 return;
1256 } 1266 }
1257 } 1267 }
1258 1268
1259 void Widget::OnMouseCaptureLost() { 1269 void Widget::OnMouseCaptureLost() {
1260 if (ignore_capture_loss_) 1270 if (ignore_capture_loss_)
1261 return; 1271 return;
1262 1272
1263 View* root_view = GetRootView(); 1273 View* root_view = GetRootView();
1264 if (root_view) 1274 if (root_view)
1265 root_view->OnMouseCaptureLost(); 1275 root_view->OnMouseCaptureLost();
1276 is_mouse_button_pressed_ = false;
1266 } 1277 }
1267 1278
1268 void Widget::OnScrollEvent(ui::ScrollEvent* event) { 1279 void Widget::OnScrollEvent(ui::ScrollEvent* event) {
1269 ui::ScrollEvent event_copy(*event); 1280 ui::ScrollEvent event_copy(*event);
1270 SendEventToProcessor(&event_copy); 1281 SendEventToProcessor(&event_copy);
1271 1282
1272 // Convert unhandled ui::ET_SCROLL events into ui::ET_MOUSEWHEEL events. 1283 // Convert unhandled ui::ET_SCROLL events into ui::ET_MOUSEWHEEL events.
1273 if (!event_copy.handled() && event_copy.type() == ui::ET_SCROLL) { 1284 if (!event_copy.handled() && event_copy.type() == ui::ET_SCROLL) {
1274 ui::MouseWheelEvent wheel(*event); 1285 ui::MouseWheelEvent wheel(*event);
1275 OnMouseEvent(&wheel); 1286 OnMouseEvent(&wheel);
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1510 1521
1511 //////////////////////////////////////////////////////////////////////////////// 1522 ////////////////////////////////////////////////////////////////////////////////
1512 // internal::NativeWidgetPrivate, NativeWidget implementation: 1523 // internal::NativeWidgetPrivate, NativeWidget implementation:
1513 1524
1514 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { 1525 internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() {
1515 return this; 1526 return this;
1516 } 1527 }
1517 1528
1518 } // namespace internal 1529 } // namespace internal
1519 } // namespace views 1530 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/widget/widget.h ('k') | ui/views/widget/widget_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698