Three processes build a CinnamonBgList: the background daemon, the settings panel, and the slideshow daemon.
cinnamon-background-daemon (the renderer)
never writes the configuration. It asks the model what each monitor
should show, paints the result, and pushes the primary monitor's
picture uri out to AccountsService so the greeter matches. It also
publishes its own RenderedLayout property on its dbus interface
(org.Cinnamon.Background), useful for reporting
what images are currently being rendered to an applet.
The settings panel owns the mode. It writes the
background-mode key directly and calls
cinnamon_bg_list_save() once the list reports the
new mode; cinnamon_bg_list_set_mode() is the
equivalent for a C consumer. It makes configuration
edits by setting properties on model items and calling
cinnamon_bg_list_save().
The slideshow daemon only advances
picture-uri on model items as it rotates, persisting
with cinnamon_bg_list_save_pictures(),
which moves pictures without changing which entries the key holds. A
rotation is not a configuration edit, so it must not prune the entry
of a monitor that happens to be unplugged. It never writes
background-mode.
Cinnamon's slideshowManager only ever reads
GSettings, and builds no BgList. It calls cinnamon_bg_list_has_slideshow(), which reads the keys directly.
Cinnamon's backgroundManager builds no list
either. It is the only thing that reacts to a flat
picture-uri, which is how
an external "set as wallpaper" arrives: either on our own key (what
xdg-desktop-portal-xapp writes) or on
org.gnome.desktop.background's (which some
applications still set directly). It turns either into
cinnamon_bg_list_set_single_uri() — deliberately destructive, since
asking for one wallpaper means one image on every monitor.
That both of Cinnamon's own consumers reach the library only through
cinnamon_bg_list_has_slideshow()
and
cinnamon_bg_list_set_single_uri()
is deliberate. Both are static and touch nothing but
GSettings, so the shell never constructs a list and never
acquires the window manager's DisplayConfig proxy that
one would bring with it.
cinnamon_bg_list_save() writes
picture-uri-list alone, so a component that only meant
to change a picture cannot write back whatever mode it happens to be
holding. Changing the mode is a separate, deliberate call.
cinnamon_bg_list_set_single_uri() is the one
exception, and an explicit one: it sets the mode to mirror along with the
picture, because one wallpaper on every monitor is what it means.