[gtk+] win32: provide an implementation for gdk_test_simulate_key().
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] win32: provide an implementation for gdk_test_simulate_key().
- Date: Tue, 23 Sep 2014 01:22:48 +0000 (UTC)
commit c87c5cd0ba79ec652617dfe282b46fe94e5854c9
Author: Jehan <jehan girinstud io>
Date: Fri Aug 15 19:58:11 2014 +0000
win32: provide an implementation for gdk_test_simulate_key().
https://bugzilla.gnome.org/show_bug.cgi?id=734879
gdk/win32/gdktestutils-win32.c | 79 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 78 insertions(+), 1 deletions(-)
---
diff --git a/gdk/win32/gdktestutils-win32.c b/gdk/win32/gdktestutils-win32.c
index e1e574a..6e4729d 100644
--- a/gdk/win32/gdktestutils-win32.c
+++ b/gdk/win32/gdktestutils-win32.c
@@ -30,9 +30,86 @@ _gdk_win32_window_simulate_key (GdkWindow *window,
GdkModifierType modifiers,
GdkEventType key_pressrelease)
{
+ gboolean success = FALSE;
+ GdkKeymapKey *keys = NULL;
+ gint n_keys = 0;
+ INPUT ip;
+ gint i;
+
g_return_val_if_fail (key_pressrelease == GDK_KEY_PRESS || key_pressrelease == GDK_KEY_RELEASE, FALSE);
g_return_val_if_fail (window != NULL, FALSE);
- return FALSE;
+
+ ip.type = INPUT_KEYBOARD;
+ ip.ki.wScan = 0;
+ ip.ki.time = 0;
+ ip.ki.dwExtraInfo = 0;
+
+ switch (key_pressrelease)
+ {
+ case GDK_KEY_PRESS:
+ ip.ki.dwFlags = 0;
+ break;
+ case GDK_KEY_RELEASE:
+ ip.ki.dwFlags = KEYEVENTF_KEYUP;
+ break;
+ default:
+ /* Not a key event. */
+ return FALSE;
+ }
+ if (gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), keyval, &keys, &n_keys))
+ {
+ for (i = 0; i < n_keys; i++)
+ {
+ if (key_pressrelease == GDK_KEY_PRESS)
+ {
+ /* AltGr press. */
+ if (keys[i].group)
+ {
+ /* According to some virtualbox code I found, AltGr is
+ * simulated on win32 with LCtrl+RAlt */
+ ip.ki.wVk = VK_CONTROL;
+ SendInput(1, &ip, sizeof(INPUT));
+ ip.ki.wVk = VK_MENU;
+ SendInput(1, &ip, sizeof(INPUT));
+ }
+ /* Shift press. */
+ if (keys[i].level || (modifiers & GDK_SHIFT_MASK))
+ {
+ ip.ki.wVk = VK_SHIFT;
+ SendInput(1, &ip, sizeof(INPUT));
+ }
+ }
+
+ /* Key pressed/released. */
+ ip.ki.wVk = keys[i].keycode;
+ SendInput(1, &ip, sizeof(INPUT));
+
+ if (key_pressrelease == GDK_KEY_RELEASE)
+ {
+ /* Shift release. */
+ if (keys[i].level || (modifiers & GDK_SHIFT_MASK))
+ {
+ ip.ki.wVk = VK_SHIFT;
+ SendInput(1, &ip, sizeof(INPUT));
+ }
+ /* AltrGr release. */
+ if (keys[i].group)
+ {
+ ip.ki.wVk = VK_MENU;
+ SendInput(1, &ip, sizeof(INPUT));
+ ip.ki.wVk = VK_CONTROL;
+ SendInput(1, &ip, sizeof(INPUT));
+ }
+ }
+
+ /* No need to loop for alternative keycodes. We want only one
+ * key generated. */
+ success = TRUE;
+ break;
+ }
+ g_free (keys);
+ }
+ return success;
}
gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]