Skip to content

Commit ec8de86

Browse files
committed
Change Editor status message only from EDT
This adapter invokes all status changes on the EDT instead of worker thread of the Runner. Modifying AWT components from the worker threads may introduce strange bugs and in this case caused UI changes to run out of order, hiding runtime exceptions under problems displayed when cursor moves to the offending line.
1 parent 8f81ae5 commit ec8de86

3 files changed

Lines changed: 53 additions & 3 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package processing.app;
2+
3+
import java.awt.EventQueue;
4+
5+
public class RunnerListenerEdtAdapter implements RunnerListener {
6+
7+
private RunnerListener wrapped;
8+
9+
public RunnerListenerEdtAdapter(RunnerListener wrapped) {
10+
this.wrapped = wrapped;
11+
}
12+
13+
@Override
14+
public void statusError(String message) {
15+
EventQueue.invokeLater(() -> wrapped.statusError(message));
16+
}
17+
18+
@Override
19+
public void statusError(Exception exception) {
20+
EventQueue.invokeLater(() -> wrapped.statusError(exception));
21+
}
22+
23+
@Override
24+
public void statusNotice(String message) {
25+
EventQueue.invokeLater(() -> wrapped.statusNotice(message));
26+
}
27+
28+
@Override
29+
public void startIndeterminate() {
30+
EventQueue.invokeLater(() -> wrapped.startIndeterminate());
31+
}
32+
33+
@Override
34+
public void stopIndeterminate() {
35+
EventQueue.invokeLater(() -> wrapped.stopIndeterminate());
36+
}
37+
38+
@Override
39+
public void statusHalt() {
40+
EventQueue.invokeLater(() -> wrapped.statusHalt());
41+
}
42+
43+
@Override
44+
public boolean isHalted() {
45+
return wrapped.isHalted();
46+
}
47+
}
48+

java/src/processing/mode/java/Debugger.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import javax.swing.tree.DefaultMutableTreeNode;
4040

4141
import processing.app.Messages;
42+
import processing.app.RunnerListenerEdtAdapter;
4243
import processing.app.Sketch;
4344
import processing.app.SketchCode;
4445
import processing.mode.java.debug.*;
@@ -201,7 +202,7 @@ public synchronized void startDebug() {
201202
//lineMap = LineMapping.generateMapping(srcPath + File.separator + mainClassName + ".java");
202203

203204
log("launching debuggee runtime");
204-
runtime = new Runner(build, editor);
205+
runtime = new Runner(build, new RunnerListenerEdtAdapter(editor));
205206
VirtualMachine vm = runtime.debug(null); // non-blocking
206207
if (vm == null) {
207208
loge("error 37: launch failed", null);

java/src/processing/mode/java/JavaEditor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,10 +1093,11 @@ protected void handleLaunch(boolean present, boolean tweak) {
10931093
synchronized (runtimeLock) {
10941094
if (runtimeLaunchRequested) {
10951095
runtimeLaunchRequested = false;
1096+
RunnerListener listener = new RunnerListenerEdtAdapter(JavaEditor.this);
10961097
if (!tweak) {
1097-
runtime = jmode.handleLaunch(sketch, JavaEditor.this, present);
1098+
runtime = jmode.handleLaunch(sketch, listener, present);
10981099
} else {
1099-
runtime = jmode.handleTweak(sketch, JavaEditor.this);
1100+
runtime = jmode.handleTweak(sketch, listener);
11001101
}
11011102
}
11021103
}

0 commit comments

Comments
 (0)