OSDN Git Service

Work around some mono issues, lock on exit, and crash on reconnect.
authorLatif Khalifa <latifer@streamgrid.net>
Tue, 27 Oct 2009 06:35:20 +0000 (06:35 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Tue, 27 Oct 2009 06:35:20 +0000 (06:35 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@379 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Consoles/MapConsole.cs
Radegast/GUI/Consoles/TabsConsole.cs
Radegast/GUI/Dialogs/MainForm.cs

index 0b151dd..daf8f70 100644 (file)
@@ -56,6 +56,8 @@ namespace Radegast
             Disposed += new EventHandler(frmMap_Disposed);\r
 \r
             instance = i;\r
+            instance.ClientChanged += new EventHandler<ClientChangedEventArgs>(instance_ClientChanged);\r
+\r
             try\r
             {\r
                 map = new WebBrowser();\r
@@ -80,19 +82,36 @@ namespace Radegast
             }\r
 \r
             // Register callbacks\r
+            RegisterClientEvents(client);\r
+        }\r
+\r
+        private void RegisterClientEvents(GridClient client)\r
+        {\r
             client.Grid.GridRegion += new EventHandler<GridRegionEventArgs>(Grid_GridRegion);\r
             client.Self.TeleportProgress += new EventHandler<TeleportEventArgs>(Self_TeleportProgress);\r
             client.Network.OnCurrentSimChanged += new NetworkManager.CurrentSimChangedCallback(Network_OnCurrentSimChanged);\r
         }\r
 \r
-        void frmMap_Disposed(object sender, EventArgs e)\r
+        private void UnregisterClientEvents(GridClient client)\r
         {\r
-            // Unregister callbacks\r
             client.Grid.GridRegion -= new EventHandler<GridRegionEventArgs>(Grid_GridRegion);\r
             client.Self.TeleportProgress -= new EventHandler<TeleportEventArgs>(Self_TeleportProgress);\r
             client.Network.OnCurrentSimChanged -= new NetworkManager.CurrentSimChangedCallback(Network_OnCurrentSimChanged);\r
+        }\r
+\r
+        void instance_ClientChanged(object sender, ClientChangedEventArgs e)\r
+        {\r
+            UnregisterClientEvents(e.OldClient);\r
+            RegisterClientEvents(client);\r
+        }\r
+\r
+\r
+        void frmMap_Disposed(object sender, EventArgs e)\r
+        {\r
+            // Unregister callbacks\r
+            UnregisterClientEvents(client);\r
 \r
-            if (map != null)\r
+            if (map != null && !instance.MonoRuntime)\r
             {\r
                 map.Dispose();\r
                 map = null;\r
index 0f380a1..b8d41d1 100644 (file)
@@ -439,10 +439,13 @@ namespace Radegast
             tab.AllowDetach = true;\r
             tab.Visible = false;\r
 \r
-            tab = AddTab("map", "Map", new MapConsole(instance));\r
-            tab.AllowClose = false;\r
-            tab.AllowDetach = true;\r
-            tab.Visible = false;\r
+            if (!TabExists("map"))\r
+            {\r
+                tab = AddTab("map", "Map", new MapConsole(instance));\r
+                tab.AllowClose = false;\r
+                tab.AllowDetach = true;\r
+                tab.Visible = false;\r
+            }\r
 \r
         }\r
 \r
@@ -451,7 +454,12 @@ namespace Radegast
         /// </summary>\r
         private void DisposeOnlineTabs()\r
         {\r
-            ForceCloseTab("map");\r
+            // Mono crashes if we try to open map for the second time\r
+            if (!instance.MonoRuntime)\r
+                ForceCloseTab("map");\r
+            else\r
+                tabs["map"].Hide();\r
+\r
             ForceCloseTab("search");\r
             ForceCloseTab("inventory");\r
             ForceCloseTab("groups");\r
index 03e3817..cdd27e2 100644 (file)
@@ -315,6 +315,13 @@ namespace Radegast
 \r
         private void frmMain_FormClosing(object sender, FormClosingEventArgs e)\r
         {\r
+            if (statusTimer != null)\r
+            {\r
+                statusTimer.Stop();\r
+                statusTimer.Dispose();\r
+                statusTimer = null;\r
+            }\r
+\r
             if (mediaConsole != null)\r
             {\r
                 if (tabsConsole.TabExists("media"))\r
@@ -465,8 +472,13 @@ namespace Radegast
 \r
         private void statusTimer_Elapsed(object sender, ElapsedEventArgs e)\r
         {\r
-            RefreshWindowTitle();\r
-            RefreshStatusBar();\r
+            // Mono sometimes fires timer after is's disposed\r
+            try\r
+            {\r
+                RefreshWindowTitle();\r
+                RefreshStatusBar();\r
+            }\r
+            catch { }\r
         }\r
         #endregion\r
 \r