< prev index next >
src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java
Print this page
@@ -91,11 +91,10 @@
});
if (XWM.getWMID() != XWM.METACITY_WM) {
parentXED = dummyXED; // We don't like to leave it 'null'.
-
} else {
parentXED = new XEventDispatcher() {
// It's executed under AWTLock.
public void dispatchEvent(XEvent ev) {
if (isDisposed() || ev.get_type() != XConstants.ConfigureNotify) {
@@ -298,14 +297,22 @@
isDisposed = true;
XToolkit.awtUnlock();
removeXED(getWindow(), eframeXED);
removeXED(eframeParentID, parentXED);
+ removeListeners();
eframe.realDispose();
balloon.dispose();
isTrayIconDisplayed = false;
+ canvas.dispose();
+ canvas = null;
+ popup = null;
+ balloon = null;
+ tooltip = null;
XToolkit.targetDisposedPeer(target, this);
+ target = null;
+ eframe = null;
}
public static void suppressWarningString(Window w) {
AWTAccessor.getWindowAccessor().setTrayIconWindow(w, true);
}
@@ -414,10 +421,16 @@
canvas.addMouseListener(eventProxy);
canvas.addMouseMotionListener(eventProxy);
eframe.addMouseListener(eventProxy);
}
+ void removeListeners() {
+ canvas.removeMouseListener(eventProxy);
+ canvas.removeMouseMotionListener(eventProxy);
+ eframe.removeMouseListener(eventProxy);
+ }
+
long getWindow() {
return AWTAccessor.getComponentAccessor()
.<XEmbeddedFramePeer>getPeer(eframe).getWindow();
}
@@ -548,10 +561,15 @@
curW = autosize ? width : image.getWidth(observer);
curH = autosize ? height : image.getHeight(observer);
super.repaintImage(doClear || (old_autosize != autosize));
}
+
+ public void dispose() {
+ super.dispose();
+ target = null;
+ }
}
@SuppressWarnings("serial") // JDK-implementation class
public static class IconCanvas extends Canvas {
volatile Image image;
@@ -571,10 +589,14 @@
observer = new IconObserver();
}
repaintImage(true);
}
+ public void dispose() {
+ observer = null;
+ }
+
// Invoke on EDT.
protected void repaintImage(boolean doClear) {
Graphics g = getGraphics();
if (g != null) {
try {
< prev index next >