]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/notifmsg.cpp
simplify code to return from the end of the function
[wxWidgets.git] / src / msw / notifmsg.cpp
index 31a4472be4b195e1151920bc5191ba785a6d6179..b1a91d86d6f333e50e6530b7aed0c87b16857502 100644 (file)
@@ -134,11 +134,6 @@ public:
 
     // can't close automatic notification [currently]
     virtual bool DoClose() { return false; }
-
-private:
-    // custom event handler connected to m_icon which will receive the icon
-    // close event and delete it and itself when it happens
-    wxEvtHandler * const m_iconEvtHandler;
 };
 
 // implementation for manually closed notifications
@@ -280,7 +275,7 @@ void wxBalloonNotifMsgImpl::SetUpIcon(wxWindow *win)
         if ( !icon.IsOk() )
         {
             // we really must have some icon
-            icon = wxIcon(_T("wxICON_AAA"));
+            icon = wxIcon(wxT("wxICON_AAA"));
         }
 
         m_icon->SetIcon(icon);
@@ -293,6 +288,23 @@ wxBalloonNotifMsgImpl::DoShow(const wxString& title,
                               int timeout,
                               int flags)
 {
+    if ( !m_icon->IsIconInstalled() )
+    {
+        // If we failed to install the icon (which does happen sometimes,
+        // although only in unusual circumstances, e.g. it happens regularly,
+        // albeit not constantly, if we're used soon after resume from suspend
+        // under Windows 7), we should not call ShowBalloon() because it would
+        // just assert and return and we must delete the icon ourselves because
+        // otherwise its associated wxTaskBarIconWindow would remain alive
+        // forever because we're not going to receive a notification about icon
+        // disappearance from the system if we failed to install it in the
+        // first place.
+        delete m_icon;
+        m_icon = NULL;
+
+        return false;
+    }
+
     timeout *= 1000; // Windows expresses timeout in milliseconds
 
     return m_icon->ShowBalloon(title, message, timeout, flags);
@@ -321,7 +333,7 @@ wxManualNotifMsgImpl::DoShow(const wxString& title,
                              int flags)
 {
     wxASSERT_MSG( timeout == wxNotificationMessage::Timeout_Never,
-                    _T("shouldn't be used") );
+                    wxT("shouldn't be used") );
 
     // base class creates the icon for us initially but we could have destroyed
     // it in DoClose(), recreate it if this was the case
@@ -356,9 +368,14 @@ bool wxManualNotifMsgImpl::DoClose()
 // ----------------------------------------------------------------------------
 
 wxAutoNotifMsgImpl::wxAutoNotifMsgImpl(wxWindow *win)
-                  : wxBalloonNotifMsgImpl(win),
-                    m_iconEvtHandler(new wxNotificationIconEvtHandler(m_icon))
+                  : wxBalloonNotifMsgImpl(win)
 {
+    if ( m_ownsIcon )
+    {
+        // This object will self-destruct and also delete the icon when the
+        // notification is hidden.
+        new wxNotificationIconEvtHandler(m_icon);
+    }
 }
 
 bool
@@ -368,7 +385,7 @@ wxAutoNotifMsgImpl::DoShow(const wxString& title,
                            int flags)
 {
     wxASSERT_MSG( timeout != wxNotificationMessage::Timeout_Never,
-                    _T("shouldn't be used") );
+                    wxT("shouldn't be used") );
 
     if ( timeout == wxNotificationMessage::Timeout_Auto )
     {