Author: czeidler Date: 2010-08-17 08:25:55 +0200 (Tue, 17 Aug 2010) New Revision: 38169 Changeset: http://dev.haiku-os.org/changeset/38169 Modified: haiku/trunk/headers/private/app/ServerProtocol.h haiku/trunk/src/servers/app/DesktopListener.cpp haiku/trunk/src/servers/app/DesktopListener.h haiku/trunk/src/servers/app/ServerWindow.cpp haiku/trunk/src/servers/app/ServerWindow.h Log: 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. Modified: haiku/trunk/headers/private/app/ServerProtocol.h =================================================================== --- haiku/trunk/headers/private/app/ServerProtocol.h 2010-08-17 06:23:06 UTC (rev 38168) +++ haiku/trunk/headers/private/app/ServerProtocol.h 2010-08-17 06:25:55 UTC (rev 38169) @@ -333,6 +333,9 @@ AS_DIRECT_WINDOW_SET_FULLSCREEN, AS_DIRECT_SCREEN_LOCK, + // desktop listener communications + AS_TALK_TO_DESKTOP_LISTENER, + AS_LAST_CODE }; Modified: haiku/trunk/src/servers/app/DesktopListener.cpp =================================================================== --- haiku/trunk/src/servers/app/DesktopListener.cpp 2010-08-17 06:23:06 UTC (rev 38168) +++ haiku/trunk/src/servers/app/DesktopListener.cpp 2010-08-17 06:25:55 UTC (rev 38169) @@ -47,9 +47,22 @@ } -#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<int32>(&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 Modified: haiku/trunk/src/servers/app/DesktopListener.h =================================================================== --- haiku/trunk/src/servers/app/DesktopListener.h 2010-08-17 06:23:06 UTC (rev 38168) +++ haiku/trunk/src/servers/app/DesktopListener.h 2010-08-17 06:25:55 UTC (rev 38169) @@ -13,7 +13,9 @@ #include <Point.h> +#include <ServerLink.h> + class BMessage; class Desktop; class Window; @@ -23,9 +25,14 @@ 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 @@ void UnregisterListener(DesktopListener* listener); const DesktopListenerDLList& GetDesktopListenerList(); + bool MessageForListener(Window* sender, + BPrivate::ServerLink& link); + void WindowAdded(Window* window); void WindowRemoved(Window* window); Modified: haiku/trunk/src/servers/app/ServerWindow.cpp =================================================================== --- haiku/trunk/src/servers/app/ServerWindow.cpp 2010-08-17 06:23:06 UTC (rev 38168) +++ haiku/trunk/src/servers/app/ServerWindow.cpp 2010-08-17 06:25:55 UTC (rev 38169) @@ -1156,6 +1156,22 @@ break; } + case AS_TALK_TO_DESKTOP_LISTENER: + { + port_id senderPort; + link.Read<port_id>(&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 @@ 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; Modified: haiku/trunk/src/servers/app/ServerWindow.h =================================================================== --- haiku/trunk/src/servers/app/ServerWindow.h 2010-08-17 06:23:06 UTC (rev 38168) +++ haiku/trunk/src/servers/app/ServerWindow.h 2010-08-17 06:25:55 UTC (rev 38169) @@ -93,6 +93,9 @@ // 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; }