Bug 572200 - [GTK4] gtk_window_set_icon_list removed from GTK4

- Moved gtk_window_set_icon_list to GTK3.java
- Set icon_list of GtkWindow manually through gdk_toplevel_set_icon
- Moved GdkToplevel functions (except gdk_toplevel_present due to
dependency on struct in os.h) from GDK to GTK4

Change-Id: I3a8f4d779aea332bee3050c94797e893be2d9b88
Signed-off-by: Paul D'Pong <sdamrong@redhat.com>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3.c
index f943ffb..985d77e 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3.c
@@ -400,3 +400,13 @@
 }
 #endif
 
+#ifndef NO_gtk_1window_1set_1icon_1list
+JNIEXPORT void JNICALL GTK3_NATIVE(gtk_1window_1set_1icon_1list)
+	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
+{
+	GTK3_NATIVE_ENTER(env, that, gtk_1window_1set_1icon_1list_FUNC);
+	gtk_window_set_icon_list((GtkWindow *)arg0, (GList *)arg1);
+	GTK3_NATIVE_EXIT(env, that, gtk_1window_1set_1icon_1list_FUNC);
+}
+#endif
+
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.c
index 6078411..c43aca5 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.c
@@ -52,6 +52,7 @@
 	"gtk_1init_1check",
 	"gtk_1main_1do_1event",
 	"gtk_1rgb_1to_1hsv",
+	"gtk_1window_1set_1icon_1list",
 };
 #define NATIVE_FUNCTION_COUNT sizeof(GTK3_nativeFunctionNames) / sizeof(char*)
 int GTK3_nativeFunctionCount = NATIVE_FUNCTION_COUNT;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.h
index a25d88c..84d73e0 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk3_stats.h
@@ -62,4 +62,5 @@
 	gtk_1init_1check_FUNC,
 	gtk_1main_1do_1event_FUNC,
 	gtk_1rgb_1to_1hsv_FUNC,
+	gtk_1window_1set_1icon_1list_FUNC,
 } GTK3_FUNCS;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4.c
index d18253c..f6932a6 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4.c
@@ -23,6 +23,50 @@
 #define GTK4_NATIVE(func) Java_org_eclipse_swt_internal_gtk4_GTK4_##func
 #endif
 
+#ifndef NO_gdk_1toplevel_1focus
+JNIEXPORT void JNICALL GTK4_NATIVE(gdk_1toplevel_1focus)
+	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
+{
+	GTK4_NATIVE_ENTER(env, that, gdk_1toplevel_1focus_FUNC);
+	gdk_toplevel_focus((GdkToplevel *)arg0, arg1);
+	GTK4_NATIVE_EXIT(env, that, gdk_1toplevel_1focus_FUNC);
+}
+#endif
+
+#ifndef NO_gdk_1toplevel_1get_1state
+JNIEXPORT jint JNICALL GTK4_NATIVE(gdk_1toplevel_1get_1state)
+	(JNIEnv *env, jclass that, jlong arg0)
+{
+	jint rc = 0;
+	GTK4_NATIVE_ENTER(env, that, gdk_1toplevel_1get_1state_FUNC);
+	rc = (jint)gdk_toplevel_get_state((GdkToplevel *)arg0);
+	GTK4_NATIVE_EXIT(env, that, gdk_1toplevel_1get_1state_FUNC);
+	return rc;
+}
+#endif
+
+#ifndef NO_gdk_1toplevel_1lower
+JNIEXPORT jboolean JNICALL GTK4_NATIVE(gdk_1toplevel_1lower)
+	(JNIEnv *env, jclass that, jlong arg0)
+{
+	jboolean rc = 0;
+	GTK4_NATIVE_ENTER(env, that, gdk_1toplevel_1lower_FUNC);
+	rc = (jboolean)gdk_toplevel_lower((GdkToplevel *)arg0);
+	GTK4_NATIVE_EXIT(env, that, gdk_1toplevel_1lower_FUNC);
+	return rc;
+}
+#endif
+
+#ifndef NO_gdk_1toplevel_1set_1icon_1list
+JNIEXPORT void JNICALL GTK4_NATIVE(gdk_1toplevel_1set_1icon_1list)
+	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
+{
+	GTK4_NATIVE_ENTER(env, that, gdk_1toplevel_1set_1icon_1list_FUNC);
+	gdk_toplevel_set_icon_list((GdkToplevel *)arg0, (GList *)arg1);
+	GTK4_NATIVE_EXIT(env, that, gdk_1toplevel_1set_1icon_1list_FUNC);
+}
+#endif
+
 #ifndef NO_gtk_1box_1append
 JNIEXPORT void JNICALL GTK4_NATIVE(gtk_1box_1append)
 	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.c
