Bug 498165 - [GTK3] Stackoverflow using MeasureItem listener
gtk_tree_view_column_cell_get_position() method is signalling into the
redererGetPreferredWidthCallback everytime it is run, causing a
recursive loop when MeasuredEvent has a listener in GTK3. I've disabled
and reinanbled the callback when calling
gtk_tree_view_column_cell_get_position() to fix this issue.
Tested on GTK3.14 -> GTK3.21+ and GTK2
Change-Id: I7a70bf73df3123414c59b1b1aae2cd8af96db4be
Signed-off-by: Ian Pun <ipun@redhat.com>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
index 3c3e80e..518df2a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
@@ -743,7 +743,18 @@
* use the same underlying GTK structure.
*/
int [] x = new int [1], w = new int [1];
- OS.gtk_tree_view_column_cell_get_position (column, pixbufRenderer, x, w);
+ /*
+ * Bug 498165: gtk_tree_view_column_cell_get_position() sets off rendererGetPreferredWidthCallback in GTK3 which is an issue
+ * if there is an ongoing MeasureEvent listener. Disabling it and re-enabling the callback after the method is called
+ * prevents a stack overflow from occurring.
+ */
+ if (OS.GTK3) {
+ Callback.setEnabled(false);
+ OS.gtk_tree_view_column_cell_get_position (column, pixbufRenderer, x, w);
+ Callback.setEnabled(true);
+ } else {
+ OS.gtk_tree_view_column_cell_get_position (column, pixbufRenderer, x, w);
+ }
if (OS.GTK3) {
if (parent.pixbufSizeSet) {
if (x [0] > 0) {
@@ -758,7 +769,18 @@
long /*int*/ textRenderer = parent.getTextRenderer (column);
if (textRenderer == 0) return new Rectangle (0, 0, 0, 0);
int [] xText = new int [1], wText = new int [1];
- OS.gtk_tree_view_column_cell_get_position (column, textRenderer, xText, wText);
+ /*
+ * Bug 498165: gtk_tree_view_column_cell_get_position() sets off rendererGetPreferredWidthCallback in GTK3 which is an issue
+ * if there is an ongoing MeasureEvent listener. Disabling it and re-enabling the callback after the method is called
+ * prevents a stack overflow from occurring.
+ */
+ if (OS.GTK3) {
+ Callback.setEnabled(false);
+ OS.gtk_tree_view_column_cell_get_position (column, textRenderer, xText, wText);
+ Callback.setEnabled(true);
+ } else {
+ OS.gtk_tree_view_column_cell_get_position (column, textRenderer, xText, wText);
+ }
rect.x += xText [0];
}
} else {