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 --- 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