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:
parent
a1c5fb3432
commit
ad6b480400
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
@ -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();
|
||||
|
||||
};
|
||||
|
||||
|
@ -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"));
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user