< prev index next >
src/java.desktop/unix/classes/sun/awt/X11/XWindowPeer.java
Print this page
*** 27,36 ****
--- 27,37 ----
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.WindowEvent;
+ import java.awt.geom.AffineTransform;
import java.awt.peer.ComponentPeer;
import java.awt.peer.WindowPeer;
import java.io.UnsupportedEncodingException;
*** 748,772 ****
public void paletteChanged() {
}
private Point queryXLocation()
{
! return XlibUtil.translateCoordinates(
! getContentWindow(),
! XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber()),
! new Point(0, 0));
}
protected Point getNewLocation(XConfigureEvent xe, int leftInset, int topInset) {
// Bounds of the window
Rectangle targetBounds = AWTAccessor.getComponentAccessor().getBounds(target);
int runningWM = XWM.getWMID();
Point newLocation = targetBounds.getLocation();
if (xe.get_send_event() || runningWM == XWM.NO_WM || XWM.isNonReparentingWM()) {
// Location, Client size + insets
! newLocation = new Point(xe.get_x() - leftInset, xe.get_y() - topInset);
} else {
// ICCCM 4.1.5 states that a real ConfigureNotify will be sent when
// a window is resized but the client can not tell if the window was
// moved or not. The client should consider the position as unkown
// and use TranslateCoordinates to find the actual position.
--- 749,774 ----
public void paletteChanged() {
}
private Point queryXLocation()
{
! return XlibUtil.translateCoordinates(getContentWindow(), XlibWrapper
! .RootWindow(XToolkit.getDisplay(),
! getScreenNumber()),
! new Point(0, 0), getScale());
}
protected Point getNewLocation(XConfigureEvent xe, int leftInset, int topInset) {
// Bounds of the window
Rectangle targetBounds = AWTAccessor.getComponentAccessor().getBounds(target);
int runningWM = XWM.getWMID();
Point newLocation = targetBounds.getLocation();
if (xe.get_send_event() || runningWM == XWM.NO_WM || XWM.isNonReparentingWM()) {
// Location, Client size + insets
! newLocation = new Point(scaleDown(xe.get_x()) - leftInset,
! scaleDown(xe.get_y()) - topInset);
} else {
// ICCCM 4.1.5 states that a real ConfigureNotify will be sent when
// a window is resized but the client can not tell if the window was
// moved or not. The client should consider the position as unkown
// and use TranslateCoordinates to find the actual position.
*** 805,820 ****
/*
* Correct window location which could be wrong in some cases.
* See getNewLocation() for the details.
*/
Point newLocation = getNewLocation(xe, 0, 0);
! xe.set_x(newLocation.x);
! xe.set_y(newLocation.y);
! checkIfOnNewScreen(new Rectangle(xe.get_x(),
! xe.get_y(),
! xe.get_width(),
! xe.get_height()));
// Don't call super until we've handled a screen change. Otherwise
// there could be a race condition in which a ComponentListener could
// see the old screen.
super.handleConfigureNotifyEvent(xev);
--- 807,822 ----
/*
* Correct window location which could be wrong in some cases.
* See getNewLocation() for the details.
*/
Point newLocation = getNewLocation(xe, 0, 0);
! xe.set_x(scaleUp(newLocation.x));
! xe.set_y(scaleUp(newLocation.y));
! checkIfOnNewScreen(new Rectangle(newLocation.x,
! newLocation.y,
! scaleDown(xe.get_width()),
! scaleDown(xe.get_height())));
// Don't call super until we've handled a screen change. Otherwise
// there could be a race condition in which a ComponentListener could
// see the old screen.
super.handleConfigureNotifyEvent(xev);
*** 2113,2123 ****
public void handleXCrossingEvent(XEvent xev) {
XCrossingEvent xce = xev.get_xcrossing();
if (grabLog.isLoggable(PlatformLogger.Level.FINE)) {
grabLog.fine("{0}, when grabbed {1}, contains {2}",
! xce, isGrabbed(), containsGlobal(xce.get_x_root(), xce.get_y_root()));
}
if (isGrabbed()) {
// When window is grabbed, all events are dispatched to
// it. Retarget them to the corresponding windows (notice
// that XBaseWindow.dispatchEvent does the opposite
--- 2115,2127 ----
public void handleXCrossingEvent(XEvent xev) {
XCrossingEvent xce = xev.get_xcrossing();
if (grabLog.isLoggable(PlatformLogger.Level.FINE)) {
grabLog.fine("{0}, when grabbed {1}, contains {2}",
! xce, isGrabbed(),
! containsGlobal(scaleDown(xce.get_x_root()),
! scaleDown(xce.get_y_root())));
}
if (isGrabbed()) {
// When window is grabbed, all events are dispatched to
// it. Retarget them to the corresponding windows (notice
// that XBaseWindow.dispatchEvent does the opposite
*** 2139,2149 ****
public void handleMotionNotify(XEvent xev) {
XMotionEvent xme = xev.get_xmotion();
if (grabLog.isLoggable(PlatformLogger.Level.FINER)) {
grabLog.finer("{0}, when grabbed {1}, contains {2}",
! xme, isGrabbed(), containsGlobal(xme.get_x_root(), xme.get_y_root()));
}
if (isGrabbed()) {
boolean dragging = false;
final int buttonsNumber = XToolkit.getNumberOfButtonsForMask();
--- 2143,2155 ----
public void handleMotionNotify(XEvent xev) {
XMotionEvent xme = xev.get_xmotion();
if (grabLog.isLoggable(PlatformLogger.Level.FINER)) {
grabLog.finer("{0}, when grabbed {1}, contains {2}",
! xme, isGrabbed(),
! containsGlobal(scaleDown(xme.get_x_root()),
! scaleDown(xme.get_y_root())));
}
if (isGrabbed()) {
boolean dragging = false;
final int buttonsNumber = XToolkit.getNumberOfButtonsForMask();
*** 2164,2176 ****
// so we need to retarget them. Here I use simplified logic which retarget all
// such events to source of mouse press (or the grabber). It helps with fix for 6390326.
// So, I do not want to implement complicated logic for better retargeting.
target = pressTarget.isVisible() ? pressTarget : this;
xme.set_window(target.getWindow());
! Point localCoord = target.toLocal(xme.get_x_root(), xme.get_y_root());
! xme.set_x(localCoord.x);
! xme.set_y(localCoord.y);
}
if (grabLog.isLoggable(PlatformLogger.Level.FINER)) {
grabLog.finer(" - Grab event target {0}", target);
}
if (target != null) {
--- 2170,2183 ----
// so we need to retarget them. Here I use simplified logic which retarget all
// such events to source of mouse press (or the grabber). It helps with fix for 6390326.
// So, I do not want to implement complicated logic for better retargeting.
target = pressTarget.isVisible() ? pressTarget : this;
xme.set_window(target.getWindow());
! Point localCoord = target.toLocal(scaleDown(xme.get_x_root()),
! scaleDown(xme.get_y_root()));
! xme.set_x(scaleUp(localCoord.x));
! xme.set_y(scaleUp(localCoord.y));
}
if (grabLog.isLoggable(PlatformLogger.Level.FINER)) {
grabLog.finer(" - Grab event target {0}", target);
}
if (target != null) {
*** 2180,2190 ****
}
}
// note that we need to pass dragging events to the grabber (6390326)
// see comment above for more inforamtion.
! if (!containsGlobal(xme.get_x_root(), xme.get_y_root()) && !dragging) {
// Outside of Java
return;
}
}
super.handleMotionNotify(xev);
--- 2187,2199 ----
}
}
// note that we need to pass dragging events to the grabber (6390326)
// see comment above for more inforamtion.
! if (!containsGlobal(scaleDown(xme.get_x_root()),
! scaleDown(xme.get_y_root()))
! && !dragging) {
// Outside of Java
return;
}
}
super.handleMotionNotify(xev);
*** 2193,2214 ****
// we use it to retarget mouse drag and mouse release during grab.
private XBaseWindow pressTarget = this;
public void handleButtonPressRelease(XEvent xev) {
XButtonEvent xbe = xev.get_xbutton();
-
/*
* Ignore the buttons above 20 due to the bit limit for
* InputEvent.BUTTON_DOWN_MASK.
* One more bit is reserved for FIRST_HIGH_BIT.
*/
if (xbe.get_button() > SunToolkit.MAX_BUTTONS_SUPPORTED) {
return;
}
if (grabLog.isLoggable(PlatformLogger.Level.FINE)) {
grabLog.fine("{0}, when grabbed {1}, contains {2} ({3}, {4}, {5}x{6})",
! xbe, isGrabbed(), containsGlobal(xbe.get_x_root(), xbe.get_y_root()), getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight());
}
if (isGrabbed()) {
// When window is grabbed, all events are dispatched to
// it. Retarget them to the corresponding windows (notice
// that XBaseWindow.dispatchEvent does the opposite
--- 2202,2226 ----
// we use it to retarget mouse drag and mouse release during grab.
private XBaseWindow pressTarget = this;
public void handleButtonPressRelease(XEvent xev) {
XButtonEvent xbe = xev.get_xbutton();
/*
* Ignore the buttons above 20 due to the bit limit for
* InputEvent.BUTTON_DOWN_MASK.
* One more bit is reserved for FIRST_HIGH_BIT.
*/
if (xbe.get_button() > SunToolkit.MAX_BUTTONS_SUPPORTED) {
return;
}
if (grabLog.isLoggable(PlatformLogger.Level.FINE)) {
grabLog.fine("{0}, when grabbed {1}, contains {2} ({3}, {4}, {5}x{6})",
! xbe, isGrabbed(),
! containsGlobal(scaleDown(xbe.get_x_root()),
! scaleDown(xbe.get_y_root())),
! getAbsoluteX(), getAbsoluteY(),
! getWidth(), getHeight());
}
if (isGrabbed()) {
// When window is grabbed, all events are dispatched to
// it. Retarget them to the corresponding windows (notice
// that XBaseWindow.dispatchEvent does the opposite
*** 2230,2242 ****
// during grab we do receive mouse release on different component (not on the source
// of mouse press). So we need to retarget it.
// see 6390326 for more information.
target = pressTarget.isVisible() ? pressTarget : this;
xbe.set_window(target.getWindow());
! Point localCoord = target.toLocal(xbe.get_x_root(), xbe.get_y_root());
! xbe.set_x(localCoord.x);
! xbe.set_y(localCoord.y);
pressTarget = this;
}
if (target != null && target != getContentXWindow() && target != this) {
target.dispatchEvent(xev);
return;
--- 2242,2255 ----
// during grab we do receive mouse release on different component (not on the source
// of mouse press). So we need to retarget it.
// see 6390326 for more information.
target = pressTarget.isVisible() ? pressTarget : this;
xbe.set_window(target.getWindow());
! Point localCoord = target.toLocal(scaleDown(xbe.get_x_root()),
! scaleDown(xbe.get_y_root()));
! xbe.set_x(scaleUp(localCoord.x));
! xbe.set_y(scaleUp(localCoord.y));
pressTarget = this;
}
if (target != null && target != getContentXWindow() && target != this) {
target.dispatchEvent(xev);
return;
*** 2244,2254 ****
} finally {
if (target != null) {
// Target is either us or our content window -
// check that event is inside. 'Us' in case of
// shell will mean that this will also filter out press on title
! if ((target == this || target == getContentXWindow()) && !containsGlobal(xbe.get_x_root(), xbe.get_y_root())) {
// Outside this toplevel hierarchy
// According to the specification of UngrabEvent, post it
// when press occurs outside of the window and not on its owned windows
if (xbe.get_type() == XConstants.ButtonPress) {
if (grabLog.isLoggable(PlatformLogger.Level.FINE)) {
--- 2257,2270 ----
} finally {
if (target != null) {
// Target is either us or our content window -
// check that event is inside. 'Us' in case of
// shell will mean that this will also filter out press on title
! if ((target == this || target == getContentXWindow())
! && !containsGlobal(scaleDown(xbe.get_x_root()),
! scaleDown(xbe.get_y_root())))
! {
// Outside this toplevel hierarchy
// According to the specification of UngrabEvent, post it
// when press occurs outside of the window and not on its owned windows
if (xbe.get_type() == XConstants.ButtonPress) {
if (grabLog.isLoggable(PlatformLogger.Level.FINE)) {
< prev index next >