< 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 >