public static Menu CreateMenu(IObservable <Optional <AbsoluteFilePath> > path) { var sublimeTextPath = ApplicationPaths.SublimeTextPath(); return(path .SelectPerElement(project => project.ContainingDirectory) .Select(dir => new [] { Menu.Item( name: "Open in Sublime", command: Command.Create( isEnabled: dir.HasValue && sublimeTextPath.HasValue, action: () => Task.Run(() => { if (Platform.OperatingSystem == OS.Mac) { ExternalApplication.FromAppBundle(sublimeTextPath.Value).Open(dir.Value); } else { var ps = new ProcessStartInfo() { FileName = (sublimeTextPath.Value / new FileName("sublime_text.exe")).NativePath, Arguments = "\"" + dir.Value.NativePath + "\"", UseShellExecute = false }; ps.UpdatePathEnvironment(); Process.Start(ps); } }))), }) .Concat()); }
public IUnoHostControl Create( AbsoluteFilePath assemblyPath, Command onFocused, Menu contextMenu, AbsoluteFilePath userDataPath, Action <IUnoHostControl> initialize, Action <OpenGlVersion> gotVersion, params string[] arguments) { var currentExeDir = typeof(Application).Assembly.GetCodeBaseFilePath().ContainingDirectory; var contentsDir = currentExeDir / ".." / ".." / ".."; var unoHostBundle = contentsDir / "UnoHost.app"; UnoHostProcess.Application = ExternalApplication.FromAppBundle(unoHostBundle); var unoHostExe = unoHostBundle / "Contents" / "MacOS" / new FileName("UnoHost"); UnoHostProcess.Application = ExternalApplication.FromNativeExe(unoHostExe); var dispatcher = Fusion.Application.MainThread; var messagesToHost = new Subject <IBinaryMessage>(); var unoHost = UnoHostProcess.Spawn(assemblyPath, messagesToHost, userDataPath, /*TODO*/ new List <string>()); var control = new UnoHostControlImplementation() { Disposables = Disposable.Combine(unoHost), Messages = unoHost.Messages, MessagesTo = messagesToHost, Process = unoHost.Process, }; control.Control = Fusion.Control.Create(self => { var view = UnoHostViewFactory.Create(unoHost.Messages, messagesToHost); self.BindNativeDefaults(view.View, dispatcher); view.Focus .Where(foc => foc == FocusState.Focused) .WithLatestFromBuffered(onFocused.Execute.ConnectWhile(self.IsRooted), (_, c) => c) .Subscribe(c => c()); unoHost.Messages .SelectMany(m => m.TryParse(Ready.MessageType, Ready.ReadDataFrom)) .Take(1) .Subscribe(_ => initialize(control)); unoHost.Messages .SelectSome(OpenGlVersionMessage.TryParse) .Subscribe(gotVersion); unoHost.Messages.Connect(); return(view.View); }).SetContextMenu(contextMenu); return(control); }
public static IFuse Initialize(string programName, List <string> args) { var systemId = SystemGuidLoader.LoadOrCreateOrEmpty(); var sessionId = Guid.NewGuid(); var report = ReportFactory.GetReporter(systemId, sessionId, programName); AppDomain.CurrentDomain.ReportUnhandledExceptions(report); report.Info("Initializing with arguments '" + args.Join(" ") + "'"); // Report running mono version Type type = Type.GetType("Mono.Runtime"); if (type != null) { MethodInfo displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static); if (displayName != null) { report.Info("Running with Mono " + displayName.Invoke(null, null)); } } EnsureSpecialFoldersExist(); var fuseExeOverride = args .TryParse("override-fuse-exe") .SelectMany(AbsoluteFilePath.TryParse); var rootDirSetByArgs = Optional.None <AbsoluteDirectoryPath>(); /*args * .FirstOrNone(a => a.StartsWith("fuse-root")) * .Select(a => a.Substring(a.IndexOf("=", StringComparison.InvariantCulture) + 1, a.Length - 1 - a.IndexOf("=", StringComparison.InvariantCulture))) * .Select(AbsoluteDirectoryPath.Parse);*/ var os = Platform.OperatingSystem; var fuseRoot = rootDirSetByArgs .Or(() => GetFuseRoot(os)) .OrThrow(new FuseRootDirectoryWasNotFound()); if (os != OS.Mac && os != OS.Windows) { throw new UnsupportedPlatformException(os); } var isMac = os == OS.Mac; var mono = isMac ? Optional.Some(FindMonoExe(fuseRoot)) : Optional.None(); var codeAssistanceService = new FileName("Fuse.CodeAssistanceService.exe"); var fuseExe = fuseExeOverride.Or(isMac ? fuseRoot / "MacOS" / new FileName("Fuse") : fuseRoot / new FileName("Fuse.exe")); var unoExe = FindUnoExe(fuseRoot); var impl = new FuseImpl { FuseRoot = fuseRoot, Version = SystemInfoFactory.GetBuildVersion(), UnoExe = unoExe, FuseExe = fuseExe, MonoExe = mono, Fuse = ExternalApplication.FromNativeExe(fuseExe), // Tools Designer = isMac ? ExternalApplication.FromAppBundle(fuseRoot / new FileName("Fuse Studio.app")) : ExternalApplication.FromNativeExe(fuseRoot / new FileName("Fuse Studio.exe")), // Services CodeAssistance = isMac ? ExternalApplication.FromMonoExe(fuseRoot / "MonoBundle" / codeAssistanceService, mono) : ExternalApplication.FromNativeExe(fuseRoot / codeAssistanceService), Tray = isMac ? ExternalApplication.FromNativeExe(fuseRoot / "Fuse Tray.app" / "Contents" / "MacOS" / new FileName("Fuse Tray")) : ExternalApplication.FromNativeExe(fuseRoot / new FileName("Fuse-Tray.exe")), LogServer = isMac ? ExternalApplication.FromNativeExe(fuseRoot / new FileName("fuse-logserver")) : null, // Uno Uno = isMac ? ExternalApplication.FromMonoExe(unoExe, mono) : ExternalApplication.FromNativeExe(unoExe), // System paths UserDataDir = isMac ? AbsoluteDirectoryPath.Parse(Environment.GetFolderPath(Environment.SpecialFolder.Personal)) / ".fuse" : AbsoluteDirectoryPath.Parse(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)) / "Fusetools" / "Fuse", ProjectsDir = AbsoluteDirectoryPath.Parse(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)) / "Fuse", SystemId = systemId, SessionId = sessionId, Report = report }; var partial = args.Remove("--partial") | args.Remove("-p"); if (!partial) { impl.CheckCompleteness(); } // Set assembly configuration for .unoconfig, to be able to find correct bin/$(Configuration) directories. #if DEBUG UnoConfigFile.Constants["Configuration"] = "Debug"; #else UnoConfigFile.Constants["Configuration"] = "Release"; #endif return(impl); }