From 531d3f18481988494e77b5f1ded92a7f346ea14d Mon Sep 17 00:00:00 2001 From: Eric Williams Date: Wed, 28 Oct 2015 10:52:36 -0400 Subject: Bug 480986: [Wayland] Workspace chooser won't launch gtk_size_allocate() in Shell is called more often on Wayland. These additional and unexpected calls trigger an infinite recursive call to resizeBounds(), which causes non-resizable Shells/Dialogs to crash. The fix is to only resize Shells that have the SWT.RESIZE attribute enabled. Tested on Gtk3.16 on Wayland, Gtk3.16 on X, and Gtk2.24. AllNonBrowser JUnit test cases pass on Gtk3 running X. There are some irregularities with test cases on Wayland, as outlined in bug 480893. Change-Id: I55612d8486cdd512e275a8a7456e0197ed717c75 Signed-off-by: Eric Williams --- .../Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git eclipse.platform.swt/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java eclipse.platform.swt/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java index d65af5c..49ae036 100644 --- eclipse.platform.swt/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java +++ eclipse.platform.swt/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java @@ -1528,10 +1528,15 @@ long /*int*/ gtk_size_allocate (long /*int*/ widget, long /*int*/ allocation) { OS.gtk_widget_get_allocation (shellHandle, widgetAllocation); int width = widgetAllocation.width; int height = widgetAllocation.height; - if (!resized || oldWidth != width || oldHeight != height) { + + // Bug 474235: on Wayland gtk_size_allocate() is called more frequently, causing an + // infinitely recursive resize call. This causes non-resizable Shells/Dialogs to + // crash. Fix: only call resizeBounds() on resizable Shells. + if ((!resized || oldWidth != width || oldHeight != height) + && (OS.GTK3 && !OS.isX11() ? ((style & SWT.RESIZE) != 0) : true)) { //Wayland oldWidth = width; oldHeight = height; - resizeBounds (width, height, true); + resizeBounds (width, height, true); //this is called to resize child widgets when the shell is resized. } return 0; } -- cgit v0.11.2-4-g4a35