X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2FLibCecTray%2Fui%2FCECTray.cs;h=197ce32818c0d7537d2349f2f4102ce4b58f0854;hb=c46b7188dffb5b17f88de17615e4615a1f904877;hp=6a04d62f2301da982ecb970cf78547c9031351bc;hpb=fec04a82ac869da26cd02a64be354cbd08ecdc1b;p=deb_libcec.git diff --git a/src/LibCecTray/ui/CECTray.cs b/src/LibCecTray/ui/CECTray.cs index 6a04d62..197ce32 100644 --- a/src/LibCecTray/ui/CECTray.cs +++ b/src/LibCecTray/ui/CECTray.cs @@ -40,6 +40,7 @@ using LibCECTray.controller.applications; using LibCECTray.settings; using Microsoft.Win32; using System.Security.Permissions; +using System.Runtime.InteropServices; namespace LibCECTray.ui { @@ -72,28 +73,91 @@ namespace LibCECTray.ui else OnShow(); }; - SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(OnPowerModeChanged); + SystemEvents.SessionEnding += new SessionEndingEventHandler(OnSessionEnding); } public void OnSessionEnding(object sender, SessionEndingEventArgs e) { + Controller.CECActions.SuppressUpdates = true; Controller.Close(); } - public void OnPowerModeChanged(Object sender, PowerModeChangedEventArgs e) + #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) { - switch (e.Mode) + if (msg.Msg == WM_POWERBROADCAST) { - case PowerModes.Resume: - Controller.Initialise(); - break; - case PowerModes.Suspend: - Controller.Close(); - break; - case PowerModes.StatusChange: - break; + 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: + // do _not_ wake the pc when away mode is deactivated + //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 @@ -110,8 +174,10 @@ namespace LibCECTray.ui protected override void Dispose(bool disposing) { Hide(); + SuppressLogUpdates = true; if (disposing) { + Controller.CECActions.SuppressUpdates = true; Controller.Close(); } if (disposing && (components != null)) @@ -246,6 +312,9 @@ namespace LibCECTray.ui delegate void UpdateLogCallback(); private void UpdateLog() { + if (SuppressLogUpdates) + return; + if (tbLog.InvokeRequired) { UpdateLogCallback d = UpdateLog; @@ -503,6 +572,7 @@ namespace LibCECTray.ui #endregion #region Class members + private bool SuppressLogUpdates = false; private ConfigTab _selectedTab = ConfigTab.Configuration; private string _log = string.Empty; private CECController _controller;