From 07e5e0d1a202d4f4d9feec1ca30b061ab7116203 Mon Sep 17 00:00:00 2001 From: Adi Oanca Date: Tue, 13 Jan 2004 00:20:09 +0000 Subject: [PATCH] modified so use BSession again various fixes especialy regarding app_server connection git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6048 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/Window.cpp | 416 +++++++++++++++++----------------- 1 file changed, 214 insertions(+), 202 deletions(-) diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index 749ce9ec86..cb8ac5b653 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -44,13 +44,13 @@ // Project Includes ------------------------------------------------------------ #include +#include +#include #include #include #include #include #include -#include -#include // Standard Includes ----------------------------------------------------------- #include @@ -217,12 +217,11 @@ BWindow::BWindow(BMessage* data) //------------------------------------------------------------------------------ BWindow::~BWindow(){ - // the following lines, remove all existing shortcuts and delete accelList int32 noOfItems; noOfItems = accelList.CountItems(); - for ( int index = noOfItems; index >= 0; index-- ) { + for ( int index = noOfItems-1; index >= 0; index-- ) { _BCmdKey *cmdKey; cmdKey = (_BCmdKey*)accelList.ItemAt( index ); @@ -232,14 +231,13 @@ BWindow::~BWindow(){ delete cmdKey->message; delete cmdKey; } - -// TODO: release other dynamically-allocated objects + +// TODO: release other dinamicaly alocated objects // disable pulsing SetPulseRate( 0 ); delete session; - delete fServerLink; delete_port( receive_port ); } @@ -330,10 +328,10 @@ void BWindow::Quit(){ // ... also its children //detachTopView(); - +STRACE(("Trying to stop connection...\n")); // tell app_server, this window will finish execution stopConnection(); - +STRACE(("Connection stopped!\n")); if (fFlags & B_QUIT_ON_WINDOW_CLOSE) be_app->PostMessage( B_QUIT_REQUESTED ); @@ -374,9 +372,9 @@ void BWindow::Minimize(bool minimize){ return; Lock(); - fServerLink->SetOpCode(AS_WINDOW_MINIMIZE); - fServerLink->Attach( minimize ); - fServerLink->Flush(); + session->WriteInt32( AS_WINDOW_MINIMIZE ); + session->WriteBool( minimize ); + session->Sync( ); Unlock(); } //------------------------------------------------------------------------------ @@ -386,14 +384,16 @@ status_t BWindow::SendBehind(const BWindow* window){ if (!window) return B_ERROR; + int32 rCode; + Lock(); - PortMessage pmsg; - fServerLink->SetOpCode( AS_SEND_BEHIND ); - fServerLink->Attach( _get_object_token_(window) ); - fServerLink->FlushWithReply(&pmsg); + session->WriteInt32( AS_SEND_BEHIND ); + session->WriteInt32( _get_object_token_(window) ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - return (pmsg.Code() == SERVER_TRUE)? B_OK : B_ERROR; + return rCode == SERVER_TRUE? B_OK : B_ERROR; } //------------------------------------------------------------------------------ @@ -960,23 +960,24 @@ void BWindow::MenusEnded(){ void BWindow::SetSizeLimits(float minWidth, float maxWidth, float minHeight, float maxHeight){ + int32 rCode; + if (minWidth > maxWidth) return; if (minHeight > maxHeight) return; Lock(); - PortMessage pmsg; - - fServerLink->Attach( AS_SET_SIZE_LIMITS ); - fServerLink->Attach( fMinWindWidth ); - fServerLink->Attach( fMaxWindWidth ); - fServerLink->Attach( fMinWindHeight ); - fServerLink->Attach( fMaxWindHeight ); - fServerLink->FlushWithReply(&pmsg); + session->WriteInt32( AS_SET_SIZE_LIMITS ); + session->WriteFloat( fMinWindWidth ); + session->WriteFloat( fMaxWindWidth ); + session->WriteFloat( fMinWindHeight ); + session->WriteFloat( fMaxWindHeight ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - if (pmsg.Code() == SERVER_TRUE){ + if (rCode == SERVER_TRUE){ fMinWindHeight = minHeight; fMinWindWidth = minWidth; fMaxWindHeight = maxHeight; @@ -1246,9 +1247,9 @@ void BWindow::Activate(bool active){ return; Lock(); - fServerLink->SetOpCode( AS_ACTIVATE_WINDOW ); - fServerLink->Attach( active ); - fServerLink->Flush(); + session->WriteInt32( AS_ACTIVATE_WINDOW ); + session->WriteBool( active ); + session->Sync( ); Unlock(); } @@ -1389,9 +1390,9 @@ void BWindow::SetTitle(const char* title){ // we notify the app_server so we can actually see the change Lock(); - fServerLink->SetOpCode( AS_WINDOW_TITLE ); - fServerLink->AttachString( fTitle ); - fServerLink->Flush(); + session->WriteInt32( AS_WINDOW_TITLE); + session->WriteString( fTitle ); + session->Sync( ); Unlock(); } else @@ -1449,18 +1450,19 @@ status_t BWindow::AddToSubset(BWindow* window){ if ( !window ) return B_ERROR; - PortMessage pmsg; + int32 rCode; if (window->Feel() == B_MODAL_SUBSET_WINDOW_FEEL || window->Feel() == B_FLOATING_SUBSET_WINDOW_FEEL){ Lock(); - fServerLink->SetOpCode( AS_ADD_TO_SUBSET ); - fServerLink->Attach( _get_object_token_(window) ); - fServerLink->FlushWithReply(&pmsg); + session->WriteInt32( AS_ADD_TO_SUBSET ); + session->WriteInt32( _get_object_token_(window) ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - return (pmsg.Code() == SERVER_TRUE)? B_OK : B_ERROR; + return rCode == SERVER_TRUE? B_OK : B_ERROR; } return B_ERROR; @@ -1472,15 +1474,16 @@ status_t BWindow::RemoveFromSubset(BWindow* window){ if ( !window ) return B_ERROR; - PortMessage pmsg; + int32 rCode; Lock(); - fServerLink->SetOpCode( AS_REM_FROM_SUBSET ); - fServerLink->Attach( _get_object_token_(window) ); - fServerLink->FlushWithReply(&pmsg); + session->WriteInt32( AS_REM_FROM_SUBSET ); + session->WriteInt32( _get_object_token_(window) ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - return ( pmsg.Code() == SERVER_TRUE)? B_OK : B_ERROR; + return rCode == SERVER_TRUE? B_OK : B_ERROR; } //------------------------------------------------------------------------------ @@ -1493,7 +1496,6 @@ status_t BWindow::Perform(perform_code d, void* arg){ status_t BWindow::SetType(window_type type){ decomposeType(type, &fLook, &fFeel); - status_t stat1, stat2; stat1=SetLook( fLook ); @@ -1514,16 +1516,17 @@ window_type BWindow::Type() const{ status_t BWindow::SetLook(window_look look){ - PortMessage pmsg; + int32 rCode; Lock(); - fServerLink->SetOpCode( AS_SET_LOOK ); - fServerLink->Attach( fLook ); - fServerLink->FlushWithReply(&pmsg); + session->WriteInt32( AS_SET_LOOK ); + session->WriteInt32( (int32)look ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - if(pmsg.Code() == SERVER_TRUE){ - fLook = look; + if (rCode == SERVER_TRUE){ + fLook = look; return B_OK; } @@ -1542,19 +1545,20 @@ status_t BWindow::SetFeel(window_feel feel){ /* TODO: See what happens when a window that is part of a subset, changes its feel!? should it be removed from the subset??? */ - PortMessage pmsg; + int32 rCode; Lock(); - fServerLink->SetOpCode( AS_SET_FEEL ); - fServerLink->Attach( fFeel ); - fServerLink->FlushWithReply(&pmsg); + session->WriteInt32( AS_SET_FEEL ); + session->WriteInt32( (int32)feel ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - if(pmsg.Code() == SERVER_TRUE){ - fFeel = feel; + if (rCode == SERVER_TRUE){ + fFeel = feel; return B_OK; } - + return B_ERROR; } @@ -1568,19 +1572,20 @@ window_feel BWindow::Feel() const{ status_t BWindow::SetFlags(uint32 flags){ - PortMessage pmsg; + int32 rCode; - Lock(); - fServerLink->SetOpCode( AS_SET_FLAGS ); - fServerLink->Attach( fFlags ); - fServerLink->FlushWithReply(&pmsg); + Lock(); + session->WriteInt32( AS_SET_FLAGS ); + session->WriteUInt32( flags ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - if(pmsg.Code() == SERVER_TRUE){ - fFlags = flags; + if (rCode == SERVER_TRUE){ + fFlags = flags; return B_OK; } - + return B_ERROR; } @@ -1617,24 +1622,28 @@ status_t BWindow::SetWindowAlignment(window_alignment mode, return B_ERROR; // TODO: test if hOffset = 0 and set it to 1 if true. - PortMessage pmsg; + int32 rCode; Lock(); - fServerLink->SetOpCode( AS_SET_ALIGNMENT ); - - fServerLink->Attach( mode ); - fServerLink->Attach( h ); - fServerLink->Attach( hOffset ); - fServerLink->Attach( width ); - fServerLink->Attach( widthOffset ); - fServerLink->Attach( v ); - fServerLink->Attach( vOffset ); - fServerLink->Attach( height ); - fServerLink->Attach( heightOffset ); - fServerLink->FlushWithReply( &pmsg ); + session->WriteInt32( AS_SET_ALIGNMENT ); + session->WriteInt32( (int32)mode ); + session->WriteInt32( h ); + session->WriteInt32( hOffset ); + session->WriteInt32( width ); + session->WriteInt32( widthOffset ); + session->WriteInt32( v ); + session->WriteInt32( vOffset ); + session->WriteInt32( height ); + session->WriteInt32( heightOffset ); + session->Sync(); + session->ReadInt32( &rCode ); Unlock(); - return ( pmsg.Code() == SERVER_TRUE) ? B_OK : B_ERROR; + if ( rCode == SERVER_TRUE){ + return B_NO_ERROR; + } + + return B_ERROR; } //------------------------------------------------------------------------------ @@ -1645,24 +1654,25 @@ status_t BWindow::GetWindowAlignment(window_alignment* mode, int32* v, int32* vOffset, int32* height, int32* heightOffset) const { - PortMessage pmsg; + int32 rCode; const_cast(this)->Lock(); - fServerLink->SetOpCode( AS_GET_ALIGNMENT ); - fServerLink->FlushWithReply( &pmsg ); + session->WriteInt32( AS_GET_ALIGNMENT ); + session->Sync(); + session->ReadInt32( &rCode ); + + if (rCode == SERVER_TRUE){ + session->ReadInt32( (int32*)mode ); + session->ReadInt32( h ); + session->ReadInt32( hOffset ); + session->ReadInt32( width ); + session->ReadInt32( widthOffset ); + session->ReadInt32( v ); + session->ReadInt32( hOffset ); + session->ReadInt32( height ); + session->ReadInt32( heightOffset ); - if (pmsg.Code() == SERVER_TRUE){ - pmsg.Read( mode ); - pmsg.Read( h ); - pmsg.Read( hOffset ); - pmsg.Read( width ); - pmsg.Read( widthOffset ); - pmsg.Read( v ); - pmsg.Read( hOffset ); - pmsg.Read( height ); - pmsg.Read( heightOffset ); - - return B_OK; + return B_NO_ERROR; } const_cast(this)->Unlock(); @@ -1672,16 +1682,13 @@ status_t BWindow::GetWindowAlignment(window_alignment* mode, //------------------------------------------------------------------------------ uint32 BWindow::Workspaces() const{ - - uint32 workspaces; - PortMessage pmsg; + uint32 workspaces; const_cast(this)->Lock(); - fServerLink->SetOpCode( AS_GET_WORKSPACES ); - fServerLink->FlushWithReply( &pmsg ); + session->WriteInt32( AS_GET_WORKSPACES ); + session->Sync(); + session->ReadInt32( (int32*)&workspaces ); const_cast(this)->Unlock(); - - pmsg.Read( &workspaces ); return workspaces; } @@ -1691,9 +1698,9 @@ uint32 BWindow::Workspaces() const{ void BWindow::SetWorkspaces(uint32 workspaces){ Lock(); - fServerLink->SetOpCode( AS_SET_WORKSPACES ); - fServerLink->Attach( workspaces ); - fServerLink->Flush(); + session->WriteInt32( AS_SET_WORKSPACES ); + session->WriteInt32( (int32)workspaces ); + session->Sync( ); Unlock(); } @@ -1723,10 +1730,10 @@ void BWindow::MoveTo( BPoint point ){ void BWindow::MoveTo(float x, float y){ Lock(); - fServerLink->SetOpCode( AS_WINDOW_MOVE ); - fServerLink->Attach( x ); - fServerLink->Attach( y ); - fServerLink->Flush(); + session->WriteInt32( AS_WINDOW_MOVE ); + session->WriteFloat( x ); + session->WriteFloat( y ); + session->Sync(); Unlock(); } @@ -1756,10 +1763,10 @@ void BWindow::ResizeTo(float width, float height){ height = (height > fMaxWindHeight) ? fMaxWindHeight : height; Lock(); - fServerLink->SetOpCode( AS_WINDOW_RESIZE ); - fServerLink->Attach( width ); - fServerLink->Attach( height ); - fServerLink->Flush(); + session->WriteInt32( AS_WINDOW_RESIZE ); + session->WriteFloat( width ); + session->WriteFloat( height ); + session->Sync( ); Unlock(); } @@ -1772,22 +1779,17 @@ void BWindow::Show(){ if (fShowLevel == 0){ STRACE(("BWindow(%s): sending AS_SHOW_WINDOW message...\n", Name() )); - if ( !isLocked ) - Lock(); - - fServerLink->SetOpCode( AS_SHOW_WINDOW ); - fServerLink->Flush(); - - if ( !isLocked) - Unlock(); + if ( !isLocked ) Lock(); + session->WriteInt32( AS_SHOW_WINDOW ); + session->Sync( ); + if ( !isLocked) Unlock(); } - // if it's the fist time Show() is called, start the Looper thread. + // if it's the fist time Show() is called... start the Looper thread. if ( Thread() == B_ERROR ) { - // normally this won't happen, but I want to be sure! - if ( !isLocked ) - Lock(); + // normaly this won't happen, but I want to be sure! + if ( !isLocked ) Lock(); Run(); } @@ -1798,8 +1800,8 @@ void BWindow::Show(){ void BWindow::Hide(){ if (fShowLevel == 0){ Lock(); - fServerLink->SetOpCode( AS_HIDE_WINDOW ); - fServerLink->Flush(); + session->WriteInt32( AS_HIDE_WINDOW ); + session->Sync(); Unlock(); } fShowLevel++; @@ -1995,28 +1997,43 @@ void BWindow::InitData( BRect frame, bool locked = false; if ( !(be_app->IsLocked()) ) { be_app->Lock(); locked = true; } + + PortMessage pmsg; + PortLink link(be_app->fServerFrom); + link.SetOpCode(AS_CREATE_WINDOW); + + link.Attach( fFrame ); + link.Attach( (int32)fLook ); + link.Attach( (int32)fFeel ); + link.Attach( fFlags ); + link.Attach( workspace ); + link.Attach( _get_object_token_(this) ); + link.Attach( receive_port ); + link.Attach( fMsgPort ); + link.AttachString( title ); + link.FlushWithReply(&pmsg); - BPrivate::BAppServerLink *serverlink=new BPrivate::BAppServerLink; - PortMessage pmsg; - - serverlink->SetOpCode( AS_CREATE_WINDOW ); - serverlink->Attach( fFrame ); - serverlink->Attach( (int32)fLook ); - serverlink->Attach( (int32)fFeel ); - serverlink->Attach( fFlags ); - serverlink->Attach( workspace ); - serverlink->Attach( _get_object_token_(this) ); - serverlink->Attach( &receive_port, sizeof(port_id) ); - serverlink->Attach( &fMsgPort, sizeof(port_id) ); - serverlink->AttachString( title ); - serverlink->FlushWithReply(&pmsg); + pmsg.Read(&send_port); +/* + session->WriteInt32( AS_CREATE_WINDOW ); + session->WriteRect( fFrame ); + session->WriteInt32( (int32)fLook ); + session->WriteInt32( (int32)fFeel ); + session->WriteUInt32( fFlags ); + session->WriteUInt32( workspace ); + session->WriteData( &team, sizeof(team_id)); + session->WriteInt32( _get_object_token_(this) ); + session->WriteData( &receive_port, sizeof(port_id) ); + session->WriteData( &fMsgPort, sizeof(port_id) ); + session->WriteString( title ); + +printf("look: %ld\n", (int32)fLook); +printf("title: %s\n", title); + session->Sync(); // The port on witch app_server will listen for us - pmsg.Read( &send_port ); - - delete serverlink; - - fServerLink=new PortLink(send_port); - + STRACE(("here\n")); + session->ReadData( &send_port, sizeof(port_id) ); +*/ // unlock, so other threads can do their job. if( locked ) be_app->Unlock(); @@ -2047,24 +2064,35 @@ void BWindow::task_looper(){ // loop: As long as we are not terminating. while (!fTerminating) { - // get BMessages from app_server - while ( (msg = ReadMessageFromPort(10)) ){ + msg = MessageFromPort(); + + // Did we get a message? + if (msg){ + // Add to queue fQueue->Lock(); fQueue->AddMessage(msg); fQueue->Unlock(); - dispatchNextMessage = true; } - // get BMessages from BLooper port - while ( (msg = MessageFromPort(0)) ){ + // Get message count from port + int32 msgCount = port_count(fMsgPort); + if (msgCount > 0){ fQueue->Lock(); - fQueue->AddMessage(msg); + for (int32 i = 0; i < msgCount; ++i) + { + // Read 'count' messages from port (so we will not block) + // We use zero as our timeout since we know there is stuff there + msg = MessageFromPort(0); + // Add messages to queue + if (msg) + fQueue->AddMessage(msg); + } fQueue->Unlock(); - dispatchNextMessage = true; } - + // loop: As long as there are messages in the queue and // and we are not terminating. + dispatchNextMessage = true; while (!fTerminating && dispatchNextMessage) { fQueue->Lock(); @@ -2072,6 +2100,7 @@ void BWindow::task_looper(){ fQueue->Unlock(); Lock(); + // TODO: add code for drag & drop if (!fLastMessage) { @@ -2114,13 +2143,20 @@ void BWindow::task_looper(){ session->Sync(); Unlock(); - +printf("Lock released\n"); // Delete the current message (fLastMessage) if (fLastMessage) { delete fLastMessage; fLastMessage = NULL; } + + // Are any messages on the port? + if (port_count(fMsgPort) > 0) + { + // Do outer loop + dispatchNextMessage = false; + } } } @@ -2129,41 +2165,7 @@ void BWindow::task_looper(){ //------------------------------------------------------------------------------ BMessage* BWindow::ReadMessageFromPort(bigtime_t tout){ - int32 msgCode; - BMessage* msg = NULL; - - ssize_t bufferSize; - - // we NEVER have to use B_INFINITE_TIMEOUT - if (tout == B_INFINITE_TIMEOUT) - tout = 0; - - /* because BSession does not have support for timeout operations - We'll use this trick! :-) */ - bufferSize = port_buffer_size_etc(receive_port, B_TIMEOUT, tout); - if (bufferSize == B_TIMED_OUT || bufferSize == B_BAD_PORT_ID || - bufferSize == B_WOULD_BLOCK || bufferSize == B_INTERRUPTED ) - { - msgCode = B_ERROR; - } - - // we have something in our port's queue - if (bufferSize > 0){ - /* A rudimentary synchronize mechanism between BWindow and app_server. - * Just in case some we do something foolish :-) - * It ensures a clean "restart" if I can call it that way. - */ - if ( session->DropInputBuffer() ) - printf("***PANIC: BWindow(%s): BSession's input buffer dropped! The buffer WASN'T empty!***\n", Name()); - - // read message code - session->ReadInt32( &msgCode ); - } - - if ( msgCode != B_ERROR ) - msg = ConvertToMessage( NULL, msgCode ); - - return msg; +// TODO: remove! } //------------------------------------------------------------------------------ @@ -2264,26 +2266,35 @@ void BWindow::BuildTopView(){ // and also set its next handler to be this window. top_view->setOwner( this ); + PortLink link(send_port); + link.SetOpCode(AS_LAYER_CREATE_ROOT); + link.Attach(_get_object_token_( top_view )); + link.Attach(top_view->Frame()); + link.Attach(top_view->ResizingMode()); + link.Attach(top_view->Flags()); + link.AttachString(top_view->Name()); + link.Flush(); +/* // send top_view's information to app_server - fServerLink->SetOpCode( AS_LAYER_CREATE_ROOT ); - fServerLink->Attach( AS_LAYER_CREATE_ROOT ); - fServerLink->Attach( _get_object_token_( top_view ) ); - fServerLink->Attach( top_view->Frame() ); - fServerLink->Attach( top_view->ResizingMode() ); - fServerLink->Attach( top_view->Flags() ); - fServerLink->AttachString( top_view->Name() ); + session->WriteInt32( AS_LAYER_CREATE_ROOT ); + session->WriteInt32( _get_object_token_( top_view ) ); + session->WriteRect( top_view->Frame() ); + session->WriteInt32( top_view->ResizingMode() ); + session->WriteInt32( top_view->Flags() ); + session->WriteString( top_view->Name() ); // we DO NOT send our current state; the server knows the default values! - fServerLink->Flush(); - + session->Sync(); +*/ fLastViewToken = _get_object_token_( top_view ); +STRACE(("BuildTopView ended\n")); } //------------------------------------------------------------------------------ void BWindow::stopConnection(){ Lock(); - fServerLink->SetOpCode( AS_QUIT_WINDOW ); - fServerLink->Flush(); + session->WriteInt32( B_QUIT_REQUESTED ); + session->Sync(); Unlock(); } @@ -3127,12 +3138,13 @@ void BWindow::drawAllViews(BView* aView){ session->WriteInt32( AS_UPDATE_IF_NEEDED ); session->Sync(); Unlock(); - + +// TODO: update!!!!!!!!!!!!!!!!!!! // process all update messages from receive port queue bool over = false; while (!over) { - msg = ReadMessageFromPort(0); + msg = MessageFromPort(0); if (msg){ switch (msg->what){