Skip to content

Commit 2fa407d

Browse files
authored
Coalesce queued Display size-change events to protect EDT (#4593)
Fixed #4589
1 parent a8254fe commit 2fa407d

File tree

1 file changed

+80
-42
lines changed

1 file changed

+80
-42
lines changed

Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java

Lines changed: 80 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,6 +2075,83 @@ private boolean isPinchZoom(MouseEvent e) {
20752075
private Cursor defaultCursor = Cursor.getDefaultCursor();
20762076
private int currentCursor = 0;
20772077
private java.util.Timer reSize;
2078+
private final Object pendingSizeChangeLock = new Object();
2079+
private int pendingSizeChangeWidth = -1;
2080+
private int pendingSizeChangeHeight = -1;
2081+
private boolean pendingSizeChangeQueued;
2082+
private boolean pendingRevalidateAfterSizeChange;
2083+
private boolean pendingForceRevalidateAfterSizeChange;
2084+
private boolean pendingResetGraphicsAfterSizeChange;
2085+
private boolean pendingDelayedWindowRepaint;
2086+
2087+
private void queueSizeChangeEvent(int w, int h, boolean revalidate, boolean forceRevalidate, boolean resetGraphics, boolean delayedWindowRepaint) {
2088+
synchronized (pendingSizeChangeLock) {
2089+
pendingSizeChangeWidth = w;
2090+
pendingSizeChangeHeight = h;
2091+
pendingRevalidateAfterSizeChange |= revalidate;
2092+
pendingForceRevalidateAfterSizeChange |= forceRevalidate;
2093+
pendingResetGraphicsAfterSizeChange |= resetGraphics;
2094+
pendingDelayedWindowRepaint |= delayedWindowRepaint;
2095+
if (pendingSizeChangeQueued) {
2096+
return;
2097+
}
2098+
pendingSizeChangeQueued = true;
2099+
}
2100+
Display.getInstance().callSerially(new Runnable() {
2101+
public void run() {
2102+
int queuedW;
2103+
int queuedH;
2104+
boolean doRevalidate;
2105+
boolean doForceRevalidate;
2106+
boolean doResetGraphics;
2107+
boolean doDelayedWindowRepaint;
2108+
synchronized (pendingSizeChangeLock) {
2109+
queuedW = pendingSizeChangeWidth;
2110+
queuedH = pendingSizeChangeHeight;
2111+
doRevalidate = pendingRevalidateAfterSizeChange;
2112+
doForceRevalidate = pendingForceRevalidateAfterSizeChange;
2113+
doResetGraphics = pendingResetGraphicsAfterSizeChange;
2114+
doDelayedWindowRepaint = pendingDelayedWindowRepaint;
2115+
pendingRevalidateAfterSizeChange = false;
2116+
pendingForceRevalidateAfterSizeChange = false;
2117+
pendingResetGraphicsAfterSizeChange = false;
2118+
pendingDelayedWindowRepaint = false;
2119+
pendingSizeChangeQueued = false;
2120+
}
2121+
2122+
JavaSEPort.this.sizeChanged(queuedW, queuedH);
2123+
2124+
if (doResetGraphics) {
2125+
g2dInstance = null;
2126+
}
2127+
2128+
Form f = Display.getInstance().getCurrent();
2129+
if (f != null) {
2130+
if (doForceRevalidate) {
2131+
f.forceRevalidate();
2132+
} else if (doRevalidate) {
2133+
f.revalidate();
2134+
}
2135+
}
2136+
2137+
if (doDelayedWindowRepaint) {
2138+
new Thread(new Runnable() {
2139+
@Override
2140+
public void run() {
2141+
try {
2142+
Thread.sleep(1500);
2143+
} catch (Exception e) {
2144+
}
2145+
if (window != null) {
2146+
window.repaint();
2147+
}
2148+
}
2149+
}).start();
2150+
reSize = null;
2151+
}
2152+
}
2153+
});
2154+
}
20782155

20792156
public void mouseMoved(MouseEvent e) {
20802157
e.consume();
@@ -2138,11 +2215,7 @@ public void setBounds(int x, int y, int w, int h) {
21382215
Preferences pref = Preferences.userNodeForPackage(JavaSEPort.class);
21392216
boolean desktopSkin = pref.getBoolean("desktopSkin", false);
21402217
if (getSkin() == null && !desktopSkin) {
2141-
Display.getInstance().callSerially(new Runnable() {
2142-
public void run() {
2143-
JavaSEPort.this.sizeChanged((int)(getWidth() * retinaScale), (int)(getHeight() * retinaScale));
2144-
}
2145-
});
2218+
queueSizeChangeEvent((int)(getWidth() * retinaScale), (int)(getHeight() * retinaScale), false, false, false, false);
21462219
}
21472220

21482221
}
@@ -2186,17 +2259,7 @@ public void run() {
21862259
setSize((int)topSize.getWidth(), (int)topSize.getHeight());
21872260
canvas.setForcedSize(new Dimension(getWidth(), getHeight()));
21882261

2189-
Display.getInstance().callSerially(new Runnable() {
2190-
public void run() {
2191-
2192-
JavaSEPort.this.sizeChanged((int)(getWidth() * retinaScale), (int)(getHeight() * retinaScale));
2193-
2194-
Form f = Display.getInstance().getCurrent();
2195-
if (f != null) {
2196-
f.revalidate();
2197-
}
2198-
}
2199-
});
2262+
queueSizeChangeEvent((int)(getWidth() * retinaScale), (int)(getHeight() * retinaScale), true, false, false, false);
22002263
return;
22012264
}
22022265

@@ -2214,32 +2277,7 @@ public void run() {
22142277
// System.out.println("Resize with media container");
22152278
// JavaSEPort.this.sizeChanged((int)(mediaContainer.getWidth() * retinaScale), (int)(mediaContainer.getHeight() * retinaScale));
22162279
//}else{
2217-
Display.getInstance().callSerially(new Runnable() {
2218-
public void run() {
2219-
JavaSEPort.this.sizeChanged((int)(getWidth() * retinaScale), (int)(getHeight() * retinaScale));
2220-
g2dInstance = null;
2221-
Form f = Display.getInstance().getCurrent();
2222-
if (f != null) {
2223-
f.forceRevalidate();
2224-
}
2225-
2226-
// probably not necessary
2227-
new Thread(new Runnable() {
2228-
@Override
2229-
public void run() {
2230-
try {
2231-
Thread.sleep(1500);
2232-
} catch (Exception e) {
2233-
}
2234-
if (window != null) {
2235-
window.repaint();
2236-
}
2237-
}
2238-
}).start();
2239-
2240-
reSize = null;
2241-
}
2242-
});
2280+
queueSizeChangeEvent((int)(getWidth() * retinaScale), (int)(getHeight() * retinaScale), false, true, true, true);
22432281

22442282
//}
22452283

0 commit comments

Comments
 (0)