提交 15e8b999 编写于 作者: A azvegint

8181786: Extra runLater causes impossible states to be possible using...

8181786: Extra runLater causes impossible states to be possible using javafx.embed.singleThread=true
Reviewed-by: kcr
上级 fb278dbe
...@@ -153,6 +153,23 @@ class EventDispatchThread extends Thread { ...@@ -153,6 +153,23 @@ class EventDispatchThread extends Thread {
} }
} }
boolean filterAndCheckEvent(AWTEvent event) {
boolean eventOK = true;
synchronized (eventFilters) {
for (int i = eventFilters.size() - 1; i >= 0; i--) {
EventFilter f = eventFilters.get(i);
EventFilter.FilterAction accept = f.acceptEvent(event);
if (accept == EventFilter.FilterAction.REJECT) {
eventOK = false;
break;
} else if (accept == EventFilter.FilterAction.ACCEPT_IMMEDIATELY) {
break;
}
}
}
return eventOK && SunDragSourceContextPeer.checkEvent(event);
}
void pumpOneEventForFilters(int id) { void pumpOneEventForFilters(int id) {
AWTEvent event = null; AWTEvent event = null;
boolean eventOK = false; boolean eventOK = false;
...@@ -170,20 +187,7 @@ class EventDispatchThread extends Thread { ...@@ -170,20 +187,7 @@ class EventDispatchThread extends Thread {
event = (id == ANY_EVENT) ? eq.getNextEvent() : eq.getNextEvent(id); event = (id == ANY_EVENT) ? eq.getNextEvent() : eq.getNextEvent(id);
} }
eventOK = true; eventOK = filterAndCheckEvent(event);
synchronized (eventFilters) {
for (int i = eventFilters.size() - 1; i >= 0; i--) {
EventFilter f = eventFilters.get(i);
EventFilter.FilterAction accept = f.acceptEvent(event);
if (accept == EventFilter.FilterAction.REJECT) {
eventOK = false;
break;
} else if (accept == EventFilter.FilterAction.ACCEPT_IMMEDIATELY) {
break;
}
}
}
eventOK = eventOK && SunDragSourceContextPeer.checkEvent(event);
if (!eventOK) { if (!eventOK) {
event.consume(); event.consume();
} }
......
...@@ -711,7 +711,9 @@ public class EventQueue { ...@@ -711,7 +711,9 @@ public class EventQueue {
fwDispatcher.scheduleDispatch(new Runnable() { fwDispatcher.scheduleDispatch(new Runnable() {
@Override @Override
public void run() { public void run() {
dispatchEventImpl(event, src); if (dispatchThread.filterAndCheckEvent(event)) {
dispatchEventImpl(event, src);
}
} }
}); });
} }
...@@ -1000,6 +1002,32 @@ public class EventQueue { ...@@ -1000,6 +1002,32 @@ public class EventQueue {
return createSecondaryLoop(null, null, 0); return createSecondaryLoop(null, null, 0);
} }
private class FwSecondaryLoopWrapper implements SecondaryLoop {
final private SecondaryLoop loop;
final private EventFilter filter;
public FwSecondaryLoopWrapper(SecondaryLoop loop, EventFilter filter) {
this.loop = loop;
this.filter = filter;
}
@Override
public boolean enter() {
if (filter != null) {
dispatchThread.addEventFilter(filter);
}
return loop.enter();
}
@Override
public boolean exit() {
if (filter != null) {
dispatchThread.removeEventFilter(filter);
}
return loop.exit();
}
}
SecondaryLoop createSecondaryLoop(Conditional cond, EventFilter filter, long interval) { SecondaryLoop createSecondaryLoop(Conditional cond, EventFilter filter, long interval) {
pushPopLock.lock(); pushPopLock.lock();
try { try {
...@@ -1008,7 +1036,7 @@ public class EventQueue { ...@@ -1008,7 +1036,7 @@ public class EventQueue {
return nextQueue.createSecondaryLoop(cond, filter, interval); return nextQueue.createSecondaryLoop(cond, filter, interval);
} }
if (fwDispatcher != null) { if (fwDispatcher != null) {
return fwDispatcher.createSecondaryLoop(); return new FwSecondaryLoopWrapper(fwDispatcher.createSecondaryLoop(), filter);
} }
if (dispatchThread == null) { if (dispatchThread == null) {
initDispatchThread(); initDispatchThread();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册