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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: ui/views/win/hwnd_message_handler.cc
===================================================================
--- ui/views/win/hwnd_message_handler.cc (revision 243629)
+++ ui/views/win/hwnd_message_handler.cc (working copy)
@@ -299,6 +299,24 @@
// The thickness of an auto-hide taskbar in pixels.
const int kAutoHideTaskbarThicknessPx = 2;
+bool IsTopLevelWindow(HWND window) {
+ long style = GetWindowLong(window, GWL_STYLE);
+ if (!(style & WS_CHILD))
+ return true;
+
+ HWND parent = GetParent(window);
+ return !parent || (parent == GetDesktopWindow());
+}
+
+void AddScrollStylesToWindow(HWND window) {
+ if (::IsWindow(window)) {
+ DCHECK(IsTopLevelWindow(window));
+ long current_style = ::GetWindowLong(window, GWL_STYLE);
+ ::SetWindowLong(window, GWL_STYLE,
+ current_style | WS_VSCROLL | WS_HSCROLL);
+ }
+}
+
} // namespace
// A scoping class that prevents a window from being able to redraw in response
@@ -1343,6 +1361,21 @@
delegate_->HandleCreate();
+#if defined(USE_AURA)
sky 2014/01/10 16:43:21 Can this be moved to CalculateWindowStylesFromInit
ananta 2014/01/10 18:59:21 Done.
+ // Certain trackpad drivers on Windows have bugs where in they don't generate
+ // WM_MOUSEWHEEL messages for the trackpoint and trackpad scrolling gestures
+ // unless there is an entry for Chrome with the class name of the Window.
+ // These drivers check if the window under the trackpoint has the WS_VSCROLL/
+ // WS_HSCROLL style and if yes they generate the legacy WM_VSCROLL/WM_HSCROLL
+ // messages. We want the style to be present on the window. However we don't
+ // want Windows to draw the scrollbars. To achieve this we hide the scroll
+ // bars and readd them to the window style in a posted task which works.
+ if (IsTopLevelWindow(hwnd())) {
+ long current_style = ::GetWindowLong(hwnd(), GWL_STYLE);
+ ::SetWindowLong(hwnd(), GWL_STYLE,
+ current_style | WS_VSCROLL | WS_HSCROLL);
+ }
+#endif
// TODO(beng): move more of NWW::OnCreate here.
return 0;
}
@@ -2042,6 +2075,23 @@
// ResetWindowRegion is going to trigger WM_NCPAINT. By doing it after we've
// invoked OnSize we ensure the RootView has been laid out.
ResetWindowRegion(false, true);
+
+#if defined(USE_AURA)
+ // As documented in the HWNDMessageHandler::OnCreate function, we add the
+ // WS_VSCROLL and WS_HSCROLL styles to the window to ensure that legacy track
+ // pad/trackpoint drivers generate the WM_VSCROLL and WM_HSCROLL messages.
+ // We want the style to be present on the window. However we don't want
+ // Windows to draw the scrollbars. To achieve this we hide the scroll bars
sky 2014/01/10 16:43:21 Could we instead set the scrollbar sizes to 0?
ananta 2014/01/10 18:59:21 Tricky to do that. The non AURA code did this in t
+ // and readd them to the window style in a posted task which works.
+ if (IsTopLevelWindow(hwnd())) {
+ BOOL visible = ::IsWindowVisible(hwnd());
+ ShowScrollBar(hwnd(), SB_BOTH, FALSE);
+ long current_style = ::GetWindowLong(hwnd(), GWL_STYLE);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&AddScrollStylesToWindow, hwnd()));
+#endif
+ }
}
void HWNDMessageHandler::OnSysCommand(UINT notification_code,
@@ -2255,6 +2305,15 @@
SetMsgHandled(FALSE);
}
+LRESULT HWNDMessageHandler::OnScrollMessage(UINT message,
+ WPARAM w_param,
+ LPARAM l_param) {
+ MSG msg = { hwnd(), message, w_param, l_param, GetMessageTime() };
+ ui::ScrollEvent event(msg);
+ delegate_->HandleScrollEvent(event);
+ return 0;
+}
+
void HWNDMessageHandler::HandleTouchEvents(const TouchEvents& touch_events) {
base::WeakPtr<HWNDMessageHandler> ref(weak_factory_.GetWeakPtr());
for (size_t i = 0; i < touch_events.size() && ref; ++i)

Powered by Google App Engine
This is Rietveld 408576698