Bug 528819: [GTK3] StyledText draws carets if unfocused

Only draw the caret if it has focus: this logic existed for GTK3.20- but
was removed in a fix for Wayland. Restoring this behaviour fixes the bug
for GTK3.22 as well.

Tested with the snippet attached and in the IDE. No reduction in Caret
performance is observed.

Change-Id: I91d78217e90ce7ac7d1ab3e0898b0dda6fad44d2
Signed-off-by: Eric Williams <ericwill@redhat.com>
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java
index cdfb57c..ebbb60f 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Canvas.java
@@ -180,8 +180,10 @@
 		 *  blink is needed to be checked as gtk_draw() signals sent from other parts of the canvas
 		 *  can interfere with the blinking state. This will ensure that we are only draw/redrawing the
 		 *  caret when it is intended to. See Bug 517487.
+		 *
+		 *  Additionally, only draw the caret if it has focus. See bug 528819.
 		 */
-		if (caret != null && blink == true) {
+		if (caret != null && blink == true && caret.isFocusCaret()) {
 			drawCaret(widget,cairo);
 			blink = false;
 		}
diff --git a/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug528819_StyledTextCaretDraw.java b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug528819_StyledTextCaretDraw.java
new file mode 100644
index 0000000..ce011d9
--- /dev/null
+++ b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug528819_StyledTextCaretDraw.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Thomas Singer and others. All rights reserved.
+ * The contents of this file are made available under the terms
+ * of the GNU Lesser General Public License (LGPL) Version 2.1 that
+ * accompanies this distribution (lgpl-v21.txt).  The LGPL is also
+ * available at http://www.gnu.org/licenses/lgpl.html.  If the version
+ * of the LGPL at http://www.gnu.org is different to the version of
+ * the LGPL accompanying this distribution and there is any conflict
+ * between the two license versions, the terms of the LGPL accompanying
+ * this distribution shall govern.
+ *
+ * Contributors:
+ *     Thomas Singer - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.tests.gtk.snippets;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class Bug528819_StyledTextCaretDraw {
+
+	public static void main(String[] args) {
+		final Display display = new Display();
+
+		final Shell shell = new Shell(display);
+		shell.setLayout(new FillLayout());
+
+		final Text text = new Text(shell, SWT.MULTI | SWT.WRAP);
+		text.setText("Resize the shell and what for the styled text controls that paint carets.");
+		createStyledText(shell);
+		createStyledText(shell);
+
+		shell.setSize(500, 400);
+		shell.open();
+
+		while (!shell.isDisposed()) {
+			if (!display.readAndDispatch()) {
+				display.sleep();
+			}
+		}
+
+		display.dispose();
+	}
+
+	private static void createStyledText(Shell shell) {
+		final StyledText st = new StyledText(shell, SWT.BORDER);
+		st.setEditable(false);
+	}
+}