コード例 #1
0
ファイル: MonitorSetup.cs プロジェクト: appsou/Helios
        /// <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);
            }
        }
コード例 #2
0
ファイル: MonitorSetup.cs プロジェクト: appsou/Helios
        /// <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;
        }
コード例 #3
0
ファイル: MonitorSetup.cs プロジェクト: appsou/Helios
        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}");
        }
コード例 #4
0
ファイル: MonitorSetup.cs プロジェクト: appsou/Helios
        private void RemoveMonitor(Monitor monitor)
        {
            ShadowMonitor shadow = _monitors[monitor];

            shadow.MonitorChanged -= Raw_MonitorChanged;
            MonitorRemoved?.Invoke(this, new ShadowMonitorEventArgs(shadow));
            _monitors.Remove(monitor);
            shadow.Dispose();
        }
コード例 #5
0
        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;
        }
コード例 #6
0
ファイル: MonitorSetup.cs プロジェクト: appsou/Helios
        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();
        }
コード例 #7
0
ファイル: MonitorSetup.cs プロジェクト: appsou/Helios
        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();
        }
コード例 #8
0
ファイル: MonitorSetup.cs プロジェクト: appsou/Helios
        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));
        }
コード例 #9
0
ファイル: ShadowMonitor.cs プロジェクト: appsou/Helios
 public ShadowMonitorEventArgs(ShadowMonitor shadow)
 {
     Data = shadow;
 }