@@ -169,6 +169,11 @@ class ms::BasicSurface::Multiplexer : public ObserverMultiplexer<SurfaceObserver
169
169
{
170
170
for_each_observer (&SurfaceObserver::left_output, surf, id);
171
171
}
172
+
173
+ void rescale_output (Surface const * surf, graphics::DisplayConfigurationOutputId const & id) override
174
+ {
175
+ for_each_observer (&SurfaceObserver::rescale_output, surf, id);
176
+ }
172
177
};
173
178
174
179
namespace
@@ -989,28 +994,34 @@ auto mir::scene::BasicSurface::content_top_left(State const& state) const -> geo
989
994
void mir::scene::BasicSurface::track_outputs ()
990
995
{
991
996
auto const state{synchronised_state.lock ()};
992
- std::set<mg::DisplayConfigurationOutputId> tracked;
997
+ decltype (tracked_output_scales) tracked;
993
998
994
999
display_config->for_each_output (
995
1000
[&](mg::DisplayConfigurationOutput const & output)
996
1001
{
997
1002
if (output.valid () && output.used && output.extents ().overlaps (state->surface_rect ))
998
1003
{
999
- if (!tracked_outputs .contains (output.id ))
1004
+ if (!tracked_output_scales .contains (output.id ))
1000
1005
{
1001
1006
observers->entered_output (this , output.id );
1002
1007
}
1003
- tracked.insert (output.id );
1008
+ tracked.emplace (output.id , output. scale );
1004
1009
}
1005
1010
});
1006
1011
1007
- // TODO: Once std::views::filter is properly supported across compilers, replace the
1008
- // creation of `untracked` with iteration over a filtered view of `tracked_outputs`
1009
- std::vector<mg::DisplayConfigurationOutputId> untracked;
1010
- std::ranges::set_difference (tracked_outputs, tracked, std::back_inserter (untracked));
1011
- std::ranges::for_each (untracked, [&](auto const & id) { observers->left_output (this , id); });
1012
+ for (auto const & [id, scale] : tracked_output_scales)
1013
+ {
1014
+ if (auto new_entry = tracked.find (id); new_entry == tracked.end ())
1015
+ {
1016
+ observers->left_output (this , id);
1017
+ }
1018
+ else if (new_entry->second != scale)
1019
+ {
1020
+ observers->rescale_output (this , id);
1021
+ }
1022
+ }
1012
1023
1013
- tracked_outputs = std::move (tracked);
1024
+ tracked_output_scales = std::move (tracked);
1014
1025
}
1015
1026
1016
1027
void mir::scene::BasicSurface::linearised_track_outputs ()
0 commit comments