Bug 565818 - [Regression] KeyEvent keyCode changed in 2020-09 M2

- 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>
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 27727f3..d154647 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 @@
 }
 #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 @@
 }
 #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 256aa22..68e3037 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 @@
 	"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 @@
 	"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 538bd72..5c188ed 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 @@
 	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 @@
 	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 b358963..eaf6253 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 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 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 @@
 	/** @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 7e9ae9d..037882f 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 @@
 				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 @@
 					}
 					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 795964d..046708f 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 @@
 		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]);
 				}
 			}