Bug 574272 - StyledText might paint with outdated clientArea causing paint artifacts
Summary: StyledText might paint with outdated clientArea causing paint artifacts
Status: NEW
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 4.21   Edit
Hardware: PC Windows 10
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Platform-SWT-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-06-17 09:26 EDT by Thomas Singer CLA
Modified: 2021-06-17 09:29 EDT (History)
1 user (show)

See Also:


Attachments
Screenshots of such paint artefacts (3.10 KB, image/png)
2021-06-17 09:29 EDT, Thomas Singer CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
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