Blob Blame History Raw
From 87d512619f0b0b05332e4c83f651f29bfa50c5e9 Mon Sep 17 00:00:00 2001
From: Snjezana Peco
Date: Tue, 24 Nov 2015 13:46:51 +0100
Subject: Bug 478962 - [GTK3] Eclipse Mars SR1 consumes 60% CPU while idling

The
https://git.gnome.org/browse/gtk+/commit/?id=fe51ac273c8045279a222c22a52d297d5ede4169
commit changes the state of a node instead of copying the style info.
When getting some properties (color, background color, border, padding),
SWT changes the state of the node 0 (OS.GTK_STATE_FLAG_NORMAL) which
sometimes causes a widget to continously repaint.
For example:
SWT uses the following method to get the background color:

OS.gtk_style_context_get_background_color (context,
OS.GTK_STATE_FLAG_NORMAL, rgba);

This method changes the state of a node to 0 (OS.GTK_STATE_FLAG_NORMAL).
CTabFolder calls the method from inside the paint listener which causes an
infinite painting loop.

This commit fixes the issue by using the widget's current style state
instead of OS.GTK_STATE_FLAG_NORMAL.

Change-Id: I4dd27e3f6c5895a115fd76788ca2b2322aad6c4d
Signed-off-by: Snjezana Peco <snjeza.peco@gmail.com>
---
 bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c |  8 ++++----
 .../gtk/org/eclipse/swt/internal/gtk/OS.java            |  4 ++--
 .../gtk/org/eclipse/swt/widgets/Control.java            | 17 +++++++++++------
 .../gtk/org/eclipse/swt/widgets/DateTime.java           |  8 +++++---
 .../gtk/org/eclipse/swt/widgets/Spinner.java            |  5 +++--
 .../Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java   |  3 ++-
 6 files changed, 27 insertions(+), 18 deletions(-)

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 c0dff7f..52ade78 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	
@@ -18341,18 +18341,18 @@ fail:
 #endif
 
 #ifndef NO__1gtk_1widget_1get_1state_1flags
