Index: trunk/src/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc |
=================================================================== |
--- trunk/src/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc (revision 255397) |
+++ trunk/src/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc (working copy) |
@@ -18,6 +18,7 @@ |
#include "third_party/skia/include/core/SkPath.h" |
#include "ui/aura/client/cursor_client.h" |
#include "ui/aura/client/focus_client.h" |
+#include "ui/aura/client/user_action_client.h" |
#include "ui/aura/window.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/aura/window_property.h" |
@@ -64,6 +65,10 @@ |
namespace { |
+// Standard Linux mouse buttons for going back and forward. |
+const int kBackMouseButton = 8; |
+const int kForwardMouseButton = 9; |
+ |
// Constants that are part of EWMH. |
const int k_NET_WM_STATE_ADD = 1; |
const int k_NET_WM_STATE_REMOVE = 0; |
@@ -1296,7 +1301,20 @@ |
SendEventToProcessor(&keyup_event); |
break; |
} |
- case ButtonPress: |
+ case ButtonPress: { |
+ if (static_cast<int>(xev->xbutton.button) == kBackMouseButton || |
+ static_cast<int>(xev->xbutton.button) == kForwardMouseButton) { |
+ aura::client::UserActionClient* gesture_client = |
+ aura::client::GetUserActionClient(dispatcher_->window()); |
+ if (gesture_client) { |
+ gesture_client->OnUserAction( |
+ static_cast<int>(xev->xbutton.button) == kBackMouseButton ? |
+ aura::client::UserActionClient::BACK : |
+ aura::client::UserActionClient::FORWARD); |
+ } |
+ break; |
+ } |
+ } // fallthrough |
case ButtonRelease: { |
ui::EventType event_type = ui::EventTypeFromNative(xev); |
switch (event_type) { |
@@ -1389,6 +1407,33 @@ |
num_coalesced = ui::CoalescePendingMotionEvents(xev, &last_event); |
if (num_coalesced > 0) |
xev = &last_event; |
+ } else if (type == ui::ET_MOUSE_PRESSED) { |
+ XIDeviceEvent* xievent = |
+ static_cast<XIDeviceEvent*>(xev->xcookie.data); |
+ int button = xievent->detail; |
+ if (button == kBackMouseButton || button == kForwardMouseButton) { |
+ aura::client::UserActionClient* gesture_client = |
+ aura::client::GetUserActionClient(window()); |
+ if (gesture_client) { |
+ bool reverse_direction = |
+ ui::IsTouchpadEvent(xev) && ui::IsNaturalScrollEnabled(); |
+ gesture_client->OnUserAction( |
+ (button == kBackMouseButton && !reverse_direction) || |
+ (button == kForwardMouseButton && reverse_direction) ? |
+ aura::client::UserActionClient::BACK : |
+ aura::client::UserActionClient::FORWARD); |
+ } |
+ break; |
+ } |
+ } else if (type == ui::ET_MOUSE_RELEASED) { |
+ XIDeviceEvent* xievent = |
+ static_cast<XIDeviceEvent*>(xev->xcookie.data); |
+ int button = xievent->detail; |
+ if (button == kBackMouseButton || button == kForwardMouseButton) { |
+ // We've already passed the back/forward mouse down to the user |
+ // action client; we want to swallow the corresponding release. |
+ break; |
+ } |
} |
ui::MouseEvent mouseev(xev); |
DispatchMouseEvent(&mouseev); |