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

Unified Diff: base/event_synthesis_gtk.cc

Issue 2083012: enable RenderViewTest.OnHandleKeyboardEvent on Linux. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Created 10 years, 7 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: base/event_synthesis_gtk.cc
diff --git a/base/event_synthesis_gtk.cc b/base/event_synthesis_gtk.cc
new file mode 100644
index 0000000000000000000000000000000000000000..20559099e2ab4e82d36d74f694b6447e01f9dc1b
--- /dev/null
+++ b/base/event_synthesis_gtk.cc
@@ -0,0 +1,90 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/event_synthesis_gtk.h"
+
+#include "base/keyboard_code_conversion_gtk.h"
+
+namespace base {
+
+GdkEvent* SynthesizeKeyEvent(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;
+ if (window)
+ g_object_ref(window);
+ event->key.send_event = false;
+
+ struct timespec ts;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ event->key.time = ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
+
+ event->key.state = state;
+ event->key.keyval = gdk_key;
+
+ GdkKeymapKey* keys;
+ gint n_keys;
+ if (event->key.keyval != 0 &&
+ gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(),
+ event->key.keyval, &keys, &n_keys)) {
+ event->key.hardware_keycode = keys[0].keycode;
+ event->key.group = keys[0].group;
+ g_free(keys);
+ }
+
+ return event;
+}
+
+void SynthesizeKeyPressEvents(GdkWindow* window,
+ base::KeyboardCode key,
+ bool control, bool shift, bool alt,
+ std::vector<GdkEvent*>* events) {
+ if (control)
+ events->push_back(
+ SynthesizeKeyEvent(window, true, GDK_Control_L, 0));
+
+ if (shift) {
+ events->push_back(SynthesizeKeyEvent(window, true, GDK_Shift_L,
+ control ? GDK_CONTROL_MASK : 0));
+ }
+
+ if (alt) {
+ guint state = (control ? GDK_CONTROL_MASK : 0) |
+ (shift ? GDK_SHIFT_MASK : 0);
+ events->push_back(
+ SynthesizeKeyEvent(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);
+ events->push_back(SynthesizeKeyEvent(window, true, gdk_key, state));
+ events->push_back(SynthesizeKeyEvent(window, false, gdk_key, state));
+
+ if (alt) {
+ guint state = (control ? GDK_CONTROL_MASK : 0) |
+ (shift ? GDK_SHIFT_MASK : 0) | GDK_MOD1_MASK;
+ events->push_back(
+ SynthesizeKeyEvent(window, false, GDK_Alt_L, state));
+ }
+
+ if (shift) {
+ events->push_back(
+ SynthesizeKeyEvent(window, false, GDK_Shift_L,
+ (control ? GDK_CONTROL_MASK : 0) | GDK_SHIFT_MASK));
+ }
+
+ if (control) {
+ events->push_back(
+ SynthesizeKeyEvent(window, false, GDK_Control_L, GDK_CONTROL_MASK));
+ }
+}
+
+} // namespace base

Powered by Google App Engine
This is Rietveld 408576698