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