Index: chrome/browser/automation/ui_controls_linux.cc |
diff --git a/chrome/browser/automation/ui_controls_linux.cc b/chrome/browser/automation/ui_controls_linux.cc |
index 973c1f4651a9d90fbf57747014353c53f47346a5..c9dca787a52e31a91fbaec43c0d5a7ea475e1711 100644 |
--- a/chrome/browser/automation/ui_controls_linux.cc |
+++ b/chrome/browser/automation/ui_controls_linux.cc |
@@ -8,6 +8,7 @@ |
#include <gdk/gdkkeysyms.h> |
#include "gfx/rect.h" |
+#include "base/event_synthesis_gtk.h" |
#include "base/keyboard_code_conversion_gtk.h" |
#include "base/logging.h" |
#include "base/message_loop.h" |
@@ -82,34 +83,6 @@ class ClickTask : public Task { |
Task* followup_; |
}; |
-bool SendKeyEvent(GdkWindow* window, bool press, guint gdk_key, guint state) { |
- GdkEvent* event = gdk_event_new(press ? GDK_KEY_PRESS : GDK_KEY_RELEASE); |
- |
- event->key.type = press ? GDK_KEY_PRESS : GDK_KEY_RELEASE; |
- event->key.window = window; |
- g_object_ref(event->key.window); |
- event->key.send_event = false; |
- event->key.time = gtk_util::XTimeNow(); |
- |
- event->key.state = state; |
- event->key.keyval = gdk_key; |
- |
- GdkKeymapKey* keys; |
- gint n_keys; |
- if (!gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), |
- event->key.keyval, &keys, &n_keys)) { |
- return false; |
- } |
- event->key.hardware_keycode = keys[0].keycode; |
- event->key.group = keys[0].group; |
- g_free(keys); |
- |
- gdk_event_put(event); |
- // gdk_event_put appends a copy of the event. |
- gdk_event_free(event); |
- return true; |
-} |
- |
void FakeAMouseMotionEvent(gint x, gint y) { |
GdkEvent* event = gdk_event_new(GDK_MOTION_NOTIFY); |
@@ -171,48 +144,17 @@ bool SendKeyPress(gfx::NativeWindow window, |
return false; |
} |
- bool rv = true; |
- |
- if (control) |
- rv = rv && SendKeyEvent(event_window, true, GDK_Control_L, 0); |
- |
- if (shift) { |
- rv = rv && SendKeyEvent(event_window, true, GDK_Shift_L, |
- control ? GDK_CONTROL_MASK : 0); |
- } |
- |
- if (alt) { |
- guint state = (control ? GDK_CONTROL_MASK : 0) | |
- (shift ? GDK_SHIFT_MASK : 0); |
- rv = rv && SendKeyEvent(event_window, true, GDK_Alt_L, state); |
- } |
- |
- // TODO(estade): handle other state flags besides control, shift, alt? |
- // For example caps lock. |
- guint state = (control ? GDK_CONTROL_MASK : 0) | |
- (shift ? GDK_SHIFT_MASK : 0) | |
- (alt ? GDK_MOD1_MASK : 0); |
- |
- guint gdk_key = base::GdkKeyCodeForWindowsKeyCode(key, shift); |
- rv = rv && SendKeyEvent(event_window, true, gdk_key, state); |
- rv = rv && SendKeyEvent(event_window, false, gdk_key, state); |
- |
- if (alt) { |
- guint state = (control ? GDK_CONTROL_MASK : 0) | |
- (shift ? GDK_SHIFT_MASK : 0) | GDK_MOD1_MASK; |
- rv = rv && SendKeyEvent(event_window, false, GDK_Alt_L, state); |
+ std::vector<GdkEvent*> events; |
+ base::SynthesizeKeyPressEvents(event_window, key, control, shift, alt, |
+ &events); |
+ for (std::vector<GdkEvent*>::iterator iter = events.begin(); |
+ iter != events.end(); ++iter) { |
+ gdk_event_put(*iter); |
+ // gdk_event_put appends a copy of the event. |
+ gdk_event_free(*iter); |
} |
- if (shift) { |
- rv = rv && SendKeyEvent(event_window, false, GDK_Shift_L, |
- (control ? GDK_CONTROL_MASK : 0) | GDK_SHIFT_MASK); |
- } |
- |
- if (control) |
- rv = rv && SendKeyEvent(event_window, false, GDK_Control_L, |
- GDK_CONTROL_MASK); |
- |
- return rv; |
+ return true; |
} |
bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window, |