-JNIEXPORT jintLong JNICALL OS_NATIVE(_1gtk_1widget_1get_1state_1flags)
+JNIEXPORT jint JNICALL OS_NATIVE(_1gtk_1widget_1get_1state_1flags)
 	(JNIEnv *env, jclass that, jintLong arg0)
 {
-	jintLong rc = 0;
+	jint rc = 0;
 	OS_NATIVE_ENTER(env, that, _1gtk_1widget_1get_1state_1flags_FUNC);
 /*
-	rc = (jintLong)gtk_widget_get_state_flags((GtkWidget *)arg0);
+	rc = (jint)gtk_widget_get_state_flags((GtkWidget *)arg0);
 */
 	{
 		OS_LOAD_FUNCTION(fp, gtk_widget_get_state_flags)
 		if (fp) {
-			rc = (jintLong)((jintLong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
+			rc = (jint)((jintLong (CALLING_CONVENTION*)(GtkWidget *))fp)((GtkWidget *)arg0);
 		}
 	}
 	OS_NATIVE_EXIT(env, that, _1gtk_1widget_1get_1state_1flags_FUNC);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java
index 0ee6dda..a7fb6fe 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java	
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java	
@@ -11855,8 +11855,8 @@ public static final void gtk_style_context_restore(long /*int*/ context) {
 /** @method flags=dynamic
  *  @param self cast=(GtkWidget *)
  *  */
-public static final native long /*int*/ _gtk_widget_get_state_flags(long /*int*/ self);
-public static final long /*int*/ gtk_widget_get_state_flags(long /*int*/ self) {
+public static final native int _gtk_widget_get_state_flags(long /*int*/ self);
+public static final int gtk_widget_get_state_flags(long /*int*/ self) {
 	lock.lock();
 	try {
 		return _gtk_widget_get_state_flags(self);
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 7061084..ecf2da0 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	
@@ -2585,8 +2585,9 @@
 		}
 	} else {
 		long /*int*/ context = OS.gtk_widget_get_style_context (fontHandle);
+		int styleState = OS.gtk_widget_get_state_flags(handle);
 		GdkRGBA rgba = new GdkRGBA ();
-		OS.gtk_style_context_get_background_color (context, OS.GTK_STATE_FLAG_NORMAL, rgba);
+		OS.gtk_style_context_get_background_color (context, styleState, rgba);
 		if (rgba.alpha == 0) {
 			return display.COLOR_WIDGET_BACKGROUND;
 		}
@@ -2625,8 +2626,9 @@ GdkColor getContextBackground () {
 GdkColor getContextColor () {
 	long /*int*/ fontHandle = fontHandle ();
 	long /*int*/ context = OS.gtk_widget_get_style_context (fontHandle);
+	int styleState = OS.gtk_widget_get_state_flags(handle);
 	GdkRGBA rgba = new GdkRGBA ();
-	rgba = display.styleContextGetColor (context, OS.GTK_STATE_FLAG_NORMAL, rgba);
+	rgba = display.styleContextGetColor (context, styleState, rgba);
 	GdkColor color = new GdkColor ();
 	color.red = (short)(rgba.red * 0xFFFF);
 	color.green = (short)(rgba.green * 0xFFFF);
@@ -2761,7 +2763,8 @@ long /*int*/ getFontDescription () {
 	long /*int*/ fontHandle = fontHandle ();
 	if (OS.GTK3) {
 		long /*int*/ context = OS.gtk_widget_get_style_context (fontHandle);
-		return OS.gtk_style_context_get_font(context, OS.GTK_STATE_FLAG_NORMAL);
+		int styleState = OS.gtk_widget_get_state_flags(fontHandle);
+		return OS.gtk_style_context_get_font(context, styleState);
 	}
 	OS.gtk_widget_realize (fontHandle);
 	return OS.gtk_style_get_font_desc (OS.gtk_widget_get_style (fontHandle));
@@ -3021,12 +3024,13 @@ Point getThickness (long /*int*/ widget) {
 		int xthickness = 0, ythickness = 0;
 		GtkBorder tmp = new GtkBorder();
 		long /*int*/ context = OS.gtk_widget_get_style_context (widget);
+		int styleState = OS.gtk_widget_get_state_flags(widget);
 		OS.gtk_style_context_save (context);
 		OS.gtk_style_context_add_class (context, OS.GTK_STYLE_CLASS_FRAME);
-		OS.gtk_style_context_get_padding (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+		OS.gtk_style_context_get_padding (context, styleState, tmp);
 		xthickness += tmp.left;
 		ythickness += tmp.top;
-		OS.gtk_style_context_get_border (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+		OS.gtk_style_context_get_border (context, styleState, tmp);
 		xthickness += tmp.left;
 		ythickness += tmp.top;
 		OS.gtk_style_context_restore (context);
@@ -5595,7 +5599,8 @@ long /*int*/ windowProc (long /*int*/ handle, long /*int*/ arg0, long /*int*/ us
 				if (OS.GTK3 && !draw && (state & CANVAS) != 0) {
 					GdkRGBA rgba = new GdkRGBA();
 					long /*int*/ context = OS.gtk_widget_get_style_context (handle);
-					OS.gtk_style_context_get_background_color (context, OS.GTK_STATE_FLAG_NORMAL, rgba);
+					int styleState = OS.gtk_widget_get_state_flags(handle);
+					OS.gtk_style_context_get_background_color (context, styleState, rgba);
 					draw = rgba.alpha == 0;
 				}
 				if (draw) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java
index 12bca54..81780bd 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java	
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java	
@@ -296,13 +296,14 @@ public Rectangle computeTrim (int x, int y, int width, int height) {
 		if (OS.GTK3) {
 			GtkBorder tmp = new GtkBorder ();
 			long /*int*/ context = OS.gtk_widget_get_style_context (textEntryHandle);
-			OS.gtk_style_context_get_padding (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+			int styleState = OS.gtk_widget_get_state_flags(textEntryHandle);
+			OS.gtk_style_context_get_padding (context, styleState, tmp);
 			trim.x -= tmp.left;
 			trim.y -= tmp.top;
 			trim.width += tmp.left + tmp.right;
 			trim.height += tmp.top + tmp.bottom;
 			if ((style & SWT.BORDER) != 0) {
-				OS.gtk_style_context_get_border (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+				OS.gtk_style_context_get_border (context, styleState, tmp);
 				trim.x -= tmp.left;
 				trim.y -= tmp.top;
 				trim.width += tmp.left + tmp.right;
@@ -1738,7 +1739,8 @@ GtkBorder getGtkBorderPadding () {
 		//In Gtk3, acquire border.
 		GtkBorder gtkBorderPadding = new GtkBorder ();
 		long /*int*/ context = OS.gtk_widget_get_style_context (textEntryHandle);
-		OS.gtk_style_context_get_padding (context, OS.GTK_STATE_FLAG_NORMAL, gtkBorderPadding);
+		int styleState = OS.gtk_widget_get_state_flags(textEntryHandle);
+		OS.gtk_style_context_get_padding (context, styleState, gtkBorderPadding);
 		return gtkBorderPadding;
 	} else {
 		//in GTK2 hard code the padding
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java
index 7550122..3bbb886 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java	
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java	
@@ -255,9 +255,10 @@ public Rectangle computeTrim (int x, int y, int width, int height) {
 	if (OS.GTK3) {
 		GtkBorder tmp = new GtkBorder();
 		long /*int*/ context = OS.gtk_widget_get_style_context (handle);
-		OS.gtk_style_context_get_padding (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+		int styleState = OS.gtk_widget_get_state_flags(handle);
+		OS.gtk_style_context_get_padding (context, styleState, tmp);
 		if ((style & SWT.BORDER) != 0) {
-			OS.gtk_style_context_get_border (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+			OS.gtk_style_context_get_border (context, styleState, tmp);
 			trim.x -= tmp.left;
 			trim.y -= tmp.top;
 			trim.width += tmp.left + tmp.right;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java
index ee9172e..8d5d0ba 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java	
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java	
@@ -591,7 +591,8 @@ public Rectangle computeTrim (int x, int y, int width, int height) {
 		if (OS.GTK3) {
 			GtkBorder tmp = new GtkBorder();
 			long /*int*/ context = OS.gtk_widget_get_style_context (handle);
-			OS.gtk_style_context_get_padding (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+			int styleState = OS.gtk_widget_get_state_flags(handle);
+			OS.gtk_style_context_get_padding (context, styleState, tmp);
 			trim.x -= tmp.left;
 			trim.y -= tmp.top;
 			trim.width += tmp.left + tmp.right;
@@ -598,7 +602,7 @@ public Rectangle computeTrim (int x, int y, int width, int height) {
 			trim.width += tmp.left + tmp.right;
 			trim.height += tmp.top + tmp.bottom;
 			if ((style & SWT.BORDER) != 0) {
-				OS.gtk_style_context_get_border (context, OS.GTK_STATE_FLAG_NORMAL, tmp);
+				OS.gtk_style_context_get_border (context, styleState, tmp);
 				trim.x -= tmp.left;
 				trim.y -= tmp.top;
 				trim.width += tmp.left + tmp.right;
-- 
cgit v0.11.2-4-g4a35