< prev index next >
src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 213,222 ****
--- 213,228 ----
private static volatile int maxWindowHeightInPixels = -1;
static long awt_defaultFg; // Pixel
private static XMouseInfoPeer xPeer;
+ /**
+ * Should we check "_NET_WM_STRUT/_NET_WM_STRUT_PARTIAL" during insets
+ * calculation.
+ */
+ private static Boolean checkSTRUT;
+
static {
initSecurityWarning();
if (GraphicsEnvironment.isHeadless()) {
localEnv = null;
device = null;
*** 824,840 ****
return null;
}
/*
! * If we're running in non-Xinerama environment and the current
! * window manager supports _NET protocol then the screen insets
! * are calculated using _NET_WM_WORKAREA property of the root
! * window.
! * Otherwise, i. e. if Xinerama is on or _NET_WM_WORKAREA is
! * not set, we try to calculate the insets ourselves using
! * getScreenInsetsManually method.
*/
@Override
public Insets getScreenInsets(GraphicsConfiguration gc)
{
XNETProtocol netProto = XWM.getWM().getNETProtocol();
--- 830,859 ----
return null;
}
/*
! * If the current window manager supports _NET protocol then the screen
! * insets are calculated using _NET_WORKAREA property of the root window.
! * <p>
! * Note that _NET_WORKAREA is a rectangular area and it does not work
! * well in the Xinerama mode.
! * <p>
! * We will trust the part of this rectangular area only if it starts at the
! * requested graphics configuration. Below is an example when the
! * _NET_WORKAREA intersects with the requested graphics configuration but
! * produce wrong result.
! *
! * //<-x1,y1///////
! * // // ////////////////
! * // SCREEN1 // // SCREEN2 //
! * // ********** // // x2,y2->//
! * //////////////// // //
! * ////////////////
! *
! * When two screens are overlap and the first contain a dock(*****), then
! * _NET_WORKAREA may start at point x1,y1 and ends at point x2,y2.
*/
@Override
public Insets getScreenInsets(GraphicsConfiguration gc)
{
XNETProtocol netProto = XWM.getWM().getNETProtocol();
*** 844,900 ****
}
XToolkit.awtLock();
try
{
- X11GraphicsConfig x11gc = (X11GraphicsConfig)gc;
- X11GraphicsDevice x11gd = x11gc.getDevice();
- long root = XlibUtil.getRootWindow(x11gd.getScreen());
- int scale = x11gc.getScale();
- Rectangle rootBounds = XlibUtil.getWindowGeometry(root, scale);
-
X11GraphicsEnvironment x11ge = (X11GraphicsEnvironment)
GraphicsEnvironment.getLocalGraphicsEnvironment();
! if (!x11ge.runningXinerama())
! {
! Insets screenInsets = getInsets(root, rootBounds, scale);
! if (screenInsets != null) return screenInsets;
! }
!
Insets insets = getScreenInsetsManually(root, rootBounds,
gc.getBounds(), scale);
! if ((insets.left | insets.top | insets.bottom | insets.right) == 0
! && rootBounds != null ) {
! root = XlibWrapper.RootWindow(XToolkit.getDisplay(),
! x11gd.getScreen());
! Insets screenInsets = getInsets(root, rootBounds, scale);
! if (screenInsets != null) return screenInsets;
! }
return insets;
}
finally
{
XToolkit.awtUnlock();
}
}
! private Insets getInsets(long root, Rectangle rootBounds, int scale) {
! Rectangle workArea = XToolkit.getWorkArea(root, scale);
! if (workArea == null) {
! return null;
}
! return new Insets(workArea.y, workArea.x,
! rootBounds.height - workArea.height - workArea.y,
! rootBounds.width - workArea.width - workArea.x);
}
/*
* Manual calculation of screen insets: get all the windows with
* _NET_WM_STRUT/_NET_WM_STRUT_PARTIAL hints and add these
* hints' values to screen insets.
*
* This method should be called under XToolkit.awtLock()
*/
private Insets getScreenInsetsManually(long root, Rectangle rootBounds,
Rectangle screenBounds, int scale)
{
/*
--- 863,932 ----
}
XToolkit.awtLock();
try
{
X11GraphicsEnvironment x11ge = (X11GraphicsEnvironment)
GraphicsEnvironment.getLocalGraphicsEnvironment();
! X11GraphicsConfig x11gc = (X11GraphicsConfig) gc;
! long root = XlibUtil.getRootWindow(x11gc.getDevice().getScreen());
! int scale = x11gc.getScale();
! if (x11ge.runningXinerama() && checkSTRUT()) {
! // implementation based on _NET_WM_STRUT/_NET_WM_STRUT_PARTIAL
! Rectangle rootBounds = XlibUtil.getWindowGeometry(root, scale);
Insets insets = getScreenInsetsManually(root, rootBounds,
gc.getBounds(), scale);
! if ((insets.left | insets.top | insets.bottom | insets.right) != 0
! || rootBounds == null) {
return insets;
}
+ }
+ Rectangle workArea = XToolkit.getWorkArea(root, scale);
+ Rectangle screen = gc.getBounds();
+ if (workArea != null && screen.contains(workArea.getLocation())) {
+ workArea = workArea.intersection(screen);
+ int top = workArea.y - screen.y;
+ int left = workArea.x - screen.x;
+ int bottom = screen.height - workArea.height - top;
+ int right = screen.width - workArea.width - left;
+ return new Insets(top, left, bottom, right);
+ }
+ // Note that it is better to return zeros than inadequate values
+ return new Insets(0, 0, 0, 0);
+ }
finally
{
XToolkit.awtUnlock();
}
}
! /**
! * Returns the value of "sun.awt.X11.checkSTRUT" property. Default value is
! * {@code false}.
! */
! private static boolean checkSTRUT() {
! if (checkSTRUT == null) {
! checkSTRUT = AccessController.doPrivileged(
! new GetBooleanAction("sun.awt.X11.checkSTRUT"));
}
! return checkSTRUT;
}
/*
* Manual calculation of screen insets: get all the windows with
* _NET_WM_STRUT/_NET_WM_STRUT_PARTIAL hints and add these
* hints' values to screen insets.
*
* This method should be called under XToolkit.awtLock()
+ *
+ * This method is unused because of two reasons:
+ * - Iteration over windows may be extremely slow, and execution of
+ * getScreenInsets() can be x100 slower than in one monitor config.
+ * - _NET_WM_STRUT/_NET_WM_STRUT_PARTIAL are hints for the applications.
+ * WM should take into account these hints when "_NET_WORKAREA" is
+ * calculated, but the system panels are not necessary contain these
+ * hints(Gnome 3 for example).
*/
private Insets getScreenInsetsManually(long root, Rectangle rootBounds,
Rectangle screenBounds, int scale)
{
/*
< prev index next >