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

Side by Side Diff: ui/events/blink/web_input_event_builders_win.cc

Issue 2782893002: WebMouseEvent coordinates are now fractional & private (Closed)
Patch Set: Rebased, fixed a comment in web_input_event_builders_mac.mm Created 3 years, 8 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/events/blink/web_input_event_builders_win.h" 5 #include "ui/events/blink/web_input_event_builders_win.h"
6 6
7 #include "ui/display/win/screen_win.h" 7 #include "ui/display/win/screen_win.h"
8 #include "ui/events/blink/blink_event_util.h" 8 #include "ui/events/blink/blink_event_util.h"
9 #include "ui/events/event_utils.h" 9 #include "ui/events/event_utils.h"
10 10
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 modifiers |= WebInputEvent::MiddleButtonDown; 163 modifiers |= WebInputEvent::MiddleButtonDown;
164 if (wparam & MK_RBUTTON) 164 if (wparam & MK_RBUTTON)
165 modifiers |= WebInputEvent::RightButtonDown; 165 modifiers |= WebInputEvent::RightButtonDown;
166 166
167 WebMouseEvent result(type, modifiers, time_stamp); 167 WebMouseEvent result(type, modifiers, time_stamp);
168 result.pointerType = pointer_type; 168 result.pointerType = pointer_type;
169 result.button = button; 169 result.button = button;
170 result.id = ui::PointerEvent::kMousePointerId; 170 result.id = ui::PointerEvent::kMousePointerId;
171 171
172 // set position fields: 172 // set position fields:
173 result.x = static_cast<short>(LOWORD(lparam)); 173 result.setPositionInWidget(static_cast<short>(LOWORD(lparam)),
174 result.y = static_cast<short>(HIWORD(lparam)); 174 static_cast<short>(HIWORD(lparam)));
175 175
176 POINT global_point = {result.x, result.y}; 176 POINT global_point = {result.positionInWidget().x,
177 result.positionInWidget().y};
177 ClientToScreen(hwnd, &global_point); 178 ClientToScreen(hwnd, &global_point);
178 179
179 // We need to convert the global point back to DIP before using it. 180 // We need to convert the global point back to DIP before using it.
180 gfx::Point dip_global_point = display::win::ScreenWin::ScreenToDIPPoint( 181 gfx::Point dip_global_point = display::win::ScreenWin::ScreenToDIPPoint(
181 gfx::Point(global_point.x, global_point.y)); 182 gfx::Point(global_point.x, global_point.y));
182 183
183 result.globalX = dip_global_point.x(); 184 result.setPositionInScreen(dip_global_point.x(), dip_global_point.y());
184 result.globalY = dip_global_point.y();
185 185
186 // calculate number of clicks: 186 // calculate number of clicks:
187 187
188 // This differs slightly from the WebKit code in WebKit/win/WebView.cpp 188 // This differs slightly from the WebKit code in WebKit/win/WebView.cpp
189 // where their original code looks buggy. 189 // where their original code looks buggy.
190 static int last_click_position_x; 190 static int last_click_position_x;
191 static int last_click_position_y; 191 static int last_click_position_y;
192 static WebMouseEvent::Button last_click_button = WebMouseEvent::Button::Left; 192 static WebMouseEvent::Button last_click_button = WebMouseEvent::Button::Left;
193 193
194 double current_time = result.timeStampSeconds(); 194 double current_time = result.timeStampSeconds();
195 bool cancel_previous_click = 195 bool cancel_previous_click =
196 (abs(last_click_position_x - result.x) > 196 (abs(last_click_position_x - result.positionInWidget().x) >
197 (::GetSystemMetrics(SM_CXDOUBLECLK) / 2)) || 197 (::GetSystemMetrics(SM_CXDOUBLECLK) / 2)) ||
198 (abs(last_click_position_y - result.y) > 198 (abs(last_click_position_y - result.positionInWidget().y) >
199 (::GetSystemMetrics(SM_CYDOUBLECLK) / 2)) || 199 (::GetSystemMetrics(SM_CYDOUBLECLK) / 2)) ||
200 ((current_time - g_last_click_time) * 1000.0 > ::GetDoubleClickTime()); 200 ((current_time - g_last_click_time) * 1000.0 > ::GetDoubleClickTime());
201 201
202 if (result.type() == WebInputEvent::MouseDown) { 202 if (result.type() == WebInputEvent::MouseDown) {
203 if (!cancel_previous_click && (result.button == last_click_button)) { 203 if (!cancel_previous_click && (result.button == last_click_button)) {
204 ++g_last_click_count; 204 ++g_last_click_count;
205 } else { 205 } else {
206 g_last_click_count = 1; 206 g_last_click_count = 1;
207 last_click_position_x = result.x; 207 last_click_position_x = result.positionInWidget().x;
208 last_click_position_y = result.y; 208 last_click_position_y = result.positionInWidget().y;
209 } 209 }
210 g_last_click_time = current_time; 210 g_last_click_time = current_time;
211 last_click_button = result.button; 211 last_click_button = result.button;
212 } else if (result.type() == WebInputEvent::MouseMove || 212 } else if (result.type() == WebInputEvent::MouseMove ||
213 result.type() == WebInputEvent::MouseLeave) { 213 result.type() == WebInputEvent::MouseLeave) {
214 if (cancel_previous_click) { 214 if (cancel_previous_click) {
215 g_last_click_count = 0; 215 g_last_click_count = 0;
216 last_click_position_x = 0; 216 last_click_position_x = 0;
217 last_click_position_y = 0; 217 last_click_position_y = 0;
218 g_last_click_time = 0; 218 g_last_click_time = 0;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 key_state = 0; 252 key_state = 0;
253 if (GetAsyncKeyState(VK_SHIFT) & 0x8000) 253 if (GetAsyncKeyState(VK_SHIFT) & 0x8000)
254 key_state |= MK_SHIFT; 254 key_state |= MK_SHIFT;
255 if (GetAsyncKeyState(VK_CONTROL) & 0x8000) 255 if (GetAsyncKeyState(VK_CONTROL) & 0x8000)
256 key_state |= MK_CONTROL; 256 key_state |= MK_CONTROL;
257 // NOTE: There doesn't seem to be a way to query the mouse button state 257 // NOTE: There doesn't seem to be a way to query the mouse button state
258 // in this case. 258 // in this case.
259 259
260 POINT cursor_position = {0}; 260 POINT cursor_position = {0};
261 GetCursorPos(&cursor_position); 261 GetCursorPos(&cursor_position);
262 result.globalX = cursor_position.x; 262 result.setPositionInScreen(cursor_position.x, cursor_position.y);
263 result.globalY = cursor_position.y;
264 263
265 switch (LOWORD(wparam)) { 264 switch (LOWORD(wparam)) {
266 case SB_LINEUP: // == SB_LINELEFT 265 case SB_LINEUP: // == SB_LINELEFT
267 wheel_delta = WHEEL_DELTA; 266 wheel_delta = WHEEL_DELTA;
268 break; 267 break;
269 case SB_LINEDOWN: // == SB_LINERIGHT 268 case SB_LINEDOWN: // == SB_LINERIGHT
270 wheel_delta = -WHEEL_DELTA; 269 wheel_delta = -WHEEL_DELTA;
271 break; 270 break;
272 case SB_PAGEUP: 271 case SB_PAGEUP:
273 wheel_delta = 1; 272 wheel_delta = 1;
274 result.scrollByPage = true; 273 result.scrollByPage = true;
275 break; 274 break;
276 case SB_PAGEDOWN: 275 case SB_PAGEDOWN:
277 wheel_delta = -1; 276 wheel_delta = -1;
278 result.scrollByPage = true; 277 result.scrollByPage = true;
279 break; 278 break;
280 default: // We don't supoprt SB_THUMBPOSITION or SB_THUMBTRACK here. 279 default: // We don't supoprt SB_THUMBPOSITION or SB_THUMBTRACK here.
281 wheel_delta = 0; 280 wheel_delta = 0;
282 break; 281 break;
283 } 282 }
284 283
285 if (message == WM_HSCROLL) 284 if (message == WM_HSCROLL)
286 horizontal_scroll = true; 285 horizontal_scroll = true;
287 } else { 286 } else {
288 // Non-synthesized event; we can just read data off the event. 287 // Non-synthesized event; we can just read data off the event.
289 key_state = GET_KEYSTATE_WPARAM(wparam); 288 key_state = GET_KEYSTATE_WPARAM(wparam);
290 289
291 result.globalX = static_cast<short>(LOWORD(lparam)); 290 result.setPositionInScreen(static_cast<short>(LOWORD(lparam)),
292 result.globalY = static_cast<short>(HIWORD(lparam)); 291 static_cast<short>(HIWORD(lparam)));
293 292
294 // Currently we leave hasPreciseScrollingDeltas false, even for trackpad 293 // Currently we leave hasPreciseScrollingDeltas false, even for trackpad
295 // scrolls that generate WM_MOUSEWHEEL, since we don't have a good way to 294 // scrolls that generate WM_MOUSEWHEEL, since we don't have a good way to
296 // distinguish these from real mouse wheels (crbug.com/545234). 295 // distinguish these from real mouse wheels (crbug.com/545234).
297 wheel_delta = static_cast<float>(GET_WHEEL_DELTA_WPARAM(wparam)); 296 wheel_delta = static_cast<float>(GET_WHEEL_DELTA_WPARAM(wparam));
298 297
299 if (message == WM_MOUSEHWHEEL) { 298 if (message == WM_MOUSEHWHEEL) {
300 horizontal_scroll = true; 299 horizontal_scroll = true;
301 wheel_delta = -wheel_delta; // Windows is <- -/+ ->, WebKit <- +/- ->. 300 wheel_delta = -wheel_delta; // Windows is <- -/+ ->, WebKit <- +/- ->.
302 } 301 }
303 } 302 }
304 303
305 // Set modifiers based on key state. 304 // Set modifiers based on key state.
306 int modifiers = result.modifiers(); 305 int modifiers = result.modifiers();
307 if (key_state & MK_SHIFT) 306 if (key_state & MK_SHIFT)
308 modifiers |= WebInputEvent::ShiftKey; 307 modifiers |= WebInputEvent::ShiftKey;
309 if (key_state & MK_CONTROL) 308 if (key_state & MK_CONTROL)
310 modifiers |= WebInputEvent::ControlKey; 309 modifiers |= WebInputEvent::ControlKey;
311 if (key_state & MK_LBUTTON) 310 if (key_state & MK_LBUTTON)
312 modifiers |= WebInputEvent::LeftButtonDown; 311 modifiers |= WebInputEvent::LeftButtonDown;
313 if (key_state & MK_MBUTTON) 312 if (key_state & MK_MBUTTON)
314 modifiers |= WebInputEvent::MiddleButtonDown; 313 modifiers |= WebInputEvent::MiddleButtonDown;
315 if (key_state & MK_RBUTTON) 314 if (key_state & MK_RBUTTON)
316 modifiers |= WebInputEvent::RightButtonDown; 315 modifiers |= WebInputEvent::RightButtonDown;
317 result.setModifiers(modifiers); 316 result.setModifiers(modifiers);
318 317
319 // Set coordinates by translating event coordinates from screen to client. 318 // Set coordinates by translating event coordinates from screen to client.
320 POINT client_point = {result.globalX, result.globalY}; 319 POINT client_point = {result.positionInScreen().x,
320 result.positionInScreen().y};
321 MapWindowPoints(0, hwnd, &client_point, 1); 321 MapWindowPoints(0, hwnd, &client_point, 1);
322 result.x = client_point.x; 322 result.setPositionInWidget(client_point.x, client_point.y);
323 result.y = client_point.y;
324 323
325 // Convert wheel delta amount to a number of pixels to scroll. 324 // Convert wheel delta amount to a number of pixels to scroll.
326 // 325 //
327 // How many pixels should we scroll per line? Gecko uses the height of the 326 // How many pixels should we scroll per line? Gecko uses the height of the
328 // current line, which means scroll distance changes as you go through the 327 // current line, which means scroll distance changes as you go through the
329 // page or go to different pages. IE 8 is ~60 px/line, although the value 328 // page or go to different pages. IE 8 is ~60 px/line, although the value
330 // seems to vary slightly by page and zoom level. Also, IE defaults to 329 // seems to vary slightly by page and zoom level. Also, IE defaults to
331 // smooth scrolling while Firefox doesn't, so it can get away with somewhat 330 // smooth scrolling while Firefox doesn't, so it can get away with somewhat
332 // larger scroll values without feeling as jerky. Here we use 100 px per 331 // larger scroll values without feeling as jerky. Here we use 100 px per
333 // three lines (the default scroll amount is three lines per wheel tick). 332 // three lines (the default scroll amount is three lines per wheel tick).
(...skipping 27 matching lines...) Expand all
361 result.wheelTicksX = wheel_delta; 360 result.wheelTicksX = wheel_delta;
362 } else { 361 } else {
363 result.deltaY = scroll_delta; 362 result.deltaY = scroll_delta;
364 result.wheelTicksY = wheel_delta; 363 result.wheelTicksY = wheel_delta;
365 } 364 }
366 365
367 return result; 366 return result;
368 } 367 }
369 368
370 } // namespace ui 369 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/blink/web_input_event.cc ('k') | ui/events/blink/web_input_event_builders_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698