diff options
author | Paul D'Pong | 2020-08-05 13:53:02 +0000 |
---|---|---|
committer | Alexander Kurtakov | 2020-08-06 16:12:37 +0000 |
commit | b61e47c3876bcf3690607acca63b2d6143985504 (patch) | |
tree | dbe8205a2c609353c703902014e9c21f2b0a6013 | |
parent | 4a732816319476543350f65d500e0da20bedf42b (diff) | |
download | eclipse.platform.swt-b61e47c3876bcf3690607acca63b2d6143985504.tar.gz eclipse.platform.swt-b61e47c3876bcf3690607acca63b2d6143985504.tar.xz eclipse.platform.swt-b61e47c3876bcf3690607acca63b2d6143985504.zip |
Bug 565818 - [Regression] KeyEvent keyCode changed in 2020-09 M2Y20200806-1200
- Reverted breaking changes to setKeyState.
- Left comment for GTK4 port about the need to replace
gdk_keymap_translate_keyboard_state
Change-Id: Ifd444dd08a8659a6f569c1a40ca24109bd309cb5
Signed-off-by: Paul D'Pong <sdamrong@redhat.com>
6 files changed, 61 insertions, 3 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c index 27727f31f3..d154647ae5 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c @@ -964,6 +964,22 @@ JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1event_1get_1event_1type) } #endif +#ifndef NO_gdk_1event_1get_1keycode +JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1keycode) + (JNIEnv *env, jclass that, jlong arg0, jshortArray arg1) +{ + jshort *lparg1=NULL; + jboolean rc = 0; + GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1keycode_FUNC); + if (arg1) if ((lparg1 = (*env)->GetShortArrayElements(env, arg1, NULL)) == NULL) goto fail; + rc = (jboolean)gdk_event_get_keycode((GdkEvent *)arg0, (guint16 *)lparg1); +fail: + if (arg1 && lparg1) (*env)->ReleaseShortArrayElements(env, arg1, lparg1, 0); + GDK_NATIVE_EXIT(env, that, gdk_1event_1get_1keycode_FUNC); + return rc; +} +#endif + #ifndef NO_gdk_1event_1get_1keyval JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1keyval) (JNIEnv *env, jclass that, jlong arg0, jintArray arg1) @@ -1245,6 +1261,18 @@ JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1get_1default_1root_1window) } #endif +#ifndef NO_gdk_1key_1event_1get_1keycode +JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1key_1event_1get_1keycode) + (JNIEnv *env, jclass that, jlong arg0) +{ + jint rc = 0; + GDK_NATIVE_ENTER(env, that, gdk_1key_1event_1get_1keycode_FUNC); + rc = (jint)gdk_key_event_get_keycode((GdkEvent *)arg0); + GDK_NATIVE_EXIT(env, that, gdk_1key_1event_1get_1keycode_FUNC); + return rc; +} +#endif + #ifndef NO_gdk_1key_1event_1get_1keyval JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1key_1event_1get_1keyval) (JNIEnv *env, jclass that, jlong arg0) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c index 256aa224b8..68e30377de 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c @@ -89,6 +89,7 @@ char * GDK_nativeFunctionNames[] = { "gdk_1event_1get_1button", "gdk_1event_1get_1coords", "gdk_1event_1get_1event_1type", + "gdk_1event_1get_1keycode", "gdk_1event_1get_1keyval", "gdk_1event_1get_1modifier_1state", "gdk_1event_1get_1position", @@ -109,6 +110,7 @@ char * GDK_nativeFunctionNames[] = { "gdk_1event_1unref", "gdk_1focus_1event_1get_1in", "gdk_1get_1default_1root_1window", + "gdk_1key_1event_1get_1keycode", "gdk_1key_1event_1get_1keyval", "gdk_1key_1event_1get_1layout", "gdk_1keymap_1get_1entries_1for_1keyval", diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h index 538bd723e6..5c188eda36 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h @@ -99,6 +99,7 @@ typedef enum { gdk_1event_1get_1button_FUNC, gdk_1event_1get_1coords_FUNC, gdk_1event_1get_1event_1type_FUNC, + gdk_1event_1get_1keycode_FUNC, gdk_1event_1get_1keyval_FUNC, gdk_1event_1get_1modifier_1state_FUNC, gdk_1event_1get_1position_FUNC, @@ -119,6 +120,7 @@ typedef enum { gdk_1event_1unref_FUNC, gdk_1focus_1event_1get_1in_FUNC, gdk_1get_1default_1root_1window_FUNC, + gdk_1key_1event_1get_1keycode_FUNC, gdk_1key_1event_1get_1keyval_FUNC, gdk_1key_1event_1get_1layout_FUNC, gdk_1keymap_1get_1entries_1for_1keyval_FUNC, diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java index b358963292..eaf62534dd 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java @@ -524,6 +524,11 @@ public class GDK extends OS { public static final native boolean gdk_event_get_keyval(long event,int [] keyval); /** * @param event cast=(GdkEvent *) + * @param keycode cast=(guint16 *) + */ + public static final native boolean gdk_event_get_keycode(long event, short [] keycode); + /** + * @param event cast=(GdkEvent *) * @param x cast=(gdouble *) * @param y cast=(gdouble *) */ @@ -545,6 +550,7 @@ public class GDK extends OS { */ public static final native boolean gdk_event_get_scroll_direction(long event, int [] direction); + /* GDK Events (GTK4 only, if-def'd in os.h) */ /** @param event cast=(GdkEvent *) */ public static final native long gdk_event_ref(long event); @@ -563,6 +569,8 @@ public class GDK extends OS { /** @param event cast=(GdkEvent *) */ public static final native boolean gdk_focus_event_get_in(long event); /** @param event cast=(GdkEvent *) */ + public static final native int gdk_key_event_get_keycode(long event); + /** @param event cast=(GdkEvent *) */ public static final native int gdk_key_event_get_keyval(long event); /** @param event cast=(GdkEvent *) */ public static final native int gdk_key_event_get_layout(long event); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java index 7e9ae9dd69..037882f065 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java @@ -4323,10 +4323,12 @@ public boolean post (Event event) { int final_keyval = raw_keyval; boolean foundKeys; + long keymap = 0; if (GTK.GTK4) { + // TODO: Find alternative for gdk_keymap_translate_keyboard_state (no longer exist, and keymap can not be retrieved) foundKeys = GDK.gdk_display_map_keyval(gdkDisplay, raw_keyval, keys_list, n_keys); } else { - long keymap = GDK.gdk_keymap_get_for_display(gdkDisplay); + keymap = GDK.gdk_keymap_get_for_display(gdkDisplay); foundKeys = GDK.gdk_keymap_get_entries_for_keyval (keymap, raw_keyval, keys_list, n_keys); } @@ -4338,7 +4340,6 @@ public boolean post (Event event) { } OS.g_free(keys_list[0]); - long keymap = GDK.gdk_keymap_get_for_display(gdkDisplay); GDK.gdk_keymap_translate_keyboard_state(keymap, hardware_keycode, state, 0, keyval, effective_group, level, consumed_modifiers); if (is_modifier == 1) final_keyval = keyval[0]; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java index 795964d64e..046708fa7f 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java @@ -1789,13 +1789,30 @@ boolean setKeyState (Event javaEvent, long event) { default: { if (javaEvent.keyCode == 0) { int [] keyval = new int [1]; + int [] effective_group = new int [1], level = new int [1], consumed_modifiers = new int [1]; /* If current group is not a Latin layout, get the most Latin Layout group from input source. */ Map<Integer, Integer> groupLatinKeysCount = display.getGroupKeysCount(); if (!groupLatinKeysCount.containsKey(group)) { group = display.getLatinKeyGroup(); } - if (GDK.gdk_event_get_keyval(event, keyval)) { + long keymap = 0; + long display = GDK.gdk_display_get_default(); + if (GTK.GTK4) { + //TODO: GTK4 Get keymap or find alternative for gdk_keymap_translate_keyboard_state (no longer exist in GTK4) + } else { + keymap = GDK.gdk_keymap_get_for_display(display); + } + + short [] keyCode = new short [1]; + if (GTK.GTK4) { + keyCode[0] = (short) GDK.gdk_key_event_get_keycode(event); + } else { + GDK.gdk_event_get_keycode(event, keyCode); + } + + if (GDK.gdk_keymap_translate_keyboard_state (keymap, keyCode[0], + 0, group, keyval, effective_group, level, consumed_modifiers)) { javaEvent.keyCode = (int) GDK.gdk_keyval_to_unicode (keyval [0]); } } |