Tried something, didn't work, some cleanup left.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12845 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-05-26 15:04:45 +00:00
parent 1e7ae0559f
commit 280d1aac5b
2 changed files with 130 additions and 149 deletions
+125 -144
View File
@@ -108,18 +108,18 @@ write_to_buffer(int8 **_buffer, Type value)
*_buffer = (int8 *)(typedBuffer); *_buffer = (int8 *)(typedBuffer);
} }
//------------------------------------------------------------------------------
// #pragma mark -
/*! /*!
\brief Contructor \brief Constructor
Does a lot of stuff to set up for the window - new decorator, new winborder, spawn a Does a lot of stuff to set up for the window - new decorator, new winborder, spawn a
monitor thread. monitor thread.
*/ */
ServerWindow::ServerWindow( const char *string, ServerWindow::ServerWindow(const char *string, ServerApp *winapp,
ServerApp *winapp, port_id winport, port_id looperPort, int32 handlerID)
port_id winport,
port_id looperPort,
int32 handlerID)
: fServerApp(winapp), : fServerApp(winapp),
// fClientWinPort is the port to which the app awaits messages from the server // fClientWinPort is the port to which the app awaits messages from the server
fClientWinPort(winport), fClientWinPort(winport),
@@ -158,54 +158,34 @@ void
ServerWindow::Init(BRect frame, uint32 wlook, ServerWindow::Init(BRect frame, uint32 wlook,
uint32 wfeel, uint32 wflags, uint32 wwksindex) uint32 wfeel, uint32 wflags, uint32 wwksindex)
{ {
char newName[60]; char name[60];
sprintf(newName, "%ld: %s", fClientTeamID, fName); snprintf(name, sizeof(name), "%ld: %s", fClientTeamID, fName);
fWinBorder = new WinBorder( frame,
newName, fWinBorder = new WinBorder(frame, name, wlook, wfeel, wflags,
wlook, wwksindex, this, desktop->GetDisplayDriver());
wfeel,
wflags,
wwksindex,
this,
desktop->GetDisplayDriver());
// Spawn our message-monitoring thread // Spawn our message-monitoring thread
fMonitorThreadID = spawn_thread(MonitorWin, fName, B_NORMAL_PRIORITY, this); fMonitorThreadID = spawn_thread(MonitorWin, fName, B_NORMAL_PRIORITY, this);
if (fMonitorThreadID >= B_OK)
if(fMonitorThreadID != B_NO_MORE_THREADS && fMonitorThreadID != B_NO_MEMORY)
resume_thread(fMonitorThreadID); resume_thread(fMonitorThreadID);
} }
//------------------------------------------------------------------------------
//!Tears down all connections the main app_server objects, and deletes some internals. //!Tears down all connections the main app_server objects, and deletes some internals.
ServerWindow::~ServerWindow(void) ServerWindow::~ServerWindow(void)
{ {
STRACE(("*ServerWindow (%s):~ServerWindow()\n",fName)); STRACE(("*ServerWindow (%s):~ServerWindow()\n", fName));
if (fWinBorder)
{
delete fWinBorder;
fWinBorder = NULL;
}
fCurrentLayer = NULL; delete fWinBorder;
delete fMsgSender;
delete fMsgReader;
if(fMsgSender)
{
delete fMsgSender;
fMsgSender=NULL;
}
if(fMsgReader)
{
delete fMsgReader;
fMsgReader=NULL;
}
STRACE(("#ServerWindow(%s) will exit NOW\n", fName)); STRACE(("#ServerWindow(%s) will exit NOW\n", fName));
} }
//! Forces the window border to update its decorator //! Forces the window border to update its decorator
void ServerWindow::ReplaceDecorator(void) void
ServerWindow::ReplaceDecorator(void)
{ {
if (!IsLocked()) if (!IsLocked())
debugger("you must lock a ServerWindow object before calling ::ReplaceDecorator()\n"); debugger("you must lock a ServerWindow object before calling ::ReplaceDecorator()\n");
@@ -213,44 +193,47 @@ void ServerWindow::ReplaceDecorator(void)
STRACE(("ServerWindow %s: Replace Decorator\n",fName)); STRACE(("ServerWindow %s: Replace Decorator\n",fName));
fWinBorder->UpdateDecorator(); fWinBorder->UpdateDecorator();
} }
//------------------------------------------------------------------------------
//! Requests that the ServerWindow's BWindow quit //! Requests that the ServerWindow's BWindow quit
void ServerWindow::Quit(void) void
ServerWindow::Quit(void)
{ {
// NOTE: if you do something else, other than sending a port message, PLEASE lock // NOTE: if you do something else, other than sending a port message, PLEASE lock
STRACE(("ServerWindow %s: Quit\n",fName)); STRACE(("ServerWindow %s: Quit\n",fName));
BMessage msg;
BMessage msg(B_QUIT_REQUESTED);
msg.what = B_QUIT_REQUESTED;
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
//! Shows the window's WinBorder //! Shows the window's WinBorder
void ServerWindow::Show(void) void
ServerWindow::Show(void)
{ {
// NOTE: if you do something else, other than sending a port message, PLEASE lock // NOTE: if you do something else, other than sending a port message, PLEASE lock
STRACE(("ServerWindow %s: Show\n",fName)); STRACE(("ServerWindow %s: Show\n",fName));
if(!fWinBorder->IsHidden()) if (!fWinBorder->IsHidden())
return; return;
fWinBorder->GetRootLayer()->ShowWinBorder(fWinBorder); fWinBorder->GetRootLayer()->ShowWinBorder(fWinBorder);
} }
//------------------------------------------------------------------------------
//! Hides the window's WinBorder //! Hides the window's WinBorder
void ServerWindow::Hide(void) void
ServerWindow::Hide(void)
{ {
// NOTE: if you do something else, other than sending a port message, PLEASE lock // NOTE: if you do something else, other than sending a port message, PLEASE lock
STRACE(("ServerWindow %s: Hide\n",fName)); STRACE(("ServerWindow %s: Hide\n",fName));
if(fWinBorder->IsHidden()) if (fWinBorder->IsHidden())
return; return;
fWinBorder->GetRootLayer()->HideWinBorder(fWinBorder); fWinBorder->GetRootLayer()->HideWinBorder(fWinBorder);
} }
//------------------------------------------------------------------------------
void ServerWindow::Minimize(bool status)
void
ServerWindow::Minimize(bool status)
{ {
// NOTE: if you do something else, other than sending a port message, PLEASE lock // NOTE: if you do something else, other than sending a port message, PLEASE lock
// This function doesn't need much -- check to make sure that we should and // This function doesn't need much -- check to make sure that we should and
@@ -258,94 +241,92 @@ void ServerWindow::Minimize(bool status)
// does all the heavy lifting for us. :) // does all the heavy lifting for us. :)
bool sendMessages = false; bool sendMessages = false;
if (status) if (status) {
{ if (!fWinBorder->IsHidden()) {
if (!fWinBorder->IsHidden())
{
Hide(); Hide();
sendMessages = true; sendMessages = true;
} }
} } else {
else if (fWinBorder->IsHidden()) {
{
if (fWinBorder->IsHidden())
{
Show(); Show();
sendMessages = true; sendMessages = true;
} }
} }
if (sendMessages) if (sendMessages) {
{
BMessage msg; BMessage msg;
msg.what = B_MINIMIZE; msg.what = B_MINIMIZE;
msg.AddInt64("when", real_time_clock_usecs()); msg.AddInt64("when", real_time_clock_usecs());
msg.AddBool("minimize", status); msg.AddBool("minimize", status);
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
} }
//------------------------------------------------------------------------------
// Sends a message to the client to perform a Zoom //! Sends a message to the client to perform a Zoom
void ServerWindow::Zoom(void) void
ServerWindow::Zoom(void)
{ {
// NOTE: if you do something else, other than sending a port message, PLEASE lock // NOTE: if you do something else, other than sending a port message, PLEASE lock
BMessage msg; BMessage msg(B_ZOOM);
msg.what=B_ZOOM;
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Notifies window of a change in screen resolution \brief Notifies window of a change in screen resolution
\param frame Size of the new resolution \param frame Size of the new resolution
\param color_space Color space of the new screen mode \param color_space Color space of the new screen mode
*/ */
void ServerWindow::ScreenModeChanged(const BRect frame, const color_space cspace) void
ServerWindow::ScreenModeChanged(const BRect frame, const color_space colorSpace)
{ {
STRACE(("ServerWindow %s: ScreenModeChanged\n",fName)); STRACE(("ServerWindow %s: ScreenModeChanged\n", fName));
BMessage msg;
BMessage msg(B_SCREEN_CHANGED);
msg.what = B_SCREEN_CHANGED;
msg.AddRect("frame", frame); msg.AddRect("frame", frame);
msg.AddInt32("mode", (int32)cspace); msg.AddInt32("mode", (int32)colorSpace);
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Locks the window \brief Locks the window
\return B_OK if everything is ok, B_ERROR if something went wrong \return B_OK if everything is ok, B_ERROR if something went wrong
*/ */
status_t ServerWindow::Lock(void) status_t
ServerWindow::Lock(void)
{ {
STRACE(("\nServerWindow %s: Lock\n",fName)); STRACE(("\nServerWindow %s: Lock\n", fName));
return (fLocker.Lock())?B_OK:B_ERROR; return fLocker.Lock() ? B_OK : B_ERROR;
} }
//------------------------------------------------------------------------------
//! Unlocks the window //! Unlocks the window
void ServerWindow::Unlock(void) void
ServerWindow::Unlock(void)
{ {
STRACE(("ServerWindow %s: Unlock\n\n",fName)); STRACE(("ServerWindow %s: Unlock\n\n", fName));
fLocker.Unlock(); fLocker.Unlock();
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Determines whether or not the window is locked \brief Determines whether or not the window is locked
\return True if locked, false if not. \return True if locked, false if not.
*/ */
bool ServerWindow::IsLocked(void) const bool
ServerWindow::IsLocked(void) const
{ {
return fLocker.IsLocked(); return fLocker.IsLocked();
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Sets the font state for a layer \brief Sets the font state for a layer
\param layer The layer to set the font \param layer The layer to set the font
*/ */
inline inline
void ServerWindow::SetLayerFontState(Layer *layer, LinkMsgReader &link) void
ServerWindow::SetLayerFontState(Layer *layer, LinkMsgReader &link)
{ {
STRACE(("ServerWindow %s: SetLayerFontStateMessage for layer %s\n", STRACE(("ServerWindow %s: SetLayerFontStateMessage for layer %s\n",
fName, layer->fName->String())); fName, layer->fName->String()));
@@ -353,9 +334,11 @@ void ServerWindow::SetLayerFontState(Layer *layer, LinkMsgReader &link)
layer->fLayerData->ReadFontFromLink(link); layer->fLayerData->ReadFontFromLink(link);
} }
//------------------------------------------------------------------------------
inline inline
void ServerWindow::SetLayerState(Layer *layer, LinkMsgReader &link) void
ServerWindow::SetLayerState(Layer *layer, LinkMsgReader &link)
{ {
STRACE(("ServerWindow %s: SetLayerState for layer %s\n",fName, STRACE(("ServerWindow %s: SetLayerState for layer %s\n",fName,
layer->fName->String())); layer->fName->String()));
@@ -364,9 +347,11 @@ void ServerWindow::SetLayerState(Layer *layer, LinkMsgReader &link)
layer->fLayerData->ReadFromLink(link); layer->fLayerData->ReadFromLink(link);
// TODO: Rebuild clipping here? // TODO: Rebuild clipping here?
} }
//------------------------------------------------------------------------------
inline inline
Layer * ServerWindow::CreateLayerTree(Layer *localRoot, LinkMsgReader &link) Layer *
ServerWindow::CreateLayerTree(Layer *localRoot, LinkMsgReader &link)
{ {
// NOTE: no need to check for a lock. This is a private method. // NOTE: no need to check for a lock. This is a private method.
@@ -379,7 +364,7 @@ Layer * ServerWindow::CreateLayerTree(Layer *localRoot, LinkMsgReader &link)
bool hidden; bool hidden;
int32 childCount; int32 childCount;
char *name = NULL; char *name = NULL;
link.Read<int32>(&token); link.Read<int32>(&token);
link.ReadString(&name); link.ReadString(&name);
link.Read<BRect>(&frame); link.Read<BRect>(&frame);
@@ -389,40 +374,39 @@ Layer * ServerWindow::CreateLayerTree(Layer *localRoot, LinkMsgReader &link)
link.Read<uint32>(&flags); link.Read<uint32>(&flags);
link.Read<bool>(&hidden); link.Read<bool>(&hidden);
link.Read<int32>(&childCount); link.Read<int32>(&childCount);
STRACE(("ServerWindow(%s)::CreateLayerTree()-> layer %s, token %ld\n", fName,name,token)); STRACE(("ServerWindow(%s)::CreateLayerTree()-> layer %s, token %ld\n", fName,name,token));
Layer *newLayer; Layer *newLayer = new Layer(frame, name, token, resizeMask,
newLayer = new Layer(frame, name, token, resizeMask,
flags, desktop->GetDisplayDriver()); flags, desktop->GetDisplayDriver());
if (name)
free(name); free(name);
// there is no way of setting this, other than manually :-) // there is no way of setting this, other than manually :-)
newLayer->fHidden = hidden; newLayer->fHidden = hidden;
newLayer->fEventMask = eventMask; newLayer->fEventMask = eventMask;
newLayer->fEventOptions = eventOptions; newLayer->fEventOptions = eventOptions;
newLayer->fOwner = fWinBorder; newLayer->fOwner = fWinBorder;
// add the new Layer to the tree structure. // add the new Layer to the tree structure.
if(localRoot) if (localRoot)
localRoot->AddChild(newLayer, NULL); localRoot->AddChild(newLayer, NULL);
return newLayer; return newLayer;
} }
//------------------------------------------------------------------------------
void ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link)
void
ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link)
{ {
if (fCurrentLayer == NULL && code != AS_LAYER_CREATE_ROOT) if (fCurrentLayer == NULL && code != AS_LAYER_CREATE_ROOT) {
{
printf("ServerWindow %s received unexpected code - message offset %ld before top_view attached.\n",fName, code - SERVER_TRUE); printf("ServerWindow %s received unexpected code - message offset %ld before top_view attached.\n",fName, code - SERVER_TRUE);
return; return;
} }
RootLayer *myRootLayer = fWinBorder->GetRootLayer(); RootLayer *myRootLayer = fWinBorder->GetRootLayer();
switch(code) switch (code) {
{
//--------- BView Messages ----------------- //--------- BView Messages -----------------
case AS_LAYER_SCROLL: case AS_LAYER_SCROLL:
{ {
@@ -2042,7 +2026,7 @@ ServerWindow::DispatchGraphicsMessage(int32 code, LinkMsgReader &link)
desktop->GetDisplayDriver()->ConstrainClippingRegion(NULL); desktop->GetDisplayDriver()->ConstrainClippingRegion(NULL);
fWinBorder->GetRootLayer()->Unlock(); fWinBorder->GetRootLayer()->Unlock();
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Message-dispatching loop for the ServerWindow \brief Message-dispatching loop for the ServerWindow
@@ -2050,17 +2034,17 @@ ServerWindow::DispatchGraphicsMessage(int32 code, LinkMsgReader &link)
\param data The thread's ServerWindow \param data The thread's ServerWindow
\return Throwaway code. Always 0. \return Throwaway code. Always 0.
*/ */
int32 ServerWindow::MonitorWin(void *data) int32
ServerWindow::MonitorWin(void *data)
{ {
ServerWindow *win = (ServerWindow *)data; ServerWindow *win = (ServerWindow *)data;
LinkMsgReader *ses = win->fMsgReader; LinkMsgReader *ses = win->fMsgReader;
bool quitting = false; bool quitting = false;
int32 code; int32 code;
status_t err = B_OK; status_t err = B_OK;
while(!quitting) while (!quitting) {
{
// printf("info: ServerWindow::MonitorWin listening on port %ld.\n", win->fMessagePort); // printf("info: ServerWindow::MonitorWin listening on port %ld.\n", win->fMessagePort);
code = AS_CLIENT_DEAD; code = AS_CLIENT_DEAD;
err = ses->GetNextMessage(&code); err = ses->GetNextMessage(&code);
@@ -2069,34 +2053,33 @@ int32 ServerWindow::MonitorWin(void *data)
win->Lock(); win->Lock();
switch(code) switch (code) {
{
case AS_DELETE_WINDOW: case AS_DELETE_WINDOW:
case AS_CLIENT_DEAD: case AS_CLIENT_DEAD:
{ {
// this means the client has been killed // this means the client has been killed
STRACE(("ServerWindow %s received 'AS_CLIENT_DEAD/AS_DELETE_WINDOW' message code\n",win->Title())); STRACE(("ServerWindow %s received 'AS_CLIENT_DEAD/AS_DELETE_WINDOW' message code\n",win->Title()));
// RootLayer *myRootLayer = win->fWinBorder->GetRootLayer();
// quitting = true; //RootLayer *rootLayer = fWinBorder->GetRootLayer();
// we are preparing to delete a ServerWindow, RootLayer should be aware // we are preparing to delete a ServerWindow, RootLayer should be aware
// of that and stop for a moment. // of that and stop for a moment.
// also we must wait a bit for the associated WinBorder to become hidden // also we must wait a bit for the associated WinBorder to become hidden
// while(1) //while(1) {
// { // myRootLayer->Lock();
// myRootLayer->Lock(); // if (IsHidden())
// if (win->IsHidden()) // break;
// break; // else
// else // rootLayer->Unlock();
// myRootLayer->Unlock(); //}
// }
// ServerWindow's destructor takes care of pulling this object off the desktop. // ServerWindow's destructor takes care of pulling this object off the desktop.
if (!win->fWinBorder->IsHidden()) if (!win->fWinBorder->IsHidden())
CRITICAL("ServerWindow: a window must be hidden before it's deleted\n"); CRITICAL("ServerWindow: a window must be hidden before it's deleted\n");
delete win;
// myRootLayer->Unlock();
delete win;
// rootLayer->Unlock();
exit_thread(0); exit_thread(0);
break; break;
} }
@@ -2164,8 +2147,8 @@ ServerWindow::_CopyBits(RootLayer* rootLayer, Layer* layer,
} }
//------------------------------------------------------------------------------ void
void ServerWindow::SendMessageToClient(const BMessage* msg, int32 target, bool usePreferred) const ServerWindow::SendMessageToClient(const BMessage* msg, int32 target, bool usePreferred) const
{ {
ssize_t size = msg->FlattenedSize(); ssize_t size = msg->FlattenedSize();
char* buffer = new char[size]; char* buffer = new char[size];
@@ -2177,11 +2160,9 @@ void ServerWindow::SendMessageToClient(const BMessage* msg, int32 target, bool u
fClientLooperPort, target, usePreferred, 100000); fClientLooperPort, target, usePreferred, 100000);
if (ret < B_OK) if (ret < B_OK)
fprintf(stderr, "ServerWindow::SendMessageToClient(): %s\n", strerror(ret)); fprintf(stderr, "ServerWindow::SendMessageToClient(): %s\n", strerror(ret));
} else } else
printf("PANIC: ServerWindow %s: can't flatten message in 'SendMessageToClient()'\n", fName); printf("PANIC: ServerWindow %s: can't flatten message in 'SendMessageToClient()'\n", fName);
delete[] buffer; delete[] buffer;
} }
//------------------------------------------------------------------------------
+5 -5
View File
@@ -1,5 +1,5 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Copyright (c) 2001-2002, Haiku, Inc. // Copyright (c) 2001-2005, Haiku, Inc.
// //
// Permission is hereby granted, free of charge, to any person obtaining a // Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"), // copy of this software and associated documentation files (the "Software"),
@@ -65,8 +65,7 @@ class Layer;
coordinating and linking a window's WinBorder half with its messaging half, dispatching coordinating and linking a window's WinBorder half with its messaging half, dispatching
mouse and key events from the server to its window, and other such things. mouse and key events from the server to its window, and other such things.
*/ */
class ServerWindow class ServerWindow {
{
public: public:
ServerWindow( const char *string, ServerWindow( const char *string,
ServerApp *winapp, ServerApp *winapp,
@@ -74,7 +73,7 @@ public:
port_id looperPort, port_id looperPort,
int32 handlerID); int32 handlerID);
virtual ~ServerWindow(void); virtual ~ServerWindow(void);
void Init( BRect frame, void Init( BRect frame,
uint32 wlook, uint32 wfeel, uint32 wflags, uint32 wlook, uint32 wfeel, uint32 wflags,
uint32 wwksindex); uint32 wwksindex);
@@ -92,7 +91,7 @@ public:
void Minimize(bool status); void Minimize(bool status);
void Zoom(void); void Zoom(void);
void ScreenModeChanged(const BRect frame, const color_space cspace); void ScreenModeChanged(const BRect frame, const color_space cspace);
// util methods. // util methods.
void SendMessageToClient(const BMessage* msg, void SendMessageToClient(const BMessage* msg,
int32 target = B_NULL_TOKEN, int32 target = B_NULL_TOKEN,
@@ -117,6 +116,7 @@ private:
Layer* CreateLayerTree(Layer *localRoot, LinkMsgReader &link); Layer* CreateLayerTree(Layer *localRoot, LinkMsgReader &link);
void SetLayerState(Layer *layer, LinkMsgReader &link); void SetLayerState(Layer *layer, LinkMsgReader &link);
void SetLayerFontState(Layer *layer, LinkMsgReader &link); void SetLayerFontState(Layer *layer, LinkMsgReader &link);
void ClientDied(bool crashed);
// message handle methods. // message handle methods.
void DispatchMessage(int32 code, LinkMsgReader &link); void DispatchMessage(int32 code, LinkMsgReader &link);