Browse Source

More work on Gtk system.

pull/10/head
Steven Kirk 11 years ago
parent
commit
1bb713cc47
  1. 6
      Gtk/Perspex.Gtk/Perspex.Gtk.csproj
  2. 98
      Gtk/Perspex.Gtk/Window.cs
  3. 11
      Gtk/Perspex.Gtk/packages.config
  4. 23
      Perspex-Mono.userprefs
  5. 8
      Perspex.Base/Threading/MainLoop.cs

6
Gtk/Perspex.Gtk/Perspex.Gtk.csproj

@ -47,6 +47,12 @@
<Reference Include="System.Reactive.Core">
<HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.Linq">
<HintPath>..\..\packages\Rx-Linq.2.2.5\lib\net45\System.Reactive.Linq.dll</HintPath>
</Reference>
<Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
<Package>glib-sharp-2.0</Package>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />

98
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<IPlatformRenderInterface>();
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<Window>(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;
}
}
}

11
Gtk/Perspex.Gtk/packages.config

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Splat" version="1.5.1" targetFramework="net45" />
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="Splat" version="1.5.1" targetFramework="net45" />
</packages>

23
Perspex-Mono.userprefs

@ -1,27 +1,30 @@
<Properties>
<Properties GitUserInfo="UsingGIT">
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
<MonoDevelop.Ide.Workbench ActiveDocument="Gtk/Perspex.Gtk/Window.cs">
<MonoDevelop.Ide.Workbench ActiveDocument="Perspex.Base/Threading/MainLoop.cs">
<Files>
<File FileName="Gtk/Perspex.Gtk/GtkPlatform.cs" Line="17" Column="17" />
<File FileName="TestApplication/App.cs" Line="16" Column="16" />
<File FileName="Gtk/Perspex.Gtk/Window.cs" Line="9" Column="9" />
<File FileName="Windows/Perspex.Win32/Window.cs" Line="79" Column="79" />
<File FileName="Perspex.Base/Threading/MainLoop.cs" Line="18" Column="18" />
</Files>
<Pads>
<Pad Id="ProjectPad">
<State expanded="True">
<Node name="Gtk" expanded="True">
<Node name="Perspex.Gtk" expanded="True">
<Node name="References" selected="True" />
<Node name="Perspex.Base" expanded="True">
<Node name="Threading" expanded="True">
<Node name="MainLoop.cs" selected="True" />
</Node>
</Node>
<Node name="TestApplication-Mono" expanded="True" />
</State>
</Pad>
<Pad Id="MonoDevelop.Debugger.WatchPad">
<State />
</Pad>
</Pads>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.DebuggingService.Breakpoints>
<BreakpointStore />
<BreakpointStore>
<Breakpoint file="/home/steven/projects/Perspex/Gtk/Perspex.Gtk/Window.cs" line="56" column="1" />
<Breakpoint file="/home/steven/projects/Perspex/Perspex.Base/Threading/MainLoop.cs" line="60" column="1" />
</BreakpointStore>
</MonoDevelop.Ide.DebuggingService.Breakpoints>
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
</Properties>

8
Perspex.Base/Threading/MainLoop.cs

@ -1,5 +1,5 @@
// -----------------------------------------------------------------------
// <copyright file="Application.cs" company="Steven Kirk">
// <copyright file="MainLoop.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
@ -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);
}

Loading…
Cancel
Save