From 9ff327dea3cf4ab84fa475ada4b073e311794654 Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Sat, 20 Nov 2010 06:47:20 +0000 Subject: [PATCH] - Make MessageForListener a bit more flexible, passing a fix ServerLink is sometimes not enough and a separate sender and receiver is needed. - Add communication part to restore and save S&T groups. - Fix call of GetDecoratorSettings listener hook. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39534 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../private/interface/StackAndTilePrivate.h | 11 ++- .../decorators/SATDecorator/SATGroup.cpp | 6 +- .../decorators/SATDecorator/SATWindow.cpp | 19 +++-- .../decorators/SATDecorator/SATWindow.h | 3 +- .../decorators/SATDecorator/StackAndTile.cpp | 70 ++++++++++++++++++- .../decorators/SATDecorator/StackAndTile.h | 7 +- .../decorators/SATDecorator/Stacking.cpp | 58 +++++++-------- .../decorators/SATDecorator/Stacking.h | 3 +- src/servers/app/Desktop.cpp | 22 +++++- src/servers/app/DesktopListener.cpp | 4 +- src/servers/app/DesktopListener.h | 6 +- src/servers/app/ServerWindow.cpp | 3 +- src/servers/app/Window.cpp | 3 + 13 files changed, 167 insertions(+), 48 deletions(-) diff --git a/headers/private/interface/StackAndTilePrivate.h b/headers/private/interface/StackAndTilePrivate.h index 6cdecfe88d..2728c2c350 100644 --- a/headers/private/interface/StackAndTilePrivate.h +++ b/headers/private/interface/StackAndTilePrivate.h @@ -15,13 +15,22 @@ namespace BPrivate { const int32 kMagicSATIdentifier = 'SATI'; +enum sat_target { + kStacking, + kTiling +}; + + enum sat_messages { kAddWindowToStack, kRemoveWindowFromStack, kRemoveWindowFromStackAt, kCountWindowsOnStack, kWindowOnStackAt, - kStackHasWindow + kStackHasWindow, + + kSaveAllGroups, + kRestoreGroup }; diff --git a/src/add-ons/decorators/SATDecorator/SATGroup.cpp b/src/add-ons/decorators/SATDecorator/SATGroup.cpp index 8862f37399..3b04a16371 100644 --- a/src/add-ons/decorators/SATDecorator/SATGroup.cpp +++ b/src/add-ons/decorators/SATDecorator/SATGroup.cpp @@ -853,10 +853,10 @@ SATGroup::RestoreGroup(const BMessage& archive, StackAndTile* sat) Tab* bottom = tempHTabs[bottomTab]; // adding windows to area - int64 windowId; + uint64 windowId; WindowArea* area = NULL; - for (int32 i = 0; - areaArchive.FindInt64("window", i, &windowId) == B_OK; i++) { + for (int32 i = 0; areaArchive.FindInt64("window", i, + (int64*)&windowId) == B_OK; i++) { SATWindow* window = sat->FindSATWindow(windowId); if (!window) continue; diff --git a/src/add-ons/decorators/SATDecorator/SATWindow.cpp b/src/add-ons/decorators/SATDecorator/SATWindow.cpp index 468c58b58b..194b2d5435 100644 --- a/src/add-ons/decorators/SATDecorator/SATWindow.cpp +++ b/src/add-ons/decorators/SATDecorator/SATWindow.cpp @@ -11,6 +11,8 @@ #include +#include "StackAndTilePrivate.h" + #include "SATGroup.h" #include "ServerApp.h" #include "Window.h" @@ -347,9 +349,15 @@ SATWindow::GetGroup() bool -SATWindow::HandleMessage(SATWindow* sender, BPrivate::ServerLink& link) +SATWindow::HandleMessage(SATWindow* sender, BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply) { - return StackingEventHandler::HandleMessage(sender, link); + int32 target; + link.Read(&target); + if (target == kStacking) + return StackingEventHandler::HandleMessage(sender, link, reply); + + return false; } @@ -382,7 +390,8 @@ SATWindow::AddedToGroup(SATGroup* group, WindowArea* area) return false; } - area->UpdateSizeLimits(); + if (group->CountItems() > 1) + area->UpdateSizeLimits(); if (group->CountItems() == 2) group->WindowAt(0)->_UpdateSizeLimits(); @@ -692,8 +701,10 @@ SATWindow::Id() bool SATWindow::SetSettings(const BMessage& message) { - if (message.FindInt64("window_id", (int64*)&fId) != B_OK) + uint64 id; + if (message.FindInt64("window_id", (int64*)&id) != B_OK) return false; + fId = id; return true; } diff --git a/src/add-ons/decorators/SATDecorator/SATWindow.h b/src/add-ons/decorators/SATDecorator/SATWindow.h index cb0120f97a..afab06cbf5 100644 --- a/src/add-ons/decorators/SATDecorator/SATWindow.h +++ b/src/add-ons/decorators/SATDecorator/SATWindow.h @@ -85,7 +85,8 @@ public: return fGroupCookie->GetWindowArea(); } bool HandleMessage(SATWindow* sender, - BPrivate::ServerLink& link); + BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply); bool PropagateToGroup(SATGroup* group, WindowArea* area); diff --git a/src/add-ons/decorators/SATDecorator/StackAndTile.cpp b/src/add-ons/decorators/SATDecorator/StackAndTile.cpp index ee7d49103b..6137dc7a60 100644 --- a/src/add-ons/decorators/SATDecorator/StackAndTile.cpp +++ b/src/add-ons/decorators/SATDecorator/StackAndTile.cpp @@ -24,6 +24,7 @@ using namespace std; StackAndTile::StackAndTile() : + fDesktop(NULL), fSATKeyPressed(false), fCurrentSATWindow(NULL), fTabIsShifting(false) @@ -48,6 +49,8 @@ StackAndTile::Identifier() void StackAndTile::ListenerRegistered(Desktop* desktop) { + fDesktop = desktop; + WindowList& windows = desktop->AllWindows(); for (Window *window = windows.FirstWindow(); window != NULL; window = window->NextWindow(kAllWindowList)) @@ -68,13 +71,17 @@ StackAndTile::ListenerUnregistered() bool -StackAndTile::HandleMessage(Window* sender, BPrivate::ServerLink& link) +StackAndTile::HandleMessage(Window* sender, BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply) { + if (sender == NULL) + return _HandleMessage(link, reply); + SATWindow* satWindow = GetSATWindow(sender); if (!satWindow) return false; - return satWindow->HandleMessage(satWindow, link); + return satWindow->HandleMessage(satWindow, link, reply); } @@ -441,6 +448,65 @@ StackAndTile::_ActivateWindow(SATWindow* satWindow) } +bool +StackAndTile::_HandleMessage(BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply) +{ + int32 what; + link.Read(&what); + + switch (what) { + case BPrivate::kSaveAllGroups: + { + BMessage allGroupsArchive; + GroupIterator groups(this, fDesktop); + while (true) { + SATGroup* group = groups.NextGroup(); + if (group == NULL) + break; + if (group->CountItems() <= 1) + continue; + BMessage groupArchive; + if (group->ArchiveGroup(groupArchive) != B_OK) + continue; + allGroupsArchive.AddMessage("group", &groupArchive); + } + int32 size = allGroupsArchive.FlattenedSize(); + char buffer[size]; + if (allGroupsArchive.Flatten(buffer, size) == B_OK) { + reply.StartMessage(B_OK); + reply.Attach(size); + reply.Attach(buffer, size); + } else + reply.StartMessage(B_ERROR); + reply.Flush(); + break; + } + + case BPrivate::kRestoreGroup: + { + int32 size; + if (link.Read(&size) == B_OK) { + char buffer[size]; + BMessage group; + if (link.Read(buffer, size) == B_OK + && group.Unflatten(buffer) == B_OK) { + status_t status = SATGroup::RestoreGroup(group, this); + reply.StartMessage(status); + reply.Flush(); + } + } + break; + } + + default: + return false; + } + + return true; +} + + GroupIterator::GroupIterator(StackAndTile* sat, Desktop* desktop) : fStackAndTile(sat), diff --git a/src/add-ons/decorators/SATDecorator/StackAndTile.h b/src/add-ons/decorators/SATDecorator/StackAndTile.h index b5f44b01de..cd0ba9361f 100644 --- a/src/add-ons/decorators/SATDecorator/StackAndTile.h +++ b/src/add-ons/decorators/SATDecorator/StackAndTile.h @@ -48,7 +48,8 @@ public: virtual void ListenerUnregistered(); virtual bool HandleMessage(Window* sender, - BPrivate::ServerLink& link); + BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply); virtual void WindowAdded(Window* window); virtual void WindowRemoved(Window* window); @@ -95,6 +96,10 @@ private: void _StartSAT(); void _StopSAT(); void _ActivateWindow(SATWindow* window); + bool _HandleMessage(BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply); + + Desktop* fDesktop; bool fSATKeyPressed; diff --git a/src/add-ons/decorators/SATDecorator/Stacking.cpp b/src/add-ons/decorators/SATDecorator/Stacking.cpp index d0ee4ed6c5..951be05a85 100644 --- a/src/add-ons/decorators/SATDecorator/Stacking.cpp +++ b/src/add-ons/decorators/SATDecorator/Stacking.cpp @@ -33,7 +33,7 @@ const float kMaxTabWidth = 165.; bool StackingEventHandler::HandleMessage(SATWindow* sender, - BPrivate::ServerLink& link) + BPrivate::LinkReceiver& link, BPrivate::LinkSender& reply) { Desktop* desktop = sender->GetDesktop(); StackAndTile* stackAndTile = sender->GetStackAndTile(); @@ -63,8 +63,8 @@ StackingEventHandler::HandleMessage(SATWindow* sender, SATWindow* parent = area->WindowList().ItemAt(position); Window* window = desktop->WindowForClientLooperPort(port); if (!parent || !window) { - link.StartMessage(B_BAD_VALUE); - link.Flush(); + reply.StartMessage(B_BAD_VALUE); + reply.Flush(); break; } @@ -74,8 +74,8 @@ StackingEventHandler::HandleMessage(SATWindow* sender, if (!parent->StackWindow(candidate)) return false; - link.StartMessage(B_OK); - link.Flush(); + reply.StartMessage(B_OK); + reply.Flush(); break; } case kRemoveWindowFromStack: @@ -94,8 +94,8 @@ StackingEventHandler::HandleMessage(SATWindow* sender, Window* window = desktop->WindowForClientLooperPort(port); if (!window) { - link.StartMessage(B_BAD_VALUE); - link.Flush(); + reply.StartMessage(B_BAD_VALUE); + reply.Flush(); break; } SATWindow* candidate = stackAndTile->GetSATWindow(window); @@ -116,8 +116,8 @@ StackingEventHandler::HandleMessage(SATWindow* sender, return false; SATWindow* removeWindow = area->WindowList().ItemAt(position); if (!removeWindow) { - link.StartMessage(B_BAD_VALUE); - link.Flush(); + reply.StartMessage(B_BAD_VALUE); + reply.Flush(); break; } @@ -125,11 +125,11 @@ StackingEventHandler::HandleMessage(SATWindow* sender, return false; ServerWindow* window = removeWindow->GetWindow()->ServerWindow(); - link.StartMessage(B_OK); - link.Attach(window->ClientLooperPort()); - link.Attach(window->ClientToken()); - link.Attach(window->ClientTeam()); - link.Flush(); + reply.StartMessage(B_OK); + reply.Attach(window->ClientLooperPort()); + reply.Attach(window->ClientToken()); + reply.Attach(window->ClientTeam()); + reply.Flush(); break; } case kCountWindowsOnStack: @@ -137,9 +137,9 @@ StackingEventHandler::HandleMessage(SATWindow* sender, WindowArea* area = sender->GetWindowArea(); if (!area) return false; - link.StartMessage(B_OK); - link.Attach(area->WindowList().CountItems()); - link.Flush(); + reply.StartMessage(B_OK); + reply.Attach(area->WindowList().CountItems()); + reply.Flush(); break; } case kWindowOnStackAt: @@ -152,17 +152,17 @@ StackingEventHandler::HandleMessage(SATWindow* sender, return false; SATWindow* satWindow = area->WindowList().ItemAt(position); if (!satWindow) { - link.StartMessage(B_BAD_VALUE); - link.Flush(); + reply.StartMessage(B_BAD_VALUE); + reply.Flush(); break; } ServerWindow* window = satWindow->GetWindow()->ServerWindow(); - link.StartMessage(B_OK); - link.Attach(window->ClientLooperPort()); - link.Attach(window->ClientToken()); - link.Attach(window->ClientTeam()); - link.Flush(); + reply.StartMessage(B_OK); + reply.Attach(window->ClientLooperPort()); + reply.Attach(window->ClientToken()); + reply.Attach(window->ClientTeam()); + reply.Flush(); break; } case kStackHasWindow: @@ -177,8 +177,8 @@ StackingEventHandler::HandleMessage(SATWindow* sender, Window* window = desktop->WindowForClientLooperPort(port); if (!window) { - link.StartMessage(B_BAD_VALUE); - link.Flush(); + reply.StartMessage(B_BAD_VALUE); + reply.Flush(); break; } SATWindow* candidate = stackAndTile->GetSATWindow(window); @@ -188,9 +188,9 @@ StackingEventHandler::HandleMessage(SATWindow* sender, WindowArea* area = sender->GetWindowArea(); if (!area) return false; - link.StartMessage(B_OK); - link.Attach(area->WindowList().HasItem(candidate)); - link.Flush(); + reply.StartMessage(B_OK); + reply.Attach(area->WindowList().HasItem(candidate)); + reply.Flush(); break; } default: diff --git a/src/add-ons/decorators/SATDecorator/Stacking.h b/src/add-ons/decorators/SATDecorator/Stacking.h index 2e15785fbf..7d822ea547 100644 --- a/src/add-ons/decorators/SATDecorator/Stacking.h +++ b/src/add-ons/decorators/SATDecorator/Stacking.h @@ -19,7 +19,8 @@ class StackingEventHandler { public: static bool HandleMessage(SATWindow* sender, - BPrivate::ServerLink& link); + BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply); }; diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 059d5e27d7..db8d9e79c6 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -2078,7 +2078,6 @@ Desktop::WriteWindowInfo(int32 serverToken, BPrivate::LinkSender& sender) ::Window* tmp = window->Window(); if (tmp) { BMessage message; - GetDecoratorSettings(tmp, message); if (tmp->GetDecoratorSettings(&message)) { BRect tabFrame; message.FindRect("tab frame", &tabFrame); @@ -2445,6 +2444,27 @@ Desktop::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) break; } + case AS_TALK_TO_DESKTOP_LISTENER: + { + port_id clientReplyPort; + if (link.Read(&clientReplyPort) != B_OK) + break; + + BPrivate::LinkSender reply(clientReplyPort); + LockAllWindows(); + if (MessageForListener(NULL, link, reply)) { + UnlockAllWindows(); + break; + } + + // unhandled message at least send an error if needed + if (link.NeedsReply()) { + reply.StartMessage(B_ERROR); + reply.Flush(); + } + break; + } + // ToDo: Remove this again. It is a message sent by the // invalidate_on_exit kernel debugger add-on to trigger a redraw // after exiting a kernel debugger session. diff --git a/src/servers/app/DesktopListener.cpp b/src/servers/app/DesktopListener.cpp index 1a2167b250..6580663145 100644 --- a/src/servers/app/DesktopListener.cpp +++ b/src/servers/app/DesktopListener.cpp @@ -49,14 +49,14 @@ DesktopObservable::GetDesktopListenerList() bool DesktopObservable::MessageForListener(Window* sender, - BPrivate::ServerLink& link) + BPrivate::LinkReceiver& link, BPrivate::LinkSender& reply) { 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)) + if (!listener->HandleMessage(sender, link, reply)) break; return true; } diff --git a/src/servers/app/DesktopListener.h b/src/servers/app/DesktopListener.h index 3f0c9aaa8f..a8aceeb049 100644 --- a/src/servers/app/DesktopListener.h +++ b/src/servers/app/DesktopListener.h @@ -32,7 +32,8 @@ public: virtual void ListenerUnregistered() = 0; virtual bool HandleMessage(Window* sender, - BPrivate::ServerLink& link) = 0; + BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply) = 0; virtual void WindowAdded(Window* window) = 0; virtual void WindowRemoved(Window* window) = 0; @@ -85,7 +86,8 @@ public: const DesktopListenerDLList& GetDesktopListenerList(); bool MessageForListener(Window* sender, - BPrivate::ServerLink& link); + BPrivate::LinkReceiver& link, + BPrivate::LinkSender& reply); void NotifyWindowAdded(Window* window); void NotifyWindowRemoved(Window* window); diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 19cedb4c6f..393f76c09b 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -1161,7 +1161,8 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) case AS_TALK_TO_DESKTOP_LISTENER: { - if (fDesktop->MessageForListener(fWindow, fLink)) + if (fDesktop->MessageForListener(fWindow, fLink.Receiver(), + fLink.Sender())) break; // unhandled message at least send an error if needed if (link.NeedsReply()) { diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index 9aa099dbe4..2513f3ed05 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -1072,6 +1072,9 @@ Window::SetDecoratorSettings(const BMessage& settings, BRegion& dirty) bool Window::GetDecoratorSettings(BMessage* settings) { + if (fDesktop) + fDesktop->GetDecoratorSettings(this, *settings); + if (fDecorator) return fDecorator->GetSettings(settings);