From ad6b480400e921f46a444359fc92be5251ab6ac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Mon, 16 May 2005 15:39:58 +0000 Subject: [PATCH] Work in Progress. The server keeps the client window up to date on layer movement/resizing. This fixes quite a few problems and brings support for FrameMoved and Resized hooks. But implementing it this way has its own set of problem, most importantly: When a BView calles Window()->CurrentMessage() in its FrameMoved/Resized hooks, it will see something very different from what it would see in R5. This needs to be fixed, but I have not had a good idea how to do this other than faking the current message in BWindow, which I didn't look into. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12689 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/TextInput.cpp | 1 - src/kits/interface/Window.cpp | 55 ++++++++++++++++++++++++++++++-- src/servers/app/Layer.cpp | 40 ++++++++++++++++++++--- src/servers/app/Layer.h | 6 ++-- src/servers/app/ServerWindow.cpp | 3 +- src/servers/app/ServerWindow.h | 13 +++++--- 6 files changed, 102 insertions(+), 16 deletions(-) diff --git a/src/kits/interface/TextInput.cpp b/src/kits/interface/TextInput.cpp index 106825f28f..f416898dc0 100644 --- a/src/kits/interface/TextInput.cpp +++ b/src/kits/interface/TextInput.cpp @@ -83,7 +83,6 @@ _BTextInput_::Archive(BMessage *data, bool deep) const void _BTextInput_::FrameResized(float width, float height) { -printf("_BTextInput_::FrameResized()\n"); BTextView::FrameResized(width, height); AlignTextRect(); // TODO: just to get something working, it wouldn't be correct for diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index 5ed1d76f8b..c5b7435407 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -917,7 +917,58 @@ void BWindow::DispatchMessage(BMessage *msg, BHandler *target) fLink->Flush(); break; } + case B_VIEW_RESIZED: case B_VIEW_MOVED: + { + // NOTE: The problem with this implementation is that BView::Window()->CurrentMessage() + // will show this message, and not what it used to be on R5. This might break apps and + // we need to fix this here or change the way this feature is implemented. However, this + // implementation shows what has to be done when Layers are moved or resized inside the + // app_server. This message is generated from Layer::move_by() and resize_by() in + // Layer::AddToViewsWithInvalidCoords(). + int32 token; + BPoint frameLeftTop; + float width; + float height; + BView* view; + for (int32 i = 0; msg->FindInt32("_token", i, &token) >= B_OK; i++) { + if (token >= 0) { + msg->FindPoint("where", i, &frameLeftTop); + msg->FindFloat("width", i, &width); + msg->FindFloat("height", i, &height); + if ((view = findView(top_view, token))) { + // update the views offset in parent + if (view->originX != frameLeftTop.x || view->originY != frameLeftTop.y) { +//printf("updating position (%.1f, %.1f): %s\n", frameLeftTop.x, frameLeftTop.y, view->Name()); + view->originX = frameLeftTop.x; + view->originY = frameLeftTop.y; + // optionally call FrameMoved + if (view->fFlags & B_FRAME_EVENTS) { + STRACE(("Calling BView(%s)::FrameMoved( %.1f, %.1f )\n", view->Name(), + frameLeftTop.x, frameLeftTop.y)); + view->FrameMoved(frameLeftTop); + } + } + // update the views width and height + if (view->fBounds.Width() != width || view->fBounds.Height() != height) { +//printf("updating size (%.1f, %.1f): %s\n", width, height, view->Name()); + // TODO: does this work when a views left/top side is resized? + view->fBounds.right = view->fBounds.left + width; + view->fBounds.bottom = view->fBounds.top + height; + // optionally call FrameResized + if (view->fFlags & B_FRAME_EVENTS) { + STRACE(("Calling BView(%s)::FrameResized( %f, %f )\n", view->Name(), width, height)); + view->FrameResized(width, height); + } + } + } else { + fprintf(stderr, "***PANIC: BW: Can't find view with ID: %ld !***\n", token); + } + } + } + break; + } +/* case B_VIEW_MOVED: { // NOTE: This message only arrives if the // view has flags B_FRAME_EVENTS @@ -963,10 +1014,10 @@ void BWindow::DispatchMessage(BMessage *msg, BHandler *target) } else printf("***PANIC: BW: Can't find view with ID: %ld !***\n", token); - break; } - +*/ + case _MENUS_DONE_: MenusEnded(); break; diff --git a/src/servers/app/Layer.cpp b/src/servers/app/Layer.cpp index 96ba6494ba..29a39ed92e 100644 --- a/src/servers/app/Layer.cpp +++ b/src/servers/app/Layer.cpp @@ -570,8 +570,9 @@ Layer::RebuildRegions( const BRegion& reg, uint32 action, BPoint pt, BPoint ptOf fFrame.OffsetBy(pt.x, pt.y); fFull.OffsetBy(pt.x, pt.y); - // TODO: uncomment later when you'll implement a queue in ServerWindow::SendMessgeToClient() + // TODO: investigate combining frame event messages for efficiency //SendViewMovedMsg(); + AddToViewsWithInvalidCoords(); newAction = B_LAYER_SIMPLE_MOVE; break; @@ -592,8 +593,10 @@ Layer::RebuildRegions( const BRegion& reg, uint32 action, BPoint pt, BPoint ptOf fFrame.bottom += pt.y; RebuildFullRegion(); - // TODO: uncomment later when you'll implement a queue in ServerWindow::SendMessgeToClient() + // TODO: investigate combining frame event messages for efficiency //SendViewResizedMsg(); + AddToViewsWithInvalidCoords(); + newAction = B_LAYER_MASK_RESIZE; break; @@ -617,8 +620,9 @@ Layer::RebuildRegions( const BRegion& reg, uint32 action, BPoint pt, BPoint ptOf fFrame.bottom += rSize.y; RebuildFullRegion(); - // TODO: uncomment later when you'll implement a queue in ServerWindow::SendMessgeToClient() + // TODO: investigate combining frame event messages for efficiency //SendViewResizedMsg(); + AddToViewsWithInvalidCoords(); newAction = B_LAYER_MASK_RESIZE; newPt = rSize; @@ -1285,7 +1289,6 @@ printf("no parent in Layer::move_layer() (%s)\n", GetName()); fFrameAction = B_LAYER_ACTION_NONE; return; } - fParent->StartRebuildRegions(BRegion(rect), this, B_LAYER_MOVE, pt); fDriver->CopyRegionList(&fRootLayer->fCopyRegList, @@ -1294,6 +1297,8 @@ return; &fFullVisible); fParent->Redraw(fRootLayer->fRedrawReg, this); + + SendViewCoordUpdateMsg(); EmptyGlobals(); @@ -1321,6 +1326,8 @@ return; fDriver->CopyRegionList(&fRootLayer->fCopyRegList, &fRootLayer->fCopyList, fRootLayer->fCopyRegList.CountItems(), &fFullVisible); fParent->Redraw(fRootLayer->fRedrawReg, this); + + SendViewCoordUpdateMsg(); EmptyGlobals(); @@ -1467,6 +1474,29 @@ Layer::SendUpdateMsg(BRegion& reg) fOwner->Window()->SendMessageToClient(&msg); } +// AddToViewsWithInvalidCoords +void +Layer::AddToViewsWithInvalidCoords() const +{ + if (fServerWin) { + fServerWin->fClientViewsWithInvalidCoords.AddInt32("_token", fViewToken); + fServerWin->fClientViewsWithInvalidCoords.AddPoint("where", fFrame.LeftTop()); + fServerWin->fClientViewsWithInvalidCoords.AddFloat("width", fFrame.Width()); + fServerWin->fClientViewsWithInvalidCoords.AddFloat("height", fFrame.Height()); + } +} + +// SendViewCoordUpdateMsg +void +Layer::SendViewCoordUpdateMsg() const +{ + if (fServerWin && !fServerWin->fClientViewsWithInvalidCoords.IsEmpty()) { + fServerWin->SendMessageToClient(&fServerWin->fClientViewsWithInvalidCoords); + fServerWin->fClientViewsWithInvalidCoords.MakeEmpty(); + } +} + +/* //! Sends a B_VIEW_MOVED message to the client BWindow void Layer::SendViewMovedMsg() @@ -1502,5 +1532,5 @@ Layer::SendViewResizedMsg() fServerWin->SendMessageToClient(&msg); } } - +*/ diff --git a/src/servers/app/Layer.h b/src/servers/app/Layer.h index aca3104dbb..d1faf07caa 100644 --- a/src/servers/app/Layer.h +++ b/src/servers/app/Layer.h @@ -246,8 +246,10 @@ class Layer { ServerWindow* SearchForServerWindow(); void SendUpdateMsg(BRegion& reg); - void SendViewMovedMsg(); - void SendViewResizedMsg(); + void AddToViewsWithInvalidCoords() const; + void SendViewCoordUpdateMsg() const; +// void SendViewMovedMsg(); +// void SendViewResizedMsg(); }; diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index e700bc2865..c95d583997 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -122,7 +122,8 @@ ServerWindow::ServerWindow( const char *string, // fClientWinPort is the port to which the app awaits messages from the server fClientWinPort(winport), fClientLooperPort(looperPort), - fHandlerToken(handlerID) + fHandlerToken(handlerID), + fClientViewsWithInvalidCoords(B_VIEW_RESIZED) { STRACE(("ServerWindow(%s)::ServerWindow()\n",string? string: "NULL")); diff --git a/src/servers/app/ServerWindow.h b/src/servers/app/ServerWindow.h index 59955fa33f..afa26edbb4 100644 --- a/src/servers/app/ServerWindow.h +++ b/src/servers/app/ServerWindow.h @@ -27,17 +27,18 @@ #ifndef _SERVERWIN_H_ #define _SERVERWIN_H_ -#include #include -#include +#include +#include #include +#include +#include #include #include #include -#include -#include -#include "TokenSpace.h" + #include "FMWList.h" +#include "TokenSpace.h" class BString; class BMessenger; @@ -150,6 +151,8 @@ protected: LinkMsgReader* fMsgReader; LinkMsgSender* fMsgSender; + BMessage fClientViewsWithInvalidCoords; + BLocker fLocker; int32 fHandlerToken;