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

Side by Side Diff: ui/views/win/hwnd_message_handler.cc

Issue 133053004: Ensure that trackpad and trackpoint scrolling works on Windows desktop Aura with legacy trackpad dr… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 6 years, 11 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 | « ui/views/win/hwnd_message_handler.h ('k') | ui/views/win/hwnd_message_handler_delegate.h » ('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/win/hwnd_message_handler.h" 5 #include "ui/views/win/hwnd_message_handler.h"
6 6
7 #include <dwmapi.h> 7 #include <dwmapi.h>
8 #include <shellapi.h> 8 #include <shellapi.h>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 } 292 }
293 293
294 return false; 294 return false;
295 } 295 }
296 296
297 #endif 297 #endif
298 298
299 // The thickness of an auto-hide taskbar in pixels. 299 // The thickness of an auto-hide taskbar in pixels.
300 const int kAutoHideTaskbarThicknessPx = 2; 300 const int kAutoHideTaskbarThicknessPx = 2;
301 301
302 bool IsTopLevelWindow(HWND window) {
303 long style = GetWindowLong(window, GWL_STYLE);
cpu_(ooo_6.6-7.5) 2014/01/11 01:34:30 use :: For Windows calls here and in 306, 307
ananta 2014/01/11 01:36:21 Done.
304 if (!(style & WS_CHILD))
305 return true;
306 HWND parent = GetParent(window);
307 return !parent || (parent == GetDesktopWindow());
308 }
309
310 void AddScrollStylesToWindow(HWND window) {
311 if (::IsWindow(window)) {
312 long current_style = ::GetWindowLong(window, GWL_STYLE);
313 ::SetWindowLong(window, GWL_STYLE,
314 current_style | WS_VSCROLL | WS_HSCROLL);
315 }
316 }
317
302 } // namespace 318 } // namespace
303 319
304 // A scoping class that prevents a window from being able to redraw in response 320 // A scoping class that prevents a window from being able to redraw in response
305 // to invalidations that may occur within it for the lifetime of the object. 321 // to invalidations that may occur within it for the lifetime of the object.
306 // 322 //
307 // Why would we want such a thing? Well, it turns out Windows has some 323 // Why would we want such a thing? Well, it turns out Windows has some
308 // "unorthodox" behavior when it comes to painting its non-client areas. 324 // "unorthodox" behavior when it comes to painting its non-client areas.
309 // Occasionally, Windows will paint portions of the default non-client area 325 // Occasionally, Windows will paint portions of the default non-client area
310 // right over the top of the custom frame. This is not simply fixed by handling 326 // right over the top of the custom frame. This is not simply fixed by handling
311 // WM_NCPAINT/WM_PAINT, with some investigation it turns out that this 327 // WM_NCPAINT/WM_PAINT, with some investigation it turns out that this
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 is_right_mouse_pressed_on_caption_(false), 399 is_right_mouse_pressed_on_caption_(false),
384 lock_updates_count_(0), 400 lock_updates_count_(0),
385 ignore_window_pos_changes_(false), 401 ignore_window_pos_changes_(false),
386 last_monitor_(NULL), 402 last_monitor_(NULL),
387 use_layered_buffer_(false), 403 use_layered_buffer_(false),
388 layered_alpha_(255), 404 layered_alpha_(255),
389 waiting_for_redraw_layered_window_contents_(false), 405 waiting_for_redraw_layered_window_contents_(false),
390 is_first_nccalc_(true), 406 is_first_nccalc_(true),
391 menu_depth_(0), 407 menu_depth_(0),
392 autohide_factory_(this), 408 autohide_factory_(this),
393 id_generator_(0) { 409 id_generator_(0),
410 scroll_styles_set_(false) {
394 } 411 }
395 412
396 HWNDMessageHandler::~HWNDMessageHandler() { 413 HWNDMessageHandler::~HWNDMessageHandler() {
397 delegate_ = NULL; 414 delegate_ = NULL;
398 // Prevent calls back into this class via WNDPROC now that we've been 415 // Prevent calls back into this class via WNDPROC now that we've been
399 // destroyed. 416 // destroyed.
400 ClearUserData(); 417 ClearUserData();
401 } 418 }
402 419
403 void HWNDMessageHandler::Init(HWND parent, const gfx::Rect& bounds) { 420 void HWNDMessageHandler::Init(HWND parent, const gfx::Rect& bounds) {
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 #if !defined(USE_AURA) 1353 #if !defined(USE_AURA)
1337 // We need to add ourselves as a message loop observer so that we can repaint 1354 // We need to add ourselves as a message loop observer so that we can repaint
1338 // aggressively if the contents of our window become invalid. Unfortunately 1355 // aggressively if the contents of our window become invalid. Unfortunately
1339 // WM_PAINT messages are starved and we get flickery redrawing when resizing 1356 // WM_PAINT messages are starved and we get flickery redrawing when resizing
1340 // if we do not do this. 1357 // if we do not do this.
1341 base::MessageLoopForUI::current()->AddObserver(this); 1358 base::MessageLoopForUI::current()->AddObserver(this);
1342 #endif 1359 #endif
1343 1360
1344 delegate_->HandleCreate(); 1361 delegate_->HandleCreate();
1345 1362
1363 #if defined(USE_AURA)
1364 // Certain trackpad drivers on Windows have bugs where in they don't generate
1365 // WM_MOUSEWHEEL messages for the trackpoint and trackpad scrolling gestures
1366 // unless there is an entry for Chrome with the class name of the Window.
1367 // These drivers check if the window under the trackpoint has the WS_VSCROLL/
1368 // WS_HSCROLL style and if yes they generate the legacy WM_VSCROLL/WM_HSCROLL
1369 // messages. We add these styles to ensure that trackpad/trackpoint scrolling
1370 // work.
1371 // TODO(ananta)
1372 // Look into moving the WS_VSCROLL and WS_HSCROLL style setting logic to the
1373 // CalculateWindowStylesFromInitParams function. Doing it there seems to
1374 // cause some interactive tests to fail. Investigation needed.
1375 if (IsTopLevelWindow(hwnd())) {
1376 long current_style = ::GetWindowLong(hwnd(), GWL_STYLE);
1377 ::SetWindowLong(hwnd(), GWL_STYLE,
1378 current_style | WS_VSCROLL | WS_HSCROLL);
1379 scroll_styles_set_ = true;
1380 }
1381 #endif
1346 // TODO(beng): move more of NWW::OnCreate here. 1382 // TODO(beng): move more of NWW::OnCreate here.
1347 return 0; 1383 return 0;
1348 } 1384 }
1349 1385
1350 void HWNDMessageHandler::OnDestroy() { 1386 void HWNDMessageHandler::OnDestroy() {
1351 delegate_->HandleDestroying(); 1387 delegate_->HandleDestroying();
1352 } 1388 }
1353 1389
1354 void HWNDMessageHandler::OnDisplayChange(UINT bits_per_pixel, 1390 void HWNDMessageHandler::OnDisplayChange(UINT bits_per_pixel,
1355 const CSize& screen_size) { 1391 const CSize& screen_size) {
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
1958 EndPaint(hwnd(), &ps); 1994 EndPaint(hwnd(), &ps);
1959 } 1995 }
1960 1996
1961 LRESULT HWNDMessageHandler::OnReflectedMessage(UINT message, 1997 LRESULT HWNDMessageHandler::OnReflectedMessage(UINT message,
1962 WPARAM w_param, 1998 WPARAM w_param,
1963 LPARAM l_param) { 1999 LPARAM l_param) {
1964 SetMsgHandled(FALSE); 2000 SetMsgHandled(FALSE);
1965 return 0; 2001 return 0;
1966 } 2002 }
1967 2003
2004 LRESULT HWNDMessageHandler::OnScrollMessage(UINT message,
2005 WPARAM w_param,
2006 LPARAM l_param) {
2007 MSG msg = { hwnd(), message, w_param, l_param, GetMessageTime() };
2008 ui::ScrollEvent event(msg);
2009 delegate_->HandleScrollEvent(event);
2010 return 0;
2011 }
2012
1968 LRESULT HWNDMessageHandler::OnSetCursor(UINT message, 2013 LRESULT HWNDMessageHandler::OnSetCursor(UINT message,
1969 WPARAM w_param, 2014 WPARAM w_param,
1970 LPARAM l_param) { 2015 LPARAM l_param) {
1971 // Reimplement the necessary default behavior here. Calling DefWindowProc can 2016 // Reimplement the necessary default behavior here. Calling DefWindowProc can
1972 // trigger weird non-client painting for non-glass windows with custom frames. 2017 // trigger weird non-client painting for non-glass windows with custom frames.
1973 // Using a ScopedRedrawLock to prevent caption rendering artifacts may allow 2018 // Using a ScopedRedrawLock to prevent caption rendering artifacts may allow
1974 // content behind this window to incorrectly paint in front of this window. 2019 // content behind this window to incorrectly paint in front of this window.
1975 // Invalidating the window to paint over either set of artifacts is not ideal. 2020 // Invalidating the window to paint over either set of artifacts is not ideal.
1976 wchar_t* cursor = IDC_ARROW; 2021 wchar_t* cursor = IDC_ARROW;
1977 switch (LOWORD(l_param)) { 2022 switch (LOWORD(l_param)) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 delegate_->HandleWorkAreaChanged(); 2080 delegate_->HandleWorkAreaChanged();
2036 SetMsgHandled(FALSE); 2081 SetMsgHandled(FALSE);
2037 } 2082 }
2038 } 2083 }
2039 2084
2040 void HWNDMessageHandler::OnSize(UINT param, const CSize& size) { 2085 void HWNDMessageHandler::OnSize(UINT param, const CSize& size) {
2041 RedrawWindow(hwnd(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); 2086 RedrawWindow(hwnd(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
2042 // ResetWindowRegion is going to trigger WM_NCPAINT. By doing it after we've 2087 // ResetWindowRegion is going to trigger WM_NCPAINT. By doing it after we've
2043 // invoked OnSize we ensure the RootView has been laid out. 2088 // invoked OnSize we ensure the RootView has been laid out.
2044 ResetWindowRegion(false, true); 2089 ResetWindowRegion(false, true);
2090
2091 #if defined(USE_AURA)
2092 // We add the WS_VSCROLL and WS_HSCROLL styles to top level windows to ensure
2093 // that legacy trackpad/trackpoint drivers generate the WM_VSCROLL and
2094 // WM_HSCROLL messages and scrolling works.
2095 // We want the style to be present on the window. However we don't want
2096 // Windows to draw the scrollbars. To achieve this we hide the scroll bars
2097 // and readd them to the window style in a posted task which works.
2098 if (scroll_styles_set_) {
2099 ShowScrollBar(hwnd(), SB_BOTH, FALSE);
2100 base::MessageLoop::current()->PostTask(
2101 FROM_HERE,
2102 base::Bind(&AddScrollStylesToWindow, hwnd()));
2103 #endif
2104 }
2045 } 2105 }
2046 2106
2047 void HWNDMessageHandler::OnSysCommand(UINT notification_code, 2107 void HWNDMessageHandler::OnSysCommand(UINT notification_code,
2048 const CPoint& point) { 2108 const CPoint& point) {
2049 if (!delegate_->ShouldHandleSystemCommands()) 2109 if (!delegate_->ShouldHandleSystemCommands())
2050 return; 2110 return;
2051 2111
2052 // Windows uses the 4 lower order bits of |notification_code| for type- 2112 // Windows uses the 4 lower order bits of |notification_code| for type-
2053 // specific information so we must exclude this when comparing. 2113 // specific information so we must exclude this when comparing.
2054 static const int sc_mask = 0xFFF0; 2114 static const int sc_mask = 0xFFF0;
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
2255 SetMsgHandled(FALSE); 2315 SetMsgHandled(FALSE);
2256 } 2316 }
2257 2317
2258 void HWNDMessageHandler::HandleTouchEvents(const TouchEvents& touch_events) { 2318 void HWNDMessageHandler::HandleTouchEvents(const TouchEvents& touch_events) {
2259 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr()); 2319 base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr());
2260 for (size_t i = 0; i < touch_events.size() && ref; ++i) 2320 for (size_t i = 0; i < touch_events.size() && ref; ++i)
2261 delegate_->HandleTouchEvent(touch_events[i]); 2321 delegate_->HandleTouchEvent(touch_events[i]);
2262 } 2322 }
2263 2323
2264 } // namespace views 2324 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/win/hwnd_message_handler.h ('k') | ui/views/win/hwnd_message_handler_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698