Index: content/browser/renderer_host/input/motion_event_android.cc |
diff --git a/content/browser/renderer_host/input/motion_event_android.cc b/content/browser/renderer_host/input/motion_event_android.cc |
index 249b20e4df0a2e810a1c62dc1b74b676d9078b6f..498b838a7fdf2da9aec0ef5162bb378e71d90c37 100644 |
--- a/content/browser/renderer_host/input/motion_event_android.cc |
+++ b/content/browser/renderer_host/input/motion_event_android.cc |
@@ -4,9 +4,12 @@ |
#include "content/browser/renderer_host/input/motion_event_android.h" |
+#include <android/input.h> |
+ |
#include "base/android/jni_android.h" |
#include "base/float_util.h" |
#include "jni/MotionEvent_jni.h" |
+#include "ui/events/event_constants.h" |
using base::android::AttachCurrentThread; |
using namespace JNI_MotionEvent; |
@@ -89,6 +92,21 @@ int FromAndroidButtonState(int button_state) { |
return result; |
} |
+int FromAndroidMetaState(int meta_state) { |
+ int flags = ui::EF_NONE; |
+ if ((meta_state & AMETA_SHIFT_ON) != 0) |
+ flags |= ui::EF_SHIFT_DOWN; |
+ if ((meta_state & AMETA_CTRL_ON) != 0) |
+ flags |= ui::EF_CONTROL_DOWN; |
+ if ((meta_state & AMETA_ALT_ON) != 0) |
+ flags |= ui::EF_ALT_DOWN; |
+ if ((meta_state & AMETA_META_ON) != 0) |
+ flags |= ui::EF_COMMAND_DOWN; |
+ if ((meta_state & AMETA_CAPS_LOCK_ON) != 0) |
+ flags |= ui::EF_CAPS_LOCK_DOWN; |
+ return flags; |
+} |
+ |
int64 ToAndroidTime(base::TimeTicks time) { |
return (time - base::TimeTicks()).InMilliseconds(); |
} |
@@ -127,13 +145,15 @@ MotionEventAndroid::MotionEventAndroid(float pix_to_dip, |
jfloat raw_pos_y_pixels, |
jint android_tool_type_0, |
jint android_tool_type_1, |
- jint android_button_state) |
+ jint android_button_state, |
+ jint meta_state) |
: cached_time_(FromAndroidTime(time_ms)), |
cached_action_(FromAndroidAction(android_action)), |
cached_pointer_count_(pointer_count), |
cached_history_size_(history_size), |
cached_action_index_(action_index), |
cached_button_state_(FromAndroidButtonState(android_button_state)), |
+ cached_flags_(FromAndroidMetaState(meta_state)), |
pix_to_dip_(pix_to_dip), |
should_recycle_(false) { |
DCHECK_GT(pointer_count, 0); |
@@ -170,6 +190,8 @@ MotionEventAndroid::MotionEventAndroid(float pix_to_dip, |
cached_action_index_(Java_MotionEvent_getActionIndex(env, event)), |
cached_button_state_( |
FromAndroidButtonState(Java_MotionEvent_getButtonState(env, event))), |
+ cached_flags_( |
+ FromAndroidMetaState(Java_MotionEvent_getMetaState(env, event))), |
pix_to_dip_(pix_to_dip), |
should_recycle_(true) { |
event_.Reset(env, event); |
@@ -213,6 +235,7 @@ MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other) |
cached_action_index_(other.cached_action_index_), |
cached_raw_position_offset_(other.cached_raw_position_offset_), |
cached_button_state_(other.cached_button_state_), |
+ cached_flags_(other.cached_flags_), |
pix_to_dip_(other.pix_to_dip_), |
should_recycle_(true) { |
DCHECK(event_.obj()); |
@@ -355,6 +378,10 @@ int MotionEventAndroid::GetButtonState() const { |
return cached_button_state_; |
} |
+int MotionEventAndroid::GetFlags() const { |
+ return cached_flags_; |
+} |
+ |
scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const { |
return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this)); |
} |