diff --git a/Userland/Services/NotificationServer/ClientConnection.cpp b/Userland/Services/NotificationServer/ClientConnection.cpp index 4cf70b6389..59b9dcf968 100644 --- a/Userland/Services/NotificationServer/ClientConnection.cpp +++ b/Userland/Services/NotificationServer/ClientConnection.cpp @@ -55,7 +55,7 @@ OwnPtr ClientConnection::handle(con OwnPtr ClientConnection::handle(const Messages::NotificationServer::ShowNotification& message) { - auto window = NotificationWindow::construct(message.text(), message.title(), message.icon()); + auto window = NotificationWindow::construct(client_id(), message.text(), message.title(), message.icon()); window->show(); return make(); } diff --git a/Userland/Services/NotificationServer/NotificationWindow.cpp b/Userland/Services/NotificationServer/NotificationWindow.cpp index b811521dd7..696436b2b2 100644 --- a/Userland/Services/NotificationServer/NotificationWindow.cpp +++ b/Userland/Services/NotificationServer/NotificationWindow.cpp @@ -25,6 +25,7 @@ */ #include "NotificationWindow.h" +#include #include #include #include @@ -39,12 +40,13 @@ namespace NotificationServer { -static Vector> s_windows; +static HashMap> s_windows; void update_notification_window_locations() { Gfx::IntRect last_window_rect; - for (auto& window : s_windows) { + for (auto& window_entry : s_windows) { + auto& window = window_entry.value; Gfx::IntPoint new_window_location; if (last_window_rect.is_null()) new_window_location = GUI::Desktop::the().rect().top_right().translated(-window->rect().width() - 24, 26); @@ -58,16 +60,18 @@ void update_notification_window_locations() } } -NotificationWindow::NotificationWindow(const String& text, const String& title, const Gfx::ShareableBitmap& icon) +NotificationWindow::NotificationWindow(i32 client_id, const String& text, const String& title, const Gfx::ShareableBitmap& icon) { - s_windows.append(this); + m_id = client_id; + s_windows.set(m_id, this); set_window_type(GUI::WindowType::Notification); set_resizable(false); set_minimizable(false); Gfx::IntRect lowest_notification_rect_on_screen; - for (auto& window : s_windows) { + for (auto& window_entry : s_windows) { + auto& window = window_entry.value; if (window->m_original_rect.y() > lowest_notification_rect_on_screen.y()) lowest_notification_rect_on_screen = window->m_original_rect; } @@ -114,7 +118,7 @@ NotificationWindow::NotificationWindow(const String& text, const String& title, right_container.set_layout(); on_close_request = [this] { - s_windows.remove_first_matching([this](auto& entry) { return entry == this; }); + s_windows.remove(m_id); update_notification_window_locations(); return CloseRequestDecision::Close; }; diff --git a/Userland/Services/NotificationServer/NotificationWindow.h b/Userland/Services/NotificationServer/NotificationWindow.h index 607365fe6e..f2654ddda7 100644 --- a/Userland/Services/NotificationServer/NotificationWindow.h +++ b/Userland/Services/NotificationServer/NotificationWindow.h @@ -40,9 +40,10 @@ public: void set_original_rect(Gfx::IntRect original_rect) { m_original_rect = original_rect; }; private: - NotificationWindow(const String& text, const String& title, const Gfx::ShareableBitmap&); + NotificationWindow(i32 client_id, const String& text, const String& title, const Gfx::ShareableBitmap&); Gfx::IntRect m_original_rect; + i32 m_id; }; }