[haiku-commits] r38169 - in haiku/trunk: headers/private/app src/servers/app

  • From: clemens.zeidler@xxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 17 Aug 2010 08:25:56 +0200 (CEST)

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


Other related posts:

  • » [haiku-commits] r38169 - in haiku/trunk: headers/private/app src/servers/app - clemens . zeidler