# HG changeset patch # User kcr # Date 1409075729 25200 # Node ID 38801bfb823c19076b9d97aacc2d1e13f02d9bcd # Parent 3b1618210ab2be098a7812d78ca400ce3dbf94d6 RT-38289: [Quantum] Control ActionEvent is fired on Stage closing and the App hangs if modal window is then shown diff --git a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassViewEventHandler.java b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassViewEventHandler.java --- a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassViewEventHandler.java +++ b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassViewEventHandler.java @@ -224,7 +224,18 @@ keyNotification.chars = chars; keyNotification.modifiers = modifiers; - AccessController.doPrivileged(keyNotification, scene.getAccessControlContext()); + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleKeyEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } + try { + AccessController.doPrivileged(keyNotification, scene.getAccessControlContext()); + } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } + } } private static EventType mouseEventType(int glassType) { @@ -379,7 +390,18 @@ mouseNotification.isPopupTrigger = isPopupTrigger; mouseNotification.isSynthesized = isSynthesized; - AccessController.doPrivileged(mouseNotification, scene.getAccessControlContext()); + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleMouseEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } + try { + AccessController.doPrivileged(mouseNotification, scene.getAccessControlContext()); + } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } + } } @Override public void handleMenuEvent(final View view, @@ -389,6 +411,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("MENU_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleMenuEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -404,6 +431,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -420,6 +450,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("SCROLL_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleScrollEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -446,6 +481,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -527,6 +565,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("INPUT_METHOD_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleInputMethodEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -548,6 +591,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -615,12 +661,20 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("DRAG_ENTER"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleDragEnter: renderLock held!"); + ViewPainter.renderLock.unlock(); + } TransferMode action; try { action = dndHandler.handleDragEnter(x, y, xAbs, yAbs, actionToTransferMode(recommendedDropAction), dropTargetAssistant); } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -632,9 +686,17 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("DRAG_LEAVE"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleDragLeave: renderLock held!"); + ViewPainter.renderLock.unlock(); + } try { dndHandler.handleDragLeave(dropTargetAssistant); } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -649,12 +711,20 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("DRAG_DROP"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleDragDrop: renderLock held!"); + ViewPainter.renderLock.unlock(); + } TransferMode action; try { action = dndHandler.handleDragDrop(x, y, xAbs, yAbs, actionToTransferMode(recommendedDropAction), dropTargetAssistant); } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -670,12 +740,20 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("DRAG_OVER"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleDragOver: renderLock held!"); + ViewPainter.renderLock.unlock(); + } TransferMode action; try { action = dndHandler.handleDragOver(x, y, xAbs, yAbs, actionToTransferMode(recommendedDropAction), dropTargetAssistant); } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -692,10 +770,18 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("DRAG_START"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleDragStart: renderLock held!"); + ViewPainter.renderLock.unlock(); + } dropSourceAssistant = assistant; try { dndHandler.handleDragStart(button, x, y, xAbs, yAbs, assistant); } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -706,9 +792,17 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("DRAG_END"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleDragEnd: renderLock held!"); + ViewPainter.renderLock.unlock(); + } try { dndHandler.handleDragEnd(actionToTransferMode(performedAction), dropSourceAssistant); } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -787,6 +881,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("VIEW_EVENT: "+ViewEvent.getTypeString(type)); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleViewEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } viewNotification.view = view; viewNotification.time = time; viewNotification.type = type; @@ -794,6 +893,9 @@ AccessController.doPrivileged(viewNotification, scene.getAccessControlContext()); } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -809,6 +911,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("SCROLL_GESTURE_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleScrollGestureEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -850,6 +957,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -867,6 +977,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("ZOOM_GESTURE_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleZoomGestureEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -905,6 +1020,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -921,6 +1039,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("ROTATE_GESTURE_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleRotateGestureEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -959,6 +1082,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -974,6 +1100,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("SWIPE_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleSwipeGestureEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -1015,6 +1146,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -1028,6 +1162,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("BEGIN_TOUCH_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleBeginTouchEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -1048,6 +1187,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -1063,6 +1205,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("NEXT_TOUCH_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleNextTouchEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -1095,6 +1242,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -1107,6 +1257,11 @@ if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput("END_TOUCH_EVENT"); } + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleEndTouchEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } WindowStage stage = scene.getWindowStage(); try { if (stage != null) { @@ -1122,6 +1277,9 @@ if (stage != null) { stage.setInEventHandler(false); } + if (locked) { + ViewPainter.renderLock.lock(); + } if (PULSE_LOGGING_ENABLED) { PulseLogger.newInput(null); } @@ -1133,7 +1291,18 @@ @Override public Accessible getSceneAccessible() { if (scene != null && scene.sceneListener != null) { - return scene.sceneListener.getSceneAccessible(); + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("getSceneAccessible: renderLock held!"); + ViewPainter.renderLock.unlock(); + } + try { + return scene.sceneListener.getSceneAccessible(); + } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } + } } return null; } diff --git a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java --- a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java +++ b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/GlassWindowEventHandler.java @@ -121,7 +121,18 @@ @Override public void handleLevelEvent(int level) { - stage.stageListener.changedAlwaysOnTop(level != Level.NORMAL); + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleWindowEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } + try { + stage.stageListener.changedAlwaysOnTop(level != Level.NORMAL); + } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } + } } @Override @@ -129,8 +140,19 @@ this.window = window; this.type = type; - AccessControlContext acc = stage.getAccessControlContext(); - AccessController.doPrivileged(this, acc); + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleWindowEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } + try { + AccessControlContext acc = stage.getAccessControlContext(); + AccessController.doPrivileged(this, acc); + } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } + } } @Override @@ -146,10 +168,21 @@ } } - AccessControlContext acc = stage.getAccessControlContext(); - AccessController.doPrivileged((PrivilegedAction)() -> { - stage.stageListener.changedScreen(oldScreen, newScreen); - return (Void)null; - } , acc); + final boolean locked = ViewPainter.renderLock.isHeldByCurrentThread(); + if (locked) { + System.err.println("handleScreenChangedEvent: renderLock held!"); + ViewPainter.renderLock.unlock(); + } + try { + AccessControlContext acc = stage.getAccessControlContext(); + AccessController.doPrivileged((PrivilegedAction)() -> { + stage.stageListener.changedScreen(oldScreen, newScreen); + return (Void)null; + } , acc); + } finally { + if (locked) { + ViewPainter.renderLock.lock(); + } + } } }