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

Unified Diff: remoting/host/event_executor_linux.cc

Issue 6697024: client-side wheel mouse support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: acculumate subticks Created 9 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
Index: remoting/host/event_executor_linux.cc
diff --git a/remoting/host/event_executor_linux.cc b/remoting/host/event_executor_linux.cc
index 2321c5c0ec3dd2d059f237e47c7f5d1456a773e7..2eaf83e3ae2050edd3c2ca5c7c5105fde6de42df 100644
--- a/remoting/host/event_executor_linux.cc
+++ b/remoting/host/event_executor_linux.cc
@@ -36,6 +36,8 @@ class EventExecutorLinux : public EventExecutor {
virtual void InjectMouseEvent(const MouseEvent& event) OVERRIDE;
private:
+ void InjectScrollWheelClicks(int button, int count);
+
MessageLoop* message_loop_;
Capturer* capturer_;
@@ -68,6 +70,16 @@ int MouseButtonToX11ButtonNumber(MouseEvent::MouseButton button) {
}
}
+int ScrollWheelToX11ButtonNumber(int dx, int dy) {
Wez 2011/10/14 21:42:54 Split this into two separate functions for clarity
+ // Horizontal scroll wheel.
+ if (dx != 0)
+ return (dx > 0 ? 6 : 7);
+
+ // Positive y-values are wheel scroll-up events (button 4), negative y-values
+ // are wheel scroll-down events (button 5).
+ return (dy > 0 ? 4 : 5);
+}
+
// Hard-coded mapping from Virtual Key codes to X11 KeySyms.
// This mapping is only valid if both client and host are using a
// US English keyboard layout.
@@ -309,6 +321,15 @@ void EventExecutorLinux::InjectKeyEvent(const KeyEvent& event) {
XFlush(display_);
}
+void EventExecutorLinux::InjectScrollWheelClicks(int button, int count) {
+ for (int i = 0; i < count; i++) {
+ // Generate a button-down and a button-up to simulate a wheel click.
+ XTestFakeButtonEvent(display_, button, true, CurrentTime);
+ XTestFakeButtonEvent(display_, button, false, CurrentTime);
+ }
+ XFlush(display_);
+}
+
void EventExecutorLinux::InjectMouseEvent(const MouseEvent& event) {
if (MessageLoop::current() != message_loop_) {
message_loop_->PostTask(
@@ -339,8 +360,7 @@ void EventExecutorLinux::InjectMouseEvent(const MouseEvent& event) {
int button_number = MouseButtonToX11ButtonNumber(event.button());
if (button_number < 0) {
- LOG(WARNING) << "Ignoring unknown button type: "
- << event.button();
+ LOG(WARNING) << "Ignoring unknown button type: " << event.button();
return;
}
@@ -353,8 +373,15 @@ void EventExecutorLinux::InjectMouseEvent(const MouseEvent& event) {
XFlush(display_);
}
- if (event.has_wheel_offset_x() && event.has_wheel_offset_y()) {
- NOTIMPLEMENTED() << "No scroll wheel support yet.";
+ if (event.has_wheel_offset_y() && event.wheel_offset_y() != 0) {
+ int dy = event.wheel_offset_y();
+ InjectScrollWheelClicks(ScrollWheelToX11ButtonNumber(0, dy),
+ (dy > 0) ? dy : -dy);
Lambros 2011/10/14 21:00:25 Optional nit: Maybe use abs() from <stdlib.h> or <
+ }
+ if (event.has_wheel_offset_x() && event.wheel_offset_x() != 0) {
+ int dx = event.wheel_offset_x();
+ InjectScrollWheelClicks(ScrollWheelToX11ButtonNumber(dx, 0),
+ (dx > 0) ? dx : -dx);
}
}

Powered by Google App Engine
This is Rietveld 408576698