# Monitor configuration

## File locations

Monitor configurations are stored as XML files called `monitors.xml` on the file
system. There are two types of locations for the XML file: the system level and
the user level.

The directories for system level configuration is defined in accordance to the
$XDG_CONFIG_DIRS environment variable defined in the XDG Base Directory
Specification. The default is `/etc/xdg/monitors.xml`.

The directory for the user level configuration is defined in accordance to the
$XDG_CONFIG_HOME environment variable defined in the XDG Base Directory
Specification. The default is `~/.config/monitors.xml`

## File contents

A configuration file consists of an XML document with the root element
`<monitors version="2">`. In this document multiple configurations are stored as
individual `<configuration/>` elements containing all the details of the monitor
setup. The `version` attribute must be set to `"2"`.

Each configuration corresponds to a specific hardware setup, where a given set
of monitors are connected to the computer. There can only be one configuration
per hardware setup.

## Writing configuration

Monitor configurations are managed by Mutter via the Display panel in Settings,
which uses a D-Bus API to communicate with Mutter. Each time a new configuration
is applied and accepted, the user level configuration file is replaced with
updated content.

Previously defined monitor configurations for hardware state other than the
current are left intact.

## Configuration policy

The monitor configuration policy determines how Mutter configures monitors. This
can mean for example in what order configuration files should be preferred, or
whether configuration via Settings (i.e. D-Bus) should be allowed.

The default policy is to prioritize configurations defined in the user level
configuration file, and to allow configuring via D-Bus.

Changing the policy is possible by manually adding a `<policy/>` element inside
the `<monitors version="2"/>` element in the `monitors.xml` file. Note that
there may only be one `<policy/>` element in each configuration file.

### Changing configuration file priority policy

To change the order of configuration file priority, or to disable configuration
files completely, add a `<stores/>` element inside the `<policy/>` element
described above.

In this element, the file policy is defined by a `<stores/>` element, which
lists stores with the order according to prioritization. Each store is specified
using a `<store/>` element with either `system` or `user` as the content.

#### Example of only reading monitor configuration from the system level file:

```xml
<monitors version="2">
  <policy>
    <stores>
      <store>system</store>
    </stores>
  </policy>
</monitors>
```

#### Example of reversing the priority of monitor configuration:

```xml
<monitors version="2">
  <policy>
    <stores>
      <store>user</store>
      <store>system</store>
    </stores>
  </policy>
</monitors>
```

### Changing D-Bus configuration policy

D-Bus configureability can be configured using a `<dbus/>` element in the
`<policy/>` element. It's content should either be `yes` or `no` depending on
whether monitor configuration via D-Bus should be enabled or disable.

#### Example of how to disable monitor configuration via D-Bus:

```xml
<monitors version="2">
  <policy>
    <dbus>no</dbus>
  </policy>
</monitors>
```