From 1bb713cc477388b910b4b2d7ba465c3b23f29141 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 2 Dec 2014 10:03:42 +0100 Subject: [PATCH] More work on Gtk system. --- Gtk/Perspex.Gtk/Perspex.Gtk.csproj | 6 ++ Gtk/Perspex.Gtk/Window.cs | 98 ++++++++++++++++++++++++++---- Gtk/Perspex.Gtk/packages.config | 11 ++-- Perspex-Mono.userprefs | 23 ++++--- Perspex.Base/Threading/MainLoop.cs | 8 +-- 5 files changed, 116 insertions(+), 30 deletions(-) diff --git a/Gtk/Perspex.Gtk/Perspex.Gtk.csproj b/Gtk/Perspex.Gtk/Perspex.Gtk.csproj index f197f478e1..6f662d64e7 100644 --- a/Gtk/Perspex.Gtk/Perspex.Gtk.csproj +++ b/Gtk/Perspex.Gtk/Perspex.Gtk.csproj @@ -47,6 +47,12 @@ ..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll + + ..\..\packages\Rx-Linq.2.2.5\lib\net45\System.Reactive.Linq.dll + + + glib-sharp-2.0 + diff --git a/Gtk/Perspex.Gtk/Window.cs b/Gtk/Perspex.Gtk/Window.cs index 1449eb4239..67111d34f6 100644 --- a/Gtk/Perspex.Gtk/Window.cs +++ b/Gtk/Perspex.Gtk/Window.cs @@ -6,10 +6,16 @@ namespace Perspex.Gtk { + using System; + using System.Reactive.Linq; + using Perspex.Controls; + using Perspex.Controls.Presenters; using Perspex.Input; + using Perspex.Layout; using Perspex.Rendering; - using Perspex.Layout; - using Perspex.Controls; + using Perspex.Platform; + using Perspex.Threading; + using Splat; using Gtk = global::Gtk; public class Window : ContentControl, ILayoutRoot, IRenderRoot, ICloseable @@ -19,27 +25,84 @@ namespace Perspex.Gtk private Gtk.Window inner; + private Dispatcher dispatcher; + + private IRenderer renderer; + public Window () { - this.inner = new Gtk.Window(Gtk.WindowType.Toplevel); + IPlatformRenderInterface factory = Locator.Current.GetService(); + + this.inner = new Gtk.Window(Gtk.WindowType.Toplevel); inner.SetDefaultSize(1400, 800); inner.SetPosition(Gtk.WindowPosition.Center); - inner.DeleteEvent += delegate { Gtk.Application.Quit(); }; - } + + inner.DeleteEvent += (o, a) => + { + if (this.Closed != null) + { + this.Closed(this, EventArgs.Empty); + } + }; + + var clientSize = this.ClientSize; + this.renderer = factory.CreateRenderer(this.inner.Handle, (int)clientSize.Width, (int)clientSize.Height); + this.LayoutManager = new LayoutManager(this); + this.RenderManager = new RenderManager(); + this.Template = ControlTemplate.Create(this.DefaultTemplate); + + this.LayoutManager.LayoutNeeded.Subscribe(x => + { + this.dispatcher.InvokeAsync( + () => + { + this.LayoutManager.ExecuteLayoutPass(); + this.renderer.Render(this); + this.RenderManager.RenderFinished(); + }, + DispatcherPriority.Render); + }); + + this.RenderManager.RenderNeeded + .Where(_ => !this.LayoutManager.LayoutQueued) + .Subscribe(x => + { + this.dispatcher.InvokeAsync( + () => + { + if (!this.LayoutManager.LayoutQueued) + { + this.renderer.Render(this); + this.RenderManager.RenderFinished(); + } + }, + DispatcherPriority.Render); + }); + } public event System.EventHandler Closed; public Size ClientSize { - get { throw new System.NotImplementedException (); } + get + { + int width; + int height; + this.inner.GetSize(out width, out height); + return new Size(width, height); + } } - public ILayoutManager LayoutManager { - get { throw new System.NotImplementedException (); } + public ILayoutManager LayoutManager + { + get; + private set; } - public IRenderManager RenderManager { - get { throw new System.NotImplementedException (); } + public IRenderManager RenderManager + { + get; + private set; } public string Title @@ -52,5 +115,18 @@ namespace Perspex.Gtk { this.inner.Show(); } - } + + private Control DefaultTemplate(Window c) + { + Border border = new Border(); + border.Background = new Perspex.Media.SolidColorBrush(0xffffffff); + ContentPresenter contentPresenter = new ContentPresenter(); + contentPresenter.Bind( + ContentPresenter.ContentProperty, + this.GetObservable(Window.ContentProperty), + BindingPriority.Style); + border.Content = contentPresenter; + return border; + } + } } \ No newline at end of file diff --git a/Gtk/Perspex.Gtk/packages.config b/Gtk/Perspex.Gtk/packages.config index 0ab7b56b8d..91b939ae19 100644 --- a/Gtk/Perspex.Gtk/packages.config +++ b/Gtk/Perspex.Gtk/packages.config @@ -1,6 +1,7 @@ - - - - - + + + + + + \ No newline at end of file diff --git a/Perspex-Mono.userprefs b/Perspex-Mono.userprefs index d5dd52b18f..64d6d04a1c 100644 --- a/Perspex-Mono.userprefs +++ b/Perspex-Mono.userprefs @@ -1,27 +1,30 @@ - + - + - - - - + - - - + + + + + + - + + + + \ No newline at end of file diff --git a/Perspex.Base/Threading/MainLoop.cs b/Perspex.Base/Threading/MainLoop.cs index 0e1fe67ef2..88afba36a6 100644 --- a/Perspex.Base/Threading/MainLoop.cs +++ b/Perspex.Base/Threading/MainLoop.cs @@ -1,5 +1,5 @@ // ----------------------------------------------------------------------- -// +// // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- @@ -33,11 +33,11 @@ namespace Perspex.Win32.Threading Job job; // TODO: Dispatch windows messages in preference to lower priority jobs. - while (queue.Count > 0) + while (this.queue.Count > 0) { lock (this.queue) { - job = queue.Dequeue(); + job = this.queue.Dequeue(); } try @@ -59,7 +59,7 @@ namespace Perspex.Win32.Threading { var job = new Job(action); - lock (queue) + lock (this.queue) { this.queue.Add(job, priority); }