diff options
author | Andrey Loskutov | 2020-02-20 08:52:55 +0000 |
---|---|---|
committer | Andrey Loskutov | 2020-03-14 19:49:59 +0000 |
commit | 42cced92611c0eea6694cb93193ba1af4087018e (patch) | |
tree | b2b99e26b76e08422a1f80a896585c915fac452a | |
parent | 439d8fb91e6a33773ef023745d7f65f2ec9aeed8 (diff) | |
download | eclipse.platform.swt-42cced92611c0eea6694cb93193ba1af4087018e.tar.gz eclipse.platform.swt-42cced92611c0eea6694cb93193ba1af4087018e.tar.xz eclipse.platform.swt-42cced92611c0eea6694cb93193ba1af4087018e.zip |
Bug 484682 - don't call forceResize on getClientAreaInPixels()
Beside the fact that get* methods should not modify object state, this
can lead to stack overflow.
This is experimental and can be switched off to the old behavior via
-Dorg.eclipse.swt.resizeOnGetClientArea=true system flag.
Change-Id: Ide568466ab2e09b579b4bb3cd2d4914aa7917c8d
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
4 files changed, 15 insertions, 4 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java index 4c625c0b33..3dd4747ff0 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java @@ -752,7 +752,9 @@ Rectangle getClientAreaInPixels () { if ((state & ZERO_WIDTH) != 0 && (state & ZERO_HEIGHT) != 0) { return new Rectangle (0, 0, 0, 0); } - forceResize (); + if(RESIZE_ON_GETCLIENTAREA) { + forceResize (); + } long clientHandle = clientHandle (); GtkAllocation allocation = new GtkAllocation(); GTK.gtk_widget_get_allocation (clientHandle, allocation); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java index bd6c98d64a..ff43177f65 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java @@ -40,6 +40,9 @@ public abstract class Scrollable extends Control { long scrolledHandle; ScrollBar horizontalBar, verticalBar; + /** See bug 484682 */ + static final boolean RESIZE_ON_GETCLIENTAREA = Boolean.getBoolean("org.eclipse.swt.resizeOnGetClientArea"); + /** * Prevents uninitialized instances from being created outside the package. */ @@ -232,7 +235,9 @@ public Rectangle getClientArea () { Rectangle getClientAreaInPixels () { checkWidget (); - forceResize (); + if(RESIZE_ON_GETCLIENTAREA) { + forceResize (); + } long clientHandle = clientHandle (); GtkAllocation allocation = new GtkAllocation (); GTK.gtk_widget_get_allocation (clientHandle, allocation); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java index c1d08387ed..aeeab7b506 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java @@ -1198,7 +1198,9 @@ void fixChildren (Shell newShell, Shell oldShell, Decorations newDecorations, De @Override Rectangle getClientAreaInPixels () { checkWidget (); - forceResize (); + if(RESIZE_ON_GETCLIENTAREA) { + forceResize (); + } long clientHandle = clientHandle (); GtkAllocation allocation = new GtkAllocation (); GTK.gtk_widget_get_allocation (clientHandle, allocation); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java index 76bee3fd0b..00fadcab8e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java @@ -1262,7 +1262,9 @@ void fixChildren (Shell newShell, Shell oldShell, Decorations newDecorations, De @Override Rectangle getClientAreaInPixels () { checkWidget (); - forceResize (); + if(RESIZE_ON_GETCLIENTAREA) { + forceResize (); + } long clientHandle = clientHandle (); GtkAllocation allocation = new GtkAllocation (); GTK.gtk_widget_get_allocation (clientHandle, allocation); |