Browse Source

More work on Gtk system.

pull/10/head
Steven Kirk 12 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"> <Reference Include="System.Reactive.Core">
<HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath> <HintPath>..\..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath>
</Reference> </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>
<ItemGroup> <ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />

98
Gtk/Perspex.Gtk/Window.cs

@ -6,10 +6,16 @@
namespace Perspex.Gtk namespace Perspex.Gtk
{ {
using System;
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Controls.Presenters;
using Perspex.Input; using Perspex.Input;
using Perspex.Layout;
using Perspex.Rendering; using Perspex.Rendering;
using Perspex.Layout; using Perspex.Platform;
using Perspex.Controls; using Perspex.Threading;
using Splat;
using Gtk = global::Gtk; using Gtk = global::Gtk;
public class Window : ContentControl, ILayoutRoot, IRenderRoot, ICloseable public class Window : ContentControl, ILayoutRoot, IRenderRoot, ICloseable
@ -19,27 +25,84 @@ namespace Perspex.Gtk
private Gtk.Window inner; private Gtk.Window inner;
private Dispatcher dispatcher;
private IRenderer renderer;
public Window () 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.SetDefaultSize(1400, 800);
inner.SetPosition(Gtk.WindowPosition.Center); 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 event System.EventHandler Closed;
public Size ClientSize 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 { public ILayoutManager LayoutManager
get { throw new System.NotImplementedException (); } {
get;
private set;
} }
public IRenderManager RenderManager { public IRenderManager RenderManager
get { throw new System.NotImplementedException (); } {
get;
private set;
} }
public string Title public string Title
@ -52,5 +115,18 @@ namespace Perspex.Gtk
{ {
this.inner.Show(); 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"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" /> <package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" 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" /> <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="Splat" version="1.5.1" targetFramework="net45" />
</packages> </packages>

23
Perspex-Mono.userprefs

@ -1,27 +1,30 @@
<Properties> <Properties GitUserInfo="UsingGIT">
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" /> <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
<MonoDevelop.Ide.Workbench ActiveDocument="Gtk/Perspex.Gtk/Window.cs"> <MonoDevelop.Ide.Workbench ActiveDocument="Perspex.Base/Threading/MainLoop.cs">
<Files> <Files>
<File FileName="Gtk/Perspex.Gtk/GtkPlatform.cs" Line="17" Column="17" /> <File FileName="Perspex.Base/Threading/MainLoop.cs" Line="18" Column="18" />
<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" />
</Files> </Files>
<Pads> <Pads>
<Pad Id="ProjectPad"> <Pad Id="ProjectPad">
<State expanded="True"> <State expanded="True">
<Node name="Gtk" expanded="True"> <Node name="Perspex.Base" expanded="True">
<Node name="Perspex.Gtk" expanded="True"> <Node name="Threading" expanded="True">
<Node name="References" selected="True" /> <Node name="MainLoop.cs" selected="True" />
</Node> </Node>
</Node> </Node>
<Node name="TestApplication-Mono" expanded="True" /> <Node name="TestApplication-Mono" expanded="True" />
</State> </State>
</Pad> </Pad>
<Pad Id="MonoDevelop.Debugger.WatchPad">
<State />
</Pad>
</Pads> </Pads>
</MonoDevelop.Ide.Workbench> </MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.DebuggingService.Breakpoints> <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.Breakpoints>
<MonoDevelop.Ide.DebuggingService.PinnedWatches /> <MonoDevelop.Ide.DebuggingService.PinnedWatches />
</Properties> </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 2014 MIT Licence. See licence.md for more information.
// </copyright> // </copyright>
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@ -33,11 +33,11 @@ namespace Perspex.Win32.Threading
Job job; Job job;
// TODO: Dispatch windows messages in preference to lower priority jobs. // TODO: Dispatch windows messages in preference to lower priority jobs.
while (queue.Count > 0) while (this.queue.Count > 0)
{ {
lock (this.queue) lock (this.queue)
{ {
job = queue.Dequeue(); job = this.queue.Dequeue();
} }
try try
@ -59,7 +59,7 @@ namespace Perspex.Win32.Threading
{ {
var job = new Job(action); var job = new Job(action);
lock (queue) lock (this.queue)
{ {
this.queue.Add(job, priority); this.queue.Add(job, priority);
} }

Loading…
Cancel
Save