From 6e4bef603fbe319f45d6b517acf041c647d7b082 Mon Sep 17 00:00:00 2001 From: DarkWyrm Date: Wed, 12 Feb 2003 01:11:55 +0000 Subject: [PATCH] More code written on ServerWindow Added skeleton of new_decorator() git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2695 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/server/AppServer.cpp | 7 + src/servers/app/server/AppServer.h | 8 +- src/servers/app/server/ServerApp.cpp | 2 +- src/servers/app/server/ServerApp.h | 1 + src/servers/app/server/ServerWindow.cpp | 384 ++++++++++++++---------- src/servers/app/server/ServerWindow.h | 74 +++-- 6 files changed, 295 insertions(+), 181 deletions(-) diff --git a/src/servers/app/server/AppServer.cpp b/src/servers/app/server/AppServer.cpp index beedb9e927..5a40fc9606 100644 --- a/src/servers/app/server/AppServer.cpp +++ b/src/servers/app/server/AppServer.cpp @@ -747,6 +747,12 @@ ServerApp *AppServer::FindApp(const char *sig) return NULL; } +Decorator *new_decorator(BRect rect, const char *title, int32 wlook, int32 wfeel, + int32 wflags, DisplayDriver *ddriver) +{ + return NULL; +} + /*! \brief Entry function to run the entire server \param argc Number of command-line arguments present @@ -764,3 +770,4 @@ int main( int argc, char** argv ) delete app_server; return 0; } + diff --git a/src/servers/app/server/AppServer.h b/src/servers/app/server/AppServer.h index 380f46bf76..6c1aa7cb92 100644 --- a/src/servers/app/server/AppServer.h +++ b/src/servers/app/server/AppServer.h @@ -35,9 +35,11 @@ public: void HandleKeyMessage(int32 code, int8 *buffer); ServerApp *FindApp(const char *sig); - create_decorator *make_decorator; // global function pointer private: - friend Decorator *instantiate_decorator(Layer *lay, const char *title, uint32 dflags, uint32 wlook); + friend Decorator *new_decorator(BRect rect, const char *title, int32 wlook, int32 wfeel, + int32 wflags, DisplayDriver *ddriver); + + create_decorator *make_decorator; // global function pointer port_id _messageport,_mouseport; image_id _decorator_id; @@ -52,6 +54,6 @@ private: DisplayDriver *_driver; }; -Decorator *instantiate_decorator(BRect rect, const char *title, int32 wlook, int32 wfeel, +Decorator *new_decorator(BRect rect, const char *title, int32 wlook, int32 wfeel, int32 wflags, DisplayDriver *ddriver); #endif diff --git a/src/servers/app/server/ServerApp.cpp b/src/servers/app/server/ServerApp.cpp index 1c618369dd..83d34a9862 100644 --- a/src/servers/app/server/ServerApp.cpp +++ b/src/servers/app/server/ServerApp.cpp @@ -326,7 +326,7 @@ void ServerApp::DispatchMessage(int32 code, int8 *buffer) // Create the ServerWindow object for this window ServerWindow *newwin=new ServerWindow(rect,(const char *)index, - winlook, winfeel, winflags,workspace,this,win_port); + winlook, winfeel, winflags,this,win_port,workspace); _winlist->AddItem(newwin); // Window looper is waiting for our reply. Send back the diff --git a/src/servers/app/server/ServerApp.h b/src/servers/app/server/ServerApp.h index ca77a211d9..eeca2e1505 100644 --- a/src/servers/app/server/ServerApp.h +++ b/src/servers/app/server/ServerApp.h @@ -70,6 +70,7 @@ public: void PostMessage(int32 code, size_t size=0, int8 *buffer=NULL); protected: friend AppServer; + friend ServerWindow; void DispatchMessage(int32 code, int8 *buffer); port_id _sender,_receiver; diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index fe9e475991..95fe54fe41 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -1,3 +1,29 @@ +//------------------------------------------------------------------------------ +// Copyright (c) 2001-2002, OpenBeOS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// File Name: ServerWindow.cpp +// Author: DarkWyrm +// Description: Shadow BWindow class +// +//------------------------------------------------------------------------------ #include #include #include @@ -10,152 +36,195 @@ #include "ServerWindow.h" #include "ServerApp.h" #include "ServerProtocol.h" - -// TODO: include when we have WindowBorder.h +// TODO: uncomment this when we have WindowBorder.h //#include "WindowBorder.h" #include "Desktop.h" +#include "TokenHandler.h" -// defined in WindowBorder.cpp locking not necessary - the only -// thread which accesses them is the Poller thread -extern bool is_moving_window,is_resizing_window,is_sliding_tab; +//! Handler to get BWindow tokens from +TokenHandler win_token_handler; -// Used in window focus management +// defined in WindowBorder.cpp. Locking is not necessary - the only +// _monitorthread which accesses them is the Poller _monitorthread + +// TODO: Uncomment the extern keyword when we have WindowBorder.h +/* extern */bool is_moving_window,is_resizing_window,is_sliding_tab; + +//! Used in window focus management ServerWindow *active_serverwindow=NULL; -ServerWindow::ServerWindow(BRect rect, const char *title, uint32 wlook, uint32 wfeel, - uint32 wflags, int32 workspace, ServerApp *winapp, port_id winport) -{ -/* title=new BString; - if(string) - title->SetTo(string); - else - title->SetTo("Window"); - - // This must happen before the WindowBorder object - it needs this object's frame - // to be valid - frame=rect; - - // set these early also - the decorator will also need them - winflags=wflags; - winlook=wlook; - winfeel=wfeel; +/*! + \brief Contructor - - winborder=new WindowBorder(this, title->String()); - - // hard code this for now - window look also needs to be attached and sent to - // server by BWindow constructor - decorator=instantiate_decorator(frame,title->String(),winlook,winfeel,winflags,get_gfxdriver()); - - winborder->SetDecorator(decorator); - - // sender is the monitored app's event port - sender=winport; - winlink=new PortLink(sender); - - if(winapp!=NULL) - applink=new PortLink(winapp->receiver); - else - applink=NULL; - - // receiver is the port to which the app sends messages for the server - receiver=create_port(30,title->String()); - - active=false; - hidecount=0; - - // Spawn our message monitoring thread - thread=spawn_thread(MonitorWin,title->String(),B_NORMAL_PRIORITY,this); - if(thread!=B_NO_MORE_THREADS && thread!=B_NO_MEMORY) - resume_thread(thread); - - workspace=index; - AddWindowToDesktop(this,index); + Sets up a lot of the stuff */ +ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook, + uint32 wfeel, uint32 wflags, ServerApp *winapp, port_id winport, uint32 index) +{ + _title=new BString; + _title->SetTo( (string)?string:"Window" ); + + // This must happen before the WindowBorder object - it needs this object's _frame + // to be valid + _frame=rect; + + // set these early also - the _decorator will also need them + _flags=wflags; + _look=wlook; + _feel=wfeel; + +// TODO: uncomment this when we have WindowBorder.h +// _winborder=new WindowBorder(this, _title->String()); + + _decorator=new_decorator(_frame,_title->String(),_look,_feel,_flags,GetGfxDriver()); +// TODO: uncomment this when we have WindowBorder.h +// _winborder->SetDecorator(_decorator); + + // _sender is the monitored _app's event port + _sender=winport; + _winlink=new PortLink(_sender); + + _applink= (winapp)? new PortLink(winapp->_receiver) : NULL; + + // _receiver is the port to which the _app sends messages for the server + _receiver=create_port(30,_title->String()); + + _active=false; + _hidecount=0; + + // Spawn our message monitoring _monitorthread + _monitorthread=spawn_thread(MonitorWin,_title->String(),B_NORMAL_PRIORITY,this); + if(_monitorthread!=B_NO_MORE_THREADS && _monitorthread!=B_NO_MEMORY) + resume_thread(_monitorthread); + + _workspace=index; + + AddWindowToDesktop(this,index); } ServerWindow::~ServerWindow(void) { -/* RemoveWindowFromDesktop(this); - if(applink) + RemoveWindowFromDesktop(this); + if(_applink) { - delete applink; - applink=NULL; - - delete title; - delete winlink; - delete decorator; - delete winborder; + delete _applink; + _applink=NULL; + delete _title; + delete _winlink; + delete _decorator; +// TODO: uncomment this when we have WindowBorder.h +// delete _winborder; } - kill_thread(thread); -*/ + kill_thread(_monitorthread); } void ServerWindow::RequestDraw(BRect rect) { -/* winlink->SetOpCode(LAYER_DRAW); - winlink->Attach(&rect,sizeof(BRect)); - winlink->Flush(); -*/ + _winlink->SetOpCode(LAYER_DRAW); + _winlink->Attach(&rect,sizeof(BRect)); + _winlink->Flush(); +} + +void ServerWindow::ReplaceDecorator(void) +{ } void ServerWindow::Quit(void) { } +const char *ServerWindow::GetTitle(void) +{ + return _title->String(); +} + +ServerApp *ServerWindow::GetApp(void) +{ + return _app; +} + void ServerWindow::Show(void) { -/* if(winborder) + if(_winborder) { - winborder->ShowLayer(); +// TODO: uncomment this when we have WindowBorder.h +// _winborder->ShowLayer(); ActivateWindow(this); } -*/ } void ServerWindow::Hide(void) { -// if(winborder) -// winborder->HideLayer(); +// TODO: uncomment this when we have WindowBorder.h +// if(_winborder) +// _winborder->HideLayer(); +} + +bool ServerWindow::IsHidden(void) +{ + return (_hidecount==0)?true:false; } void ServerWindow::SetFocus(bool value) { -/* if(active!=value) + if(_active!=value) { - active=value; - decorator->SetFocus(value); - decorator->Draw(); - } -*/ -} - -void ServerWindow::WorkspaceActivated(int32 NewWorkspace, const BPoint Resolution, color_space CSpace) -{ -} - -void ServerWindow::WindowActivated(bool Active) -{ -} - -void ServerWindow::ScreenModeChanged(const BPoint Resolustion, color_space CSpace) -{ -} - -void ServerWindow::DispatchMessage(int32 code, int8 *msgbuffer) -{ - switch(code) - { - default: - { - break; - } + _active=value; + _decorator->SetFocus(value); + _decorator->Draw(); } } -int32 ServerWindow::MonitorWin(void *data) +bool ServerWindow::HasFocus(void) +{ + return _active; +} + +void ServerWindow::WorkspaceActivated(int32 newworkspace, const BPoint reso, color_space cspace) +{ +} + +void ServerWindow::WindowActivated(bool active) +{ +} + +void ServerWindow::ScreenModeChanged(const BPoint res, color_space cspace) +{ +} + +void ServerWindow::SetFrame(const BRect &rect) +{ + _frame=rect; +} + +BRect ServerWindow::Frame(void) +{ + return _frame; +} + +status_t ServerWindow::Lock(void) +{ +#ifdef DEBUG_SERVERWIN +printf("%s::Lock()\n",_title->String()); +#endif + return _locker.Lock(); +} + +void ServerWindow::Unlock(void) +{ +#ifdef DEBUG_SERVERWIN +printf("%s::Unlock()\n",_title->String()); +#endif + _locker.Unlock(); +} + +bool ServerWindow::IsLocked(void) +{ + return _locker.IsLocked(); +} + +void ServerWindow::Loop(void) { -/* ServerWindow *win=(ServerWindow *)data; // Message-dispatching loop for the ServerWindow int32 msgcode; int8 *msgbuffer=NULL; @@ -163,15 +232,15 @@ int32 ServerWindow::MonitorWin(void *data) for(;;) { - buffersize=port_buffer_size(receiver); + buffersize=port_buffer_size(_receiver); if(buffersize>0) { msgbuffer=new int8[buffersize]; - bytesread=read_port(receiver,&msgcode,msgbuffer,buffersize); + bytesread=read_port(_receiver,&msgcode,msgbuffer,buffersize); } else - bytesread=read_port(receiver,&msgcode,NULL,0); + bytesread=read_port(_receiver,&msgcode,NULL,0); if (bytesread != B_BAD_PORT_ID && bytesread != B_TIMED_OUT && bytesread != B_WOULD_BLOCK) { @@ -182,15 +251,17 @@ int32 ServerWindow::MonitorWin(void *data) // Received when a view is attached to a window. This will require // us to attach a layer in the tree in the same manner and invalidate // the area in which the new layer resides assuming that it is - // visible + // visible. // Attached Data: // 1) (int32) id of the parent view - // 2) (int32) id of the child view - // 3) (BRect) frame in parent's coordinates - // 4) (int32) resize flags - // 5) (int32) view flags - // 6) (uint16) view's hide level + // 2) (BRect) frame in parent's coordinates + // 3) (int32) resize flags + // 4) (int32) view flags + // 5) (uint16) view's hide level + + // This is a synchronous call, so reply immediately with the ID of the layer + // so the BView can identify itself break; } @@ -219,22 +290,9 @@ int32 ServerWindow::MonitorWin(void *data) { // Received from our window when it is told to quit, so tell our // application to delete this object - applink->SetOpCode(DELETE_WINDOW); - applink->Attach((int32)thread); - applink->Flush(); - break; - } - case VIEW_GET_TOKEN: - { - // Request to get a view identifier - this is synchronous, so reply - // immediately - - // Attached data: - // 1) port_id reply port - port_id reply_port=*((port_id*)msgbuffer); - PortLink *link=new PortLink(reply_port); - link->Attach(view_counter++); - link->Flush(); + _applink->SetOpCode(DELETE_WINDOW); + _applink->Attach((int32)_monitorthread); + _applink->Flush(); break; } default: @@ -250,18 +308,39 @@ int32 ServerWindow::MonitorWin(void *data) if(msgcode==B_QUIT_REQUESTED) break; } -*/ +} + +void ServerWindow::DispatchMessage(int32 code, int8 *msgbuffer) +{ + switch(code) + { + default: + { +#ifdef DEBUG_SERVERWIN +printf("%s::ServerWindow(): Received unexpected code: ",_title->String()); +PrintMessageCode(code); +#endif + break; + } + } +} + +int32 ServerWindow::MonitorWin(void *data) +{ + ServerWindow *win=(ServerWindow *)data; + win->Loop(); + exit_thread(0); return 0; } void ServerWindow::HandleMouseEvent(int32 code, int8 *buffer) { -/* ServerWindow *mousewin=NULL; + ServerWindow *mousewin=NULL; int8 *index=buffer; // Find the window which will receive our mouse event. Layer *root=GetRootLayer(); - WindowBorder *winborder; + WindowBorder *_winborder; // activeborder is used to remember windows when resizing/moving windows // or sliding a tab @@ -294,12 +373,12 @@ void ServerWindow::HandleMouseEvent(int32 code, int8 *buffer) BPoint pt(x,y); // If we have clicked on a window, - winborder=(WindowBorder*)root->GetChildAt(pt); - if(winborder) + _winborder=(WindowBorder*)root->GetChildAt(pt); + if(_winborder) { - mousewin=winborder->Window(); - ASSERT(mousewin!=NULL); - winborder->MouseDown(pt,buttons,modifiers); +// TODO: Uncomment when we have WindowBorder.h +// mousewin=_winborder->Window(); +// _winborder->MouseDown(pt,buttons,modifiers); } break; } @@ -321,17 +400,16 @@ void ServerWindow::HandleMouseEvent(int32 code, int8 *buffer) BPoint pt(x,y); is_moving_window=false; - winborder=(WindowBorder*)root->GetChildAt(pt); - if(winborder) + _winborder=(WindowBorder*)root->GetChildAt(pt); + if(_winborder) { - mousewin=winborder->Window(); - ASSERT(mousewin!=NULL); +// TODO: Uncomment when we have WindowBorder.h +// mousewin=_winborder->Window(); // Eventually, we will build in MouseUp messages with buttons specified // For now, we just "assume" no mouse specification with a 0. - winborder->MouseUp(pt,0,0); +// _winborder->MouseUp(pt,0,0); - // Do cool mouse stuff here } break; } @@ -354,19 +432,17 @@ void ServerWindow::HandleMouseEvent(int32 code, int8 *buffer) if(is_moving_window || is_resizing_window || is_sliding_tab) { mousewin=active_serverwindow; - ASSERT(mousewin!=NULL); - - mousewin->winborder->MouseMoved(pt,buttons,0); +// TODO: Uncomment when we have WindowBorder.h +// mousewin->_winborder->MouseMoved(pt,buttons,0); } else { - winborder=(WindowBorder*)root->GetChildAt(pt); - if(winborder) + _winborder=(WindowBorder*)root->GetChildAt(pt); + if(_winborder) { - mousewin=winborder->Window(); - ASSERT(mousewin!=NULL); - - winborder->MouseMoved(pt,buttons,0); +// TODO: Uncomment when we have WindowBorder.h +// mousewin=_winborder->Window(); +// _winborder->MouseMoved(pt,buttons,0); } } break; @@ -376,17 +452,15 @@ void ServerWindow::HandleMouseEvent(int32 code, int8 *buffer) break; } } -*/ } void ActivateWindow(ServerWindow *win) { -/* if(active_serverwindow==win) + if(active_serverwindow==win) return; if(active_serverwindow) active_serverwindow->SetFocus(false); active_serverwindow=win; if(win) win->SetFocus(true); -*/ } diff --git a/src/servers/app/server/ServerWindow.h b/src/servers/app/server/ServerWindow.h index dee4fe3278..04c5f4d91e 100644 --- a/src/servers/app/server/ServerWindow.h +++ b/src/servers/app/server/ServerWindow.h @@ -1,3 +1,29 @@ +//------------------------------------------------------------------------------ +// Copyright (c) 2001-2002, OpenBeOS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// File Name: ServerWindow.h +// Author: DarkWyrm +// Description: Shadow BWindow class +// +//------------------------------------------------------------------------------ #ifndef _SERVERWIN_H_ #define _SERVERWIN_H_ @@ -9,6 +35,7 @@ #include class BString; +class BMessenger; class BPoint; class ServerApp; class Decorator; @@ -18,55 +45,58 @@ class WindowBorder; class ServerWindow { public: - ServerWindow(BRect rect, const char *title, uint32 wlook, uint32 wfeel, - uint32 wflags, int32 workspace, ServerApp *winapp, port_id winport); + ServerWindow(BRect rect, const char *string, uint32 wlook, uint32 wfeel, + uint32 wflags, ServerApp *winapp, port_id winport, uint32 index); ~ServerWindow(void); + void ReplaceDecorator(void); + void Quit(void); + const char *GetTitle(void); + ServerApp *GetApp(void); void Show(void); void Hide(void); - bool IsHidden(void) { return (_hidecount==0)?true:false; } - void RequestDraw(BRect rect); - void DispatchMessage(int32 code, int8 *msgbuffer); - static int32 MonitorWin(void *data); - void DoUpdate(uint32 size, int8 *buffer); - - int32 Flags(void) { return _flags; } - int32 Look(void) { return _look; } - int32 Feel(void) { return _feel; } - int32 Workspace(void) { return _workspace; } - const char *Title(void) { return _title->String(); } - ServerApp *App(void) { return _app; } - BRect Frame(void); - - void Quit(void); + bool IsHidden(void); void SetFocus(bool value); bool HasFocus(void); + void RequestDraw(BRect rect); void WorkspaceActivated(int32 NewDesktop, const BPoint Resolution, color_space CSpace); void WindowActivated(bool Active); void ScreenModeChanged(const BPoint Resolution, color_space CSpace); + void SetFrame(const BRect &rect); + BRect Frame(void); + + status_t Lock(void); + void Unlock(void); + bool IsLocked(void); + + void DispatchMessage(int32 code, int8 *msgbuffer); + static int32 MonitorWin(void *data); static void HandleMouseEvent(int32 code, int8 *buffer); + static void HandleKeyEvent(int32 code, int8 *buffer); + void Loop(void); protected: friend ServerApp; - BString *_title; int32 _look, _feel, _flags; int32 _workspace; bool _active; - + ServerApp *_app; + Decorator *_decorator; WindowBorder *_winborder; - bigtime_t _lasthit; thread_id _monitorthread; - port_id _receiver; - port_id _sender; + port_id _receiver; // Messages from window + port_id _sender; // Messages to window PortLink *_winlink,*_applink; + BLocker _locker; BRect _frame; uint8 _hidecount; + uint32 _token; }; void ActivateWindow(ServerWindow *win);