diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index e7adbf98a3..d68479e001 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -2468,27 +2468,27 @@ ServerApp::_CreateWindow(int32 code, BPrivate::LinkReceiver& link, status = window->Init(frame, (window_look)look, (window_feel)feel, flags, workspaces); if (status == B_OK && !window->Run()) { -fprintf(stderr, "ServerApp::_CreateWindow() - failed to run the window thread\n"); + fprintf(stderr, "ServerApp::_CreateWindow() - failed to run the window thread\n"); status = B_ERROR; } - // add the window to the list - if (status == B_OK && fWindowListLock.Lock()) { - status = fWindowList.AddItem(window) ? B_OK : B_NO_MEMORY; -if (status < B_OK) -fprintf(stderr, "ServerApp::_CreateWindow() - no memory to add window to list\n"); - fWindowListLock.Unlock(); - } - - if (status < B_OK) { + if (status < B_OK) delete window; - } } return status; } +bool +ServerApp::AddWindow(ServerWindow* window) +{ + BAutolock locker(fWindowListLock); + + return fWindowList.AddItem(window); +} + + void ServerApp::RemoveWindow(ServerWindow* window) { diff --git a/src/servers/app/ServerApp.h b/src/servers/app/ServerApp.h index 811f1ae1c0..ec86f8fd08 100644 --- a/src/servers/app/ServerApp.h +++ b/src/servers/app/ServerApp.h @@ -69,6 +69,7 @@ class ServerApp : public MessageLooper { const char* Signature() const { return fSignature.String(); } const char* SignatureLeaf() const { return fSignature.String() + 12; } + bool AddWindow(ServerWindow* window); void RemoveWindow(ServerWindow* window); bool InWorkspace(int32 index) const; uint32 Workspaces() const; diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 0bea437456..b778814029 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -194,6 +194,9 @@ ServerWindow::~ServerWindow() delete fWindowLayer; + if (App() != NULL) + App()->RemoveWindow(this); + free(fTitle); delete_port(fMessagePort); @@ -220,6 +223,11 @@ status_t ServerWindow::Init(BRect frame, window_look look, window_feel feel, uint32 flags, uint32 workspace) { + if (!App()->AddWindow(this)) { + fServerApp = NULL; + return B_NO_MEMORY; + } + if (fTitle == NULL) return B_NO_MEMORY; @@ -278,8 +286,6 @@ ServerWindow::_PrepareQuit() fDesktop->LockSingleWindow(); _Hide(); fDesktop->UnlockSingleWindow(); - - App()->RemoveWindow(this); } else if (fThread >= B_OK) PostMessage(AS_HIDE_WINDOW); }