X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2FLibCecTray%2Fui%2FCECTray.cs;h=1b2897b1b4822bd5778037fc8b50582d3102ad03;hb=07224bf34475a5bcabc52d364ae7b795541346be;hp=a781ce73049fa658b858e1d04dbafaba96436628;hpb=95587b956c69ead0b46d301f5ca70e977890c3fd;p=deb_libcec.git diff --git a/src/LibCecTray/ui/CECTray.cs b/src/LibCecTray/ui/CECTray.cs index a781ce7..1b2897b 100644 --- a/src/LibCecTray/ui/CECTray.cs +++ b/src/LibCecTray/ui/CECTray.cs @@ -1,7 +1,7 @@ /* * This file is part of the libCEC(R) library. * - * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -38,6 +38,9 @@ using LibCECTray.Properties; using LibCECTray.controller; using LibCECTray.controller.applications; using LibCECTray.settings; +using Microsoft.Win32; +using System.Security.Permissions; +using System.Runtime.InteropServices; namespace LibCECTray.ui { @@ -63,7 +66,6 @@ namespace LibCECTray.ui { Text = Resources.app_name; InitializeComponent(); - _controller = new CECController(this); VisibleChanged += delegate { if (!Visible) @@ -71,6 +73,89 @@ namespace LibCECTray.ui else OnShow(); }; + + SystemEvents.SessionEnding += new SessionEndingEventHandler(OnSessionEnding); + } + + public void OnSessionEnding(object sender, SessionEndingEventArgs e) + { + Controller.Close(); + } + + #region Power state change window messages + private const int WM_POWERBROADCAST = 0x0218; + private const int PBT_APMSUSPEND = 0x0004; + private const int PBT_APMRESUMESUSPEND = 0x0007; + private const int PBT_APMRESUMECRITICAL = 0x0006; + private const int PBT_APMRESUMEAUTOMATIC = 0x0012; + private const int PBT_POWERSETTINGCHANGE = 0x8013; + private static Guid GUID_SYSTEM_AWAYMODE = new Guid("98a7f580-01f7-48aa-9c0f-44352c29e5c0"); + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + internal struct POWERBROADCAST_SETTING + { + public Guid PowerSetting; + public uint DataLength; + public byte Data; + } + #endregion + + /// + /// Check for power state changes, and pass up when it's something we don't care about + /// + /// The incoming window message + protected override void WndProc(ref Message msg) + { + if (msg.Msg == WM_POWERBROADCAST) + { + switch (msg.WParam.ToInt32()) + { + case PBT_APMSUSPEND: + OnSleep(); + return; + + case PBT_APMRESUMESUSPEND: + case PBT_APMRESUMECRITICAL: + case PBT_APMRESUMEAUTOMATIC: + OnWake(); + return; + + case PBT_POWERSETTINGCHANGE: + { + POWERBROADCAST_SETTING pwr = (POWERBROADCAST_SETTING)Marshal.PtrToStructure(msg.LParam, typeof(POWERBROADCAST_SETTING)); + if (pwr.PowerSetting == GUID_SYSTEM_AWAYMODE && pwr.DataLength == Marshal.SizeOf(typeof(Int32))) + { + switch (pwr.Data) + { + case 0: + OnWake(); + return; + case 1: + OnSleep(); + return; + default: + break; + } + } + } + break; + default: + break; + } + } + + // pass up when not handled + base.WndProc(ref msg); + } + + private void OnWake() + { + Controller.Initialise(); + } + + private void OnSleep() + { + Controller.Close(); } public override sealed string Text @@ -79,9 +164,9 @@ namespace LibCECTray.ui set { base.Text = value; } } - private void CECTrayLoad(object sender, EventArgs e) + public void Initialise() { - _controller.Initialise(); + Controller.Initialise(); } protected override void Dispose(bool disposing) @@ -89,7 +174,7 @@ namespace LibCECTray.ui Hide(); if (disposing) { - _controller.Close(); + Controller.Close(); } if (disposing && (components != null)) { @@ -120,12 +205,12 @@ namespace LibCECTray.ui private void BSaveClick(object sender, EventArgs e) { - _controller.PersistSettings(); + Controller.PersistSettings(); } private void BReloadConfigClick(object sender, EventArgs e) { - _controller.ResetDefaultSettings(); + Controller.ResetDefaultSettings(); } #endregion @@ -170,22 +255,22 @@ namespace LibCECTray.ui private void BSendImageViewOnClick(object sender, EventArgs e) { - _controller.CECActions.SendImageViewOn(GetTargetDevice()); + Controller.CECActions.SendImageViewOn(GetTargetDevice()); } private void BStandbyClick(object sender, EventArgs e) { - _controller.CECActions.SendStandby(GetTargetDevice()); + Controller.CECActions.SendStandby(GetTargetDevice()); } private void BScanClick(object sender, EventArgs e) { - _controller.CECActions.ShowDeviceInfo(GetTargetDevice()); + Controller.CECActions.ShowDeviceInfo(GetTargetDevice()); } private void BActivateSourceClick(object sender, EventArgs e) { - _controller.CECActions.ActivateSource(GetTargetDevice()); + Controller.CECActions.ActivateSource(GetTargetDevice()); } private void CbCommandDestinationSelectedIndexChanged(object sender, EventArgs e) @@ -200,22 +285,22 @@ namespace LibCECTray.ui private void BVolUpClick(object sender, EventArgs e) { - _controller.Lib.VolumeUp(true); + Controller.Lib.VolumeUp(true); } private void BVolDownClick(object sender, EventArgs e) { - _controller.Lib.VolumeDown(true); + Controller.Lib.VolumeDown(true); } private void BMuteClick(object sender, EventArgs e) { - _controller.Lib.MuteAudio(true); + Controller.Lib.MuteAudio(true); } private void BRescanDevicesClick(object sender, EventArgs e) { - _controller.CECActions.RescanDevices(); + Controller.CECActions.RescanDevices(); } #endregion @@ -333,12 +418,12 @@ namespace LibCECTray.ui private void AboutToolStripMenuItemClick(object sender, EventArgs e) { - (new About(_controller.LibServerVersion, _controller.LibClientVersion, _controller.LibInfo)).ShowDialog(); + (new About(Controller.LibServerVersion, Controller.LibClientVersion, Controller.LibInfo)).ShowDialog(); } private void AdvancedModeToolStripMenuItemClick(object sender, EventArgs e) { - _controller.Settings.AdvancedMode.Value = !advancedModeToolStripMenuItem.Checked; + Controller.Settings.AdvancedMode.Value = !advancedModeToolStripMenuItem.Checked; ShowHideAdvanced(!advancedModeToolStripMenuItem.Checked); } @@ -372,12 +457,12 @@ namespace LibCECTray.ui { if (Visible && WindowState != FormWindowState.Minimized) { - _controller.Settings.StartHidden.Value = true; + Controller.Settings.StartHidden.Value = true; Hide(); } else { - _controller.Settings.StartHidden.Value = false; + Controller.Settings.StartHidden.Value = false; Show(); } } @@ -426,7 +511,7 @@ namespace LibCECTray.ui private void TsAdvancedClick(object sender, EventArgs e) { - _controller.Settings.AdvancedMode.Value = !tsAdvanced.Checked; + Controller.Settings.AdvancedMode.Value = !tsAdvanced.Checked; ShowHideAdvanced(!tsAdvanced.Checked); } @@ -482,10 +567,13 @@ namespace LibCECTray.ui #region Class members private ConfigTab _selectedTab = ConfigTab.Configuration; private string _log = string.Empty; - private readonly CECController _controller; + private CECController _controller; public CECController Controller { - get { return _controller; } + get + { + return _controller ?? (_controller = new CECController(this)); + } } public Control.ControlCollection TabControls { @@ -499,8 +587,8 @@ namespace LibCECTray.ui private void AddNewApplicationToolStripMenuItemClick(object sender, EventArgs e) { - ConfigureApplication appConfig = new ConfigureApplication(_controller.Settings, _controller); - _controller.DisplayDialog(appConfig, false); + ConfigureApplication appConfig = new ConfigureApplication(Controller.Settings, Controller); + Controller.DisplayDialog(appConfig, false); } } }