void RunAtStartMenuClick_Reg(object sender, EventArgs ev) { try { if (!menu_runatstart_reg.Checked) { var isadmin = Taskmaster.IsAdministrator(); if (isadmin) { var rv = System.Windows.Forms.MessageBox.Show("Run at start does not support elevated privilege that you have. Is this alright?\n\nIf you absolutely need admin rights, create on logon scheduled task.", System.Windows.Forms.Application.ProductName + " – Run at Start normal privilege problem.", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly, false); if (rv == DialogResult.No) { return; } } } menu_runatstart_reg.Checked = RunAtStartRegRun(!menu_runatstart_reg.Checked); } catch (Exception ex) { Logging.Stacktrace(ex); } }
void RestoreMainWindow(object sender, EventArgs e) { if (!Atomic.Lock(ref restoremainwindow_lock)) { return; // already being done } try { Taskmaster.ShowMainWindow(); if (Taskmaster.Trace) { Log.Verbose("RestoreMainWindow done!"); } } catch (Exception ex) { Logging.Stacktrace(ex); throw; } finally { Atomic.Unlock(ref restoremainwindow_lock); } }
public void SessionEndingEvent(object sender, EventArgs ev) { // queue exit Log.Information("<Session:Ending> Exiting..."); BeginInvoke(new Action(() => { Microsoft.Win32.SystemEvents.SessionEnding -= SessionEndingEvent; Taskmaster.UnifiedExit(); })); }
async Task CheckErrors() { await Task.Delay(0).ConfigureAwait(false); // TODO: Maybe make this errors within timeframe instead of total...? if (Statistics.FatalErrors >= Settings.FatalErrorThreshold) { Log.Fatal("<Auto-Doc> Fatal error count too high, exiting."); Taskmaster.UnifiedExit(); } }
async Task CheckLogs() { await Task.Delay(0).ConfigureAwait(false); long size = 0; var files = System.IO.Directory.GetFiles(logpath, "*", System.IO.SearchOption.AllDirectories); foreach (var filename in files) { var fi = new System.IO.FileInfo(System.IO.Path.Combine(logpath, filename)); size += fi.Length; } if (size >= Settings.FatalLogSizeThreshold * 1_000_000) { Log.Fatal("<Auto-Doc> Log files exceeding allowed size, exiting."); Taskmaster.UnifiedExit(); } }
void RunAtStartMenuClick_Sch(object sender, EventArgs ev) { try { var isadmin = Taskmaster.IsAdministrator(); if (!isadmin) { var rv = MessageBox.Show("Scheduler can not be modified without admin rights.", System.Windows.Forms.Application.ProductName + " – run with scheduler at login", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly, false); return; } if (!menu_runatstart_sch.Checked) { if (isadmin) { var rv = System.Windows.Forms.MessageBox.Show("This will add on-login scheduler to run TM as admin, is this right?", System.Windows.Forms.Application.ProductName + " – run at login with scheduler", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, System.Windows.Forms.MessageBoxOptions.DefaultDesktopOnly, false); if (rv == DialogResult.No) { return; } } } menu_runatstart_sch.Checked = RunAtStartScheduler(!menu_runatstart_sch.Checked); if (menu_runatstart_sch.Checked && menu_runatstart_reg.Checked) { // don't have both enabled RunAtStartMenuClick_Reg(this, null); } } catch (Exception ex) { Logging.Stacktrace(ex); } }
public async void EnsureVisible() { if (!Atomic.Lock(ref ensuringvisibility)) { return; } try { Enable(); int attempts = 0; while (!Tray.Visible) { Log.Debug("<Tray> Not visible, fixing..."); RefreshVisibility(); await Task.Delay(15 * 1000).ConfigureAwait(true); if (++attempts >= 5) { Log.Fatal("<Tray> Failure to become visible after 5 attempts. Exiting to avoid ghost status."); Taskmaster.UnifiedExit(); } } } catch (Exception ex) { Logging.Stacktrace(ex); } finally { Atomic.Unlock(ref ensuringvisibility); } }
// ctor, constructor /// <exception cref="InitFailure">When initialization fails in a way that can not be continued from.</exception> public MicManager() { System.Diagnostics.Debug.Assert(Taskmaster.IsMainThread(), "Requires main thread"); // Target = Maximum; // superfluous; CLEANUP var stats = Taskmaster.Config.Load(statfile); // there should be easier way for this, right? Corrections = (stats.Config.Contains("Statistics") && stats.Config["Statistics"].Contains("Corrections")) ? stats.Config["Statistics"]["Corrections"].IntValue : 0; // DEVICES // find control interface // FIXME: Deal with multiple recording devices. var waveInDeviceNumber = IntPtr.Zero; // 0 is default or first? NAudio.Mixer.MixerLine mixerLine = null; try { mixerLine = new NAudio.Mixer.MixerLine(waveInDeviceNumber, 0, NAudio.Mixer.MixerFlags.WaveIn); } catch (NAudio.MmException ex) { Log.Fatal("<Microphone> Default device not found."); throw new InitFailure("Failed to get default microphone device.", ex); } Control = (NAudio.Mixer.UnsignedMixerControl)mixerLine.Controls.FirstOrDefault( (control) => control.ControlType == NAudio.Mixer.MixerControlType.Volume ); if (Control == null) { Log.Error("<Microphone> No volume control acquired!"); throw new InitFailure("Mic monitor control not acquired."); } _volume = Control.Percent; // get default communications device var mm_enum = new NAudio.CoreAudioApi.MMDeviceEnumerator(); m_dev = mm_enum?.GetDefaultAudioEndpoint(NAudio.CoreAudioApi.DataFlow.Capture, NAudio.CoreAudioApi.Role.Communications); if (m_dev != null) { m_dev.AudioEndpointVolume.OnVolumeNotification += VolumeChangedHandler; } mm_enum = null; // unnecessary? if (m_dev == null) { Log.Error("<Microphone> No communications device found!"); throw new InitFailure("No communications device found"); } var mvol = "Microphone volume"; var corecfg = Taskmaster.Config.Load(Taskmaster.coreconfig); var save = false || !corecfg.Config["Media"].Contains(mvol); var defaultvol = corecfg.Config["Media"].GetSetDefault(mvol, 100d).DoubleValue; if (save) { corecfg.MarkDirty(); } var fname = "Microphone.Devices.ini"; var vname = "Volume"; var devcfg = Taskmaster.Config.Load(fname); var guid = (m_dev.ID.Split('}'))[1].Substring(2); var devname = m_dev.DeviceFriendlyName; var unset = !(devcfg.Config[guid].Contains(vname)); var devvol = devcfg.Config[guid].GetSetDefault(vname, defaultvol).DoubleValue; devcfg.Config[guid]["Name"].StringValue = devname; if (unset) { devcfg.Save(); } Target = devvol.Constrain(0, 100); Log.Information("<Microphone> Default device: {Device} (volume: {TargetVolume:N1}%)", m_dev.FriendlyName, Target); Volume = Target; Log.Information("<Microphone> Component loaded."); }
public TrayAccess() { // BUILD UI Tray = new NotifyIcon { Text = System.Windows.Forms.Application.ProductName + "!", // Tooltip so people know WTF I am. Icon = System.Drawing.Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetExecutingAssembly().Location) // is this really the best way? }; Tray.BalloonTipText = Tray.Text; Tray.Disposed += (object sender, EventArgs e) => { Tray = null; }; if (Taskmaster.Trace) { Log.Verbose("Generating tray icon."); } ms = new ContextMenuStrip(); menu_windowopen = new ToolStripMenuItem("Open", null, RestoreMainWindow); menu_rescan = new ToolStripMenuItem("Rescan", null, (o, s) => { menu_rescan.Enabled = false; RescanRequest?.Invoke(this, null); menu_rescan.Enabled = true; }); menu_configuration = new ToolStripMenuItem("Configuration"); var menu_configuration_autopower = new ToolStripMenuItem("Power auto-adjust", null, ShowPowerConfig); var menu_configuration_folder = new ToolStripMenuItem("Open in file manager", null, ShowConfigRequest); menu_configuration.DropDownItems.Add(menu_configuration_autopower); menu_configuration.DropDownItems.Add(new ToolStripSeparator()); menu_configuration.DropDownItems.Add(menu_configuration_folder); menu_runatstart_reg = new ToolStripMenuItem("Run at start (RegRun)", null, RunAtStartMenuClick_Reg); menu_runatstart_sch = new ToolStripMenuItem("Schedule at login (Admin)", null, RunAtStartMenuClick_Sch); bool runatstartreg = RunAtStartRegRun(enabled: false, dryrun: true); bool runatstartsch = RunAtStartScheduler(enabled: false, dryrun: true); menu_runatstart_reg.Checked = runatstartreg; menu_runatstart_sch.Checked = runatstartsch; Log.Information("<Core> Run-at-start – Registry: {Enabled}, Scheduler: {Found}", (runatstartreg ? "Enabled" : "Disabled"), (runatstartsch ? "Found" : "Missing")); if (Taskmaster.PowerManagerEnabled) { power_auto = new ToolStripMenuItem("Auto", null, SetAutoPower); power_auto.Checked = false; power_auto.CheckOnClick = true; power_auto.Enabled = false; power_highperf = new ToolStripMenuItem(PowerManager.GetModeName(PowerInfo.PowerMode.HighPerformance), null, (s, e) => { ResetPower(PowerInfo.PowerMode.HighPerformance); }); power_balanced = new ToolStripMenuItem(PowerManager.GetModeName(PowerInfo.PowerMode.Balanced), null, (s, e) => { ResetPower(PowerInfo.PowerMode.Balanced); }); power_saving = new ToolStripMenuItem(PowerManager.GetModeName(PowerInfo.PowerMode.PowerSaver), null, (s, e) => { ResetPower(PowerInfo.PowerMode.PowerSaver); }); power_manual = new ToolStripMenuItem("Manual override", null, SetManualPower) { CheckOnClick = true }; } ToolStripMenuItem menu_restart = null; menu_restart = new ToolStripMenuItem("Restart", null, (o, s) => { menu_restart.Enabled = false; Taskmaster.ConfirmExit(restart: true); menu_restart.Enabled = true; }); menu_exit = new ToolStripMenuItem("Exit", null, (o, s) => { menu_restart.Enabled = false; Taskmaster.ConfirmExit(restart: false); menu_restart.Enabled = true; }); ms.Items.Add(menu_windowopen); ms.Items.Add(new ToolStripSeparator()); ms.Items.Add(menu_rescan); ms.Items.Add(new ToolStripSeparator()); ms.Items.Add(menu_configuration); ms.Items.Add(menu_runatstart_reg); ms.Items.Add(menu_runatstart_sch); if (Taskmaster.PowerManagerEnabled) { ms.Items.Add(new ToolStripSeparator()); var plab = new ToolStripLabel("--- Power Plan ---"); plab.ForeColor = System.Drawing.SystemColors.GrayText; ms.Items.Add(plab); ms.Items.Add(power_auto); ms.Items.Add(power_highperf); ms.Items.Add(power_balanced); ms.Items.Add(power_saving); ms.Items.Add(power_manual); } ms.Items.Add(new ToolStripSeparator()); ms.Items.Add(menu_restart); ms.Items.Add(menu_exit); Tray.ContextMenuStrip = ms; if (Taskmaster.Trace) { Log.Verbose("Tray menu ready"); } if (!RegisterExplorerExit()) { throw new InitFailure("<Tray> Explorer registeriong failed; not running?"); } ms.Enabled = false; // Tray.Click += RestoreMainWindow; Tray.MouseClick += ShowWindow; // TODO: Toast Notifications if (Tray.Icon == null) { Log.Fatal("<Tray> Icon missing, setting system default."); Tray.Icon = System.Drawing.SystemIcons.Application; } Microsoft.Win32.SystemEvents.SessionEnding += SessionEndingEvent; // depends on messagepump if (Taskmaster.Trace) { Log.Verbose("<Tray> Initialized"); } }