Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul D'Pong2020-08-05 13:53:02 +0000
committerAlexander Kurtakov2020-08-06 16:12:37 +0000
commitb61e47c3876bcf3690607acca63b2d6143985504 (patch)
treedbe8205a2c609353c703902014e9c21f2b0a6013
parent4a732816319476543350f65d500e0da20bedf42b (diff)
downloadeclipse.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>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c28
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java5
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java19
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]);
}
}

Back to the top