diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 196c3ba791..6488c8c0a1 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -302,9 +302,8 @@ Desktop::Desktop(uid_t userID) fSubsetWindows(kSubsetList), fFocusList(kFocusList), fWorkspacesViews(false), - fWorkspacesLock("workspaces list"), - fActiveScreen(NULL), + fWorkspacesLock("workspaces list"), fWindowLock("window lock"), fMouseEventWindow(NULL), @@ -369,9 +368,6 @@ Desktop::Init() fVirtualScreen.SetConfiguration(*this, fWorkspaces[0].CurrentScreenConfiguration()); - // TODO: temporary workaround, fActiveScreen will be removed - fActiveScreen = fVirtualScreen.ScreenAt(0); - if (fVirtualScreen.HWInterface() == NULL) { debug_printf("Could not initialize graphics output. Exiting.\n"); return B_ERROR; diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index 490fc5030b..abeb90dace 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -113,15 +113,10 @@ public: int32* buttons) const; // for use by ServerWindow - // Screen and drawing related methods - - Screen* ScreenAt(int32 index) const - { return fActiveScreen; } - Screen* ActiveScreen() const - { return fActiveScreen; } - CursorManager& GetCursorManager() { return fCursorManager; } + // Screen and drawing related methods + status_t SetScreenMode(int32 workspace, int32 id, const display_mode& mode, bool makeDefault); status_t GetScreenMode(int32 workspace, int32 id, @@ -317,8 +312,6 @@ private: BObjectList fWorkspacesViews; BLocker fWorkspacesLock; - Screen* fActiveScreen; - CursorManager fCursorManager; #if USE_MULTI_LOCKER diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 6dca402fbb..d716b873c0 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -2263,11 +2263,11 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) ServerWindow* window = fWindowList.ItemAt(i); if (window->ClientToken() == clientToken) { - // got it! + // found it! fLink.StartMessage(B_OK); - fLink.Attach(B_MAIN_SCREEN_ID.id); - // TODO: for now... + fLink.Attach(window->Window()->Screen()->ID()); status = B_OK; + break; } } } diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 0419e01d9d..9f023f3fff 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -3550,14 +3550,14 @@ ServerWindow::_MessageLooper() void -ServerWindow::ScreenChanged(const BMessage *message) +ServerWindow::ScreenChanged(const BMessage* message) { // TODO: execute the stop notification earlier //HandleDirectConnection(B_DIRECT_STOP); SendMessageToClient(message); if (fDirectWindowData != NULL && fDirectWindowData->full_screen) { - BRect screenFrame = fDesktop->ActiveScreen()->Frame(); + BRect screenFrame = fWindow->Screen()->Frame(); fDesktop->ResizeWindowBy(fWindow, screenFrame.Width() - fWindow->Frame().Width(), screenFrame.Height() - fWindow->Frame().Height()); @@ -3575,7 +3575,7 @@ ServerWindow::SendMessageToClient(const BMessage* msg, int32 target) const target = fClientToken; BMessenger reply; - BMessage::Private messagePrivate((BMessage *)msg); + BMessage::Private messagePrivate((BMessage*)msg); return messagePrivate.SendMessage(fClientLooperPort, fClientTeam, target, 0, false, reply); } @@ -3587,7 +3587,7 @@ ServerWindow::MakeWindow(BRect frame, const char* name, { // The non-offscreen ServerWindow uses the DrawingEngine instance from // the desktop. - return new (nothrow) ::Window(frame, name, look, feel, flags, + return new(std::nothrow) ::Window(frame, name, look, feel, flags, workspace, this, new (nothrow) DrawingEngine(fDesktop->HWInterface())); } @@ -3799,8 +3799,7 @@ ServerWindow::_DirectWindowSetFullScreen(bool enable) fDesktop->HWInterface()->SetCursorVisible(false); fDirectWindowData->old_window_frame = fWindow->Frame(); - BRect screenFrame = - fDesktop->ActiveScreen()->Frame(); + BRect screenFrame = fWindow->Screen()->Frame(); fDirectWindowFeel = fWindow->Feel(); fDesktop->MoveWindowBy(fWindow, -fWindow->Frame().left, -fWindow->Frame().top); diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp index 3ff8a453f8..5339b55ec9 100644 --- a/src/servers/app/Window.cpp +++ b/src/servers/app/Window.cpp @@ -162,9 +162,8 @@ Window::Window(const BRect& frame, const char *name, uint16 width, height; uint32 colorSpace; float frequency; - if (fDesktop->ScreenAt(0)) { - fDesktop->ScreenAt(0)->GetMode(width, height, - colorSpace, frequency); + if (Screen() != NULL) { + Screen()->GetMode(width, height, colorSpace, frequency); // TODO: MOVE THIS AWAY!!! ResizeBy contains calls to virtual methods! // Also, there is no TopView()! fFrame.OffsetTo(B_ORIGIN); @@ -564,6 +563,16 @@ Window::PreviousWindow(int32 index) const } +::Screen* +Window::Screen() const +{ + ASSERT_MULTI_LOCKED(fDesktop->WindowLocker()); + + // TODO: we need to know which screen the window is on + return fDesktop->VirtualScreen().ScreenAt(0); +} + + // #pragma mark - @@ -1147,7 +1156,7 @@ Window::_AlterDeltaForSnap(BPoint& delta, bigtime_t now) BRect frame = fFrame; BPoint offsetWithinFrame; // TODO: Perhaps obtain the usable area (not covered by the Deskbar)? - BRect screenFrame = fDesktop->ActiveScreen()->Frame(); + BRect screenFrame = Screen()->Frame(); if (fDecorator) { BRegion reg; diff --git a/src/servers/app/Window.h b/src/servers/app/Window.h index bf12efb16a..41079c9c5e 100644 --- a/src/servers/app/Window.h +++ b/src/servers/app/Window.h @@ -31,6 +31,7 @@ class Decorator; class Desktop; class DrawingEngine; class EventDispatcher; +class Screen; class WorkspacesView; // TODO: move this into a proper place @@ -41,6 +42,7 @@ enum { UPDATE_EXPOSE = 0x02, }; + class Window { public: Window(const BRect& frame, const char *name, @@ -65,6 +67,8 @@ public: ::EventTarget& EventTarget() const { return fWindow->EventTarget(); } + ::Screen* Screen() const; + // setting and getting the "hard" clipping, you need to have // WriteLock()ed the clipping! void SetClipping(BRegion* stillAvailableOnScreen);