diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 9412a972b4..962da38a1d 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -480,6 +480,28 @@ Desktop::BroadcastToAllApps(int32 code) } +void +Desktop::ScreenChanged(Screen* screen) +{ + BMessage update(B_SCREEN_CHANGED); + update.AddInt64("when", real_time_clock_usecs()); + update.AddRect("frame", screen->Frame()); + update.AddInt32("mode", screen->ColorSpace()); + + BAutolock locker(this); + + // send B_SCREEN_CHANGED to windows on that screen + // TODO: currently ignores the screen argument! + + for (int32 i = fWindowLayerList.CountItems(); i-- > 0;) { + WindowLayer* layer = fWindowLayerList.ItemAt(i); + ServerWindow* window = layer->Window(); + + window->SendMessageToClient(&update); + } +} + + // #pragma mark - Methods for WindowLayer manipulation @@ -721,9 +743,9 @@ Desktop::WriteWindowList(team_id team, BPrivate::LinkSender& sender) int32 count = 0; if (team >= B_OK) { for (int32 i = 0; i < fWindowLayerList.CountItems(); i++) { - WindowLayer* border = fWindowLayerList.ItemAt(i); + WindowLayer* layer = fWindowLayerList.ItemAt(i); - if (border->Window()->ClientTeam() == team) + if (layer->Window()->ClientTeam() == team) count++; } } else @@ -735,12 +757,12 @@ Desktop::WriteWindowList(team_id team, BPrivate::LinkSender& sender) sender.Attach(count); for (int32 i = 0; i < fWindowLayerList.CountItems(); i++) { - WindowLayer* border = fWindowLayerList.ItemAt(i); + WindowLayer* layer = fWindowLayerList.ItemAt(i); - if (team >= B_OK && border->Window()->ClientTeam() != team) + if (team >= B_OK && layer->Window()->ClientTeam() != team) continue; - sender.Attach(border->Window()->ServerToken()); + sender.Attach(layer->Window()->ServerToken()); } sender.Flush(); diff --git a/src/servers/app/Desktop.h b/src/servers/app/Desktop.h index 1955ed1c27..570ec61655 100644 --- a/src/servers/app/Desktop.h +++ b/src/servers/app/Desktop.h @@ -63,6 +63,8 @@ class Desktop : public MessageLooper, public ScreenOwner { inline ::RootLayer* RootLayer() const { return fRootLayer; } inline CursorManager& GetCursorManager() { return fCursorManager; } + void ScreenChanged(Screen* screen); + virtual void ScreenRemoved(Screen* screen) {} virtual void ScreenAdded(Screen* screen) {} virtual bool ReleaseScreen(Screen* screen) { return false; } diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 24d6a7cbb5..e0d88f7681 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -2109,6 +2109,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) mode.virtual_height - 1 - bounds.Height()); gInputManager->UpdateScreenBounds(rootLayer->Bounds()); + fDesktop->ScreenChanged(fDesktop->ScreenAt(0)); } rootLayer->Unlock();