8051617: Fullscreen mode is not working properly on Xorg
authorazvegint
Wed, 29 Apr 2015 12:54:36 +0300
changeset 30486 95884a96b883
parent 30485 2ae50a16ccae
child 30487 e6658a917239
child 30489 7ea6d8a61086
8051617: Fullscreen mode is not working properly on Xorg Reviewed-by: alexsch, serb
jdk/src/java.desktop/unix/classes/sun/awt/X11ComponentPeer.java
jdk/src/java.desktop/unix/classes/sun/awt/X11GraphicsDevice.java
jdk/src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11ComponentPeer.java	Wed Apr 29 02:55:39 2015 +0300
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11ComponentPeer.java	Wed Apr 29 12:54:36 2015 +0300
@@ -32,6 +32,7 @@
 import java.awt.Graphics;
 
 public interface X11ComponentPeer {
+    long getWindow();
     long getContentWindow();
     SurfaceData getSurfaceData();
     GraphicsConfiguration getGraphicsConfiguration();
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11GraphicsDevice.java	Wed Apr 29 02:55:39 2015 +0300
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11GraphicsDevice.java	Wed Apr 29 12:54:36 2015 +0300
@@ -299,11 +299,7 @@
 
     @Override
     public boolean isFullScreenSupported() {
-        // REMIND: for now we will only allow fullscreen exclusive mode
-        // on the primary screen; we could change this behavior slightly
-        // in the future by allowing only one screen to be in fullscreen
-        // exclusive mode at any given time...
-        boolean fsAvailable = (screen == 0) && isXrandrExtensionSupported();
+        boolean fsAvailable = isXrandrExtensionSupported();
         if (fsAvailable) {
             SecurityManager security = System.getSecurityManager();
             if (security != null) {
@@ -329,7 +325,7 @@
     private static void enterFullScreenExclusive(Window w) {
         X11ComponentPeer peer = AWTAccessor.getComponentAccessor().getPeer(w);
         if (peer != null) {
-            enterFullScreenExclusive(peer.getContentWindow());
+            enterFullScreenExclusive(peer.getWindow());
             peer.setFullScreenExclusiveModeState(true);
         }
     }
@@ -338,7 +334,7 @@
         X11ComponentPeer peer = AWTAccessor.getComponentAccessor().getPeer(w);
         if (peer != null) {
             peer.setFullScreenExclusiveModeState(false);
-            exitFullScreenExclusive(peer.getContentWindow());
+            exitFullScreenExclusive(peer.getWindow());
         }
     }
 
--- a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c	Wed Apr 29 02:55:39 2015 +0300
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/awt_GraphicsEnv.c	Wed Apr 29 12:54:36 2015 +0300
@@ -1716,9 +1716,9 @@
 
         /*
          * REMIND: Fullscreen mode doesn't work quite right with multi-monitor
-         * setups and RANDR 1.2. So for now we also require a single screen.
+         * setups and RANDR 1.2.
          */
-        if (awt_numScreens > 1 ) {
+        if ((rr_maj_ver == 1 && rr_min_ver <= 2) && awt_numScreens > 1) {
             J2dRlsTraceLn(J2D_TRACE_INFO, "X11GD_InitXrandrFuncs: Can't use Xrandr. "
                           "Multiple screens in use");
             dlclose(pLibRandR);
@@ -1806,40 +1806,14 @@
     Atom wmState = XInternAtom(awt_display, "_NET_WM_STATE", False);
     Atom wmStateFs = XInternAtom(awt_display,
                                  "_NET_WM_STATE_FULLSCREEN", False);
-    Window root, parent, *children = NULL;
-    unsigned int numchildren;
+    XWindowAttributes attr;
     XEvent event;
-    Status status;
 
-    if (wmState == None || wmStateFs == None) {
+    if (wmState == None || wmStateFs == None
+            || !XGetWindowAttributes(awt_display, win, &attr)) {
         return;
     }
 
-    /*
-     * Note: the Window passed to this method is typically the "content
-     * window" of the top-level, but we need the actual shell window for
-     * the purposes of constructing the XEvent.  Therefore, we walk up the
-     * window hierarchy here to find the true top-level.
-     */
-    do {
-        if (!XQueryTree(awt_display, win,
-                        &root, &parent,
-                        &children, &numchildren))
-        {
-            return;
-        }
-
-        if (children != NULL) {
-            XFree(children);
-        }
-
-        if (parent == root) {
-            break;
-        }
-
-        win = parent;
-    } while (root != parent);
-
     memset(&event, 0, sizeof(event));
     event.xclient.type = ClientMessage;
     event.xclient.message_type = wmState;
@@ -1849,7 +1823,7 @@
     event.xclient.data.l[0] = enabled ? 1 : 0; // 1==add, 0==remove
     event.xclient.data.l[1] = wmStateFs;
 
-    XSendEvent(awt_display, root, False,
+    XSendEvent(awt_display, attr.root, False,
                SubstructureRedirectMask | SubstructureNotifyMask,
                &event);
     XSync(awt_display, False);