Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(wm): add monitor reconciliator module
This commit adds the monitor_reconciliator module which uses a tightly bounded channel (cap: 1) to handle monitor connection and disconnection events, as well as resolution and work area change events. Before, all this logic lived in a the WindowManager.reconcile_monitors function, which ran on pretty much every process_event iteration, and sometimes led to undesirable behaviour, but now the logic is split up to only run when the appropriate notifications are dispatched from the hidden window which listens for monitor and display-related events. The monitor cache has been moved out of WindowManager and into the monitor_reconciliator module, and in addition to the previous behaviour of attempting to cache monitors which had been identified as disconnected, now when the static configuration file is loaded, if the user has set display_index_preferences, the device IDs will be used to pre-populate the cache for the event where a known monitor is connected later in a session. The monitor cache itself now uses the unique device ID as a key rather than the hmonitor which is known to be inconsistent. This commit also delegates all display monitor-related Win32 calls to the "win32-display-data" crate, which was extracted from the larger "brightness" crate for its use in komorebi. As a result of these changes, "device" and "device_id" on Monitor have been changed from Option<String> to String types, as failures in retrieving these values with directly attached monitors has not been possible to reproduce. However, it remains to be seen if this will adversely impact users who use display docks which may prevent display monitor device IDs from being read and stored by the operating system. WindowManagerEvent::DisplayChange has been removed in favour of the monitor_reconciliator::Notification enum, as these events are no longer being handled in process_events. Attempts are now made to eagerly update hmonitors both within the monitor_reconciliator loop on DisplayConnectionChange notifications and when failing to find a matching hmonitor in functions like monitor_idx_from_current_pos and monitor_idx_from_window.
- Loading branch information