/// <summary> /// check monitor settings and clean up any abandoned ones /// this is necessary because when we run with a profile that has not been reset, /// we end up with settings for monitors that don't actually exist. Also, actual /// changes to our windows monitors will abandon settings for monitors that have /// changed locations or have been removed. /// </summary> private void CheckMonitorSettings() { // get the list of real monitors and all their serialized settings names HashSet <string> displayKeys = new HashSet <string>(); foreach (Monitor monitor in ConfigManager.DisplayManager.Displays) { displayKeys.UnionWith(ShadowMonitor.GetAllKeys(monitor)); } if (!(ConfigManager.SettingsManager is ISettingsManager2 settings)) { return; } // get the list of configured monitors in the settings file List <string> stableKeys = settings.EnumerateSettingNames(DISPLAYS_SETTINGS_GROUP).ToList(); if (!ConfigManager.Application.SettingsAreWritable) { // this is a readonly application, let another application (i.e. Profile Editor) clean this up return; } // clean up settings for monitors that are not existing any more or are phantoms from unreset profiles foreach (string key in stableKeys.Where(key => !displayKeys.Contains(key))) { ConfigManager.LogManager.LogDebug($"removed setting '{key}' that does not refer to a real monitor"); settings.DeleteSetting(DISPLAYS_SETTINGS_GROUP, key); } }
/// <summary> /// if we somehow end up with no UI view, select one /// this also happens when we start fresh /// </summary> private void AutoSelectUserInterfaceView() { // REVISIT add support for explicit main and UI view viewports, which will require updates to the editor also if (_monitors.Values.Any(m => m.UserInterface && m.Included)) { // got at least one, don't even create the list return; } IList <ShadowMonitor> selectedMonitors = _monitors.Values .Where(m => m.Included) .ToList(); // select any monitors with minimal viewports (might not be entirely empty) int minViewports = selectedMonitors .Select(m => m.ViewportCount) .Min <int>(); IList <ShadowMonitor> sortedMinPopulated = selectedMonitors .Where(m => m.ViewportCount == minViewports) .OrderBy(m => m.Monitor.Left) .ToList(); double maxSize = sortedMinPopulated.Select(m => m.Monitor.Width).Max <double>(); ShadowMonitor ui = sortedMinPopulated.First(m => Math.Abs(m.Monitor.Width - maxSize) < 0.001); ui.UserInterface = true; }
private static string CalculateMonitorKey(ShadowMonitor shadow) { string main = shadow.Main ? " MAIN" : ""; string ui = shadow.UserInterface ? " UI" : ""; return ($"{shadow.Monitor.Left} {shadow.Monitor.Top} {shadow.Monitor.Width} {shadow.Monitor.Height}{main}{ui}"); }
private void RemoveMonitor(Monitor monitor) { ShadowMonitor shadow = _monitors[monitor]; shadow.MonitorChanged -= Raw_MonitorChanged; MonitorRemoved?.Invoke(this, new ShadowMonitorEventArgs(shadow)); _monitors.Remove(monitor); shadow.Dispose(); }
private void AddMonitor(ShadowMonitor shadow, Vector globalOffset) { MonitorViewModel model = new MonitorViewModel(shadow, globalOffset, Scale); _monitors[shadow] = model; Monitors.Add(model); // register to changes to our settings (not the geometry of the observed visuals) model.Data.PropertyChanged += Shadow_PropertyChanged; }
public void RemoveViewport(ShadowVisual shadowViewport) { shadowViewport.ViewportChanged -= Raw_ViewportChanged; _viewports.Remove(shadowViewport.Visual); ViewportRemoved?.Invoke(this, new ShadowViewportEventArgs(shadowViewport)); // update viewport count on hosting monitor ShadowMonitor monitor = _monitors[shadowViewport.Monitor]; monitor.RemoveViewport(); // recalculate, delayed ScheduleGeometryChange(); }
public void AddViewport(ShadowVisual shadowViewport) { _viewports[shadowViewport.Visual] = shadowViewport; ViewportAdded?.Invoke(this, new ShadowViewportEventArgs(shadowViewport)); // update viewport count on hosting monitor ShadowMonitor monitor = _monitors[shadowViewport.Monitor]; monitor.AddViewport(); shadowViewport.ViewportChanged += Raw_ViewportChanged; // recalculate, delayed ScheduleGeometryChange(); }
private void AddMonitor(Monitor monitor) { ShadowMonitor shadow = new ShadowMonitor(this, monitor); _monitors[monitor] = shadow; // now that we can find the monitor in our index, we can safely add viewports // and other children shadow.Instrument(); shadow.KeyChanged += Shadow_KeyChanged; shadow.PropertyChanged += Shadow_PropertyChanged; shadow.MonitorChanged += Raw_MonitorChanged; MonitorAdded?.Invoke(this, new ShadowMonitorEventArgs(shadow)); }
public ShadowMonitorEventArgs(ShadowMonitor shadow) { Data = shadow; }