提交 8485cb77 编写于 作者: A azvegint

8051617: Fullscreen mode is not working properly on Xorg

Reviewed-by: alexsch, serb
上级 09c10858
...@@ -32,6 +32,7 @@ import sun.java2d.SurfaceData; ...@@ -32,6 +32,7 @@ import sun.java2d.SurfaceData;
import java.awt.Graphics; import java.awt.Graphics;
public interface X11ComponentPeer { public interface X11ComponentPeer {
long getWindow();
long getContentWindow(); long getContentWindow();
SurfaceData getSurfaceData(); SurfaceData getSurfaceData();
GraphicsConfiguration getGraphicsConfiguration(); GraphicsConfiguration getGraphicsConfiguration();
......
...@@ -298,11 +298,7 @@ public class X11GraphicsDevice ...@@ -298,11 +298,7 @@ public class X11GraphicsDevice
@Override @Override
public boolean isFullScreenSupported() { public boolean isFullScreenSupported() {
// REMIND: for now we will only allow fullscreen exclusive mode boolean fsAvailable = isXrandrExtensionSupported();
// 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();
if (fsAvailable) { if (fsAvailable) {
SecurityManager security = System.getSecurityManager(); SecurityManager security = System.getSecurityManager();
if (security != null) { if (security != null) {
...@@ -328,7 +324,7 @@ public class X11GraphicsDevice ...@@ -328,7 +324,7 @@ public class X11GraphicsDevice
private static void enterFullScreenExclusive(Window w) { private static void enterFullScreenExclusive(Window w) {
X11ComponentPeer peer = (X11ComponentPeer)w.getPeer(); X11ComponentPeer peer = (X11ComponentPeer)w.getPeer();
if (peer != null) { if (peer != null) {
enterFullScreenExclusive(peer.getContentWindow()); enterFullScreenExclusive(peer.getWindow());
peer.setFullScreenExclusiveModeState(true); peer.setFullScreenExclusiveModeState(true);
} }
} }
...@@ -337,7 +333,7 @@ public class X11GraphicsDevice ...@@ -337,7 +333,7 @@ public class X11GraphicsDevice
X11ComponentPeer peer = (X11ComponentPeer)w.getPeer(); X11ComponentPeer peer = (X11ComponentPeer)w.getPeer();
if (peer != null) { if (peer != null) {
peer.setFullScreenExclusiveModeState(false); peer.setFullScreenExclusiveModeState(false);
exitFullScreenExclusive(peer.getContentWindow()); exitFullScreenExclusive(peer.getWindow());
} }
} }
......
...@@ -1716,9 +1716,9 @@ X11GD_InitXrandrFuncs(JNIEnv *env) ...@@ -1716,9 +1716,9 @@ X11GD_InitXrandrFuncs(JNIEnv *env)
/* /*
* REMIND: Fullscreen mode doesn't work quite right with multi-monitor * 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. " J2dRlsTraceLn(J2D_TRACE_INFO, "X11GD_InitXrandrFuncs: Can't use Xrandr. "
"Multiple screens in use"); "Multiple screens in use");
dlclose(pLibRandR); dlclose(pLibRandR);
...@@ -1806,40 +1806,14 @@ X11GD_SetFullscreenMode(Window win, jboolean enabled) ...@@ -1806,40 +1806,14 @@ X11GD_SetFullscreenMode(Window win, jboolean enabled)
Atom wmState = XInternAtom(awt_display, "_NET_WM_STATE", False); Atom wmState = XInternAtom(awt_display, "_NET_WM_STATE", False);
Atom wmStateFs = XInternAtom(awt_display, Atom wmStateFs = XInternAtom(awt_display,
"_NET_WM_STATE_FULLSCREEN", False); "_NET_WM_STATE_FULLSCREEN", False);
Window root, parent, *children = NULL; XWindowAttributes attr;
unsigned int numchildren;
XEvent event; XEvent event;
Status status;
if (wmState == None || wmStateFs == None) { if (wmState == None || wmStateFs == None
|| !XGetWindowAttributes(awt_display, win, &attr)) {
return; 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)); memset(&event, 0, sizeof(event));
event.xclient.type = ClientMessage; event.xclient.type = ClientMessage;
event.xclient.message_type = wmState; event.xclient.message_type = wmState;
...@@ -1849,7 +1823,7 @@ X11GD_SetFullscreenMode(Window win, jboolean enabled) ...@@ -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[0] = enabled ? 1 : 0; // 1==add, 0==remove
event.xclient.data.l[1] = wmStateFs; event.xclient.data.l[1] = wmStateFs;
XSendEvent(awt_display, root, False, XSendEvent(awt_display, attr.root, False,
SubstructureRedirectMask | SubstructureNotifyMask, SubstructureRedirectMask | SubstructureNotifyMask,
&event); &event);
XSync(awt_display, False); XSync(awt_display, False);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册