index 2649b72..a1b8607 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.c
@@ -21,6 +21,10 @@
 #ifdef NATIVE_STATS
 
 char * GTK4_nativeFunctionNames[] = {
+	"gdk_1toplevel_1focus",
+	"gdk_1toplevel_1get_1state",
+	"gdk_1toplevel_1lower",
+	"gdk_1toplevel_1set_1icon_1list",
 	"gtk_1box_1append",
 	"gtk_1box_1insert_1child_1after",
 	"gtk_1box_1prepend",
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.h
index 23bf478..b25dda9 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.h
@@ -31,6 +31,10 @@
 #endif
 
 typedef enum {
+	gdk_1toplevel_1focus_FUNC,
+	gdk_1toplevel_1get_1state_FUNC,
+	gdk_1toplevel_1lower_FUNC,
+	gdk_1toplevel_1set_1icon_1list_FUNC,
 	gtk_1box_1append_FUNC,
 	gtk_1box_1insert_1child_1after_FUNC,
 	gtk_1box_1prepend_FUNC,
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 6a7cf4f..3c08574 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
@@ -2696,28 +2696,6 @@
 G_GNUC_END_IGNORE_DEPRECATIONS
 #endif
 
-#ifndef NO_gdk_1toplevel_1focus
-JNIEXPORT void JNICALL GDK_NATIVE(gdk_1toplevel_1focus)
-	(JNIEnv *env, jclass that, jlong arg0, jint arg1)
-{
-	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1focus_FUNC);
-	gdk_toplevel_focus((GdkToplevel *)arg0, arg1);
-	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1focus_FUNC);
-}
-#endif
-
-#ifndef NO_gdk_1toplevel_1get_1state
-JNIEXPORT jint JNICALL GDK_NATIVE(gdk_1toplevel_1get_1state)
-	(JNIEnv *env, jclass that, jlong arg0)
-{
-	jint rc = 0;
-	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1get_1state_FUNC);
-	rc = (jint)gdk_toplevel_get_state((GdkToplevel *)arg0);
-	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1get_1state_FUNC);
-	return rc;
-}
-#endif
-
 #ifndef NO_gdk_1toplevel_1layout_1new
 JNIEXPORT jlong JNICALL GDK_NATIVE(gdk_1toplevel_1layout_1new)
 	(JNIEnv *env, jclass that, jint arg0, jint arg1)
@@ -2738,18 +2716,6 @@
 }
 #endif
 
-#ifndef NO_gdk_1toplevel_1lower
-JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1toplevel_1lower)
-	(JNIEnv *env, jclass that, jlong arg0)
-{
-	jboolean rc = 0;
-	GDK_NATIVE_ENTER(env, that, gdk_1toplevel_1lower_FUNC);
-	rc = (jboolean)gdk_toplevel_lower((GdkToplevel *)arg0);
-	GDK_NATIVE_EXIT(env, that, gdk_1toplevel_1lower_FUNC);
-	return rc;
-}
-#endif
-
 #ifndef NO_gdk_1toplevel_1present
 JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1toplevel_1present)
 	(JNIEnv *env, jclass that, jlong arg0, jint arg1, jint arg2, jlong arg3)
@@ -14269,16 +14235,6 @@
 }
 #endif
 
