Am 17.08.2010 08:47, schrieb clemens.zeidler@xxxxxxxxxxxxxx:
Author: czeidler Date: 2010-08-17 08:47:26 +0200 (Tue, 17 Aug 2010) New Revision: 38171 Changeset: http://dev.haiku-os.org/changeset/38171 Added: haiku/trunk/headers/private/interface/WindowStack.h haiku/trunk/src/kits/interface/WindowStack.cpp Modified: haiku/trunk/headers/os/interface/Window.h haiku/trunk/src/kits/interface/Jamfile Log: Add a BWindowStack interface class. Please review if adding a BWindowStack as a friend of BWindow in Window.h is ok.
Nice changes!
+BWindowStack::BWindowStack(BWindow* window) + : + fLink(NULL) +{ + port_id receivePort = create_port(B_LOOPER_PORT_DEFAULT_CAPACITY, + "w_stack<app_server"); + if (receivePort != B_OK)
receivePort >= B_OK
+ fLink = new(std::nothrow) BPrivate::PortLink( + window->fLink->SenderPort(), receivePort); +} + + +BWindowStack::~BWindowStack() +{ + if (fLink) + delete_port(fLink->ReceiverPort()); + delete fLink; +} + + +status_t +BWindowStack::InitCheck() +{ + if (!fLink)
"fLink == NULL" is preferred for better readability.
+ return B_NO_MEMORY; + return B_OK; +} + + +status_t +BWindowStack::AddWindow(BWindow* window) +{ + BMessenger messenger(window); + return AddWindow(messenger); +} + + +status_t +BWindowStack::AddWindow(BMessenger& window) +{ + return AddWindowAt(window, -1); +} + + +status_t +BWindowStack::AddWindowAt(BWindow* window, int32 position) +{ + BMessenger messenger(window); + return AddWindowAt(messenger, position); +} + + +status_t +BWindowStack::AddWindowAt(BMessenger& window, int32 position) +{ + _StartMessage(kAddWindowToStack); + + _AttachMessenger(window); + fLink->Attach<int32>(position); + + int32 code = B_ERROR; + if (fLink->FlushWithReply(code) != B_OK) + return code; + + return B_OK; +} + + +status_t +BWindowStack::RemoveWindow(BWindow* window) +{ + BMessenger messenger(window); + return RemoveWindow(messenger); +} + + +status_t +BWindowStack::RemoveWindow(BMessenger& window) +{ + _StartMessage(kRemoveWindowFromStack); + _AttachMessenger(window); + + if (fLink->Flush() != B_OK) + return B_ERROR; + + return B_OK; +} + + +status_t +BWindowStack::RemoveWindowAt(int32 position, BMessenger* window) +{ + _StartMessage(kRemoveWindowFromStackAt); + fLink->Attach<int32>(position); + + int32 code = B_ERROR; + if (fLink->FlushWithReply(code) != B_OK) + return code; + + if (window == NULL) + return B_OK; + + return _ReadMessenger(*window); +} + + +int32 +BWindowStack::CountWindows() +{ + _StartMessage(kCountWindowsOnStack); + + int32 code = B_ERROR; + fLink->FlushWithReply(code); + if (code != B_OK) + return -1; + + int32 count; + if (fLink->Read<int32>(&count) != B_OK) + return -1; + + return count; +} + + +status_t +BWindowStack::WindowAt(int32 position, BMessenger& messenger) +{ + _StartMessage(kWindowOnStackAt); + fLink->Attach<int32>(position); + + int32 code = B_ERROR; + fLink->FlushWithReply(code); + if (code != B_OK) + return code; + + return _ReadMessenger(messenger); +} + + +bool +BWindowStack::HasWindow(BWindow* window) +{ + BMessenger messenger(window); + return HasWindow(messenger); +} + + +bool +BWindowStack::HasWindow(BMessenger& window) +{ + _StartMessage(kStackHasWindow); + _AttachMessenger(window); + + int32 code = B_ERROR; + fLink->FlushWithReply(code); + if (code != B_OK) + return code; + + bool hasWindow; + if (fLink->Read<bool>(&hasWindow) != B_OK) + return false; + + return hasWindow; +} + + +status_t +BWindowStack::_AttachMessenger(BMessenger& window) +{ + BMessenger::Private messengerPrivate(window); + fLink->Attach<port_id>(messengerPrivate.Port()); + fLink->Attach<int32>(messengerPrivate.Token()); + return fLink->Attach<team_id>(messengerPrivate.Team()); +} + + +status_t +BWindowStack::_ReadMessenger(BMessenger& window) +{ + port_id port; + int32 token; + team_id team; + fLink->Read<port_id>(&port); + fLink->Read<int32>(&token); + status_t status = fLink->Read<team_id>(&team); + if (status != B_OK) + return status; + BMessenger::Private messengerPrivate(window); + messengerPrivate.SetTo(team, port, token); + return B_OK; +} + + +status_t +BWindowStack::_StartMessage(int32 what) +{ + fLink->StartMessage(AS_TALK_TO_DESKTOP_LISTENER); + fLink->Attach<port_id>(fLink->ReceiverPort()); + fLink->Attach<int32>(kMagicSATIdentifier); + return fLink->Attach<int32>(what); +}
Have not reviewed the rest of the code very closely, but it needs to be "const BMessenger&" everywhere you use "BMessenger&" as parameter.
Best regards, -Stephan