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
This commit is contained in:
Stephan Aßmus 2005-05-16 15:39:58 +00:00
parent a1c5fb3432
commit ad6b480400
6 changed files with 102 additions and 16 deletions

View File

@ -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

View File

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

View File

@ -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);
}
}
*/

View File

@ -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();
};

View File

@ -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"));

View File

@ -27,17 +27,18 @@
#ifndef _SERVERWIN_H_
#define _SERVERWIN_H_
#include <SupportDefs.h>
#include <GraphicsDefs.h>
#include <OS.h>
#include <LinkMsgReader.h>
#include <LinkMsgSender.h>
#include <Locker.h>
#include <Message.h>
#include <OS.h>
#include <Rect.h>
#include <String.h>
#include <Window.h>
#include <LinkMsgReader.h>
#include <LinkMsgSender.h>
#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;