<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1497451738703327403</id><updated>2011-11-19T07:31:09.595-06:00</updated><title type='text'>According to Mike</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-755265412949157797</id><published>2011-06-29T11:00:00.002-06:00</published><updated>2011-06-29T11:39:54.415-06:00</updated><title type='text'>Decisions Decisions</title><content type='html'>Parted ways with Xamarin today.  Reflecting on my time at Ximian and then Novell, I've enjoyed working closely, day-to-day, with the professionals on the Mono team, as well as our talented volunteer community.  It's been a real treat for the past 8 years.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I believe in Mono and Gtk# and still think they're the best thing going on Linux and the Open Source universe.  Looking at the amazing applications that have been written for the desktop using technologies I've helped to create, and the way we've managed to extend Mono's reach to mobile devices, I'm proud of what we've accomplished.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nothing definite yet for where I go from here.  I'm interested in serious opportunities for a skilled developer with expertise spanning the unmanaged C, Java, and Mono/.NET universes on Windows, Linux, OSX, Android, and iOS.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-755265412949157797?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/755265412949157797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=755265412949157797' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/755265412949157797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/755265412949157797'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2011/06/decisions-decisions.html' title='Decisions Decisions'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-413087789285365715</id><published>2011-02-15T21:39:00.002-06:00</published><updated>2011-02-15T21:58:14.466-06:00</updated><title type='text'>Scribbling 3.0 Style</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-6fTEOwv_Xuk/TVtHOoMWjpI/AAAAAAAAAEM/n-pRpdlqDak/s1600/scribble-3.0.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 228px; height: 247px;" src="http://2.bp.blogspot.com/-6fTEOwv_Xuk/TVtHOoMWjpI/AAAAAAAAAEM/n-pRpdlqDak/s320/scribble-3.0.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5574127280434089618" /&gt;&lt;/a&gt;Just a quick update.  Got a little farther with the samples the last couple evenings.  Fixed up a few bugs causing some issues with a couple of the ones that already build, like native-instantiation.exe.  Then I tore into Scribble.cs.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was originally ported from a gtk example back in the early days.  It may have been before we really had much subclassing support in Gtk#.  I decided to see if gtk+ was still shipping the sample, and just do a clean port of the current sample instead of trying a minimal update.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The majority of the work needed to port the old sample to 3.0 boiled down to a Gdk.Pixmap to Cairo.Surface port.  The ExposeEvent to Drawn event transition was needed as well.  This is starting to sound a bit like a broken record, though I would imagine many readers have never heard a broken record.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I digress.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The finished port of the gtk+ sample is &lt;a href="https://github.com/mono/gtk-sharp/blob/master/sample/Scribble.cs"&gt;now in master&lt;/a&gt;, along with all the fixes to the stack to expose some needed API that wasn't getting generated.  The list of non-working samples is getting shorter.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-413087789285365715?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/413087789285365715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=413087789285365715' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/413087789285365715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/413087789285365715'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2011/02/scribbling-30-style.html' title='Scribbling 3.0 Style'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-6fTEOwv_Xuk/TVtHOoMWjpI/AAAAAAAAAEM/n-pRpdlqDak/s72-c/scribble-3.0.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-5049028704394043112</id><published>2011-02-12T16:48:00.003-06:00</published><updated>2011-02-12T17:40:15.496-06:00</updated><title type='text'>More Progress</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-dHkwadMzVn4/TVcOn0vKbcI/AAAAAAAAAEE/Mklr8yA83wg/s1600/cairo-sample.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 306px; height: 320px;" src="http://3.bp.blogspot.com/-dHkwadMzVn4/TVcOn0vKbcI/AAAAAAAAAEE/Mklr8yA83wg/s320/cairo-sample.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5572939141228424642" /&gt;&lt;/a&gt;Been slogging along with the process of auditing API and fixing samples to compile and not crash instantly.  Things got a whole lot more stable in the last couple evenings.  I pushed a bunch of updates today that allow the &lt;a href="https://github.com/mono/gtk-sharp/blob/master/sample/CairoSample.cs"&gt;cairo drawing sample&lt;/a&gt; in the Gtk# samples to run cleanly.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The configure now requires the &lt;a href="http://ftp.gnome.org/pub/gnome/sources/gtk+/3.0/gtk+-3.0.0.tar.bz2"&gt;gtk+-3.0.0&lt;/a&gt; release since it has hit the streets.  There was a bit of API churn between 2.99.0 and 3.0.0, which accounted for one of the more insidious crashes to track down.  Geoff Norton helped me figure that one out today, and when I reparsed for the 3.0 API a lot of things fell into place.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The size negotiation and drawing API changes are going to make for a little work when people start switching over.  These are the most common trip-ups I'm experiencing in the samples.  Any custom widgets which overloaded Widget.OnSizeRequested in 2.x will need to pick one or more of the new negotiation VMs and port to them.  For example, in the PolarFixed sample, I made the existing OnSizeRequested method private and delegated to it from new overrides for OnGetPreferredWidth and OnGetPreferredHeight.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In CairoSample, the only substantial change required was converting the old OnExposeEvent override to a new OnDrawn method.  The new method utilizes the new AllocatedWidth and AllocatedHeight properties to obtain sizing info to pass into the rendering methods.  Of course, the code was already drawing to a Cairo.Context, so the logic was ready to go.  A widget using the Gdk drawing API, or Style painting may have substantially more work to make the shift.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll try to blog more impressions of the porting effort as I move through the samples, and I encourage anyone who decides to dig in with their own apps to try to capture the knowledge, be it by sending a message to gtk-sharp-list, blogging, or adding them directly to&lt;a href="http://mono-project.com/GtkSharp3PortingGuide"&gt; the porting guide I've started on the wiki.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-5049028704394043112?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/5049028704394043112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=5049028704394043112' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5049028704394043112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5049028704394043112'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2011/02/more-progress.html' title='More Progress'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-dHkwadMzVn4/TVcOn0vKbcI/AAAAAAAAAEE/Mklr8yA83wg/s72-c/cairo-sample.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-5244485611643380711</id><published>2011-02-09T20:16:00.003-06:00</published><updated>2011-02-09T21:21:22.723-06:00</updated><title type='text'>Signs of Life</title><content type='html'>With gtk+ closing in on their 3.0 release, many folks have been inquiring about Gtk# 3 lately.  We've had a number of offers to help as well.  I've been tied up with another project at the ol' day job, but I've been dedicating a fair amount of evening and weekend time toward 3.0 bindings since the holidays.  It also looks like I'm going to be getting some more cycles to push the effort forward in the near future.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Over the past couple evenings, I've pushed a series of commits to github.com which update master to a 2.99.x API level.  Several of the samples are still not being built because of 3.0 API breakage. Most of the samples which currently build also run cleanly, but there are some crashes there to address as well.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've temporarily created a cairo-sharp.dll from the copy of Mono.Cairo we have been carrying in the tree, with a few updates to expose some of the new 1.10 API.  This will likely get merged back into the mcs/class tree, but it's a convenient place for us to move fast with fleshing out the new bits.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The generated APIs are completely unaudited at this point.  The improvements in the external Gio and Builder bindings since they spun off remain unmerged.  There is plenty of work to go around if people would like to jump in and help.  We are going to need migration docs, new API docs, the list goes on...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since people are likely wondering, the module still starts from a C parse.  I have experimented with starting from GIR format but feel at this point, given the current tooling state, that it will be quicker to get to 3.0 using the existing GAPI parser for gtk-sharp.  Since this is getting long already, I'll expand on the reasons in another blog, plus talk about the approach I think we can take to begin incorporating GIR as a starting point in new bindings.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-5244485611643380711?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/5244485611643380711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=5244485611643380711' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5244485611643380711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5244485611643380711'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2011/02/signs-of-life.html' title='Signs of Life'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-5027377188668690328</id><published>2009-08-04T09:01:00.002-06:00</published><updated>2009-08-04T09:22:19.910-06:00</updated><title type='text'>Mono Visual Profiler</title><content type='html'>We're seeking the input of profiler users and other interested parties to help create a visual profiling tool for mono applications.  Development is under way in the mono-tools module alongside the current command line decoder.  The tool is a UI to interact with the built-in mono logging profiler and graphically display captured profile logs.  The visualization capabilities of the tool are still fairly primitive, but it is already capable of creating and displaying log data for instrumented, allocation, and statistical profiles.&lt;br /&gt;&lt;br /&gt;I have created a &lt;a href="http://mono-project.com/MonoVisualProfiler"&gt;wiki page&lt;/a&gt; to track the feature capabilities and plans.  There is also a "Visual Profiler" category for bug reporting and enhancement requests in the Mono:Tools &lt;a href="http://bugzilla.novell.com"&gt;bugzilla&lt;/a&gt; product.  Discussion will occur on mono-devel-list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-5027377188668690328?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/5027377188668690328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=5027377188668690328' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5027377188668690328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5027377188668690328'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2009/08/mono-visual-profiler.html' title='Mono Visual Profiler'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-3838226767395800651</id><published>2009-04-21T17:29:00.002-06:00</published><updated>2009-04-21T17:56:57.159-06:00</updated><title type='text'>Gtk# for .net</title><content type='html'>Forgot to blog about this when it happened, but since I've gotten a couple of questions lately...&lt;br /&gt;&lt;br /&gt;In February, we released a new version of the &lt;a href="http://ftp.novell.com/pub/mono/gtk-sharp/gtk-sharp-2.12.8-1.win32.msi"&gt;Gtk# for .net installer&lt;/a&gt;.  It packages Gtk# 2.12.8 and the associated gtk+ binaries, including the registry keys necessary to build projects with MSBuild and add references using the references dialog in VS.&lt;br /&gt;&lt;br /&gt;This single installer combines the managed development functionality previously provided by both the SDK and Runtime installers in a significantly smaller download than the old SDK installer, since it no longer ships many of the C development files packaged in the old installers.  This installer also works properly on XP and Vista, unlike previous versions. &lt;br /&gt;&lt;br /&gt;In the near future, we will be announcing the availability of additional installers supporting the use of mono libraries like Mono.Posix, Mono.GetOptions, and Mono.Addins on .Net and maybe a new application installer or two as well.  Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-3838226767395800651?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/3838226767395800651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=3838226767395800651' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/3838226767395800651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/3838226767395800651'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2009/04/gtk-for-net.html' title='Gtk# for .net'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-8179363954947259884</id><published>2008-12-10T16:12:00.002-06:00</published><updated>2008-12-10T16:26:42.617-06:00</updated><title type='text'>Gtk# for .Net installers</title><content type='html'>Today, by popular demand, we &lt;a href="http://lists.ximian.com/pipermail/gtk-sharp-list/2008-December/009236.html"&gt;announced&lt;/a&gt; the availability of win32 installers for &lt;a href="http://mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt; version 2.12.6.  Runtime and SDK installers for .Net similar to those provided in the past by &lt;a href="http://medsphere.com"&gt;Medsphere&lt;/a&gt; are now being provided from the Mono project &lt;a href="http://mono-project.com/Downloads"&gt;downloads&lt;/a&gt; page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-8179363954947259884?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/8179363954947259884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=8179363954947259884' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8179363954947259884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8179363954947259884'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2008/12/gtk-for-net-installers.html' title='Gtk# for .Net installers'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-1932207929575848683</id><published>2008-09-02T12:27:00.004-06:00</published><updated>2008-09-02T13:17:12.751-06:00</updated><title type='text'>Hack Week: 1WPF</title><content type='html'>For &lt;a href="http://www.novell.com/prblogs/?p=495"&gt;Novell Hack week&lt;/a&gt;, instead of hacking on &lt;a href="http://sf.net/projects/exert"&gt;exert&lt;/a&gt; as I did &lt;a href="http://mkestner.blogspot.com/2008/02/hack-week-ii-exertion.html"&gt;in the past&lt;/a&gt;, I chose to spend some time on a &lt;a href="http://www.monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; Gtk designer restructuring project I've been considering:  one widget per design file.&lt;br /&gt;&lt;br /&gt;The current designer architecture is based on project-level design files, saved in a special hidden directory along with generated source files needed to compile the designs.  This design decision builds upon the existing stetic project-based file format.  It complicates several common operations, however, some of which have open bug reports.&lt;br /&gt;&lt;br /&gt;One problem is the ability to either copy or move widgets between projects.  Another, is the ability to add existing widgets to new projects as "external files" so that a single design can be reused by multiple projects.  When the design of the widget is saved as a child element of a project-level xml document, all of the above operations are considerably more complicated than if the widget design is contained in a standalone file.&lt;br /&gt;&lt;br /&gt;I'm implementing this redesign as a new addin in MonoDevelop, so that I won't have to pay as much attention to feature parity with the existing designer.  The hope is that at some point we can just switch the default designer to the new addin, once it reaches maturity.  Based on the amount of work remaining, this will clearly be post-2.0.&lt;br /&gt;&lt;br /&gt;Thus far, I've ported the existing addin extension code and begun the rework of the stetic WidgetDesigner.  Currently supported features include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SolutionPad display bindings and extensions&lt;/li&gt;&lt;li&gt;Grouping of related source, design, and codebehind files.&lt;/li&gt;&lt;li&gt;A CodeDom based project template to create Application projects in mulitple languages.&lt;/li&gt;&lt;li&gt;Project Compilation extensions to generate codebehind files, capable of compiling template projects.&lt;/li&gt;&lt;li&gt;CodeDom templates for ActionGroups, Dialogs, Widgets, and Windows.&lt;/li&gt;&lt;li&gt;Toolbox provider and loader.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;WidgetEditor built on existing stetic wrappers and class descriptions, currently view-only.&lt;/li&gt;&lt;/ul&gt;Here's a screenshot of a template project in C#.  The template also compiles already in VB.net.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DhCxPNs4NPU/SL2NKCZIh4I/AAAAAAAAACA/dDZ5853DQAc/s1600-h/designer.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_DhCxPNs4NPU/SL2NKCZIh4I/AAAAAAAAACA/dDZ5853DQAc/s320/designer.png" alt="" id="BLOGGER_PHOTO_ID_5241500744909621122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once I get the widget editor working, I'll probably go ahead and check in the addin for people to play around with.  No current estimates on when that might be other than, "when it's ready."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-1932207929575848683?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/1932207929575848683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=1932207929575848683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1932207929575848683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1932207929575848683'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2008/09/hack-week-1wpf.html' title='Hack Week: 1WPF'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DhCxPNs4NPU/SL2NKCZIh4I/AAAAAAAAACA/dDZ5853DQAc/s72-c/designer.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-7362173229105750227</id><published>2008-06-06T11:13:00.002-06:00</published><updated>2008-06-06T11:22:08.548-06:00</updated><title type='text'>GObject Property Registration</title><content type='html'>Christian Hoff submitted a nice patch to &lt;a href="http://mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt; supporting GObject property registration on managed subclasses.  This is a feature request we've seen off and on for a while now, especially from people writing Custom CellRenderers.  Until this patch, it was necessary to use a CellDataFunc with custom cell renderers instead of using the SetAttributes mechanism exposed by Gtk.&lt;br /&gt;&lt;br /&gt;I committed &lt;a href="http://anonsvn.mono-project.com/viewcvs/trunk/gtk-sharp/sample/PropertyRegistration.cs?view=markup"&gt;a little sample&lt;/a&gt; along with the patch to demonstrate its use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-7362173229105750227?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/7362173229105750227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=7362173229105750227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/7362173229105750227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/7362173229105750227'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2008/06/gobject-property-registration.html' title='GObject Property Registration'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-2219404545752497161</id><published>2008-04-20T20:57:00.008-06:00</published><updated>2008-04-20T22:02:38.078-06:00</updated><title type='text'>Standings and Exert Features</title><content type='html'>As of this evening, &lt;a href="http://www.nhl.com/"&gt;5 quarters are finished&lt;/a&gt;.  The prognostication standings:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mkestner.blogspot.com/2008/04/hockey-talk.html"&gt;Mike&lt;/a&gt;: 5&lt;br /&gt;&lt;a href="http://www.tsn.ca/nhl/feature/?fid=11430"&gt;Maggie the Monkey&lt;/a&gt; and &lt;a href="http://jacksonito.blogspot.com/2008/04/jacksons-official-stanley-cup-playoff.html"&gt;Jackson&lt;/a&gt;: 2&lt;br /&gt;&lt;br /&gt;Been adding some new features to &lt;a href="http://sf.net/projects/exert"&gt;exert&lt;/a&gt; the last couple weekends.  Last weekend, it was a couple new icons for swimming and cycling:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_DhCxPNs4NPU/SAwFtqEaXHI/AAAAAAAAABw/flyYv1v2Qw8/s1600-h/swimbike.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_DhCxPNs4NPU/SAwFtqEaXHI/AAAAAAAAABw/flyYv1v2Qw8/s320/swimbike.png" alt="" id="BLOGGER_PHOTO_ID_5191530752396385394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I also hacked EntryCategory editing and creation in the Preferences dialog. It supports editing of category names and icons, plus a "visible" checkbutton to indicate if you want the category shown in the Entry dialog combobox.&lt;br /&gt;&lt;br /&gt;This weekend, I added a status tray icon and menu.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_DhCxPNs4NPU/SAwHkaEaXII/AAAAAAAAAB4/IjnWVjnjPOE/s1600-h/exert-status.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_DhCxPNs4NPU/SAwHkaEaXII/AAAAAAAAAB4/IjnWVjnjPOE/s320/exert-status.png" alt="" id="BLOGGER_PHOTO_ID_5191532792505851010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've got a list of features I want to add, but I will probably kick out another release soon.  The Garmin device support deserved a release months ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-2219404545752497161?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/2219404545752497161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=2219404545752497161' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/2219404545752497161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/2219404545752497161'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2008/04/standings-and-exert-features.html' title='Standings and Exert Features'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DhCxPNs4NPU/SAwFtqEaXHI/AAAAAAAAABw/flyYv1v2Qw8/s72-c/swimbike.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-8209379331555859996</id><published>2008-04-09T15:58:00.002-06:00</published><updated>2008-04-09T16:35:19.789-06:00</updated><title type='text'>Hockey talk</title><content type='html'>Jackson took a group of us non-Canadians to a Bruins/Blackhawks game in Boston last fall, and rekindled my interest in the Blackhawks.  Seeing as &lt;a href="http://jacksonito.blogspot.com/2008/04/jacksons-official-stanley-cup-playoff.html"&gt;Jackson has posted his picks&lt;/a&gt; for the first round, I figured I would post my completely novice guesses just so I can belittle him if I happen to guess correctly.&lt;br /&gt;&lt;br /&gt;West:&lt;br /&gt;'Wings d Preds in 6.  Ellis is gonna win 2.&lt;br /&gt;Sharks d Flames in 4.  Flames are going down hard.&lt;br /&gt;Avs d Wild in 6.  Wild are too boring to win.&lt;br /&gt;Stars d Ducks in 7.  Could go the other way in 7.&lt;br /&gt;&lt;br /&gt;East:&lt;br /&gt;Montreal d Boston in 5.  Boston will win one at home.&lt;br /&gt;Pittsburgh d Ottawa in 5.  Crosby with 16 points.&lt;br /&gt;Caps d Flyers in 6.  Caps are gonna drop one at home, probably game 1.&lt;br /&gt;Rangers d Devils in 7.  Though I couldn't care less.&lt;br /&gt;&lt;br /&gt;If you place any bets based on these picks, I will expect my usual commission.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-8209379331555859996?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/8209379331555859996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=8209379331555859996' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8209379331555859996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8209379331555859996'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2008/04/hockey-talk.html' title='Hockey talk'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-1468027691189804644</id><published>2008-03-21T20:36:00.002-06:00</published><updated>2008-03-21T20:56:07.985-06:00</updated><title type='text'>gio-sharp</title><content type='html'>Been getting quite a few requests for libgio bindings.  I whipped up a new module in mono svn to provide an unstable binding for people who want to experiment and help refine the API.  It is my intention to eventually, most likely in gtk-sharp 2.14, merge this binding into gtk-sharp and eliminate the standalone package.  Until then, it will install per the &lt;a href="http://www.mono-project.com/Guidelines:Application_Deployment#Libraries_with_Unstable_APIs"&gt;Mono Guidelines for Unstable Library Deployment&lt;/a&gt; outside the GAC.&lt;br /&gt;&lt;br /&gt;For the extremely impatient and adventurous, you can find it at trunk/gio-sharp.  You will need GAPI from trunk/gtk-sharp to build it.   It still throws tons of generation warnings.  I have made zero attempts to use it.  It has no docs.  If it melts your laptop, don't complain to me.&lt;br /&gt;&lt;br /&gt;Feel free to file &lt;a href="http://bugzilla.novell.com"&gt;bug reports&lt;/a&gt; for anything out of order.  I'll try to be responsive to any reports, and as always, patches are welcome.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-1468027691189804644?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/1468027691189804644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=1468027691189804644' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1468027691189804644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1468027691189804644'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2008/03/gio-sharp.html' title='gio-sharp'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-4212225538945530413</id><published>2008-02-15T15:00:00.003-06:00</published><updated>2008-02-15T15:21:05.165-06:00</updated><title type='text'>Hack Week II Exertion</title><content type='html'>This week was Hack Week 2 at Novell, and I decided to spend the week adding Garmin Forerunner import support to exert.  I had hoped to maybe move on to some heart rate graphs and lap display, but time ran out.&lt;br /&gt;&lt;br /&gt;All track, lap, and run data is importing correctly into the exert sqlite database, at least as far as I can tell from some sql querying.  The visible entries are coming in cleanly and displayed properly, but there may still be some glitches in the lap summary and GPS track point data.&lt;br /&gt;&lt;br /&gt;Here's a rather boring screenshot of the end result. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_DhCxPNs4NPU/R7X-qaY4oMI/AAAAAAAAABo/nFBWz9a66_s/s1600-h/GarminXfer.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_DhCxPNs4NPU/R7X-qaY4oMI/AAAAAAAAABo/nFBWz9a66_s/s320/GarminXfer.png" alt="" id="BLOGGER_PHOTO_ID_5167316152069169346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current support is limited to the ForeRunner 305, but it should be easy enough to add other devices if people are interested.  I just didn't feel like implementing the entire protocol up front.&lt;br /&gt;&lt;br /&gt;The code is on svn &lt;a href="http://sourceforge.net/projects/exert/"&gt;at sourceforge&lt;/a&gt;.  I will probably hold off on a release until I can display more of the data visually.  I want to add heart rate graphs, route maps, and lap tables.  Maybe next hack week...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-4212225538945530413?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/4212225538945530413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=4212225538945530413' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/4212225538945530413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/4212225538945530413'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2008/02/hack-week-ii-exertion.html' title='Hack Week II Exertion'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DhCxPNs4NPU/R7X-qaY4oMI/AAAAAAAAABo/nFBWz9a66_s/s72-c/GarminXfer.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-7835925545133799887</id><published>2007-11-12T12:11:00.000-06:00</published><updated>2007-11-12T12:35:26.679-06:00</updated><title type='text'>IOChannels and Spawning</title><content type='html'>For the most part, we like to avoid wrapping as much of glib as possible, instead preferring the .Net framework capabilities.  We hide as many GList and GHashtable parameters as possible, for example.&lt;br /&gt;&lt;br /&gt;I've received several comments in the past that the .Net APIs for IO and process spawning didn't really match up to the glib API.  Taking this feedback, I spent the last couple days wrapping, testing, and documenting a new glib-sharp binding for g_spawn_* and GIOChannel.&lt;br /&gt;&lt;br /&gt;Here's an example usage from the docs:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using GLib;&lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;public class SpawnTest  {&lt;br /&gt;&lt;br /&gt;        public static void Main (string[] args)&lt;br /&gt;        {&lt;br /&gt;                new SpawnTest ();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        MainLoop main_loop;&lt;br /&gt;        IOChannel channel;&lt;br /&gt;&lt;br /&gt;        public SpawnTest ()&lt;br /&gt;        {&lt;br /&gt;                main_loop = new MainLoop ();&lt;br /&gt;&lt;br /&gt;                try {&lt;br /&gt;                        Process proc;&lt;br /&gt;                        int stdin = Process.IgnorePipe;&lt;br /&gt;                        int stdout = Process.RequestPipe;&lt;br /&gt;                        int stderr = Process.IgnorePipe;&lt;br /&gt;                        GLib.Process.SpawnAsyncWithPipes (null, new string[] {"pwd"}, null,&lt;br /&gt;                                                          SpawnFlags.SearchPath, null, &lt;br /&gt;                                                          out proc, ref stdin, ref stdout, &lt;br /&gt;                                                          ref stderr);&lt;br /&gt;                        channel = new IOChannel (stdout);&lt;br /&gt;                        channel.AddWatch (0, IOCondition.In | IOCondition.Hup, new IOFunc (ReadStdout));&lt;br /&gt;                } catch (Exception e) {&lt;br /&gt;                        Console.WriteLine ("Exception in Spawn: " + e);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                main_loop.Run ();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        bool ReadStdout (IOChannel source, IOCondition condition)&lt;br /&gt;        {&lt;br /&gt;                if ((condition &amp; IOCondition.In) == IOCondition.In) {&lt;br /&gt;                        string txt;&lt;br /&gt;                        if (source.ReadToEnd (out txt) == IOStatus.Normal)&lt;br /&gt;                                Console.WriteLine ("[SpawnTest output] " + txt);&lt;br /&gt;                }&lt;br /&gt;                if ((condition &amp; IOCondition.Hup) == IOCondition.Hup) {&lt;br /&gt;                        source.Dispose ();&lt;br /&gt;                        main_loop.Quit ();&lt;br /&gt;                        return true;&lt;br /&gt;                }&lt;br /&gt;                return true;&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'd appreciate it if anyone who has been missing this functionality in Gtk# would try it out and let me know any issues you find, or places the API can be improved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-7835925545133799887?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/7835925545133799887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=7835925545133799887' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/7835925545133799887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/7835925545133799887'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/11/iochannels-and-spawning.html' title='IOChannels and Spawning'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-5018056324127830105</id><published>2007-11-08T00:03:00.000-06:00</published><updated>2007-11-08T00:17:13.505-06:00</updated><title type='text'>Exert 0.1</title><content type='html'>I've spent a little spare time hacking on &lt;a href="http://sourceforge.net/projects/exert"&gt;exert&lt;/a&gt; recently and have reached the point where it has all the features I use from my online running log.  I decided to switch over to using it for my log, so that means I need to maintain database compat from now on.  I figured I might as well release it in case anyone else was interested in playing with it.&lt;br /&gt;&lt;br /&gt;There's a &lt;a href="http://downloads.sourceforge.net/exert/exert-0.1.tar.gz"&gt;source tarball&lt;/a&gt; available, and I used the opensuse build service to &lt;a href="http://download.opensuse.org/repositories/home:/mkestner/"&gt;provide packages for 10.3 and fedora&lt;/a&gt;.  Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-5018056324127830105?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/5018056324127830105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=5018056324127830105' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5018056324127830105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5018056324127830105'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/11/exert-01.html' title='Exert 0.1'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-6324060537274097467</id><published>2007-10-19T14:07:00.000-06:00</published><updated>2007-10-19T14:14:21.104-06:00</updated><title type='text'>Moko Bindings</title><content type='html'>One of the comments on my last blog entry suggested a libmokoui binding.  Since it was a nice small target, I went ahead and whipped up a binding for it this afternoon.  It took me longer to &lt;a href="http://mono-project.com/BindingMoko"&gt;write the tutorial&lt;/a&gt; I added to the wiki than it did to produce &lt;a href="http://downloads.sourceforge.net/gtk-sharp/moko-sharp-0.1.tar.gz"&gt;the binding&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Granted this was a very simple binding, since it is small and the source code was written perfectly for the GAPI parser's consumption.  It also has no auto* magic.  The tarball contains generated sources which could be copied into your project and compiled and installed as a private assembly.  There is really no point to GAC magic for an assembly with no guarantees.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-6324060537274097467?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/6324060537274097467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=6324060537274097467' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/6324060537274097467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/6324060537274097467'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/10/moko-bindings.html' title='Moko Bindings'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-6346662146319463200</id><published>2007-10-05T16:09:00.000-06:00</published><updated>2007-10-05T16:20:49.398-06:00</updated><title type='text'>Bind this...</title><content type='html'>We are looking to add to the already &lt;a href="http://mono-project.com/Libraries"&gt;impressive list of libraries&lt;/a&gt; accessible from mono.  If you have any special requests of the latest and greatest libraries which you like to access from the sexy managed language of your choice, please let us know your needs so we can prioritize our efforts.&lt;br /&gt;&lt;br /&gt;You can make your wishes known by commenting on this blog entry, mailing gtk-sharp-list@lists.ximian.com, &lt;a href="http://bugzilla.novell.com"&gt;filing a bug report&lt;/a&gt;, or writing on a cocktail napkin and mailing it to us, if you can figure out where we live.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-6346662146319463200?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/6346662146319463200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=6346662146319463200' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/6346662146319463200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/6346662146319463200'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/10/bind-this.html' title='Bind this...'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-8185095473378598093</id><published>2007-10-03T12:08:00.000-06:00</published><updated>2007-10-03T12:50:30.849-06:00</updated><title type='text'>GInterface Implementation</title><content type='html'>Finally "finished" the framework for GInterface registration in Gtk# this week.  I wrote up a &lt;a href="http://mono-project.com/ImplementingGInterfaces"&gt;small tutorial and API description&lt;/a&gt;.   It points to the &lt;a href="http://anonsvn.mono-project.com/viewcvs/trunk/gtk-sharp/sample/TreeModelDemo.cs?view=markup"&gt;small test application&lt;/a&gt; I wrote to demonstrate TreeModel implementation, which is the most common reason people have requested GInterface registration for the past few years.&lt;br /&gt;&lt;br /&gt;Here's a screenshot of the sample which uses reflection to display the assemblies, types, and members in the application's AppDomain.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_DhCxPNs4NPU/RwPcVs1Eb6I/AAAAAAAAABg/GbrBp1wdGFo/s1600-h/ifaces.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_DhCxPNs4NPU/RwPcVs1Eb6I/AAAAAAAAABg/GbrBp1wdGFo/s320/ifaces.png" alt="" id="BLOGGER_PHOTO_ID_5117175866992127906" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-8185095473378598093?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/8185095473378598093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=8185095473378598093' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8185095473378598093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8185095473378598093'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/10/ginterface-implementation.html' title='GInterface Implementation'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_DhCxPNs4NPU/RwPcVs1Eb6I/AAAAAAAAABg/GbrBp1wdGFo/s72-c/ifaces.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-1549191534334465839</id><published>2007-09-07T09:44:00.000-06:00</published><updated>2007-09-07T10:45:05.870-06:00</updated><title type='text'>Reflection: a Cautionary Tale</title><content type='html'>Back in the day, I needed a mechanism to execute a method for a class for each new subclass of that type.  Class constructors were not sufficient, because they are only run once per type, not once for every subclass of that type.&lt;br /&gt;&lt;br /&gt;I decided to annotate the init method with an attribute and use reflection to lookup the method.  When we register a new GType, we scan the class hierarchy for private static methods with a GLib.ClassInitializerAttribute and invoke any that exist.  We use a similar mechanism to hook overridden virtual methods into the GObject class vtables for signal default handlers using the GLib.DefaultSignalHandlerAttribute.&lt;br /&gt;&lt;br /&gt;This strategy works, but it turns out to be pretty suboptimal, especially from a memory usage standpoint.  In order to find the methods with [ClassInitializer] defined, we had to load all the private static methods in the type hierarchy, and then iterate over them to look for the attribute.  This caused a pretty substantial memory spike for types like Gtk.Widget which have a ton of static method delegate implementations for signal marshaling.&lt;br /&gt;&lt;br /&gt;The root of the error was in not recognizing that the Class init problem is a one-to-one relationship of class to method, where the signal delegate problem I borrowed from is a one-to-many scenario.  There is a [DefaultSignalHandler] method for each signal defined by a class.&lt;br /&gt;&lt;br /&gt;To improve the mechanism, I added a GLib.TypeInitializerAttribute which takes a type and method name argument.  With this attribute applied to a type declaration, we can lookup the specific methods by name and avoid loading all the static methods in the entire class hierarchy.  This feature is now committed to trunk and the branch svn.&lt;br /&gt;&lt;br /&gt;Since we have released the GLib.ClassInitializerAttribute as public API in a stable release, I couldn't just remove the reflection for it, even though it is unlikely that anyone out there really discovered the feature and is using it.  In order to make it possible for subclass authors to avoid the reflection step, I also added the GLib.IgnoreClassInitializersAttribute which can be applied to any assemblies which contain GLib.Object subclass declarations.  Svn trunk and branch add this attribute to all the gtk-sharp and gnome-sharp assemblies, so that all the types defined by the packages avoid this reflection overhead.  The internal usage of [ClassInitializer] has been ported to [TypeInitializer] as well.&lt;br /&gt;&lt;br /&gt;Thanks to Lluis for identifying the issue and Paolo for his usual insightful feedback in alternative approaches to the functionality.  Lluis also helped refine the implementation of the [ClassInitializer] back-compat mechanism.  My understanding is that the recent changes reduced MonoDevelop startup memory usage by about a MB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-1549191534334465839?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/1549191534334465839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=1549191534334465839' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1549191534334465839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1549191534334465839'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/09/reflection-cautionary-tale.html' title='Reflection: a Cautionary Tale'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-3588924092198218824</id><published>2007-08-13T09:41:00.000-06:00</published><updated>2007-08-13T10:17:41.494-06:00</updated><title type='text'>Change change change</title><content type='html'>After living with 4 German Shepherds for over 10 years, the past year has held a lot of painful if not unexpected changes for Sherry and I.  We lost OD last fall at ten and a half.  This summer was particularly bad, losing our 11 year old JR just two weeks after 13 year old Maggie.&lt;br /&gt;&lt;br /&gt;Sherry, Qman, and I have sort of been moping around the house for the last month.  It's amazing how empty a house can feel. &lt;br /&gt;&lt;br /&gt;That all changed Wednesday night.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_DhCxPNs4NPU/RsCBANy_fpI/AAAAAAAAABI/50J9hvDK09g/s1600-h/beebee.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_DhCxPNs4NPU/RsCBANy_fpI/AAAAAAAAABI/50J9hvDK09g/s320/beebee.png" alt="" id="BLOGGER_PHOTO_ID_5098216618886921874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's equally amazing how quickly a 3 month old puppy can fill up a house.  Her name is Beebee.  We haven't had a puppy in the house in over 11 years.  The frantic dashes to the back yard during housebreaking.  The brief periods of high-energy romping separated by hours of food-induced comas.&lt;br /&gt;&lt;br /&gt;Qman has not been all that interested in playing her little puppy games, but has been very tolerant of her.  At times, it seems like he's just laying there rolling his eyes at her.  She has a pretty amazing personality.  Extremely friendly and confident, and the shepherd drive to please is already evident.  We are really looking forward to watching her develop and anticipating the fun we'll have earning obedience, agility, and tracking titles.&lt;br /&gt;&lt;br /&gt;Oops, time to take her out back again!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-3588924092198218824?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/3588924092198218824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=3588924092198218824' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/3588924092198218824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/3588924092198218824'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/08/change-change-change.html' title='Change change change'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_DhCxPNs4NPU/RsCBANy_fpI/AAAAAAAAABI/50J9hvDK09g/s72-c/beebee.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-4390308967440097065</id><published>2007-06-29T16:34:00.000-06:00</published><updated>2007-06-29T17:09:53.170-06:00</updated><title type='text'>Hack Week</title><content type='html'>This week was &lt;a href="http://idea.opensuse.org/content/"&gt;hack week&lt;/a&gt; at Novell.  At the beginning of the week, it looked like I was going to be spending most of my time supporting new Gtk# users and fixing bugs they were tripping over.  Things settled down a bit on Tuesday though, and I got to put some time into Exert for the remainder of the week.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/exert"&gt;Exert&lt;/a&gt; is a small &lt;a href="http://mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt; app that uses sqlite as a database to manage a fitness log.  There are tons of running logs on the web and PC versions as well.  While I plan to use exert as my own fitness log and potentially explore some new usability improvements, my main goal with exert is to provide an example of a small-scale database front-end application using Gtk#.&lt;br /&gt;&lt;br /&gt;Prior to this week, I already had developed the database backend and created a couple of simple editor widgets to manage simple text only log entries.  Additionally, I created a monthly calendar view to serve as the primary user interface for the application.  There's a &lt;a href="http://sourceforge.net/project/screenshots.php?group_id=161797"&gt;screenshot&lt;/a&gt; of a fairly stale version of the calendar view up on the sourceforge project page.&lt;br /&gt;&lt;br /&gt;This week, I added a few new features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rendering of BodyWeight entries directly on the CalendarView&lt;/li&gt;&lt;li&gt;A cardio entry editor for time/distance workouts with rest/avg/peak Heartrate logging.&lt;/li&gt;&lt;li&gt;A running entry editor that builds on cardio entry but also tracks shoe usage.&lt;/li&gt;&lt;li&gt;A Settings infrastructure based on XmlSerialization.&lt;/li&gt;&lt;/ul&gt;Here's a shot of the new RunningEditor editing an entry.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_DhCxPNs4NPU/RoWMjHMXA6I/AAAAAAAAABA/8zZa1022zeM/s1600-h/run.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://3.bp.blogspot.com/_DhCxPNs4NPU/RoWMjHMXA6I/AAAAAAAAABA/8zZa1022zeM/s320/run.png" alt="" id="BLOGGER_PHOTO_ID_5081622289411670946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So far, I haven't added any summary reports for running, but I will eventually add the usual weekly/monthly/annual summaries, as mile as accumulated mileage for Shoes.&lt;br /&gt;&lt;br /&gt;Upcoming features include a specialized weightlifting entry editor to make it quick and easy to add and clone existing workouts.  That will probably have to wait until the next hack week, though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-4390308967440097065?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/4390308967440097065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=4390308967440097065' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/4390308967440097065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/4390308967440097065'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/06/hack-week.html' title='Hack Week'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_DhCxPNs4NPU/RoWMjHMXA6I/AAAAAAAAABA/8zZa1022zeM/s72-c/run.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-815378448312473400</id><published>2007-05-07T09:30:00.000-06:00</published><updated>2007-05-07T10:54:12.436-06:00</updated><title type='text'>Spring cleaning</title><content type='html'>After a brief hiatus helping out with the winforms bug count, I've spent the last few weeks shaking out bugs in &lt;a href="http://mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt;.  The win32 instability issues with trunk seem to have been smoothed out.  For the last week, I chased a bunch of ref management and object dispose/destroy issues down in MD and Stetic.  Things seem pretty stable now with trunk, but as always, please &lt;a href="http://bugzilla.ximian.com"&gt;report any trouble&lt;/a&gt; you run into.&lt;br /&gt;&lt;br /&gt;I'd like to encourage anyone who has an interest in 2.10 to try out current svn trunk with your applications. It is possible you may see issues since we are getting closer to accurate object finalization now.  Many of the issues I worked through in Stetic, for example, were related to using objects after they were already disposed, or marked for finalization by the GC through the circular ref handling capabilities of the GC.  If you are doing any object destruction in Dispose overrides, for example, that can cause trouble.  If you are invoking base.Dispose in a GLib.Object subclass, it should always be called &lt;span style="font-style: italic;"&gt;after&lt;/span&gt; you do the additional work.  When objects are leaking stuff like this doesn't bite you, but it just might now.&lt;br /&gt;&lt;br /&gt;We would like to pull together a release in the near future, and I think things are stable enough at this point for more people to kick the tires.  I've revised the &lt;a href="http://mono-project.com/GtkSharpPlan"&gt;Gtk# Plan wiki page&lt;/a&gt; to describe the recent changes in the tree and the planned feature additions.&lt;br /&gt;&lt;br /&gt;And on a completely unrelated and personal note, I &lt;a href="http://dogchaser.blogspot.com/2007/05/first-5k.html"&gt;ran my first 5K race&lt;/a&gt; over the weekend and survived to hack another day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-815378448312473400?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/815378448312473400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=815378448312473400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/815378448312473400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/815378448312473400'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/05/spring-cleaning.html' title='Spring cleaning'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-5661230651825606987</id><published>2007-03-06T16:18:00.000-06:00</published><updated>2007-03-06T17:03:43.952-06:00</updated><title type='text'>Exceptional Delegates</title><content type='html'>I committed some rework to the GObject signal system in Gtk# today.  The signal system relies heavily on native to managed callback delegates for all the unmanaged widget signals we bind.  Paolo and Lluis &lt;a href="http://bugzilla.ximian.com/show_bug.cgi?id=80516"&gt;pointed out a gap&lt;/a&gt; in our previous implementation, where we neglected to take into account the interaction of this code with managed exception handling.&lt;br /&gt;&lt;br /&gt;When an exception is thrown in a managed event handler, we need to ensure that the stack is not unrolled across native-to-managed boundaries in the call stack.  When that happens, you tend to get unpredictable behavior with stack corruption and segfaults.  Today's fixes add try/catch blocks to the signal and virtual method delegate marshallers to ensure the stack only unrolls to the boundary.&lt;br /&gt;&lt;br /&gt;The catch blocks raise static events on a new GLib.ExceptionManager class.  If you want to "catch" events happening in managed signal handlers, you can attach to the UnhandledException event.  The UnhandledExceptionArgs passed to your delegate expose an IsTerminating property (from its System.UnhandledExceptionEventArgs base class) to indicate if the exception is recoverable and an additional ExitApplication property to request program termination if desired after the event propogation is complete.&lt;br /&gt;&lt;br /&gt;Lluis, always the bearer of interesting insight, pointed out we need similar code for Idle and Timeout handlers, which made me realize that all the Callback parameters like foreach method callbacks and DestroyNotify handlers are also vulnerable to the problem.&lt;br /&gt;&lt;br /&gt;I'll be fixing this bug for a while, but feel free to try out the new signal stuff on trunk in the meantime and report any warts you run across.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-5661230651825606987?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/5661230651825606987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=5661230651825606987' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5661230651825606987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5661230651825606987'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/03/exceptional-delegates.html' title='Exceptional Delegates'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-8385812548370318206</id><published>2007-02-22T14:34:00.000-06:00</published><updated>2007-02-22T14:59:48.810-06:00</updated><title type='text'>Dogfooding MD</title><content type='html'>Good progress lately on &lt;a href="http://mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt;.  Got the &lt;a href="http://developer.gnome.org/doc/API/2.0/gobject/gobject-The-Base-Object-Type.html#g-object-add-toggle-ref"&gt;toggle ref &lt;/a&gt;updates into svn, in addition to the Gtk.Object destruction rework.  I did a lot of testing on the patch in MonoDevelop, Banshee, F-spot, and some toy apps of mine to feel more confident about such a fundamental change to ref management in the binding.&lt;br /&gt;&lt;br /&gt;Having gone through the exercise of building bleeding edge versions of all those apps to test them against bleeding edge Gtk#, I decided it would be good to continue dogfooding like this regularly.  I plan to pull the trunk sources of MD, Banshee, and F-spot once a week and run them against Gtk# trunk from now on.&lt;br /&gt;&lt;br /&gt;Dogfooding &lt;a href="http://banshee-project.org"&gt;Banshee&lt;/a&gt; and &lt;a href="http://f-spot.org"&gt;F-spot&lt;/a&gt; is a simple thing, since I use both applications regularly.  &lt;a href="http://monodevelop.com"&gt;MonoDevelop&lt;/a&gt; has been something I've only goofed around with every now and then, though.  To create a nice dogfooding opportunity I decided to convert &lt;a href="http://sourceforge.net/projects/exert"&gt;my little fitness log application&lt;/a&gt; to a MonoDevelop project so I can hack on it in MonoDevelop for an hour or two each week.  I wrote a &lt;a href="http://www.monodevelop.com/ConvertingAnSvnAutotoolsProject"&gt;wiki page&lt;/a&gt; on my experience of converting the subversion-based autotools project to an MD project.  It required surprisingly little manual effort thanks to the nice toys Lluis and folks have been building into MD lately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-8385812548370318206?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/8385812548370318206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=8385812548370318206' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8385812548370318206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/8385812548370318206'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/02/dogfooding-md.html' title='Dogfooding MD'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-1485542784326099889</id><published>2007-02-09T19:30:00.000-06:00</published><updated>2007-01-31T21:30:24.285-06:00</updated><title type='text'>Leaky Documents</title><content type='html'>Making slow but steady progress on the documentation and auditing for the 2.10 API.  Hopefully I'll finish up the Printing API next week.  I've been refining some of the tools we use to add boilerplate-ish documentation for things like default signal handler virtual methods, and some of the semi-internal API the binding has to expose for binding purposes.&lt;br /&gt;&lt;br /&gt;Since writing documentation doesn't make me feel sexy, I've been mixing in some bugfixing and new development along the way.  Today I spent some time hacking toggle ref support into GLib.Object.  Toggle refs are a new ref type added in glib-2.8.  They are a special ref type which provides notification when transitioning from sole-ownership to shared-ownership of an object. &lt;br /&gt;&lt;br /&gt;It's important to account for this with managed subclasses because we have to hold a strong reference to the managed object as long as native-owned refs exist.   If Gtk# is the sole owner of a native object, we can allow the managed reference handling to drive garbage collection.  However, when any native code takes a native ref on a managed subclass, we need to artificially maintain a managed ref to the object until the native code releases its ref.&lt;br /&gt;&lt;br /&gt;Since we maintain a GObject* keyed hashtable of outstanding GLib.Object instances, we can use the toggle ref notification to switch between weak and strong references in the hash.  While we have shared ownership, the hash will contain a normal object ref, avoiding garbage collection.  When we transition to sole ownership, we'll hold a WeakReference to the object in the hash.&lt;br /&gt;&lt;br /&gt;My first pass at toggle ref implementation seems to work well for plain GLib.Object subclasses.  Now I just have to make it work within the context of GtkObject destruction and so on.  I won't be committing anything until I've done a considerable amount of testing, since ref management changes have historically been a source of pain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-1485542784326099889?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/1485542784326099889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=1485542784326099889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1485542784326099889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/1485542784326099889'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/02/leaky-documents.html' title='Leaky Documents'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-4393683148098271276</id><published>2007-01-31T10:33:00.000-06:00</published><updated>2007-01-31T21:30:24.374-06:00</updated><title type='text'>Good enough</title><content type='html'>This morning, I committed the ilContrast tool I &lt;a href="http://mkestner.blogspot.com/2007/01/ilcontrast.html"&gt;blogged about&lt;/a&gt; on Sunday.  It is in the mono-tools product in svn trunk. The tool can compare two individual assemblies which you can provide either by cmdline argument or interactively using the FileChooser.&lt;br /&gt;&lt;br /&gt;Some potential features remain for bored hackers and artists to implement:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It needs a super-sexy icon.  I just copied MonoIcon.png.&lt;/li&gt;&lt;li&gt;It could probably use some persistence mechanism to recall the last "project".&lt;/li&gt;&lt;li&gt;Multiple assembly comparisons.  The mono-api-info tool looks like it can do it, just needs hooking up.&lt;/li&gt;&lt;li&gt;Maybe a tabbed view for displaying multiple comparisons.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The About dialog could use translation to 67 different languages.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It has a hard dependency on Gecko#.  A fallback to GtkHtml like monodoc provides might be useful.&lt;/li&gt;&lt;/ul&gt;After finishing the standalone tool, it occurred to me that this might have made a nice MonoDevelop plugin instead.  But the tool is handy as is, and will probably work its way into my Gtk# hacking.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In case anyone was actually considering the GtkHtml fallback hack, don't bother.  As Miguel pointed out to me, the javascript requirement makes that a non-starter.  A more likely hack in that area would be to remove the Gecko# dep by directly rendering the mono-api-diff output with Gtk# itself, perhaps using a TreeView.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-4393683148098271276?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/4393683148098271276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=4393683148098271276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/4393683148098271276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/4393683148098271276'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/01/good-enough.html' title='Good enough'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-5867750667334469297</id><published>2007-01-28T23:27:00.000-06:00</published><updated>2007-01-28T23:38:48.892-06:00</updated><title type='text'>ilContrast</title><content type='html'>After helping Miguel with a corcompare run on IRC Friday afternoon, we decided it would be nice to have a GUI tool that would hook it all up for you.  Running the three cmdline tools in the current manner is not the most user-friendly experience.&lt;br /&gt;&lt;br /&gt;I threw a few hours at the problem this weekend and have a little Gecko# frontend sort of working.  It has a few warts, but it's at least to the point of rendering recognizable information. Look for it to hit the mono-tools module some time this week, hopefully.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_DhCxPNs4NPU/Rb2HMrOfenI/AAAAAAAAAAM/86KccN6rtV4/s1600-h/ilcontrast.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_DhCxPNs4NPU/Rb2HMrOfenI/AAAAAAAAAAM/86KccN6rtV4/s320/ilcontrast.png" alt="" id="BLOGGER_PHOTO_ID_5025321411047029362" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-5867750667334469297?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/5867750667334469297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=5867750667334469297' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5867750667334469297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/5867750667334469297'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/01/ilcontrast.html' title='ilContrast'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_DhCxPNs4NPU/Rb2HMrOfenI/AAAAAAAAAAM/86KccN6rtV4/s72-c/ilcontrast.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-7321375174263632016</id><published>2007-01-26T16:17:00.000-06:00</published><updated>2007-01-26T16:21:09.122-06:00</updated><title type='text'>Hang on</title><content type='html'>Delegate persistence is an interesting challenge in a pinvoke binding like &lt;a href="http://mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt;.  Hang on to delegates too long and you tie up the delegate instance memory and keep objects alive which are providing the delegate's invocation target.  Release the delegate too soon and you get crashes when the native code tries to invoke it posthumously.&lt;br /&gt;&lt;br /&gt;Most of the callback parameters in &lt;a href="http://www.gtk.org/"&gt;Gtk+&lt;/a&gt; are destroy notified, taking away the guesswork of when to release the delegate.  We have supported notified delegate release for a while now.&lt;br /&gt;&lt;br /&gt;Of the non-notified callbacks, most only need to persist for the duration of the method to which they are passed.  Foreach methods are a common user of this style of delegate scope.  I refer to this as "call" scope.  You may have noticed warnings for method parameters defaulted to call scope.  The generator treats all callback parameters as call scope if the method signature doesn't contain destroy notification and a scope attribute isn't explicitly provided via metadata.&lt;br /&gt;&lt;br /&gt;The challenge appears when a callback parameter doesn't fit into either of these paradigms.  There are callbacks which persist until removed by another method.  Some of these luckily also provide destroy notification, but not all of them.  There is also another class of callbacks that I will call "async" since they are typically provided to allow non-blocking implementations of functionality.  The task is queued up by the method call and control returns before the task is actually completed.&lt;br /&gt;&lt;br /&gt;Often these async methods take a delegate parameter that is invoked at the completion of the operation to notify the caller the operation is finished.  I ran across &lt;a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk-High-level-Printing-API.html#gtk-print-run-page-setup-dialog-async"&gt;an example of this method type&lt;/a&gt; while documenting the new Gtk printing API from 2.10.  Since I was bored of writing documentation, I decided to take a crack at &lt;a href="http://lists.ximian.com/pipermail/mono-patches/2007-January/086658.html"&gt;implementing async scope callbacks in the generator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you have any async callback delegates in your bindings, you can now &lt;a href="http://www.mono-project.com/GAPI#Setting_Attributes"&gt;add the scope="async" attribute&lt;/a&gt; to the parameter with metadata to automatically handle the persistence for this new scope.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-7321375174263632016?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/7321375174263632016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=7321375174263632016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/7321375174263632016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/7321375174263632016'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/01/hang-on.html' title='Hang on'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1497451738703327403.post-6302181045614673417</id><published>2007-01-24T16:30:00.000-06:00</published><updated>2007-01-24T16:40:59.982-06:00</updated><title type='text'>Back in the Saddle</title><content type='html'>After a lengthier than expected hiatus, I've been turned loose again to dedicate most of my time to &lt;a href="http://mono-project.com/GtkSharp"&gt;Gtk#&lt;/a&gt;.  I'm looking forward to adding some new &lt;a href="http://mono-project.com/GtkSharpPlan"&gt;features&lt;/a&gt; and improving the memory management of the existing bindings.&lt;br /&gt;&lt;br /&gt; I've completed an initial &lt;a href="http://bugzilla.ximian.com/buglist.cgi?product=gtk%23&amp;amp;bug_status=ASSIGNED" title=""&gt;triage of outstanding bugs&lt;/a&gt;, along with some work bringing the documentation up to speed with current monodoc updater. I use the monodoc update as a first check for API stability, in addition to the CorCompare-based audit mechanism in svn, so it's important to me to have the docs updating with as little noise as possible.&lt;br /&gt;&lt;br /&gt;My initial focus will be working on the higher priority bugs, while also documenting and auditing the remainder of the new types added in the Gtk# 2.10 release. While I document the new types, I'll be auditing the API for correctness and making any adjustments for members the automated code generator bound incorrectly. Hopefully within a couple of weeks I'll be able to move on to new features like GInterface Registration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1497451738703327403-6302181045614673417?l=mkestner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mkestner.blogspot.com/feeds/6302181045614673417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1497451738703327403&amp;postID=6302181045614673417' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/6302181045614673417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1497451738703327403/posts/default/6302181045614673417'/><link rel='alternate' type='text/html' href='http://mkestner.blogspot.com/2007/01/back-in-saddle.html' title='Back in the Saddle'/><author><name>Mike Kestner</name><uri>http://www.blogger.com/profile/08052527685396071752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
