void IDisposable.Dispose () { Destroy (); splashScreen = null; }
int Run (MonoDevelopOptions options) { Counters.Initialization.BeginTiming (); if (options.PerfLog) { string logFile = Path.Combine (Environment.CurrentDirectory, "monodevelop.perf-log"); LoggingService.LogInfo ("Logging instrumentation service data to file: " + logFile); InstrumentationService.StartAutoSave (logFile, 1000); } //ensure native libs initialized before we hit anything that p/invokes Platform.Initialize (); Counters.Initialization.Trace ("Initializing GTK"); if (Platform.IsWindows) { CheckWindowsGtk (); } SetupExceptionManager (); try { MonoDevelop.Ide.Gui.GLibLogging.Enabled = true; } catch (Exception ex) { LoggingService.LogError ("Error initialising GLib logging.", ex); } SetupTheme (); var args = options.RemainingArgs.ToArray (); Gtk.Application.Init (BrandingService.ApplicationName, ref args); FilePath p = typeof(IdeStartup).Assembly.Location; Assembly.LoadFrom (p.ParentDirectory.Combine ("Xwt.Gtk.dll")); Xwt.Application.Initialize (Xwt.ToolkitType.Gtk); Xwt.Engine.Toolkit.ExitUserCode (null); //default to Windows IME on Windows if (Platform.IsWindows && Mono.TextEditor.GtkWorkarounds.GtkMinorVersion >= 16) { var settings = Gtk.Settings.Default; var val = Mono.TextEditor.GtkWorkarounds.GetProperty (settings, "gtk-im-module"); if (string.IsNullOrEmpty (val.Val as string)) Mono.TextEditor.GtkWorkarounds.SetProperty (settings, "gtk-im-module", new GLib.Value ("ime")); } InternalLog.Initialize (); string socket_filename = null; EndPoint ep = null; DispatchService.Initialize (); // Set a synchronization context for the main gtk thread SynchronizationContext.SetSynchronizationContext (new GtkSynchronizationContext ()); AddinManager.AddinLoadError += OnAddinError; var startupInfo = new StartupInfo (args); // If a combine was specified, force --newwindow. if (!options.NewWindow && startupInfo.HasFiles) { Counters.Initialization.Trace ("Pre-Initializing Runtime to load files in existing window"); Runtime.Initialize (true); foreach (var file in startupInfo.RequestedFileList) { if (MonoDevelop.Projects.Services.ProjectService.IsWorkspaceItemFile (file.FileName)) { options.NewWindow = true; break; } } } Counters.Initialization.Trace ("Initializing Runtime"); Runtime.Initialize (true); Counters.Initialization.Trace ("Initializing theme and splash window"); DefaultTheme = Gtk.Settings.Default.ThemeName; if (!string.IsNullOrEmpty (IdeApp.Preferences.UserInterfaceTheme)) { string theme; if (!ValidateGtkTheme (IdeApp.Preferences.UserInterfaceTheme, out theme)) return 1; Gtk.Settings.Default.ThemeName = theme; } //don't show the splash screen on the Mac, so instead we get the expected "Dock bounce" effect //this also enables the Mac platform service to subscribe to open document events before the GUI loop starts. if (Platform.IsMac) options.NoSplash = true; IProgressMonitor monitor = null; if (!options.NoSplash) { try { monitor = new SplashScreenForm (); ((SplashScreenForm)monitor).ShowAll (); } catch (Exception ex) { LoggingService.LogError ("Failed to create splash screen", ex); } } if (monitor == null) { monitor = new MonoDevelop.Core.ProgressMonitoring.ConsoleProgressMonitor (); } monitor.BeginTask (GettextCatalog.GetString ("Starting {0}", BrandingService.ApplicationName), 2); //make sure that the platform service is initialised so that the Mac platform can subscribe to open-document events Counters.Initialization.Trace ("Initializing Platform Service"); DesktopService.Initialize (); monitor.Step (1); if (options.IpcTcp) { listen_socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); ep = new IPEndPoint (IPAddress.Loopback, ipcBasePort + HashSdbmBounded (Environment.UserName)); } else { socket_filename = "/tmp/md-" + Environment.GetEnvironmentVariable ("USER") + "-socket"; listen_socket = new Socket (AddressFamily.Unix, SocketType.Stream, ProtocolType.IP); ep = new UnixEndPoint (socket_filename); } // If not opening a combine, connect to existing monodevelop and pass filename(s) and exit if (!options.NewWindow && startupInfo.HasFiles) { try { StringBuilder builder = new StringBuilder (); foreach (var file in startupInfo.RequestedFileList) { builder.AppendFormat ("{0};{1};{2}\n", file.FileName, file.Line, file.Column); } listen_socket.Connect (ep); listen_socket.Send (Encoding.UTF8.GetBytes (builder.ToString ())); return 0; } catch { // Reset the socket if (null != socket_filename && File.Exists (socket_filename)) File.Delete (socket_filename); } } Counters.Initialization.Trace ("Checking System"); string version = Assembly.GetEntryAssembly ().GetName ().Version.Major + "." + Assembly.GetEntryAssembly ().GetName ().Version.Minor; if (Assembly.GetEntryAssembly ().GetName ().Version.Build != 0) version += "." + Assembly.GetEntryAssembly ().GetName ().Version.Build; if (Assembly.GetEntryAssembly ().GetName ().Version.Revision != 0) version += "." + Assembly.GetEntryAssembly ().GetName ().Version.Revision; CheckFileWatcher (); Exception error = null; int reportedFailures = 0; try { Counters.Initialization.Trace ("Loading Icons"); //force initialisation before the workbench so that it can register stock icons for GTK before they get requested ImageService.Initialize (); if (errorsList.Count > 0) { if (monitor is SplashScreenForm) ((SplashScreenForm)monitor).Hide (); AddinLoadErrorDialog dlg = new AddinLoadErrorDialog ((AddinError[]) errorsList.ToArray (typeof(AddinError)), false); if (!dlg.Run ()) return 1; if (monitor is SplashScreenForm) ((SplashScreenForm)monitor).Show (); reportedFailures = errorsList.Count; } // no alternative for Application.ThreadException? // Application.ThreadException += new ThreadExceptionEventHandler(ShowErrorBox); Counters.Initialization.Trace ("Initializing IdeApp"); IdeApp.Initialize (monitor); // Load requested files Counters.Initialization.Trace ("Opening Files"); IdeApp.OpenFiles (startupInfo.RequestedFileList); monitor.Step (1); } catch (Exception e) { error = e; } finally { monitor.Dispose (); } if (error != null) { LoggingService.LogFatalError (null, error); MessageService.ShowException (error, BrandingService.BrandApplicationName (GettextCatalog.GetString ("MonoDevelop failed to start. The following error has been reported: ") + error.Message)); return 1; } if (errorsList.Count > reportedFailures) { AddinLoadErrorDialog dlg = new AddinLoadErrorDialog ((AddinError[]) errorsList.ToArray (typeof(AddinError)), true); dlg.Run (); } errorsList = null; // FIXME: we should probably track the last 'selected' one // and do this more cleanly try { listen_socket.Bind (ep); listen_socket.Listen (5); listen_socket.BeginAccept (new AsyncCallback (ListenCallback), listen_socket); } catch { // Socket already in use } initialized = true; MessageService.RootWindow = IdeApp.Workbench.RootWindow; Thread.CurrentThread.Name = "GUI Thread"; Counters.Initialization.Trace ("Running IdeApp"); Counters.Initialization.EndTiming (); AddinManager.AddExtensionNodeHandler("/MonoDevelop/Ide/InitCompleteHandlers", OnExtensionChanged); IdeApp.Run (); // unloading services if (null != socket_filename) File.Delete (socket_filename); Runtime.Shutdown (); InstrumentationService.Stop (); return 0; }
void IDisposable.Dispose() { Destroy(); splashScreen = null; }