still locking up when disposing, because the log callback is trying to write to the...
[deb_libcec.git] / src / LibCecTray / ui / CECTray.cs
index 1b2897b1b4822bd5778037fc8b50582d3102ad03..021eaa38e55d5d18c2bd89cdabc6036bc8ef6e90 100644 (file)
@@ -41,6 +41,7 @@ using LibCECTray.settings;
 using Microsoft.Win32;
 using System.Security.Permissions;
 using System.Runtime.InteropServices;
+using System.Threading;
 
 namespace LibCECTray.ui
 {
@@ -57,6 +58,21 @@ namespace LibCECTray.ui
     XBMC
   }
 
+  class AsyncDisconnect
+  {
+    public AsyncDisconnect(CECController controller)
+    {
+      _controller = controller;
+    }
+
+    public void Process()
+    {
+      _controller.Close();
+    }
+
+    private CECController _controller;
+  }
+
   /// <summary>
   /// Main LibCecTray GUI
   /// </summary>
@@ -79,6 +95,7 @@ namespace LibCECTray.ui
 
     public void OnSessionEnding(object sender, SessionEndingEventArgs e)
     {
+      Controller.CECActions.SuppressUpdates = true;
       Controller.Close();
     }
 
@@ -128,8 +145,9 @@ namespace LibCECTray.ui
                 switch (pwr.Data)
                 {
                   case 0:
-                    OnWake();
-                    return;
+                    // do _not_ wake the pc when away mode is deactivated
+                    //OnWake();
+                    //return;
                   case 1:
                     OnSleep();
                     return;
@@ -174,7 +192,9 @@ namespace LibCECTray.ui
       Hide();
       if (disposing)
       {
-        Controller.Close();
+        Controller.CECActions.SuppressUpdates = true;
+        AsyncDisconnect dc = new AsyncDisconnect(Controller);
+        (new Thread(dc.Process)).Start();
       }
       if (disposing && (components != null))
       {