Bug 574272

Summary: StyledText might paint with outdated clientArea causing paint artifacts
Product: [Eclipse Project] Platform Reporter: Thomas Singer <ts-swt>
Component: SWTAssignee: Platform-SWT-Inbox <platform-swt-inbox>
Status: NEW --- QA Contact:
Severity: normal    
Priority: P3 CC: ts-swt
Version: 4.21   
Target Milestone: ---   
Hardware: PC   
OS: Windows 10   
Whiteboard:
Attachments:
Description Flags
Screenshots of such paint artefacts none

Description Thomas Singer CLA 2021-06-17 09:26:48 EDT
I'm having a problem where a StyledText control gets an SWT.Paint event without the correct SWT.Resize event before, because of another SWT.Resize listener that triggers the paint. This is the stacktrace for the SWT.Paint event (the ... sections are our application code, hard to press into a snippet):

	at org.eclipse.swt.custom.StyledText.handlePaint(StyledText.java:6262)
	at org.eclipse.swt.custom.StyledText.lambda$installListeners$1(StyledText.java:5801)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4209)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1043)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1067)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1052)
	at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1533)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4817)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:340)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4938)
	at org.eclipse.swt.internal.win32.OS.RedrawWindow(Native Method)
	at org.eclipse.swt.widgets.Control.update(Control.java:4604)
	at org.eclipse.swt.widgets.Control.update(Control.java:4597)
...
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4209)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1043)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1067)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1048)
	at org.eclipse.swt.widgets.Control.WM_SIZE(Control.java:5462)
	at org.eclipse.swt.widgets.Scrollable.WM_SIZE(Scrollable.java:360)
	at org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:1722)
	at org.eclipse.swt.widgets.Canvas.WM_SIZE(Canvas.java:444)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4837)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:340)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4930)
	at org.eclipse.swt.internal.win32.OS.DefWindowProc(Native Method)
	at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:91)
	at org.eclipse.swt.widgets.Control.WM_WINDOWPOSCHANGED(Control.java:5692)
	at org.eclipse.swt.widgets.Canvas.WM_WINDOWPOSCHANGED(Canvas.java:451)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4850)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:340)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4938)
	at org.eclipse.swt.internal.win32.OS.EndDeferWindowPos(Native Method)
	at org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:986)
	at org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:963)
	at org.eclipse.swt.widgets.Composite.setResizeChildren(Composite.java:1159)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1329)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1334)
	at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1313)
	at org.eclipse.swt.widgets.Composite.setLayoutDeferred(Composite.java:1120)
	at org.eclipse.swt.widgets.Display.runDeferredLayouts(Display.java:4050)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3619)
...

Currently, the StyledText caches the clientArea values received in the SWT.Resize event. Maybe in handlePaint it should get the actual values from getClientArea() instead of using the cached values? If course, in our SWT.Resize listener I could delay the further handling using display.asyncExec, but I consider such delays as bad code style.
Comment 1 Thomas Singer CLA 2021-06-17 09:29:21 EDT
Created attachment 286613 [details]
Screenshots of such paint artefacts