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

Unified Diff: ui/aura/root_window_host_linux.cc

Issue 11192009: linux_aura: Fix tab dragging performance. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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
« no previous file with comments | « no previous file | ui/base/x/x11_util.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura/root_window_host_linux.cc
diff --git a/ui/aura/root_window_host_linux.cc b/ui/aura/root_window_host_linux.cc
index 9b8f3b8a22a4363eea5c6dc5f7149fc6f6843ae7..a85d6ff3b78b9107dd49ac956e9477dd5c50fd97 100644
--- a/ui/aura/root_window_host_linux.cc
+++ b/ui/aura/root_window_host_linux.cc
@@ -31,6 +31,7 @@
#include "ui/base/ui_base_switches.h"
#include "ui/base/view_prop.h"
#include "ui/base/x/valuators.h"
+#include "ui/base/x/x11_util.h"
#include "ui/compositor/dip_util.h"
#include "ui/compositor/layer.h"
#include "ui/gfx/codec/png_codec.h"
@@ -74,91 +75,6 @@ const char* kAtomsToCache[] = {
return target;
}
-// Coalesce all pending motion events (touch or mouse) that are at the top of
-// the queue, and return the number eliminated, storing the last one in
-// |last_event|.
-int CoalescePendingMotionEvents(const XEvent* xev, XEvent* last_event) {
- XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data);
- int num_coalesed = 0;
- Display* display = xev->xany.display;
- int event_type = xev->xgeneric.evtype;
-
-#if defined(USE_XI2_MT)
- float tracking_id = -1;
- if (event_type == XI_TouchUpdate) {
- if (!ui::ValuatorTracker::GetInstance()->ExtractValuator(*xev,
- ui::ValuatorTracker::VAL_TRACKING_ID, &tracking_id))
- tracking_id = -1;
- }
-#endif
-
- while (XPending(display)) {
- XEvent next_event;
- XPeekEvent(display, &next_event);
-
- // If we can't get the cookie, abort the check.
- if (!XGetEventData(next_event.xgeneric.display, &next_event.xcookie))
- return num_coalesed;
-
- // If this isn't from a valid device, throw the event away, as
- // that's what the message pump would do. Device events come in pairs
- // with one from the master and one from the slave so there will
- // always be at least one pending.
- if (!ui::TouchFactory::GetInstance()->ShouldProcessXI2Event(&next_event)) {
- XFreeEventData(display, &next_event.xcookie);
- XNextEvent(display, &next_event);
- continue;
- }
-
- if (next_event.type == GenericEvent &&
- next_event.xgeneric.evtype == event_type &&
- !ui::GetScrollOffsets(&next_event, NULL, NULL)) {
- XIDeviceEvent* next_xievent =
- static_cast<XIDeviceEvent*>(next_event.xcookie.data);
-#if defined(USE_XI2_MT)
- float next_tracking_id = -1;
- if (event_type == XI_TouchUpdate) {
- // If this is a touch motion event (as opposed to mouse motion event),
- // then make sure the events are from the same touch-point.
- if (!ui::ValuatorTracker::GetInstance()->ExtractValuator(next_event,
- ui::ValuatorTracker::VAL_TRACKING_ID, &next_tracking_id))
- next_tracking_id = -1;
- }
-#endif
- // Confirm that the motion event is targeted at the same window
- // and that no buttons or modifiers have changed.
- if (xievent->event == next_xievent->event &&
- xievent->child == next_xievent->child &&
-#if defined(USE_XI2_MT)
- (event_type == XI_Motion || tracking_id == next_tracking_id) &&
-#endif
- xievent->buttons.mask_len == next_xievent->buttons.mask_len &&
- (memcmp(xievent->buttons.mask,
- next_xievent->buttons.mask,
- xievent->buttons.mask_len) == 0) &&
- xievent->mods.base == next_xievent->mods.base &&
- xievent->mods.latched == next_xievent->mods.latched &&
- xievent->mods.locked == next_xievent->mods.locked &&
- xievent->mods.effective == next_xievent->mods.effective) {
- XFreeEventData(display, &next_event.xcookie);
- // Free the previous cookie.
- if (num_coalesed > 0)
- XFreeEventData(display, &last_event->xcookie);
- // Get the event and its cookie data.
- XNextEvent(display, last_event);
- XGetEventData(display, &last_event->xcookie);
- ++num_coalesed;
- continue;
- } else {
- // This isn't an event we want so free its cookie data.
- XFreeEventData(display, &next_event.xcookie);
- }
- }
- break;
- }
- return num_coalesed;
-}
-
void SelectEventsForRootWindow() {
Display* display = ui::GetXDisplay();
::Window root_window = ui::GetX11RootWindow();
@@ -545,7 +461,7 @@ void RootWindowHostLinux::DispatchXI2Event(const base::NativeEvent& event) {
switch (type) {
case ui::ET_TOUCH_MOVED:
- num_coalesced = CoalescePendingMotionEvents(xev, &last_event);
+ num_coalesced = ui::CoalescePendingMotionEvents(xev, &last_event);
if (num_coalesced > 0)
xev = &last_event;
// fallthrough
@@ -584,7 +500,7 @@ void RootWindowHostLinux::DispatchXI2Event(const base::NativeEvent& event) {
if (type == ui::ET_MOUSE_MOVED || type == ui::ET_MOUSE_DRAGGED) {
// If this is a motion event, we want to coalesce all pending motion
// events that are at the top of the queue.
- num_coalesced = CoalescePendingMotionEvents(xev, &last_event);
+ num_coalesced = ui::CoalescePendingMotionEvents(xev, &last_event);
if (num_coalesced > 0)
xev = &last_event;
} else if (type == ui::ET_MOUSE_PRESSED) {
« no previous file with comments | « no previous file | ui/base/x/x11_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698