@Override protected void addFSWindowListener(Window w) { // if the window is not a toplevel (has an owner) we have to use the // real toplevel to enter the full-screen mode with (4933099). if (!(w instanceof Frame) && !(w instanceof Dialog) && (realFSWindow = getToplevelOwner(w)) != null) { ownerOrigBounds = realFSWindow.getBounds(); WWindowPeer fp = (WWindowPeer)realFSWindow.getPeer(); ownerWasVisible = realFSWindow.isVisible(); Rectangle r = w.getBounds(); // we use operations on peer instead of component because calling // them on component will take the tree lock fp.reshape(r.x, r.y, r.width, r.height); fp.setVisible(true); } else { realFSWindow = w; } fsWindowWasAlwaysOnTop = realFSWindow.isAlwaysOnTop(); ((WWindowPeer)realFSWindow.getPeer()).setAlwaysOnTop(true); fsWindowListener = new D3DFSWindowAdapter(); realFSWindow.addWindowListener(fsWindowListener); }
@Override protected void addFSWindowListener(Window w) { // if the window is not a toplevel (has an owner) we have to use the // real toplevel to enter the full-screen mode with (4933099). final ComponentAccessor acc = AWTAccessor.getComponentAccessor(); if (!(w instanceof Frame) && !(w instanceof Dialog) && (realFSWindow = getToplevelOwner(w)) != null) { ownerOrigBounds = realFSWindow.getBounds(); WWindowPeer fp = acc.getPeer(realFSWindow); ownerWasVisible = realFSWindow.isVisible(); Rectangle r = w.getBounds(); // we use operations on peer instead of component because calling // them on component will take the tree lock fp.reshape(r.x, r.y, r.width, r.height); fp.setVisible(true); } else { realFSWindow = w; } fsWindowWasAlwaysOnTop = realFSWindow.isAlwaysOnTop(); ((WWindowPeer) acc.getPeer(realFSWindow)).setAlwaysOnTop(true); fsWindowListener = new D3DFSWindowAdapter(); realFSWindow.addWindowListener(fsWindowListener); }
@Override protected void enterFullScreenExclusive(final int screen, WindowPeer wp) { final WWindowPeer wpeer = (WWindowPeer)realFSWindow.getPeer(); D3DRenderQueue rq = D3DRenderQueue.getInstance(); rq.lock(); try { rq.flushAndInvokeNow(new Runnable() { public void run() { long hwnd = wpeer.getHWnd(); if (hwnd == 0l) { // window is disposed fsStatus = false; return; } fsStatus = enterFullScreenExclusiveNative(screen, hwnd); } }); } finally { rq.unlock(); } if (!fsStatus) { super.enterFullScreenExclusive(screen, wp); } }
@Override public synchronized void setDisplayMode(DisplayMode dm) { if (!isDisplayChangeSupported()) { super.setDisplayMode(dm); return; } if (dm == null || (dm = getMatchingDisplayMode(dm)) == null) { throw new IllegalArgumentException("Invalid display mode"); } if (getDisplayMode().equals(dm)) { return; } Window w = getFullScreenWindow(); if (w != null) { WWindowPeer peer = (WWindowPeer)w.getPeer(); configDisplayMode(screen, peer, dm.getWidth(), dm.getHeight(), dm.getBitDepth(), dm.getRefreshRate()); // resize the fullscreen window to the dimensions of the new // display mode Rectangle screenBounds = getDefaultConfiguration().getBounds(); w.setBounds(screenBounds.x, screenBounds.y, dm.getWidth(), dm.getHeight()); // Note: no call to replaceSurfaceData is required here since // replacement will be caused by an upcoming display change event } else { throw new IllegalStateException("Must be in fullscreen mode " + "in order to set display mode"); } }
@Override protected void enterFullScreenExclusive(final int screen, WindowPeer wp) { final WWindowPeer wpeer = AWTAccessor.getComponentAccessor() .getPeer(realFSWindow); D3DRenderQueue rq = D3DRenderQueue.getInstance(); rq.lock(); try { rq.flushAndInvokeNow(new Runnable() { public void run() { long hwnd = wpeer.getHWnd(); if (hwnd == 0l) { // window is disposed fsStatus = false; return; } fsStatus = enterFullScreenExclusiveNative(screen, hwnd); } }); } finally { rq.unlock(); } if (!fsStatus) { super.enterFullScreenExclusive(screen, wp); } }
@Override public synchronized void setDisplayMode(DisplayMode dm) { if (!isDisplayChangeSupported()) { super.setDisplayMode(dm); return; } if (dm == null || (dm = getMatchingDisplayMode(dm)) == null) { throw new IllegalArgumentException("Invalid display mode"); } if (getDisplayMode().equals(dm)) { return; } Window w = getFullScreenWindow(); if (w != null) { WWindowPeer peer = AWTAccessor.getComponentAccessor().getPeer(w); configDisplayMode(screen, peer, dm.getWidth(), dm.getHeight(), dm.getBitDepth(), dm.getRefreshRate()); // resize the fullscreen window to the dimensions of the new // display mode Rectangle screenBounds = getDefaultConfiguration().getBounds(); w.setBounds(screenBounds.x, screenBounds.y, dm.getWidth(), dm.getHeight()); // Note: no call to replaceSurfaceData is required here since // replacement will be caused by an upcoming display change event } else { throw new IllegalStateException("Must be in fullscreen mode " + "in order to set display mode"); } }
@Override protected void removeFSWindowListener(Window w) { realFSWindow.removeWindowListener(fsWindowListener); fsWindowListener = null; /** * Bug 4933099: There is some funny-business to deal with when this * method is called with a Window instead of a Frame. See 4836744 * for more information on this. One side-effect of our workaround * for the problem is that the owning Frame of a Window may end * up getting resized during the fullscreen process. When we * return from fullscreen mode, we should resize the Frame to * its original size (just like the Window is being resized * to its original size in GraphicsDevice). */ WWindowPeer wpeer = (WWindowPeer)realFSWindow.getPeer(); if (wpeer != null) { if (ownerOrigBounds != null) { // if the window went into fs mode before it was realized it // could have (0,0) dimensions if (ownerOrigBounds.width == 0) ownerOrigBounds.width = 1; if (ownerOrigBounds.height == 0) ownerOrigBounds.height = 1; wpeer.reshape(ownerOrigBounds.x, ownerOrigBounds.y, ownerOrigBounds.width, ownerOrigBounds.height); if (!ownerWasVisible) { wpeer.setVisible(false); } ownerOrigBounds = null; } if (!fsWindowWasAlwaysOnTop) { wpeer.setAlwaysOnTop(false); } } realFSWindow = null; }
@Override protected void removeFSWindowListener(Window w) { realFSWindow.removeWindowListener(fsWindowListener); fsWindowListener = null; /** * Bug 4933099: There is some funny-business to deal with when this * method is called with a Window instead of a Frame. See 4836744 * for more information on this. One side-effect of our workaround * for the problem is that the owning Frame of a Window may end * up getting resized during the fullscreen process. When we * return from fullscreen mode, we should resize the Frame to * its original size (just like the Window is being resized * to its original size in GraphicsDevice). */ final WWindowPeer wpeer = AWTAccessor.getComponentAccessor() .getPeer(realFSWindow); if (wpeer != null) { if (ownerOrigBounds != null) { // if the window went into fs mode before it was realized it // could have (0,0) dimensions if (ownerOrigBounds.width == 0) ownerOrigBounds.width = 1; if (ownerOrigBounds.height == 0) ownerOrigBounds.height = 1; wpeer.reshape(ownerOrigBounds.x, ownerOrigBounds.y, ownerOrigBounds.width, ownerOrigBounds.height); if (!ownerWasVisible) { wpeer.setVisible(false); } ownerOrigBounds = null; } if (!fsWindowWasAlwaysOnTop) { wpeer.setAlwaysOnTop(false); } } realFSWindow = null; }