-#ifndef NO_gtk_1window_1set_1icon_1list
-JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1icon_1list)
-	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
-{
-	GTK_NATIVE_ENTER(env, that, gtk_1window_1set_1icon_1list_FUNC);
-	gtk_window_set_icon_list((GtkWindow *)arg0, (GList *)arg1);
-	GTK_NATIVE_EXIT(env, that, gtk_1window_1set_1icon_1list_FUNC);
-}
-#endif
-
 #ifndef NO_gtk_1window_1set_1icon_1name
 JNIEXPORT void JNICALL GTK_NATIVE(gtk_1window_1set_1icon_1name)
 	(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h
index 9a0f50a..a3aee9d 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h
@@ -503,9 +503,6 @@
 #define NO_gdk_1surface_1set_1opaque_1region
 
 // No GdkToplevel on GTK3
-#define NO_gdk_1toplevel_1focus
-#define NO_gdk_1toplevel_1get_1state
-#define NO_gdk_1toplevel_1lower
 #define NO_gdk_1toplevel_1present
 
 // No GdkClipboard on GTK3
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 f31454f..3e17b05 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
@@ -198,10 +198,7 @@
 	"gdk_1texture_1new_1for_1pixbuf",
 	"gdk_1texture_1new_1from_1file",
 	"gdk_1threads_1leave",
-	"gdk_1toplevel_1focus",
-	"gdk_1toplevel_1get_1state",
 	"gdk_1toplevel_1layout_1new",
-	"gdk_1toplevel_1lower",
 	"gdk_1toplevel_1present",
 	"gdk_1unicode_1to_1keyval",
 	"gdk_1utf8_1to_1string_1target",
@@ -1068,7 +1065,6 @@
 	"gtk_1window_1set_1default_1widget",
 	"gtk_1window_1set_1destroy_1with_1parent",
 	"gtk_1window_1set_1geometry_1hints",
-	"gtk_1window_1set_1icon_1list",
 	"gtk_1window_1set_1icon_1name",
 	"gtk_1window_1set_1keep_1above",
 	"gtk_1window_1set_1modal",
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 06e3a41..9f5c0a3 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
@@ -208,10 +208,7 @@
 	gdk_1texture_1new_1for_1pixbuf_FUNC,
 	gdk_1texture_1new_1from_1file_FUNC,
 	gdk_1threads_1leave_FUNC,
-	gdk_1toplevel_1focus_FUNC,
-	gdk_1toplevel_1get_1state_FUNC,
 	gdk_1toplevel_1layout_1new_FUNC,
-	gdk_1toplevel_1lower_FUNC,
 	gdk_1toplevel_1present_FUNC,
 	gdk_1unicode_1to_1keyval_FUNC,
 	gdk_1utf8_1to_1string_1target_FUNC,
@@ -1066,7 +1063,6 @@
 	gtk_1window_1set_1default_1widget_FUNC,
 	gtk_1window_1set_1destroy_1with_1parent_FUNC,
 	gtk_1window_1set_1geometry_1hints_FUNC,
-	gtk_1window_1set_1icon_1list_FUNC,
 	gtk_1window_1set_1icon_1name_FUNC,
 	gtk_1window_1set_1keep_1above_FUNC,
 	gtk_1window_1set_1modal_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 85942d7..a30e29a 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
@@ -347,11 +347,6 @@
 	/* [GTK4 only, if-def'd in os.h] */
 	public static final native int gdk_surface_get_width(long surface);
 	/**
-	 * @param toplevel cast=(GdkToplevel *)
-	 */
-	/* [GTK4 only, if-def'd in os.h] */
-	public static final native int gdk_toplevel_get_state(long toplevel);
-	/**
 	 * @param window cast=(GdkWindow *)
 	 */
 	/* [GTK3 only, if-def'd in os.h] */
@@ -1103,9 +1098,6 @@
 	/** @param window cast=(GdkWindow *) */
 	/* [GTK3 only, if-def'd in os.h] */
 	public static final native void gdk_window_focus(long window, int timestamp);
-	/** @param surface cast=(GdkToplevel *) */
-	/* [GTK4 only, if-def'd in os.h] */
-	public static final native void gdk_toplevel_focus(long surface, int timestamp);
 	/**
 	 * @param window cast=(GdkWindow *)
 	 * @param rect cast=(GdkRectangle *),flags=no_in
@@ -1197,9 +1189,6 @@
 	/** @param window cast=(GdkWindow *) */
 	/* [GTK3 only, if-def'd in os.h] */
 	public static final native void gdk_window_lower(long window);
-	/** @param toplevel cast=(GdkToplevel *) */
-	/* [GTK4 only, if-def'd in os.h] */
-	public static final native boolean gdk_toplevel_lower(long toplevel);
 	/** @param window cast=(GdkWindow *) */
 	/* [GTK3 only, if-def'd in os.h] */
 	public static final native void gdk_window_raise(long window);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java
index 0a76e91..b511c50 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java
@@ -3835,11 +3835,6 @@
 	public static final native long gtk_window_get_icon_list(long window);
 	/**
 	 * @param window cast=(GtkWindow *)
-	 * @param list cast=(GList *)
-	 */
-	public static final native void gtk_window_set_icon_list(long window, long list);
-	/**
-	 * @param window cast=(GtkWindow *)
 	 * @param attach_widget cast=(GtkWidget *)
 	 */
 	public static final native void gtk_window_set_attached_to(long window, long attach_widget);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk3/GTK3.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk3/GTK3.java
index a4dcc77..7d47351 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk3/GTK3.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk3/GTK3.java
@@ -179,4 +179,11 @@
 	public static final native long gtk_get_event_widget(long event);
 	/** @param event cast=(GdkEvent *) */
 	public static final native void gtk_main_do_event(long event);
+
+	/* GtkWindow */
+	/**
+	 * @param window cast=(GtkWindow *)
+	 * @param list cast=(GList *)
+	 */
+	public static final native void gtk_window_set_icon_list(long window, long list);
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk4/GTK4.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk4/GTK4.java
index 06692be..1087e58 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk4/GTK4.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk4/GTK4.java
@@ -113,4 +113,17 @@
 
 	/* GTK Initialization */
 	public static final native boolean gtk_init_check();
+
+	/* GdkToplevel */
+	/** @param toplevel cast=(GdkToplevel *) */
+	public static final native int gdk_toplevel_get_state(long toplevel);
+	/**
+	 * @param toplevel cast=(GdkToplevel *)
+	 * @param textures cast=(GList *)
+	 */
+	public static final native void gdk_toplevel_set_icon_list(long toplevel, long textures);
+	/** @param toplevel cast=(GdkToplevel *) */
+	public static final native boolean gdk_toplevel_lower(long toplevel);
+	/** @param surface cast=(GdkToplevel *) */
+	public static final native void gdk_toplevel_focus(long surface, int timestamp);
 }
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java
index 9bbcffd..bd19251 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java
@@ -6168,8 +6168,8 @@
 				if (above) {
 					//TODO: GTK4 no gdk_window_raise function. In GTK4, alternative may be gdk_toplevel_present
 				} else {
-					if (enableSurface != 0) GDK.gdk_toplevel_lower (enableSurface);
-					GDK.gdk_toplevel_lower (surface);
+					if (enableSurface != 0) GTK4.gdk_toplevel_lower (enableSurface);
+					GTK4.gdk_toplevel_lower (surface);
 				}
 			} else {
 				/* TODO: GTK4 no longer has ability for changing the Z-order of the windowing system directly.
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Decorations.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Decorations.java
index 55738cb..0581dd8 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Decorations.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Decorations.java
@@ -17,6 +17,8 @@
 import org.eclipse.swt.graphics.*;
 import org.eclipse.swt.internal.*;
 import org.eclipse.swt.internal.gtk.*;
+import org.eclipse.swt.internal.gtk3.*;
+import org.eclipse.swt.internal.gtk4.*;
 
 /**
  * Instances of this class provide the appearance and
@@ -179,23 +181,40 @@
 		sort (bestImages);
 		images = bestImages;
 	}
-	long pixbufs = 0;
+
+	// Allocate GList of icons
+	long icon_list = 0;
 	if (images != null) {
-		for (int i = 0; i < images.length; i++) {
-			Image image = images [i];
-			long pixbuf = ImageList.createPixbuf (image);
-			pixbufs = OS.g_list_append (pixbufs, pixbuf);
+		for (Image image : images) {
+			long pixbuf = ImageList.createPixbuf(image);
+			if (GTK.GTK4) {
+				long texture = GDK.gdk_texture_new_for_pixbuf(pixbuf);
+				OS.g_object_unref(pixbuf);
+				icon_list = OS.g_list_append(icon_list, texture);
+			} else {
+				icon_list = OS.g_list_append(icon_list, pixbuf);
+			}
 		}
 	}
-	GTK.gtk_window_set_icon_list (topHandle (), pixbufs);
-	long [] data = new long [1];
-	long temp = pixbufs;
-	while (temp != 0) {
-		C.memmove (data, temp, C.PTR_SIZEOF);
-		OS.g_object_unref (data [0]);
-		temp = OS.g_list_next (temp);
+
+	if (GTK.GTK4) {
+		/*
+		 * Set texture list to window's surface. Can no longer
+		 * use GtkWindow functions as they require a themed icon.
+		 */
+		long surface = GTK.gtk_native_get_surface(topHandle());
+		GTK4.gdk_toplevel_set_icon_list(surface, icon_list);
+	} else {
+		GTK3.gtk_window_set_icon_list(topHandle(), icon_list);
 	}
