diff --git a/glass/glass-lib-macosx/src/GlassView.m b/glass/glass-lib-macosx/src/GlassView.m --- a/glass/glass-lib-macosx/src/GlassView.m +++ b/glass/glass-lib-macosx/src/GlassView.m @@ -615,7 +615,7 @@ GLASS_POOL_PUSH; // it will be popped by "_end" { [view retain]; - [view lockFocus]; +// [view lockFocus]; [view begin]; } } @@ -634,7 +634,7 @@ NSView *view = getGlassView(env, jPtr); { [view end]; - [view unlockFocus]; +// [view unlockFocus]; [view release]; } GLASS_POOL_POP; // it was pushed by "_begin" diff --git a/glass/glass/src/com/sun/glass/ui/swt/SWTApplication.java b/glass/glass/src/com/sun/glass/ui/swt/SWTApplication.java --- a/glass/glass/src/com/sun/glass/ui/swt/SWTApplication.java +++ b/glass/glass/src/com/sun/glass/ui/swt/SWTApplication.java @@ -744,13 +744,13 @@ static void lockFocus (Control control) { if (SWT.getPlatform().equals("cocoa")) { - invokeLock(control, "lockFocus"); + //invokeLock(control, "lockFocus"); setView(control, new_NSOpenGLContext(context)); } } static void unlockFocus (Control control) { - if (SWT.getPlatform().equals("cocoa")) invokeLock(control, "unlockFocus"); + //if (SWT.getPlatform().equals("cocoa")) invokeLock(control, "unlockFocus"); } static Object new_NSOpenGLContext (long context) { diff --git a/javafx-ui-common/src/com/sun/javafx/tk/Toolkit.java b/javafx-ui-common/src/com/sun/javafx/tk/Toolkit.java --- a/javafx-ui-common/src/com/sun/javafx/tk/Toolkit.java +++ b/javafx-ui-common/src/com/sun/javafx/tk/Toolkit.java @@ -331,36 +331,30 @@ // The set of shutdown hooks is strongly held to avoid premature GC. private final Set shutdownHooks = new HashSet(); - private final ArrayList stagePulseList = new ArrayList(); - private final ArrayList scenePulseList = new ArrayList(); - private final ArrayList postScenePulseList = new ArrayList(); public void firePulse() { // Stages need to be notified of pulses before scenes so the Stage can resized // and those changes propogated to scene before it gets its pulse to update - try { - synchronized (this) { - stagePulseList.addAll(stagePulseListeners.keySet()); - scenePulseList.addAll(scenePulseListeners.keySet()); - postScenePulseList.addAll(postScenePulseListeners.keySet()); - } - for (TKPulseListener listener: stagePulseList) { - listener.pulse(); - } - for (TKPulseListener listener: scenePulseList) { - listener.pulse(); - } - for (TKPulseListener listener: postScenePulseList) { - listener.pulse(); - } - if (lastTkPulseListener != null) { - lastTkPulseListener.pulse(); - } - } finally { - stagePulseList.clear(); - scenePulseList.clear(); - postScenePulseList.clear(); + ArrayList stagePulseList = new ArrayList(); + ArrayList scenePulseList = new ArrayList(); + ArrayList postScenePulseList = new ArrayList(); + synchronized (this) { + stagePulseList.addAll(stagePulseListeners.keySet()); + scenePulseList.addAll(scenePulseListeners.keySet()); + postScenePulseList.addAll(postScenePulseListeners.keySet()); + } + for (TKPulseListener listener: stagePulseList) { + listener.pulse(); + } + for (TKPulseListener listener: scenePulseList) { + listener.pulse(); + } + for (TKPulseListener listener: postScenePulseList) { + listener.pulse(); + } + if (lastTkPulseListener != null) { + lastTkPulseListener.pulse(); } } public void addStageTkPulseListener(TKPulseListener listener) { diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/AbstractPainter.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/AbstractPainter.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/AbstractPainter.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/AbstractPainter.java @@ -78,7 +78,6 @@ protected Presentable presentable; protected RenderingContext context = null; protected ResourceFactory factory; - protected AtomicBoolean liveRepaint = new AtomicBoolean(false); protected int width; protected int height; diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassViewEventHandler.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassViewEventHandler.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassViewEventHandler.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/GlassViewEventHandler.java @@ -639,18 +639,17 @@ return null; } switch (type) { - case ViewEvent.REPAINT: + case ViewEvent.REPAINT: { Window w = view.getWindow(); if (w != null && w.getMinimumWidth() == view.getWidth() && !w.isVisible()) { // RT-21057 - ignore initial minimum size setting if not visible break; } scene.entireSceneNeedsRepaint(); - if (PlatformUtil.isMac()) { - collector.liveRepaintRenderJob(scene); - } break; - case ViewEvent.RESIZE: + } + case ViewEvent.RESIZE: { + Window w = view.getWindow(); scene.sceneListener.changedSize(view.getWidth(), view.getHeight()); scene.entireSceneNeedsRepaint(); AbstractPainter.renderLock.lock(); @@ -659,7 +658,14 @@ } finally { AbstractPainter.renderLock.unlock(); } + if (PlatformUtil.isMac() && w != null && w.isVisible()) { + WindowStage stage = scene.getWindowStage(); + if (stage != null && !stage.isApplet()) { + collector.liveRepaintRenderJob(scene); + } + } break; + } case ViewEvent.MOVE: scene.sceneListener.changedLocation(view.getX(), view.getY()); break; diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PaintCollector.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PaintCollector.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PaintCollector.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PaintCollector.java @@ -325,27 +325,35 @@ } /** - * This is a essentially a pulse without the animation run - * and the sceneListeners pulse. It only repaints the - * scene at new dimensions. + * Run a full pulse and repaint before returning. */ final void liveRepaintRenderJob(final ViewScene scene) { - final ViewPainter viewPainter = scene.getPen().getPainter(); - if (!viewPainter.liveRepaint.getAndSet(true)) { - renderer.submit(new RenderJob((Runnable)viewPainter, new CompletionListener() { - @Override public void done(final RenderJob rj) { - viewPainter.liveRepaint.set(false); - - if (QuantumToolkit.verbose) { - System.err.println("LR.start: " + System.nanoTime() + scene); - } - } - })); - if (QuantumToolkit.verbose) { - System.err.println("LR.start: " + System.nanoTime() + scene); - } - } - } + ViewPainter viewPainter = scene.getPen().getPainter(); + ((QuantumToolkit)QuantumToolkit.getToolkit()).pulse(false); + scene.setDirty(true); +// ((Runnable)viewPainter).run(); + final CountDownLatch latch = new CountDownLatch(1); + boolean locked = AbstractPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + AbstractPainter.renderLock.unlock(); + } + try { + renderer.submit(new RenderJob((Runnable)viewPainter, new CompletionListener() { + @Override public void done(final RenderJob rj) { + latch.countDown(); + } + })); + try { + latch.await(); + } catch (InterruptedException e) { + //Fail silently. If interrupted, then proceed with the UI ... + } + } finally { + if (locked) { + AbstractPainter.renderLock.lock(); + } + } + } /** * Called by QuantumToolkit during a pulse to render whatever dirty scenes diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PresentingPainter.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PresentingPainter.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PresentingPainter.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/PresentingPainter.java @@ -39,7 +39,6 @@ } @Override public void run() { - assert !renderLock.isHeldByCurrentThread(); renderLock.lock(); boolean locked = false; diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/QuantumToolkit.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/QuantumToolkit.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/QuantumToolkit.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/QuantumToolkit.java @@ -503,8 +503,12 @@ System.err.println("QT.endPulse: " + System.nanoTime()); } } + + protected void pulse() { + pulse(true); + } - void pulse() { + void pulse(boolean collect) { try { long start = PULSE_LOGGING_ENABLED ? System.currentTimeMillis() : 0; if (PULSE_LOGGING_ENABLED) { @@ -523,7 +527,7 @@ animationRunning.set(false); } firePulse(); - collector.renderAll(); + if (collect) collector.renderAll(); endPulseRunning(); } catch (Throwable th) { th.printStackTrace(System.err); diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/UploadingPainter.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/UploadingPainter.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/UploadingPainter.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/UploadingPainter.java @@ -62,7 +62,6 @@ } @Override public void run() { - assert !renderLock.isHeldByCurrentThread(); renderLock.lock(); boolean locked = false; diff --git a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/WindowStage.java b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/WindowStage.java --- a/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/WindowStage.java +++ b/javafx-ui-quantum/src/com/sun/javafx/tk/quantum/WindowStage.java @@ -478,6 +478,10 @@ void exitFullScreen() { setFullScreen(false); } + + boolean isApplet() { + return isPrimaryStage && null != appletWindow; + } private boolean hasPermission(Permission perm) { try {