internal void Initialize(IServiceProvider services, RootComponentList rootComponents) { Services = services; MainWindow = new PhotinoWindow() .SetTitle("Photino.Blazor App") .SetUseOsDefaultLocation(false) .SetWidth(1000) .SetHeight(900) .SetLeft(450) .SetTop(100); MainWindow.RegisterCustomSchemeHandler(PhotinoWebViewManager.BlazorAppScheme, HandleWebRequest); // We assume the host page is always in the root of the content directory, because it's // unclear there's any other use case. We can add more options later if so. string hostPage = "index.html"; var contentRootDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot"); var fileProvider = new PhysicalFileProvider(contentRootDir); var dispatcher = new PhotinoDispatcher(MainWindow); var jsComponents = new JSComponentConfigurationStore(); WindowManager = new PhotinoWebViewManager(MainWindow, services, dispatcher, new Uri(PhotinoWebViewManager.AppBaseUri), fileProvider, jsComponents, hostPage); RootComponents = new BlazorWindowRootComponents(WindowManager, jsComponents); foreach (var component in rootComponents) { RootComponents.Add(component.Item1, component.Item2); } }
private static void PropertyInitStyle() { var iconFile = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "wwwroot/photino-logo.ico" : "wwwroot/photino-logo.png"; mainWindow = new PhotinoWindow { IconFile = iconFile, Title = $"My Photino Window {_windowNumber++}", //StartUrl = "https://google.com", StartUrl = "wwwroot/main.html", //StartString = "<h1>Hello Photino!</h1>", //Centered = true, //Chromeless = true, //FullScreen = true, //Maximized = true, //Minimized = true, //Resizable = false, //TopMost = true, //UseOsDefaultLocation = false, //UseOsDefaultSize = false, //Zoom = 300, //ContextMenuEnabled = false, //DevToolsEnabled = false, //GrantBrowserPermissions = false, //CenterOnInitialize = true, //Size = new Size(800, 600), //Height = 600, //Width = 800, //Location = new Point(50, 50), //Top = 50, //Left = 50, WindowCreatingHandler = WindowCreating, WindowCreatedHandler = WindowCreated, WindowLocationChangedHandler = WindowLocationChanged, WindowSizeChangedHandler = WindowSizeChanged, WebMessageReceivedHandler = MessageReceivedFromWindow, WindowClosingHandler = WindowIsClosing, //TemporaryFilesPath = @"C:\Temp", LogVerbosity = _logEvents ? 2 : 0, }; //Can this be done with a property? mainWindow.RegisterCustomSchemeHandler("app", AppCustomSchemeUsed); mainWindow.WaitForClose(); Console.WriteLine("Done Blocking!"); }
static void Main(string[] args) { FileDialogs.Init(); var serverStream = new SimplexStream(); var clientStream = new SimplexStream(); var encoding = new UTF8Encoding(false); var writer = new StreamWriter(serverStream, encoding); var formatter = new JsonMessageFormatter(encoding); Serializer.PrepareSerializer(formatter.JsonSerializer); var messageHandler = new NewLineDelimitedMessageHandler(clientStream, serverStream, formatter); var server = new FullServer(messageHandler); server.Workspace.SettingsService.RegisterSetting(DisplaySettingsNames.Theme, typeof(string), "xp/98.css"); server.Agent.IsReady += (o, e) => { if (args.Length == 1) { var _ = server.Workspace.ExecuteCommand("File.Open", args[0]); } }; // try to load settings string[] settingsLines = Array.Empty <string>(); var settingsFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".bcadconfig"); try { settingsLines = File.ReadAllLines(settingsFilePath); server.Workspace.SettingsService.LoadFromLines(settingsLines); server.Workspace.Update(isDirty: false); } catch { // don't really care if it failed } #if DEBUG var allowDebugging = true; var logVerbosity = 1; var clientArguments = new[] { "--", "debug" }; #else var allowDebugging = false; var logVerbosity = 0; var clientArguments = new[] { "--" }; #endif var window = new PhotinoWindow() .SetUseOsDefaultSize(true) .SetContextMenuEnabled(false) .Center() .SetDevToolsEnabled(allowDebugging) .SetResizable(true) .SetLogVerbosity(logVerbosity) .RegisterWebMessageReceivedHandler((object sender, string message) => { try { // forward JSON from client to server writer.WriteLine(message); writer.Flush(); } catch { // don't let this die } }); SetTitle(window, server.Workspace); window.RegisterCustomSchemeHandler("app", (object sender, string scheme, string url, out string contentType) => { contentType = "text/javascript"; var script = $"var clientArguments = [{string.Join(", ", clientArguments.Select(arg => $"\"{arg}\""))}];"; return(new MemoryStream(Encoding.UTF8.GetBytes(script))); }); var fileSystemService = new FileSystemService(action => { window.Invoke(action); }); server.Workspace.RegisterService(fileSystemService); server.Workspace.WorkspaceChanged += (sender, args) => SetTitle(window, server.Workspace); var doHardClose = false; window.WindowClosing += (sender, args) => { if (doHardClose) { // close immediately return(false); } if (server.Workspace.IsDirty) { var _ = Task.Run(async() => { var result = await server.Workspace.PromptForUnsavedChanges(); if (result != UnsavedChangesResult.Cancel) { doHardClose = true; window.Close(); } }); // don't close yet return(true); } return(false); }; var _ = Task.Run(async() => { var reader = new StreamReader(clientStream, encoding); while (true) { try { var line = await reader.ReadLineAsync(); window.SendWebMessage(line); } catch { // don't let this die } } }); server.Start(); var indexPath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "index.html"); window.Load(indexPath); window.WaitForClose(); // try to save settings try { var newSettingsContents = server.Workspace.SettingsService.WriteWithLines(settingsLines); File.WriteAllText(settingsFilePath, newSettingsContents); } catch { // don't really care if it failed } }