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

Side by Side Diff: chrome/browser/renderer_host/render_widget_host_view_gtk.cc

Issue 2679003: Peek at the event queue for wheel events for gtk (Closed)
Patch Set: Change name of event routine Created 10 years, 6 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
« no previous file with comments | « chrome/browser/renderer_host/render_widget_host.cc ('k') | chrome/common/chrome_switches.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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "chrome/browser/renderer_host/render_widget_host_view_gtk.h" 5 #include "chrome/browser/renderer_host/render_widget_host_view_gtk.h"
6 6
7 // If this gets included after the gtk headers, then a bunch of compiler 7 // If this gets included after the gtk headers, then a bunch of compiler
8 // errors happen because of a "#define Status int" in Xlib.h, which interacts 8 // errors happen because of a "#define Status int" in Xlib.h, which interacts
9 // badly with URLRequestStatus::Status. 9 // badly with URLRequestStatus::Status.
10 #include "chrome/common/render_messages.h" 10 #include "chrome/common/render_messages.h"
(...skipping 30 matching lines...) Expand all
41 41
42 #if defined(OS_CHROMEOS) 42 #if defined(OS_CHROMEOS)
43 #include "views/widget/tooltip_window_gtk.h" 43 #include "views/widget/tooltip_window_gtk.h"
44 #endif // defined(OS_CHROMEOS) 44 #endif // defined(OS_CHROMEOS)
45 45
46 static const int kMaxWindowWidth = 4000; 46 static const int kMaxWindowWidth = 4000;
47 static const int kMaxWindowHeight = 4000; 47 static const int kMaxWindowHeight = 4000;
48 static const char* kRenderWidgetHostViewKey = "__RENDER_WIDGET_HOST_VIEW__"; 48 static const char* kRenderWidgetHostViewKey = "__RENDER_WIDGET_HOST_VIEW__";
49 49
50 #if defined(OS_CHROMEOS) 50 #if defined(OS_CHROMEOS)
51 static const float kDefaultVertScrollDelta = 20.0; 51 // TODO(davemoore) Under Chromeos we are increasing the rate that the trackpad
52 // generates events to get better precisions. Eventually we will coordinate the
53 // driver and this setting to ensure they match.
54 static const float kDefaultScrollPixelsPerTick = 20;
55 #else
56 // See WebInputEventFactor.cpp for a reason for this being the default
57 // scroll size for linux.
58 static const float kDefaultScrollPixelsPerTick = 160.0f / 3.0f;
52 #endif 59 #endif
53 60
54 using WebKit::WebInputEventFactory; 61 using WebKit::WebInputEventFactory;
55 using WebKit::WebMouseWheelEvent; 62 using WebKit::WebMouseWheelEvent;
56 63
57 // This class is a simple convenience wrapper for Gtk functions. It has only 64 // This class is a simple convenience wrapper for Gtk functions. It has only
58 // static methods. 65 // static methods.
59 class RenderWidgetHostViewGtkWidget { 66 class RenderWidgetHostViewGtkWidget {
60 public: 67 public:
61 static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) { 68 static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) {
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 } 310 }
304 311
305 static gboolean ClientEvent(GtkWidget* widget, GdkEventClient* event, 312 static gboolean ClientEvent(GtkWidget* widget, GdkEventClient* event,
306 RenderWidgetHostViewGtk* host_view) { 313 RenderWidgetHostViewGtk* host_view) {
307 LOG(INFO) << "client event type: " << event->message_type 314 LOG(INFO) << "client event type: " << event->message_type
308 << " data_format: " << event->data_format 315 << " data_format: " << event->data_format
309 << " data: " << event->data.l; 316 << " data: " << event->data.l;
310 return true; 317 return true;
311 } 318 }
312 319
313 #if defined(OS_CHROMEOS)
314 // Allow the vertical scroll delta to be overridden from the command line. 320 // Allow the vertical scroll delta to be overridden from the command line.
315 // This will allow us to test more easily to discover the amount 321 // This will allow us to test more easily to discover the amount
316 // (either hard coded or computed) that's best. 322 // (either hard coded or computed) that's best.
317 static float GetVertScrollDelta() { 323 static float GetScrollPixelsPerTick() {
318 static float vert_scroll_delta = -1; 324 static float scroll_pixels = -1;
319 if (vert_scroll_delta < 0) { 325 if (scroll_pixels < 0) {
320 vert_scroll_delta = kDefaultVertScrollDelta; 326 scroll_pixels = kDefaultScrollPixelsPerTick;
321 CommandLine* command_line = CommandLine::ForCurrentProcess(); 327 CommandLine* command_line = CommandLine::ForCurrentProcess();
322 std::string vert_scroll_option = 328 std::string scroll_pixels_option =
323 command_line->GetSwitchValueASCII(switches::kVertScrollDelta); 329 command_line->GetSwitchValueASCII(switches::kScrollPixels);
324 if (!vert_scroll_option.empty()) { 330 if (!scroll_pixels_option.empty()) {
325 double v; 331 double v;
326 if (StringToDouble(vert_scroll_option, &v)) 332 if (StringToDouble(scroll_pixels_option, &v))
327 vert_scroll_delta = static_cast<float>(v); 333 scroll_pixels = static_cast<float>(v);
328 } 334 }
329 DCHECK_GT(vert_scroll_delta, 0); 335 DCHECK_GT(scroll_pixels, 0);
330 } 336 }
331 return vert_scroll_delta; 337 return scroll_pixels;
332 } 338 }
333 #endif 339
340 // Return the net up / down (or left / right) distance represented by events
341 // in the events will be removed from the queue. We only look at the top of
342 // queue...any other type of event will cause us not to look farther.
343 // If there is a change to the set of modifier keys or scroll axis
344 // in the events we will stop looking as well.
345 static int GetPendingScrollDelta(bool vert, guint current_event_state) {
346 int num_clicks = 0;
347 GdkEvent* event;
348 bool event_coalesced = true;
349 while ((event = gdk_event_get()) && event_coalesced) {
350 event_coalesced = false;
351 if (event->type == GDK_SCROLL) {
352 GdkEventScroll scroll = event->scroll;
353 if (scroll.state & GDK_SHIFT_MASK) {
354 if (scroll.direction == GDK_SCROLL_UP)
355 scroll.direction = GDK_SCROLL_LEFT;
356 else if (scroll.direction == GDK_SCROLL_DOWN)
357 scroll.direction = GDK_SCROLL_RIGHT;
358 }
359 if (vert) {
360 if (scroll.direction == GDK_SCROLL_UP ||
361 scroll.direction == GDK_SCROLL_DOWN) {
362 if (scroll.state == current_event_state) {
363 num_clicks += (scroll.direction == GDK_SCROLL_UP ? 1 : -1);
364 gdk_event_free(event);
365 event_coalesced = true;
366 }
367 }
368 } else {
369 if (scroll.direction == GDK_SCROLL_RIGHT ||
370 scroll.direction == GDK_SCROLL_LEFT) {
371 if (scroll.state == current_event_state) {
372 num_clicks += (scroll.direction == GDK_SCROLL_RIGHT ? 1 : -1);
373 gdk_event_free(event);
374 event_coalesced = true;
375 }
376 }
377 }
378 }
379 }
380 // If we have an event left we put it back on the queue.
381 if (event) {
382 gdk_event_put(event);
383 gdk_event_free(event);
384 }
385 return num_clicks * GetScrollPixelsPerTick();
386 }
334 387
335 static gboolean MouseScrollEvent(GtkWidget* widget, GdkEventScroll* event, 388 static gboolean MouseScrollEvent(GtkWidget* widget, GdkEventScroll* event,
336 RenderWidgetHostViewGtk* host_view) { 389 RenderWidgetHostViewGtk* host_view) {
337 // If the user is holding shift, translate it into a horizontal scroll. We 390 // If the user is holding shift, translate it into a horizontal scroll. We
338 // don't care what other modifiers the user may be holding (zooming is 391 // don't care what other modifiers the user may be holding (zooming is
339 // handled at the TabContentsView level). 392 // handled at the TabContentsView level).
340 if (event->state & GDK_SHIFT_MASK) { 393 if (event->state & GDK_SHIFT_MASK) {
341 if (event->direction == GDK_SCROLL_UP) 394 if (event->direction == GDK_SCROLL_UP)
342 event->direction = GDK_SCROLL_LEFT; 395 event->direction = GDK_SCROLL_LEFT;
343 else if (event->direction == GDK_SCROLL_DOWN) 396 else if (event->direction == GDK_SCROLL_DOWN)
344 event->direction = GDK_SCROLL_RIGHT; 397 event->direction = GDK_SCROLL_RIGHT;
345 } 398 }
346 399
347 WebMouseWheelEvent web_event = WebInputEventFactory::mouseWheelEvent(event); 400 WebMouseWheelEvent web_event = WebInputEventFactory::mouseWheelEvent(event);
348 #if defined (OS_CHROMEOS) 401 // We peek ahead at the top of the queue to look for additional pending
349 // Under ChromeOS we know that the wheel is a touchpad. The driver for this 402 // scroll events.
350 // can generate events very quickly. We configure it to generate more 403 if (event->direction == GDK_SCROLL_UP ||
351 // events and scroll by a smaller amount on each, to give us better 404 event->direction == GDK_SCROLL_DOWN) {
352 // precision. This is only configured for vertical scrolling, and
353 // doesn't apply if we are using the shift modifier to cause a horizontal
354 // scroll.
355 if (!(event->state & GDK_SHIFT_MASK)) {
356 if (event->direction == GDK_SCROLL_UP) 405 if (event->direction == GDK_SCROLL_UP)
357 web_event.deltaY = GetVertScrollDelta(); 406 web_event.deltaY = GetScrollPixelsPerTick();
358 else 407 else
359 web_event.deltaY = -GetVertScrollDelta(); 408 web_event.deltaY = -GetScrollPixelsPerTick();
409 web_event.deltaY += GetPendingScrollDelta(true, event->state);
410 } else {
411 if (event->direction == GDK_SCROLL_RIGHT)
412 web_event.deltaX = GetScrollPixelsPerTick();
413 else
414 web_event.deltaX = -GetScrollPixelsPerTick();
415 web_event.deltaX += GetPendingScrollDelta(false, event->state);
360 } 416 }
361 #endif // OS_CHROMEOS
362 host_view->GetRenderWidgetHost()->ForwardWheelEvent(web_event); 417 host_view->GetRenderWidgetHost()->ForwardWheelEvent(web_event);
363 return FALSE; 418 return FALSE;
364 } 419 }
365 420
366 DISALLOW_IMPLICIT_CONSTRUCTORS(RenderWidgetHostViewGtkWidget); 421 DISALLOW_IMPLICIT_CONSTRUCTORS(RenderWidgetHostViewGtkWidget);
367 }; 422 };
368 423
369 // static 424 // static
370 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( 425 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
371 RenderWidgetHost* widget) { 426 RenderWidgetHost* widget) {
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 } 965 }
911 966
912 // static 967 // static
913 RenderWidgetHostView* 968 RenderWidgetHostView*
914 RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView( 969 RenderWidgetHostView::GetRenderWidgetHostViewFromNativeView(
915 gfx::NativeView widget) { 970 gfx::NativeView widget) {
916 gpointer user_data = g_object_get_data(G_OBJECT(widget), 971 gpointer user_data = g_object_get_data(G_OBJECT(widget),
917 kRenderWidgetHostViewKey); 972 kRenderWidgetHostViewKey);
918 return reinterpret_cast<RenderWidgetHostView*>(user_data); 973 return reinterpret_cast<RenderWidgetHostView*>(user_data);
919 } 974 }
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/render_widget_host.cc ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698