Files
komorebi/docs/usage/changing-monitors.md
T
LGUG2Z f530318cee feat(wm): outputs unplugged and plugged back
KWin takes the windows of an output that goes to the outputs that are left and
puts them where it likes, so komorebi's tiles for them were on a screen that was
gone and the windows sat untiled where they landed. The monitor reconciliator
now deals with a change in the set of monitors: the table announces it as a
display connection change instead of a resize, and reconcile_display_change
reads the monitors again, keeps each one that went (workspaces, layouts,
paddings, offsets) in a cache, has the window manager move what was on it to the
monitors that are left, and removes it.

The move is WindowManager::evacuate_monitor, in the new reconcile module: each
container and floating window goes to the workspace of the same number on the
monitor that holds the middle of its window, or on the first monitor that is
left when it is on none, and the workspaces that changed are tiled. A stack goes
as one container, and a monocle and a maximized window come as ordinary
containers. A monitor that is plugged in takes what was cached under its serial
number id, less the windows that closed or that the window manager has elsewhere
by now, so it comes back with its settings and none of the windows it had. A
monitor komorebi never saw gets workspaces of its own, and when the compositor
reports no output at all nothing is done.

The workspace rules of a monitor that goes are dropped, and those of the
workspaces of one that comes back apply again. komorebi.json fills the cache as
well: a monitor that has the entry its display index preference names is kept
with it, and so is the entry of each preference whose monitor is not connected,
which that monitor takes when it is plugged in.

vm-hotplug now sends two windows to the other monitor with komorebic, disables
that output, enables it again and sends a window over once more.
2026-10-28 07:20:57 -07:00

3.3 KiB

Monitors that change

komorebi follows the outputs KWin has. There is nothing to configure and no command to run: this page says what komorebi does when a monitor changes.

A monitor changes size

A monitor changes size when its resolution or its scale changes (in System Settings, under Display & Monitor, or with kscreen-doctor output.<name>.scale.1.5), and when a panel changes the room the windows have on it: a panel that starts, grows, moves or is hidden. komorebi reads the size and the work area of every monitor again, and tiles the workspace in front on the focused monitor in the area it now has.

The windows of the other monitors keep their tiles until something tiles them again. komorebic retile does it for every monitor.

KWin has no signal for the room a panel leaves, so komorebi looks at it when a panel opens, closes or moves, and once a second. A panel that is laid out a moment after komorebi starts is found within a second.

A monitor is unplugged

KWin takes the windows of an output that goes (it is unplugged, or disabled with kscreen-doctor output.<name>.disable) to the outputs that are left, and puts them where it likes. komorebi takes the monitor's workspaces over there: every container, and every floating window, goes to the workspace with the same number on the monitor KWin put its window on, and the workspaces that changed are tiled again. A stack goes as a stack. A monocle window and a maximized window come as tiles of their own, and the windows the monocle hid are shown again.

komorebi keeps the monitor that went, with its workspaces, layouts, paddings and offsets, for when it comes back, and forgets the workspace rules of its workspaces until then. When no output is left at all, komorebi does nothing.

A monitor is plugged in

komorebi knows a monitor by the manufacturer, the model and the serial number KWin reports for the output, or by the output's name when it has no serial number. A monitor komorebi has kept comes back with what was kept: its workspaces and their settings, and the wallpaper of the monitor, less the windows that have closed or that are somewhere else now. Its windows were tiled on other monitors when it went, so it comes back with none of them. The monitor that had the focus keeps it, and every monitor shows its workspace in front.

A monitor that komorebi has not seen gets workspaces of its own, and the windows that open on it are tiled there. When komorebi.json has an entry for the monitor in display_index_preferences and the monitor was not connected when the file was read, it takes the entry when it is plugged in. The monitors are put at the index the user gave them with komorebic display-index-preference, and after the other monitors otherwise.

Following it from a program

A subscriber is sent a notification each time komorebi has dealt with a change of the monitors, whether or not anything changed in the state. Its event is {"Resize":0} for a change of size, where the number is the id of the monitor that changed, or 0 when KWin does not say which, and {"DisplayConnectionChange":0} for a monitor that was unplugged or plugged in.