From c0494bc592de7d83d2cfea79063b7c90a6a7e780 Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Tue, 17 Aug 2010 06:25:55 +0000 Subject: [PATCH] Add facility to communicate with the desktop listener over an app server link. The ServerWindow dispatch the message to the DesktopObservable which dispatch it to the correct listener. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38169 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/app/ServerProtocol.h | 3 +++ src/servers/app/DesktopListener.cpp | 19 ++++++++++++++++--- src/servers/app/DesktopListener.h | 10 ++++++++++ src/servers/app/ServerWindow.cpp | 17 +++++++++++++++++ src/servers/app/ServerWindow.h | 3 +++ 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 650d874a77..d8c2b733f4 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -333,6 +333,9 @@ enum { AS_DIRECT_WINDOW_SET_FULLSCREEN, AS_DIRECT_SCREEN_LOCK, + // desktop listener communications + AS_TALK_TO_DESKTOP_LISTENER, + AS_LAST_CODE }; diff --git a/src/servers/app/DesktopListener.cpp b/src/servers/app/DesktopListener.cpp index 0f2fec5881..1956f40e2b 100644 --- a/src/servers/app/DesktopListener.cpp +++ b/src/servers/app/DesktopListener.cpp @@ -47,9 +47,22 @@ DesktopObservable::GetDesktopListenerList() } -#define FOR_ALL_DESKTOP_LISTENER \ - for (DesktopListener* listener = fDesktopListenerList.First(); \ - listener != NULL; listener = fDesktopListenerList.GetNext(listener)) +bool +DesktopObservable::MessageForListener(Window* sender, + BPrivate::ServerLink& link) +{ + int32 identifier; + link.Read(&identifier); + for (DesktopListener* listener = fDesktopListenerList.First(); + listener != NULL; listener = fDesktopListenerList.GetNext(listener)) { + if (listener->Identifier() == identifier) { + if (!listener->HandleMessage(sender, link)) + break; + return true; + } + } + return false; +} void diff --git a/src/servers/app/DesktopListener.h b/src/servers/app/DesktopListener.h index 6659fb6127..f99412c877 100644 --- a/src/servers/app/DesktopListener.h +++ b/src/servers/app/DesktopListener.h @@ -13,6 +13,8 @@ #include +#include + class BMessage; class Desktop; @@ -23,9 +25,14 @@ class DesktopListener : public DoublyLinkedListLinkImpl { public: virtual ~DesktopListener(); + virtual int32 Identifier() = 0; + virtual void ListenerRegistered(Desktop* desktop) = 0; virtual void ListenerUnregistered() = 0; + virtual bool HandleMessage(Window* sender, + BPrivate::ServerLink& link) = 0; + virtual void WindowAdded(Window* window) = 0; virtual void WindowRemoved(Window* window) = 0; @@ -71,6 +78,9 @@ public: void UnregisterListener(DesktopListener* listener); const DesktopListenerDLList& GetDesktopListenerList(); + bool MessageForListener(Window* sender, + BPrivate::ServerLink& link); + void WindowAdded(Window* window); void WindowRemoved(Window* window); diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 8bf00290c6..3584ff199c 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -1156,6 +1156,22 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) break; } + case AS_TALK_TO_DESKTOP_LISTENER: + { + port_id senderPort; + link.Read(&senderPort); + BPrivate::LinkSender sender(senderPort); + BPrivate::PortLinkRef listenerLink(&sender, &link); + if (fDesktop->MessageForListener(fWindow, listenerLink)) + break; + // unhandled message at least send an error if needed + if (link.NeedsReply()) { + sender.StartMessage(B_ERROR); + sender.Flush(); + } + break; + } + default: if (fCurrentView == NULL) { BString codeName; @@ -3635,6 +3651,7 @@ ServerWindow::_MessageNeedsAllWindowsLocked(uint32 code) const case AS_DIRECT_WINDOW_SET_FULLSCREEN: // case AS_VIEW_SET_EVENT_MASK: // case AS_VIEW_SET_MOUSE_EVENT_MASK: + case AS_TALK_TO_DESKTOP_LISTENER: return true; default: return false; diff --git a/src/servers/app/ServerWindow.h b/src/servers/app/ServerWindow.h index 2285aacb06..69fb3a3d17 100644 --- a/src/servers/app/ServerWindow.h +++ b/src/servers/app/ServerWindow.h @@ -93,6 +93,9 @@ public: // related thread/team_id(s). inline team_id ClientTeam() const { return fClientTeam; } + inline port_id ClientLooperPort () const + { return fClientLooperPort; } + inline int32 ClientToken() const { return fClientToken; } inline int32 ServerToken() const { return fServerToken; }