-	if (pixbufs != 0) OS.g_list_free (pixbufs);
+
+	// Release GList
+	long temp = icon_list;
+	while (temp != 0) {
+		OS.g_object_unref(OS.g_list_data(temp));
+		temp = OS.g_list_next(temp);
+	}
+	if (icon_list != 0) OS.g_list_free(icon_list);
 }
 
 void addMenu (Menu menu) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MessageBox.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MessageBox.java
index ab863c7..d03a9bd 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MessageBox.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/MessageBox.java
@@ -163,6 +163,10 @@
 	// Copy parent's icon
 	if (parentHandle != 0) {
 		if (GTK.GTK4) {
+			/*
+			 * TODO: This may not work as we are setting the icon list of the GtkWindow through
+			 * GdkToplevel (which has no way of retrieving the icon list set. See bug 572200.
+			 */
 			long iconName = GTK.gtk_window_get_icon_name(parentHandle);
 			if (iconName != 0) {
 				GTK.gtk_window_set_icon_name(handle, iconName);
@@ -170,7 +174,7 @@
 		} else {
 			long pixbufs = GTK.gtk_window_get_icon_list(parentHandle);
 			if (pixbufs != 0) {
-				GTK.gtk_window_set_icon_list(handle, pixbufs);
+				GTK3.gtk_window_set_icon_list(handle, pixbufs);
 				OS.g_list_free (pixbufs);
 			}
 		}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java
index 1735f3d..bbb3537 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java
@@ -628,7 +628,7 @@
 		}
 	} else {
 		if (GTK.GTK4) {
-			GDK.gdk_toplevel_focus (gdkResource, display.lastUserEventTime);
+			GTK4.gdk_toplevel_focus (gdkResource, display.lastUserEventTime);
 		} else {
 			GDK.gdk_window_focus (gdkResource, display.lastUserEventTime);
 		}
@@ -1952,7 +1952,7 @@
 long notifyState (long object, long arg0) {
 	// GTK4 equivalent of gtk_window_state_event
 	assert GTK.GTK4;
-	int gdkSurfaceState = GDK.gdk_toplevel_get_state (object);
+	int gdkSurfaceState = GTK4.gdk_toplevel_get_state (object);
 	minimized = (gdkSurfaceState & GDK.GDK_SURFACE_STATE_MINIMIZED) != 0;
 	maximized = (gdkSurfaceState & GDK.GDK_SURFACE_STATE_MAXIMIZED) != 0;
 	fullScreen = (gdkSurfaceState & GDK.GDK_SURFACE_STATE_FULLSCREEN) != 0;