Notification: Give a unique internal ID

This will allow us to later query the notifications from a connection
and safely update it without exposing it to any other applications, as
it is session based.
This commit is contained in:
Nick Johnson 2021-03-11 13:59:37 -06:00 committed by Andreas Kling
parent 7351c77a42
commit a437430294
Notes: sideshowbarker 2024-07-18 21:09:41 +09:00
3 changed files with 13 additions and 8 deletions

View file

@ -55,7 +55,7 @@ OwnPtr<Messages::NotificationServer::GreetResponse> ClientConnection::handle(con
OwnPtr<Messages::NotificationServer::ShowNotificationResponse> 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<Messages::NotificationServer::ShowNotificationResponse>();
}

View file

@ -25,6 +25,7 @@
*/
#include "NotificationWindow.h"
#include <AK/HashMap.h>
#include <AK/Vector.h>
#include <LibGUI/BoxLayout.h>
#include <LibGUI/Button.h>
@ -39,12 +40,13 @@
namespace NotificationServer {
static Vector<RefPtr<NotificationWindow>> s_windows;
static HashMap<u32, RefPtr<NotificationWindow>> 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<GUI::HorizontalBoxLayout>();
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;
};

View file

@ -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;
};
}