Bladeren bron

Notification: Prevent showing a closed window

If a notification was closed, the connection will now be dead. To
prevent inconsistencies between when a user closes a notification and
when an application closes an applicated, check if the notification has
been closed before allowing any action.
Nick Johnson 4 jaren geleden
bovenliggende
commit
147a2c4ca2
2 gewijzigde bestanden met toevoegingen van 18 en 1 verwijderingen
  1. 17 1
      Userland/Libraries/LibGUI/Notification.cpp
  2. 1 0
      Userland/Libraries/LibGUI/Notification.h

+ 17 - 1
Userland/Libraries/LibGUI/Notification.cpp

@@ -40,12 +40,17 @@ public:
         send_sync<Messages::NotificationServer::Greet>();
     }
 
+    virtual void die() override { m_connected = false; }
+
+    bool is_connected() const { return m_connected; }
+
 private:
     NotificationServerConnection()
         : IPC::ServerConnection<NotificationClientEndpoint, NotificationServerEndpoint>(*this, "/tmp/portal/notify")
     {
     }
     virtual void handle(const Messages::NotificationClient::Dummy&) override { }
+    bool m_connected { true };
 };
 
 Notification::Notification()
@@ -60,15 +65,26 @@ Notification::~Notification()
 void Notification::show()
 {
     VERIFY(!m_showing);
+    VERIFY(!m_disposed);
+    if (!m_connection->is_connected()) {
+        // This would imply that the NotificationServer crashed before we could send it any data.
+        VERIFY_NOT_REACHED();
+    }
     auto icon = m_icon ? m_icon->to_shareable_bitmap() : Gfx::ShareableBitmap();
     m_connection->send_sync<Messages::NotificationServer::ShowNotification>(m_text, m_title, icon);
     m_showing = true;
 }
+
 void Notification::close()
 {
     VERIFY(m_showing);
-    m_connection->send_sync<Messages::NotificationServer::CloseNotification>();
+    if (m_connection->is_connected()) {
+        m_connection->send_sync<Messages::NotificationServer::CloseNotification>();
+    }
+
     m_showing = false;
+    m_disposed = true;
+}
 }
 
 }

+ 1 - 0
Userland/Libraries/LibGUI/Notification.h

@@ -60,6 +60,7 @@ private:
 
     NonnullRefPtr<NotificationServerConnection> m_connection;
     bool m_showing { false };
+    bool m_disposed { false };
 };
 
 }