public void Initialize(IList <string> args, bool isDocumentApp) { Console.CancelKeyPress += (sender, e) => Exit(0); NSApplication.Init(); _dispatcher = _dispatcher ?? new Dispatcher(Thread.CurrentThread); Fusion.Application.MainThread = _dispatcher; Fusion.Application.PerFrame = Observable.Interval( TimeSpan.FromSeconds(1.0 / 60.0), new SynchronizationContextScheduler(SynchronizationContext.Current)); var app = new AppDelegate(isDocumentApp); NSApplication.SharedApplication.Delegate = app; //TODO do we really need to retain this object? #pragma warning disable 0219 var documentController = new NSDocumentController(); #pragma warning restore 0219 NSApplication.CheckForIllegalCrossThreadCalls = false; AppDelegate.ThrowOnTerminate = false; Desktop = new MacDialog <object>(); EffectsImplementation.Initialize(_dispatcher); // Make so that the window popups with focus. NSApplication.SharedApplication.ActivateIgnoringOtherApps(true); MacEnvironment.Initialize(new MacEnvironmentImpl()); DraggingImplementation.Initialize(_dispatcher); MenuBuilder.Initialize(_dispatcher); LayeringImplementation.Initialize(_dispatcher); LabelImplementation.Initialize(_dispatcher); SliderImplementation.Initialize(_dispatcher); LineImplementation.Initialize(_dispatcher); CircleImplementation.Initialize(_dispatcher); RectangleImplementation.Initialize(_dispatcher); TextBoxImplementation.Initialize(_dispatcher); CursorsImplementation.Initialize(_dispatcher); ToolTipImplementation.Initialize(_dispatcher); ContextMenuImplementation.Initialize(_dispatcher); DropDownImplementation.Initialize(_dispatcher); ButtonImplementation.Initialize(_dispatcher); ColorPickerImplementation.Initialize(_dispatcher); ScrollingImplementation.Initialize(_dispatcher); LogViewImplementation.Initialize(_dispatcher); Transformation.Initialize(); ImageImplementation.Initialize(_dispatcher); OverlayImplementation.Initialize(_dispatcher); PointerImplementation.Initialize(_dispatcher); KeyboardImplementation.Initialize(_dispatcher); WebViewImplementation.Initialize(_dispatcher); LayoutTrackerImplementation.Initialize(); FileDialogs.Initialize(); // TODO: Fix this!!! Clipping.Initialize((control, clip) => control); // This notification occurs a _lot_, but is the most specific one I was able to find that would // allow us to be notified when the first responder changes consistently NSNotificationCenter.DefaultCenter.AddObserver(new NSString("NSApplicationDidUpdateNotification"), _ => { var keyWindow = NSApplication.SharedApplication.KeyWindow; _firstResponder.OnNext(keyWindow != null ? keyWindow.FirstResponder : null); }); app.Terminates.Subscribe(_ => { if (Terminating != null) { Terminating(); } }); EditMenu = /*CreateFirstResponderMenuItem(name: "Undo", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.Z), selectorName: "undo:") + CreateFirstResponderMenuItem(name: "Redo", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta | Fusion.ModifierKeys.Shift, Key.Z), selectorName: "redo:") + MenuItem.CreateSeparator() + */CreateFirstResponderMenuItem(name: "Cut", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.X), selectorName: "cut:") + CreateFirstResponderMenuItem(name: "Copy", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.C), selectorName: "copy:") + CreateFirstResponderMenuItem(name: "Paste", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.V), selectorName: "paste:") + CreateFirstResponderMenuItem(name: "Paste and Match Style", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta | Fusion.ModifierKeys.Shift, Key.V), selectorName: "pasteAsPlainText:") + CreateFirstResponderMenuItem(name: "Delete", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.Backspace), selectorName: "delete:") + CreateFirstResponderMenuItem(name: "Select All", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.A), selectorName: "selectAll:"); }
public static void Initialize(Dispatcher dispatcher) { Layout.Implementation.LayerControls = (childFactory) => Control.Create( ctrl => { var element = new Canvas(); ctrl.BindNativeDefaults(element, dispatcher); childFactory(ctrl) // IMPORTANT: ConnectWhile has to be done first since else we'll lose all changes done to the children list while the ctrl is unrooted. // which breaks diffing, and we get dangling views (views that aren't removed). .ConnectWhile(ctrl.IsRooted) .DiffSequence() .ObserveOn(Fusion.Application.MainThread) .Subscribe(children => { foreach (var child in children.Removed) { var nativeChild = child.NativeHandle as FrameworkElement; if (nativeChild != null) { element.Children.Remove(nativeChild); } child.Mount(MountLocation.Unmounted); } foreach (var child in children.Added) { child.Mount(new MountLocation.Mutable { IsRooted = ctrl.IsRooted, AvailableSize = ctrl.AvailableSize, NativeFrame = ObservableMath.RectangleWithSize(ctrl.NativeFrame.Size), }); var nativeChild = child.NativeHandle as FrameworkElement; if (nativeChild == null) { continue; } var parent = nativeChild.Parent as Canvas; if (parent != null) { parent.Children.Remove(nativeChild); } element.Children.Add(nativeChild); } }); return(element); }); Clipping.Initialize( (content, clipToBounds) => { var container = Layout.Layer(content); Fusion.Application.MainThread.Schedule(() => { var elm = (FrameworkElement)container.NativeHandle; elm.ClipToBounds = clipToBounds; }); return(container.WithSize(content.DesiredSize)); }); }