187 protected String getWMName() {
188 String name = target.getName();
189 if (name == null || name.trim().equals("")) {
190 name = " ";
191 }
192 return name;
193 }
194
195 void postInit(XCreateWindowParams params) {
196 super.postInit(params);
197
198 // Init WM_PROTOCOLS atom
199 initWMProtocols();
200
201 // Set WM_TRANSIENT_FOR and group_leader
202 Window t_window = (Window)target;
203 Window owner = t_window.getOwner();
204 if (owner != null) {
205 ownerPeer = (XWindowPeer)owner.getPeer();
206 if (focusLog.isLoggable(Level.FINER)) {
207 focusLog.fine("Owner is " + owner);
208 focusLog.fine("Owner peer is " + ownerPeer);
209 focusLog.fine("Owner X window " + Long.toHexString(ownerPeer.getWindow()));
210 focusLog.fine("Owner content X window " + Long.toHexString(ownerPeer.getContentWindow()));
211 }
212 // as owner window may be an embedded window, we must get a toplevel window
213 // to set as TRANSIENT_FOR hint
214 long ownerWindow = ownerPeer.getWindow();
215 if (ownerWindow != 0) {
216 XToolkit.awtLock();
217 try {
218 // Set WM_TRANSIENT_FOR
219 if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Setting transient on " + Long.toHexString(getWindow())
220 + " for " + Long.toHexString(ownerWindow));
221 setToplevelTransientFor(this, ownerPeer, false, true);
222
223 // Set group leader
224 XWMHints hints = getWMHints();
225 hints.set_flags(hints.get_flags() | (int)XlibWrapper.WindowGroupHint);
226 hints.set_window_group(ownerWindow);
227 XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData);
228 }
229 finally {
230 XToolkit.awtUnlock();
231 }
232 }
233 }
234
235 // Init warning window(for applets)
236 if (((Window)target).getWarningString() != null) {
237 // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
238 // and TrayIcon balloon windows without a warning window.
239 if (!WindowAccessor.isTrayIconWindow((Window)target)) {
240 warningWindow = new XWarningWindow((Window)target, getWindow(), this);
783 repositionSecurityWarning();
784 }
785
786 final void requestXFocus(long time) {
787 requestXFocus(time, true);
788 }
789
790 final void requestXFocus() {
791 requestXFocus(0, false);
792 }
793
794 /**
795 * Requests focus to this top-level. Descendants should override to provide
796 * implementations based on a class of top-level.
797 */
798 protected void requestXFocus(long time, boolean timeProvided) {
799 // Since in XAWT focus is synthetic and all basic Windows are
800 // override_redirect all we can do is check whether our parent
801 // is active. If it is - we can freely synthesize focus transfer.
802 // Luckily, this logic is already implemented in requestWindowFocus.
803 if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Requesting window focus");
804 requestWindowFocus(time, timeProvided);
805 }
806
807 public final boolean focusAllowedFor() {
808 if (isNativelyNonFocusableWindow()) {
809 return false;
810 }
811 /*
812 Window target = (Window)this.target;
813 if (!target.isVisible() ||
814 !target.isEnabled() ||
815 !target.isFocusable())
816 {
817 return false;
818 }
819 */
820 if (isModalBlocked()) {
821 return false;
822 }
823 return true;
993 XQueryTree qt = new XQueryTree(wi);
994 try {
995 if (qt.execute() == 0) {
996 return 0;
997 }
998 root = qt.get_root();
999 wi = qt.get_parent();
1000 } finally {
1001 qt.dispose();
1002 }
1003
1004 } while (wi != root);
1005
1006 return ret;
1007 }
1008 private boolean isDesktopWindow( long wi ) {
1009 return XWM.getWM().isDesktopWindow( wi );
1010 }
1011
1012 private void updateAlwaysOnTop() {
1013 log.log(Level.FINE, "Promoting always-on-top state {0}", Boolean.valueOf(alwaysOnTop));
1014 XWM.getWM().setLayer(this,
1015 alwaysOnTop ?
1016 XLayerProtocol.LAYER_ALWAYS_ON_TOP :
1017 XLayerProtocol.LAYER_NORMAL);
1018 }
1019
1020 public void updateAlwaysOnTopState() {
1021 this.alwaysOnTop = ((Window) this.target).isAlwaysOnTop();
1022 updateAlwaysOnTop();
1023 }
1024
1025 boolean isLocationByPlatform() {
1026 return locationByPlatform;
1027 }
1028
1029 private void promoteDefaultPosition() {
1030 this.locationByPlatform = ((Window)target).isLocationByPlatform();
1031 if (locationByPlatform) {
1032 XToolkit.awtLock();
1033 try {
1780 } else {
1781 focusLog.fine("Parent window is not active");
1782 }
1783 ComponentPeer peer = ComponentAccessor.getPeer(owner);
1784 if (peer instanceof XDecoratedPeer) {
1785 XDecoratedPeer wpeer = (XDecoratedPeer) peer;
1786 if (wpeer.requestWindowFocus(this, time, timeProvided)) {
1787 focusLog.fine("Parent window accepted focus request - generating focus for this window");
1788 return true;
1789 }
1790 }
1791 focusLog.fine("Denied - parent window is not active and didn't accept focus request");
1792 return false;
1793 }
1794
1795 // This method is to be overriden in XDecoratedPeer.
1796 void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
1797 }
1798
1799 public void xSetVisible(boolean visible) {
1800 if (log.isLoggable(Level.FINE)) log.fine("Setting visible on " + this + " to " + visible);
1801 XToolkit.awtLock();
1802 try {
1803 this.visible = visible;
1804 if (visible) {
1805 XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
1806 } else {
1807 XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
1808 }
1809 XlibWrapper.XFlush(XToolkit.getDisplay());
1810 }
1811 finally {
1812 XToolkit.awtUnlock();
1813 }
1814 }
1815
1816 private int dropTargetCount = 0;
1817
1818 public synchronized void addDropTarget() {
1819 if (dropTargetCount == 0) {
1820 long window = getWindow();
1964 // that XBaseWindow.dispatchEvent does the opposite
1965 // translation)
1966 // Note that we need to retarget XCrossingEvents to content window
1967 // since it generates MOUSE_ENTERED/MOUSE_EXITED for frame and dialog.
1968 // (fix for 6390326)
1969 XBaseWindow target = XToolkit.windowToXWindow(xce.get_window());
1970 if (grabLog.isLoggable(Level.FINER)) {
1971 grabLog.log(Level.FINER, " - Grab event target {0}",
1972 new Object[] {String.valueOf(target)});
1973 }
1974 if (target != null && target != this) {
1975 target.dispatchEvent(xev);
1976 return;
1977 }
1978 }
1979 super.handleXCrossingEvent(xev);
1980 }
1981
1982 public void handleMotionNotify(XEvent xev) {
1983 XMotionEvent xme = xev.get_xmotion();
1984 if (grabLog.isLoggable(Level.FINE)) {
1985 grabLog.log(Level.FINER, "{0}, when grabbed {1}, contains {2}",
1986 new Object[] {String.valueOf(xme), isGrabbed(),
1987 containsGlobal(xme.get_x_root(), xme.get_y_root())});
1988 }
1989 if (isGrabbed()) {
1990 boolean dragging = (xme.get_state() & (Button1Mask | Button2Mask | Button3Mask)) != 0;
1991 // When window is grabbed, all events are dispatched to
1992 // it. Retarget them to the corresponding windows (notice
1993 // that XBaseWindow.dispatchEvent does the opposite
1994 // translation)
1995 XBaseWindow target = XToolkit.windowToXWindow(xme.get_window());
1996 if (dragging && pressTarget != target) {
1997 // for some reasons if we grab input MotionNotify for drag is reported with target
1998 // to underlying window, not to window on which we have initiated drag
1999 // so we need to retarget them. Here I use simplified logic which retarget all
2000 // such events to source of mouse press (or the grabber). It helps with fix for 6390326.
2001 // So, I do not want to implement complicated logic for better retargeting.
2002 target = pressTarget.isVisible() ? pressTarget : this;
2003 xme.set_window(target.getWindow());
2004 xme.set_x(xme.get_x_root() - target.getX());
2146 }
2147 if (iOpacity > maxOpacity) {
2148 iOpacity = maxOpacity;
2149 }
2150
2151 XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY");
2152
2153 if (iOpacity == maxOpacity) {
2154 netWmWindowOpacityAtom.DeleteProperty(getWindow());
2155 } else {
2156 netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity);
2157 }
2158 }
2159
2160 @Override
2161 public void setOpaque(boolean isOpaque) {
2162 // no-op
2163 }
2164
2165 @Override
2166 public void updateWindow(BufferedImage backBuffer) {
2167 // no-op
2168 }
2169 }
|
187 protected String getWMName() {
188 String name = target.getName();
189 if (name == null || name.trim().equals("")) {
190 name = " ";
191 }
192 return name;
193 }
194
195 void postInit(XCreateWindowParams params) {
196 super.postInit(params);
197
198 // Init WM_PROTOCOLS atom
199 initWMProtocols();
200
201 // Set WM_TRANSIENT_FOR and group_leader
202 Window t_window = (Window)target;
203 Window owner = t_window.getOwner();
204 if (owner != null) {
205 ownerPeer = (XWindowPeer)owner.getPeer();
206 if (focusLog.isLoggable(Level.FINER)) {
207 focusLog.finer("Owner is " + owner);
208 focusLog.finer("Owner peer is " + ownerPeer);
209 focusLog.finer("Owner X window " + Long.toHexString(ownerPeer.getWindow()));
210 focusLog.finer("Owner content X window " + Long.toHexString(ownerPeer.getContentWindow()));
211 }
212 // as owner window may be an embedded window, we must get a toplevel window
213 // to set as TRANSIENT_FOR hint
214 long ownerWindow = ownerPeer.getWindow();
215 if (ownerWindow != 0) {
216 XToolkit.awtLock();
217 try {
218 // Set WM_TRANSIENT_FOR
219 if (focusLog.isLoggable(Level.FINE)) {
220 focusLog.fine("Setting transient on " + Long.toHexString(getWindow())
221 + " for " + Long.toHexString(ownerWindow));
222 }
223 setToplevelTransientFor(this, ownerPeer, false, true);
224
225 // Set group leader
226 XWMHints hints = getWMHints();
227 hints.set_flags(hints.get_flags() | (int)XlibWrapper.WindowGroupHint);
228 hints.set_window_group(ownerWindow);
229 XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData);
230 }
231 finally {
232 XToolkit.awtUnlock();
233 }
234 }
235 }
236
237 // Init warning window(for applets)
238 if (((Window)target).getWarningString() != null) {
239 // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
240 // and TrayIcon balloon windows without a warning window.
241 if (!WindowAccessor.isTrayIconWindow((Window)target)) {
242 warningWindow = new XWarningWindow((Window)target, getWindow(), this);
785 repositionSecurityWarning();
786 }
787
788 final void requestXFocus(long time) {
789 requestXFocus(time, true);
790 }
791
792 final void requestXFocus() {
793 requestXFocus(0, false);
794 }
795
796 /**
797 * Requests focus to this top-level. Descendants should override to provide
798 * implementations based on a class of top-level.
799 */
800 protected void requestXFocus(long time, boolean timeProvided) {
801 // Since in XAWT focus is synthetic and all basic Windows are
802 // override_redirect all we can do is check whether our parent
803 // is active. If it is - we can freely synthesize focus transfer.
804 // Luckily, this logic is already implemented in requestWindowFocus.
805 if (focusLog.isLoggable(Level.FINE)) {
806 focusLog.fine("Requesting window focus");
807 }
808 requestWindowFocus(time, timeProvided);
809 }
810
811 public final boolean focusAllowedFor() {
812 if (isNativelyNonFocusableWindow()) {
813 return false;
814 }
815 /*
816 Window target = (Window)this.target;
817 if (!target.isVisible() ||
818 !target.isEnabled() ||
819 !target.isFocusable())
820 {
821 return false;
822 }
823 */
824 if (isModalBlocked()) {
825 return false;
826 }
827 return true;
997 XQueryTree qt = new XQueryTree(wi);
998 try {
999 if (qt.execute() == 0) {
1000 return 0;
1001 }
1002 root = qt.get_root();
1003 wi = qt.get_parent();
1004 } finally {
1005 qt.dispose();
1006 }
1007
1008 } while (wi != root);
1009
1010 return ret;
1011 }
1012 private boolean isDesktopWindow( long wi ) {
1013 return XWM.getWM().isDesktopWindow( wi );
1014 }
1015
1016 private void updateAlwaysOnTop() {
1017 if (log.isLoggable(Level.FINE)) {
1018 log.log(Level.FINE, "Promoting always-on-top state {0}", Boolean.valueOf(alwaysOnTop));
1019 }
1020 XWM.getWM().setLayer(this,
1021 alwaysOnTop ?
1022 XLayerProtocol.LAYER_ALWAYS_ON_TOP :
1023 XLayerProtocol.LAYER_NORMAL);
1024 }
1025
1026 public void updateAlwaysOnTopState() {
1027 this.alwaysOnTop = ((Window) this.target).isAlwaysOnTop();
1028 updateAlwaysOnTop();
1029 }
1030
1031 boolean isLocationByPlatform() {
1032 return locationByPlatform;
1033 }
1034
1035 private void promoteDefaultPosition() {
1036 this.locationByPlatform = ((Window)target).isLocationByPlatform();
1037 if (locationByPlatform) {
1038 XToolkit.awtLock();
1039 try {
1786 } else {
1787 focusLog.fine("Parent window is not active");
1788 }
1789 ComponentPeer peer = ComponentAccessor.getPeer(owner);
1790 if (peer instanceof XDecoratedPeer) {
1791 XDecoratedPeer wpeer = (XDecoratedPeer) peer;
1792 if (wpeer.requestWindowFocus(this, time, timeProvided)) {
1793 focusLog.fine("Parent window accepted focus request - generating focus for this window");
1794 return true;
1795 }
1796 }
1797 focusLog.fine("Denied - parent window is not active and didn't accept focus request");
1798 return false;
1799 }
1800
1801 // This method is to be overriden in XDecoratedPeer.
1802 void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
1803 }
1804
1805 public void xSetVisible(boolean visible) {
1806 if (log.isLoggable(Level.FINE)) {
1807 log.fine("Setting visible on " + this + " to " + visible);
1808 }
1809 XToolkit.awtLock();
1810 try {
1811 this.visible = visible;
1812 if (visible) {
1813 XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
1814 } else {
1815 XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
1816 }
1817 XlibWrapper.XFlush(XToolkit.getDisplay());
1818 }
1819 finally {
1820 XToolkit.awtUnlock();
1821 }
1822 }
1823
1824 private int dropTargetCount = 0;
1825
1826 public synchronized void addDropTarget() {
1827 if (dropTargetCount == 0) {
1828 long window = getWindow();
1972 // that XBaseWindow.dispatchEvent does the opposite
1973 // translation)
1974 // Note that we need to retarget XCrossingEvents to content window
1975 // since it generates MOUSE_ENTERED/MOUSE_EXITED for frame and dialog.
1976 // (fix for 6390326)
1977 XBaseWindow target = XToolkit.windowToXWindow(xce.get_window());
1978 if (grabLog.isLoggable(Level.FINER)) {
1979 grabLog.log(Level.FINER, " - Grab event target {0}",
1980 new Object[] {String.valueOf(target)});
1981 }
1982 if (target != null && target != this) {
1983 target.dispatchEvent(xev);
1984 return;
1985 }
1986 }
1987 super.handleXCrossingEvent(xev);
1988 }
1989
1990 public void handleMotionNotify(XEvent xev) {
1991 XMotionEvent xme = xev.get_xmotion();
1992 if (grabLog.isLoggable(Level.FINER)) {
1993 grabLog.log(Level.FINER, "{0}, when grabbed {1}, contains {2}",
1994 new Object[] {String.valueOf(xme), isGrabbed(),
1995 containsGlobal(xme.get_x_root(), xme.get_y_root())});
1996 }
1997 if (isGrabbed()) {
1998 boolean dragging = (xme.get_state() & (Button1Mask | Button2Mask | Button3Mask)) != 0;
1999 // When window is grabbed, all events are dispatched to
2000 // it. Retarget them to the corresponding windows (notice
2001 // that XBaseWindow.dispatchEvent does the opposite
2002 // translation)
2003 XBaseWindow target = XToolkit.windowToXWindow(xme.get_window());
2004 if (dragging && pressTarget != target) {
2005 // for some reasons if we grab input MotionNotify for drag is reported with target
2006 // to underlying window, not to window on which we have initiated drag
2007 // so we need to retarget them. Here I use simplified logic which retarget all
2008 // such events to source of mouse press (or the grabber). It helps with fix for 6390326.
2009 // So, I do not want to implement complicated logic for better retargeting.
2010 target = pressTarget.isVisible() ? pressTarget : this;
2011 xme.set_window(target.getWindow());
2012 xme.set_x(xme.get_x_root() - target.getX());
2154 }
2155 if (iOpacity > maxOpacity) {
2156 iOpacity = maxOpacity;
2157 }
2158
2159 XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY");
2160
2161 if (iOpacity == maxOpacity) {
2162 netWmWindowOpacityAtom.DeleteProperty(getWindow());
2163 } else {
2164 netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity);
2165 }
2166 }
2167
2168 @Override
2169 public void setOpaque(boolean isOpaque) {
2170 // no-op
2171 }
2172
2173 @Override
2174 public void updateWindow() {
2175 // no-op
2176 }
2177 }
|