Cleanup for ServerWindow object

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8060 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adi Oanca
2004-06-19 10:23:14 +00:00
parent 19185de325
commit 8491b62602
2 changed files with 99 additions and 203 deletions
+67 -169
View File
@@ -75,11 +75,7 @@
# define STRACE_MOUSE(x) ; # define STRACE_MOUSE(x) ;
#endif #endif
//! TokenHandler object used to provide IDs for all windows in the system //------------------------------------------------------------------------------
TokenHandler win_token_handler;
//! Active winborder - used for tracking windows during moves, resizes, and tab slides
WinBorder *active_winborder=NULL;
template<class Type> Type template<class Type> Type
read_from_buffer(int8 **_buffer) read_from_buffer(int8 **_buffer)
@@ -92,7 +88,7 @@ read_from_buffer(int8 **_buffer)
return value; return value;
} }
//------------------------------------------------------------------------------
static int8 *read_pattern_from_buffer(int8 **_buffer) static int8 *read_pattern_from_buffer(int8 **_buffer)
{ {
int8 *pattern = *_buffer; int8 *pattern = *_buffer;
@@ -101,7 +97,7 @@ static int8 *read_pattern_from_buffer(int8 **_buffer)
return pattern; return pattern;
} }
//------------------------------------------------------------------------------
template<class Type> void template<class Type> void
write_to_buffer(int8 **_buffer, Type value) write_to_buffer(int8 **_buffer, Type value)
{ {
@@ -112,7 +108,7 @@ write_to_buffer(int8 **_buffer, Type value)
*_buffer = (int8 *)(typedBuffer); *_buffer = (int8 *)(typedBuffer);
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Contructor \brief Contructor
@@ -139,7 +135,6 @@ ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook,
fClientTeamID = winapp->ClientTeamID(); fClientTeamID = winapp->ClientTeamID();
fWorkspaces = index; fWorkspaces = index;
fWorkspace = NULL;
fWinBorder = NULL; fWinBorder = NULL;
fTopLayer = NULL; fTopLayer = NULL;
@@ -179,7 +174,7 @@ ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook,
STRACE(("\tPort: %ld\n",fMessagePort)); STRACE(("\tPort: %ld\n",fMessagePort));
STRACE(("\tWorkspace: %ld\n",index)); STRACE(("\tWorkspace: %ld\n",index));
} }
//------------------------------------------------------------------------------
void ServerWindow::Init(void) void ServerWindow::Init(void)
{ {
fWinBorder = new WinBorder( fFrame, fTitle.String(), fLook, fFeel, 0UL, fWinBorder = new WinBorder( fFrame, fTitle.String(), fLook, fFeel, 0UL,
@@ -198,7 +193,7 @@ void ServerWindow::Init(void)
if(fMonitorThreadID != B_NO_MORE_THREADS && fMonitorThreadID != B_NO_MEMORY) if(fMonitorThreadID != B_NO_MORE_THREADS && fMonitorThreadID != B_NO_MEMORY)
resume_thread(fMonitorThreadID); resume_thread(fMonitorThreadID);
} }
//------------------------------------------------------------------------------
//!Tears down all connections with the user application, kills the monitoring thread. //!Tears down all connections with the user application, kills the monitoring thread.
ServerWindow::~ServerWindow(void) ServerWindow::~ServerWindow(void)
{ {
@@ -229,40 +224,28 @@ ServerWindow::~ServerWindow(void)
desktop->fGeneralLock.Unlock(); desktop->fGeneralLock.Unlock();
STRACE(("#ServerWindow(%s) will exit NOW!!!\n", fTitle.String())); STRACE(("#ServerWindow(%s) will exit NOW!!!\n", fTitle.String()));
} }
//5700 - fara servo , fara cas
/*! //6300 - 1,4
\brief Requests an update of the specified rectangle //6700 - 1,6
\param rect The area to update, in the parent's coordinates //7100 - 1,4
//7500 - 1,6
This could be considered equivalent to BView::Invalidate() //------------------------------------------------------------------------------
*/
void ServerWindow::RequestDraw(BRect rect)
{
STRACE(("ServerWindow %s: Request Draw\n",fTitle.String()));
BMessage msg;
msg.what = _UPDATE_;
msg.AddRect("_rect", rect);
SendMessageToClient(&msg);
}
//! Requests an update for the entire window
void ServerWindow::RequestDraw(void)
{
RequestDraw(fFrame);
}
//! 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())
debugger("you must lock a ServerWindow object before calling ::ReplaceDecorator()\n");
STRACE(("ServerWindow %s: Replace Decorator\n",fTitle.String())); STRACE(("ServerWindow %s: Replace Decorator\n",fTitle.String()));
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)
{ {
if (!IsLocked())
debugger("you must lock a ServerWindow object before calling ::Quit()\n");
STRACE(("ServerWindow %s: Quit\n",fTitle.String())); STRACE(("ServerWindow %s: Quit\n",fTitle.String()));
BMessage msg; BMessage msg;
@@ -270,10 +253,13 @@ void ServerWindow::Quit(void)
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
//! Shows the window's WinBorder //! Shows the window's WinBorder
void ServerWindow::Show(void) void ServerWindow::Show(void)
{ {
if (!IsLocked())
debugger("you must lock a ServerWindow object before calling ::Show()\n");
if(!fWinBorder->IsHidden()) if(!fWinBorder->IsHidden())
return; return;
@@ -345,10 +331,13 @@ void ServerWindow::Show(void)
debugger("WARNING: NULL fWinBorder\n"); debugger("WARNING: NULL fWinBorder\n");
} }
} }
//------------------------------------------------------------------------------
//! Hides the window's WinBorder //! Hides the window's WinBorder
void ServerWindow::Hide(void) void ServerWindow::Hide(void)
{ {
if (!IsLocked())
debugger("you must lock a ServerWindow object before calling ::Hide()\n");
if(fWinBorder->IsHidden()) if(fWinBorder->IsHidden())
return; return;
@@ -391,19 +380,19 @@ void ServerWindow::Hide(void)
STRACE(("ServerWindow(%s)::Hide() - General lock released\n", fWinBorder->GetName())); STRACE(("ServerWindow(%s)::Hide() - General lock released\n", fWinBorder->GetName()));
} }
} }
//------------------------------------------------------------------------------
/* /*
\brief Determines whether the window is hidden or not \brief Determines whether the window is hidden or not
\return true if hidden, false if not \return true if hidden, false if not
*/ */
bool ServerWindow::IsHidden(void) bool ServerWindow::IsHidden(void) const
{ {
if(fWinBorder) if(fWinBorder)
return fWinBorder->IsHidden(); return fWinBorder->IsHidden();
return true; return true;
} }
//------------------------------------------------------------------------------
void ServerWindow::Minimize(bool status) void ServerWindow::Minimize(bool status)
{ {
// 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
@@ -439,7 +428,7 @@ void ServerWindow::Minimize(bool 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)
{ {
@@ -447,34 +436,7 @@ void ServerWindow::Zoom(void)
msg.what=B_ZOOM; msg.what=B_ZOOM;
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
/*!
\brief Handles focus and redrawing when changing focus states
The ServerWindow is set to (in)active and its decorator is redrawn based on its active status
*/
void ServerWindow::SetFocus(bool value)
{
STRACE(("ServerWindow %s: Set Focus to %s - UNIMPLEMENTED\n",fTitle.String(),value?"true":"false"));
/*
if(fIsActive!=value)
{
fIsActive=value;
fWinBorder->SetFocus(value);
// fWinBorder->RequestDraw();
}
*/
}
/*!
\brief Determines whether or not the window is active
\return true if active, false if not
*/
bool ServerWindow::HasFocus(void)
{
return fIsActive;
}
/*! /*!
\brief Notifies window of workspace (de)activation \brief Notifies window of workspace (de)activation
\param workspace Index of the workspace changed \param workspace Index of the workspace changed
@@ -492,7 +454,7 @@ void ServerWindow::WorkspaceActivated(int32 workspace, bool active)
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Notifies window of a workspace switch \brief Notifies window of a workspace switch
\param oldone index of the previous workspace \param oldone index of the previous workspace
@@ -509,7 +471,7 @@ void ServerWindow::WorkspacesChanged(int32 oldone,int32 newone)
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Notifies window of a change in focus \brief Notifies window of a change in focus
\param active New active status of the window \param active New active status of the window
@@ -524,7 +486,7 @@ void ServerWindow::WindowActivated(bool active)
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
@@ -541,27 +503,7 @@ void ServerWindow::ScreenModeChanged(const BRect frame, const color_space cspace
SendMessageToClient(&msg); SendMessageToClient(&msg);
} }
//------------------------------------------------------------------------------
/*
\brief Sets the frame size of the window
\rect New window size
*/
void ServerWindow::SetFrame(const BRect &rect)
{
STRACE(("ServerWindow %s: Set Frame to (%.1f,%.1f,%.1f,%.1f)\n",fTitle.String(),
rect.left,rect.top,rect.right,rect.bottom));
fFrame=rect;
}
/*!
\brief Returns the frame of the window in screen coordinates
\return The frame of the window in screen coordinates
*/
BRect ServerWindow::Frame(void)
{
return fFrame;
}
/*! /*!
\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
@@ -572,7 +514,7 @@ status_t ServerWindow::Lock(void)
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)
{ {
@@ -580,22 +522,23 @@ void ServerWindow::Unlock(void)
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) 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
*/ */
void ServerWindow::SetLayerFontState(Layer *layer) void ServerWindow::SetLayerFontState(Layer *layer)
{ {
// NOTE: no need to check for a lock. This is a private method.
uint16 mask; uint16 mask;
fSession->ReadUInt16(&mask); fSession->ReadUInt16(&mask);
@@ -661,9 +604,10 @@ void ServerWindow::SetLayerFontState(Layer *layer)
STRACE(("DONE: ServerWindow %s: Message AS_LAYER_SET_FONT_STATE: Layer: %s\n", STRACE(("DONE: ServerWindow %s: Message AS_LAYER_SET_FONT_STATE: Layer: %s\n",
fTitle.String(), layer->fName->String())); fTitle.String(), layer->fName->String()));
} }
//------------------------------------------------------------------------------
void ServerWindow::SetLayerState(Layer *layer) void ServerWindow::SetLayerState(Layer *layer)
{ {
// NOTE: no need to check for a lock. This is a private method.
rgb_color highColor, lowColor, viewColor; rgb_color highColor, lowColor, viewColor;
pattern patt; pattern patt;
int32 clipRegRects; int32 clipRegRects;
@@ -716,9 +660,10 @@ void ServerWindow::SetLayerState(Layer *layer)
STRACE(("DONE: ServerWindow %s: Message AS_LAYER_SET_STATE: Layer: %s\n",fTitle.String(), STRACE(("DONE: ServerWindow %s: Message AS_LAYER_SET_STATE: Layer: %s\n",fTitle.String(),
layer->fName->String())); layer->fName->String()));
} }
//------------------------------------------------------------------------------
Layer * ServerWindow::CreateLayerTree(Layer *localRoot) Layer * ServerWindow::CreateLayerTree(Layer *localRoot)
{ {
// NOTE: no need to check for a lock. This is a private method.
STRACE(("ServerWindow(%s)::CreateLayerTree()\n", fTitle.String())); STRACE(("ServerWindow(%s)::CreateLayerTree()\n", fTitle.String()));
int32 token; int32 token;
@@ -779,7 +724,7 @@ Layer * ServerWindow::CreateLayerTree(Layer *localRoot)
return newLayer; return newLayer;
} }
//------------------------------------------------------------------------------
void ServerWindow::DispatchMessage(int32 code) void ServerWindow::DispatchMessage(int32 code)
{ {
switch(code) switch(code)
@@ -904,7 +849,7 @@ void ServerWindow::DispatchMessage(int32 code)
if (!(newLayer->IsHidden())){ if (!(newLayer->IsHidden())){
// cl is the parent of newLayer, so this call is OK. // cl is the parent of newLayer, so this call is OK.
cl->FullInvalidate(newLayer->fFull.Frame()); cl->FullInvalidate(BRegion(newLayer->fFull));
} }
break; break;
@@ -1715,7 +1660,7 @@ void ServerWindow::DispatchMessage(int32 code)
} }
} }
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Iterator for graphics update messages \brief Iterator for graphics update messages
\param msgsize Size of the buffer containing the graphics messages \param msgsize Size of the buffer containing the graphics messages
@@ -2260,7 +2205,7 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
} }
} }
} }
//------------------------------------------------------------------------------
/*! /*!
\brief Message-dispatching loop for the ServerWindow \brief Message-dispatching loop for the ServerWindow
@@ -2277,19 +2222,20 @@ int32 ServerWindow::MonitorWin(void *data)
while(!quitting) while(!quitting)
{ {
code = AS_CLIENT_DEAD;
ses->ReadInt32(&code); ses->ReadInt32(&code);
win->Lock();
switch(code) switch(code)
{ {
case 0: 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' message code\n",win->Title()));
// TODO: A message code should *never* be 0. The source sending this message
// needs to be changed to something like AS_CLIENT_DEAD or something.
STRACE(("ServerWindow %s received '0' message code\n",win->Title()));
quitting = true; quitting = true;
// TODO: this is not that simple. Desktop Class should delete a window.
// something like: Desktop::DeleteWindow(thisWindow).
delete win; delete win;
break; break;
} }
@@ -2317,47 +2263,17 @@ int32 ServerWindow::MonitorWin(void *data)
break; break;
} }
} }
win->Unlock();
} }
return 0; return 0;
} }
//------------------------------------------------------------------------------
/*!
\brief Send a message to the ServerWindow
\param code ID code of the message to post
\param size size of the data buffer
\param buffer Any attached data
*/
void ServerWindow::PostMessage(int32 code, size_t size, int8 *buffer)
{
write_port(fMessagePort,code, buffer, size);
}
/*!
\brief Returns the Workspace object to which the window belongs
If the window belongs to all workspaces, it returns the current workspace
*/
Workspace *ServerWindow::GetWorkspace(void)
{
//TODO: resolve
if(fWorkspaces==B_ALL_WORKSPACES)
return NULL;//fWorkspaces->GetScreen()->GetActiveWorkspace();
return NULL;
}
/*!
\brief Assign the window to a particular workspace object
\param The ServerWindow's new workspace
*/
void ServerWindow::SetWorkspace(Workspace *wkspc)
{
STRACE(("ServerWindow %s: Set Workspace\n",fTitle.String()));
fWorkspace=wkspc;
}
Layer* ServerWindow::FindLayer(const Layer* start, int32 token) const Layer* ServerWindow::FindLayer(const Layer* start, int32 token) const
{ {
if (!IsLocked())
debugger("you must lock a ServerWindow object before calling ::FindLayer()\n");
if(!start) if(!start)
return NULL; return NULL;
@@ -2404,9 +2320,12 @@ Layer* ServerWindow::FindLayer(const Layer* start, int32 token) const
return NULL; return NULL;
} }
//------------------------------------------------------------------------------
void ServerWindow::SendMessageToClient(const BMessage* msg) const void ServerWindow::SendMessageToClient(const BMessage* msg) const
{ {
if (!IsLocked())
debugger("you must lock a ServerWindow object before calling ::SendMessageToClient()\n");
ssize_t size; ssize_t size;
char *buffer; char *buffer;
@@ -2420,26 +2339,5 @@ void ServerWindow::SendMessageToClient(const BMessage* msg) const
delete buffer; delete buffer;
} }
//------------------------------------------------------------------------------
/*!
\brief Handles window activation stuff. Called by Desktop functions
*/
void ActivateWindow(ServerWindow *oldwin,ServerWindow *newwin)
{
STRACE(("ActivateWindow: old=%s, new=%s\n",oldwin?oldwin->Title():"NULL",newwin?newwin->Title():"NULL"));
if(oldwin==newwin)
return;
if(oldwin)
oldwin->SetFocus(false);
if(newwin)
newwin->SetFocus(true);
}
/*
@log
*added handlers for AS_LAYER_(MOVE/RESIZE)TO messages
*added AS_LAYER_GET_COORD handler
*changed some methods to use BMessage class for sending messages to BWindow
*/
+32 -34
View File
@@ -71,67 +71,67 @@ public:
virtual ~ServerWindow(void); virtual ~ServerWindow(void);
void Init(); void Init();
// ServerWindow must be locked for these ones.
void ReplaceDecorator(void); void ReplaceDecorator(void);
void Quit(void); void Quit(void);
void Show(void); void Show(void);
void Hide(void); void Hide(void);
bool IsHidden(void);
// methods for sending various messages to client.
bool IsHidden(void) const;
void Minimize(bool status); void Minimize(bool status);
void Zoom(void); void Zoom(void);
void SetFocus(bool value);
bool HasFocus(void);
void RequestDraw(BRect rect);
void RequestDraw(void);
void WorkspaceActivated(int32 workspace, bool active); void WorkspaceActivated(int32 workspace, bool active);
void WorkspacesChanged(int32 oldone,int32 newone); void WorkspacesChanged(int32 oldone,int32 newone);
void WindowActivated(bool active); void WindowActivated(bool active);
void ScreenModeChanged(const BRect frame, const color_space cspace); void ScreenModeChanged(const BRect frame, const color_space cspace);
void SetFrame(const BRect &rect);
BRect Frame(void);
status_t Lock(void); status_t Lock(void);
void Unlock(void); void Unlock(void);
bool IsLocked(void); bool IsLocked(void) const;
thread_id ThreadID(void) const { return fMonitorThreadID;}
void DispatchMessage(int32 code);
void DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer);
static int32 MonitorWin(void *data);
void PostMessage(int32 code, size_t size=0, int8 *buffer=NULL);
//! Returns the index of the workspaces to which it belongs //! Returns the index of the workspaces to which it belongs
int32 GetWorkspaceIndex(void) { return fWorkspaces; } int32 GetWorkspaceIndex(void) { return fWorkspaces; }
Workspace *GetWorkspace(void);
void SetWorkspace(Workspace *wkspc); // util methods.
//! Returns the window's title
const char *Title(void) { return fTitle.String(); }
Layer *CreateLayerTree(Layer *localRoot);
void SetLayerState(Layer *layer);
void SetLayerFontState(Layer *layer);
Layer *FindLayer(const Layer *start, int32 token) const; Layer *FindLayer(const Layer *start, int32 token) const;
void SendMessageToClient( const BMessage *msg ) const; void SendMessageToClient( const BMessage *msg ) const;
// a few, not that important methods returning some internal settings.
int32 Look(void) const { return fLook; } int32 Look(void) const { return fLook; }
int32 Feel(void) const { return fFeel; } int32 Feel(void) const { return fFeel; }
uint32 Flags(void) const { return fFlags; } uint32 Flags(void) const { return fFlags; }
team_id ClientTeamID(void) const { return fClientTeamID; }
ServerApp *App(void) const { return fServerApp; }
uint32 Workspaces(void) const { return fWorkspaces; } uint32 Workspaces(void) const { return fWorkspaces; }
// to who we belong. who do we own. our title.
ServerApp *App(void) const { return fServerApp; }
WinBorder *GetWinBorder(void) const { return fWinBorder; } WinBorder *GetWinBorder(void) const { return fWinBorder; }
const char *Title(void) const { return fTitle.String(); }
// server "private" - try not to use
// related thread/team_id(s).
team_id ClientTeamID(void) const { return fClientTeamID; }
thread_id ThreadID(void) const { return fMonitorThreadID;}
// server "private" - try not to use.
void QuietlySetWorkspaces(uint32 wks) { fWorkspaces = wks; } void QuietlySetWorkspaces(uint32 wks) { fWorkspaces = wks; }
void QuietlySetFeel(int32 feel) { fFeel = feel; } void QuietlySetFeel(int32 feel) { fFeel = feel; }
int32 ClientToken(void) const { return fHandlerToken; } int32 ClientToken(void) const { return fHandlerToken; }
FMWList fWinFMWList; FMWList fWinFMWList;
private:
// methods for retrieving and creating a tree strcture of Layers.
Layer *CreateLayerTree(Layer *localRoot);
void SetLayerState(Layer *layer);
void SetLayerFontState(Layer *layer);
// message handle methods.
void DispatchMessage(int32 code);
void DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer);
static int32 MonitorWin(void *data);
protected: protected:
friend class ServerApp; friend class ServerApp;
friend class WinBorder; friend class WinBorder;
@@ -143,8 +143,6 @@ protected:
int32 fFeel; int32 fFeel;
int32 fFlags; int32 fFlags;
uint32 fWorkspaces; uint32 fWorkspaces;
Workspace *fWorkspace;
bool fIsActive;
ServerApp *fServerApp; ServerApp *fServerApp;
WinBorder *fWinBorder; WinBorder *fWinBorder;