From 8485cb77f612f0782e37be55e45353b93c2d7b88 Mon Sep 17 00:00:00 2001 From: azvegint Date: Wed, 29 Apr 2015 12:54:36 +0300 Subject: [PATCH] 8051617: Fullscreen mode is not working properly on Xorg Reviewed-by: alexsch, serb --- .../classes/sun/awt/X11ComponentPeer.java | 1 + .../classes/sun/awt/X11GraphicsDevice.java | 10 ++--- src/solaris/native/sun/awt/awt_GraphicsEnv.c | 38 +++---------------- 3 files changed, 10 insertions(+), 39 deletions(-) diff --git a/src/solaris/classes/sun/awt/X11ComponentPeer.java b/src/solaris/classes/sun/awt/X11ComponentPeer.java index 688397250..35623a67b 100644 --- a/src/solaris/classes/sun/awt/X11ComponentPeer.java +++ b/src/solaris/classes/sun/awt/X11ComponentPeer.java @@ -32,6 +32,7 @@ import sun.java2d.SurfaceData; import java.awt.Graphics; public interface X11ComponentPeer { + long getWindow(); long getContentWindow(); SurfaceData getSurfaceData(); GraphicsConfiguration getGraphicsConfiguration(); diff --git a/src/solaris/classes/sun/awt/X11GraphicsDevice.java b/src/solaris/classes/sun/awt/X11GraphicsDevice.java index c885427e5..b5e982154 100644 --- a/src/solaris/classes/sun/awt/X11GraphicsDevice.java +++ b/src/solaris/classes/sun/awt/X11GraphicsDevice.java @@ -298,11 +298,7 @@ public class X11GraphicsDevice @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) { @@ -328,7 +324,7 @@ public class X11GraphicsDevice private static void enterFullScreenExclusive(Window w) { X11ComponentPeer peer = (X11ComponentPeer)w.getPeer(); if (peer != null) { - enterFullScreenExclusive(peer.getContentWindow()); + enterFullScreenExclusive(peer.getWindow()); peer.setFullScreenExclusiveModeState(true); } } @@ -337,7 +333,7 @@ public class X11GraphicsDevice X11ComponentPeer peer = (X11ComponentPeer)w.getPeer(); if (peer != null) { peer.setFullScreenExclusiveModeState(false); - exitFullScreenExclusive(peer.getContentWindow()); + exitFullScreenExclusive(peer.getWindow()); } } diff --git a/src/solaris/native/sun/awt/awt_GraphicsEnv.c b/src/solaris/native/sun/awt/awt_GraphicsEnv.c index 0e2d15d04..1a20b404a 100644 --- a/src/solaris/native/sun/awt/awt_GraphicsEnv.c +++ b/src/solaris/native/sun/awt/awt_GraphicsEnv.c @@ -1716,9 +1716,9 @@ X11GD_InitXrandrFuncs(JNIEnv *env) /* * 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 @@ X11GD_SetFullscreenMode(Window win, jboolean enabled) 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 @@ X11GD_SetFullscreenMode(Window win, jboolean enabled) 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); -- GitLab