<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TylerBurton.ca &#187; Windows</title>
	<atom:link href="http://www.tylerburton.ca/tag/windows/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tylerburton.ca</link>
	<description></description>
	<lastBuildDate>Tue, 10 Jan 2012 04:41:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Create a GTK+ application on Linux with Objective-C</title>
		<link>http://www.tylerburton.ca/2010/12/create-a-gtk-application-on-linux-with-objective-c/</link>
		<comments>http://www.tylerburton.ca/2010/12/create-a-gtk-application-on-linux-with-objective-c/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 03:12:06 +0000</pubDate>
		<dc:creator>Tyler Burton</dc:creator>
				<category><![CDATA[Created by Tyler Burton]]></category>
		<category><![CDATA[F/OSS]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[GNUstep]]></category>
		<category><![CDATA[GTK+]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.tylerburton.ca/?p=538</guid>
		<description><![CDATA[As sort of follow-up-in-spirit to my older post I decided to share a really straight forward way to use Objective-C to build GTK+ applications. Objective-what? Objective-C is an improvement to the iconic C programming language that remains backwards compatible while adding many new and interesting features. Chief among these additions is syntax for real objects [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>As sort of follow-up-in-spirit to <a href="http://www.tylerburton.ca/2010/03/the-case-for-objective-c/">my older post</a> I decided to share a really straight forward way to use Objective-C to build GTK+ applications.</p>
<p><strong>Objective-what?</strong></p>
<p><a href="http://en.wikipedia.org/wiki/Objective-C">Objective-C</a> is an improvement to the iconic <a href="http://en.wikipedia.org/wiki/C_%28programming_language%29">C programming language</a> that remains backwards compatible while adding many new and interesting features. Chief among these additions is syntax for real objects (and thus <a href="http://en.wikipedia.org/wiki/Object-oriented_programming">object-oriented programming</a>). Popularized by <a href="http://en.wikipedia.org/wiki/NeXT">NeXT</a> and eventually <a href="http://www.apple.com">Apple</a>, Objective-C is most commonly seen in development for Apple OSX and iOS based platforms. It ships with or without a large standard library (sometimes referred to as the <a href="http://en.wikipedia.org/wiki/GNUstep#Foundation_Kit">Foundation Kit</a> library) that makes it very easy for developers to quickly create fast and efficient programs. The result is a language that compiles down to binary, requires no virtual machines (just a runtime library), and achieves performance comparable to C and C++.</p>
<p><strong>Marrying Objective-C with GTK+</strong></p>
<p>Normally when writing a <a href="http://en.wikipedia.org/wiki/GTK%2B">GTK+</a> application the language (or a library) will supply you with <a href="http://en.wikipedia.org/wiki/GTK%2B#Programming_language_bindings">bindings</a> that let you create GUIs in a way native to that language. So for instance in <a href="http://en.wikipedia.org/wiki/C%2B%2B">C++</a> you would create GTK+ objects, whereas in C you would create structures or ask functions for pointers back to the objects. Unfortunately while there used to exist a couple of different Objective-C bindings for GTK+, all of them are quite out of date. So instead we are going to rely on the fact that Objective-C is backwards compatible with C to get our program to work.</p>
<p><strong>What you need to start</strong></p>
<p>I&#8217;m going to assume that <a href="http://www.ubuntu.com">Ubuntu</a> will be our operating system for development. To ensure that we have what we need to compile the programs, just install the following packages:</p>
<ol>
<li>gnustep-core-devel</li>
<li>libgtk2.0-dev</li>
</ol>
<p>As you can see from the list above we will be using <a href="http://en.wikipedia.org/wiki/GNUstep">GNUstep</a> as our Objective-C library of choice.</p>
<p><strong>Setting it all up</strong></p>
<p>In order to make this work we will be creating two Objective-C classes, one that will house our GTK+ window and another that will actually start our program. I&#8217;m going to call my GTK+ object MainWindow and create the two necessary files: <em>MainWindow.h</em> and <em>MainWindow.m</em>. Finally I will create a <em>main.m</em> that will start the program and clean it up after it is done. <strong></strong></p>
<p><strong>Let me apologize here for the poor code formatting; apparently WordPress likes to destroy whatever I try and do to make it better. If you want properly indented code please see the download link below.</strong></p>
<p><strong>MainWindow.h</strong></p>
<p>In the MainWindow.h file put the following code:</p>
<blockquote><p>#import &lt;gtk/gtk.h&gt;<br />
#import &lt;Foundation/NSObject.h&gt;<br />
#import &lt;Foundation/NSString.h&gt;</p>
<p>//A pointer to this object (set on init) so C functions can call<br />
//Objective-C functions<br />
id myMainWindow;</p>
<p>/*<br />
* This class is responsible for initializing the GTK render loop<br />
* as well as setting up the GUI for the user. It also handles all GTK<br />
* callbacks for the winMain GtkWindow.<br />
*/<br />
@interface MainWindow : NSObject<br />
{<br />
//The main GtkWindow<br />
GtkWidget *winMain;<br />
GtkWidget *button;<br />
}</p>
<p>/*<br />
* Constructs the object and initializes GTK and the GUI for the<br />
* application.<br />
*<br />
* *********************************************************************<br />
* Input<br />
* *********************************************************************<br />
* argc (int *):    A pointer to the arg count variable that was passed<br />
*             in at the application start. It will be returned<br />
*            with the count of the modified argv array.<br />
* argv (char *[]):     A pointer to the argument array that was passed in<br />
*            at the application start. It will be returned with<br />
*            the GTK arguments removed.<br />
*<br />
* *********************************************************************<br />
* Returns<br />
* *********************************************************************<br />
* MainWindow (id):    The constructed object or nil<br />
* arc (int *):        The modified input int as described above<br />
* argv (char *[]):    The modified input array modified as described above<br />
*/<br />
-(id)initWithArgCount:(int *)argc andArgVals:(char *[])argv;</p>
<p>/*<br />
* Frees the Gtk widgets that we have control over<br />
*/<br />
-(void)destroyWidget;</p>
<p>/*<br />
* Starts and hands off execution to the GTK main loop<br />
*/<br />
-(void)startGtkMainLoop;</p>
<p>/*<br />
* Example Objective-C function that prints some output<br />
*/<br />
-(void)printSomething;</p>
<p>/*<br />
********************************************************<br />
* C callback functions<br />
********************************************************<br />
*/</p>
<p>/*<br />
* Called when the user closes the window<br />
*/<br />
void on_MainWindow_destroy(GtkObject *object, gpointer user_data);</p>
<p>/*<br />
* Called when the user presses the button<br />
*/<br />
void on_btnPushMe_clicked(GtkObject *object, gpointer user_data);</p>
<p>@end</p></blockquote>
<p><strong>MainWindow.m</strong></p>
<p>For the class&#8217; actual code file fill it in as show below. This class will create a GTK+ window with a single button and will react to both the user pressing the button, and closing the window.</p>
<blockquote><p>#import &#8220;MainWindow.h&#8221;</p>
<p>/*<br />
* For documentation see MainWindow.h<br />
*/</p>
<p>@implementation MainWindow</p>
<p>-(id)initWithArgCount:(int *)argc andArgVals:(char *[])argv<br />
{<br />
//call parent class&#8217; init<br />
if (self = [super init]) {</p>
<p>//setup the window<br />
winMain = gtk_window_new (GTK_WINDOW_TOPLEVEL);</p>
<p>gtk_window_set_title (GTK_WINDOW (winMain), &#8220;Hello World&#8221;);<br />
gtk_window_set_default_size(GTK_WINDOW(winMain), 230, 150);</p>
<p>//setup the button<br />
button = gtk_button_new_with_label (&#8220;Push me!&#8221;);</p>
<p>gtk_container_add (GTK_CONTAINER (winMain), button);</p>
<p>//connect the signals<br />
g_signal_connect (winMain, &#8220;destroy&#8221;, G_CALLBACK (on_MainWindow_destroy), NULL);<br />
g_signal_connect (button, &#8220;clicked&#8221;, G_CALLBACK (on_btnPushMe_clicked), NULL);</p>
<p>//force show all<br />
gtk_widget_show_all(winMain);<br />
}</p>
<p>//assign C-compatible pointer<br />
myMainWindow = self;</p>
<p>//return pointer to this object<br />
return self;<br />
}</p>
<p>-(void)startGtkMainLoop<br />
{<br />
//start gtk loop<br />
gtk_main();<br />
}</p>
<p>-(void)printSomething{<br />
NSLog(@&#8221;Printed from Objective-C&#8217;s NSLog function.&#8221;);<br />
printf(&#8220;Also printed from standard printf function.\n&#8221;);<br />
}</p>
<p>-(void)destroyWidget{</p>
<p>myMainWindow = NULL;</p>
<p>if(GTK_IS_WIDGET (button))<br />
{<br />
//clean up the button<br />
gtk_widget_destroy(button);<br />
}</p>
<p>if(GTK_IS_WIDGET (winMain))<br />
{<br />
//clean up the main window<br />
gtk_widget_destroy(winMain);<br />
}<br />
}</p>
<p>-(void)dealloc{<br />
[self destroyWidget];</p>
<p>[super dealloc];<br />
}</p>
<p>void on_MainWindow_destroy(GtkObject *object, gpointer user_data)<br />
{<br />
//exit the main loop<br />
gtk_main_quit();<br />
}</p>
<p>void on_btnPushMe_clicked(GtkObject *object, gpointer user_data)<br />
{<br />
printf(&#8220;Button was clicked\n&#8221;);</p>
<p>//call Objective-C function from C function using global object pointer<br />
[myMainWindow printSomething];<br />
}</p>
<p>@end</p></blockquote>
<p><strong>main.m</strong></p>
<p>To finish I will write a main file and function that creates the MainWindow object and eventually cleans it up. Objective-C (1.0) does not support automatic garbage collection so it is important that we don&#8217;t forget to clean up after ourselves.</p>
<blockquote><p>#import &#8220;MainWindow.h&#8221;<br />
#import &lt;Foundation/NSAutoreleasePool.h&gt;</p>
<p>int main(int argc, char *argv[]) {</p>
<p>//create an AutoreleasePool<br />
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];</p>
<p>//init gtk engine<br />
gtk_init(&amp;argc, &amp;argv);</p>
<p>//set up GUI<br />
MainWindow *mainWindow = [[MainWindow alloc] initWithArgCount:&amp;argc andArgVals:argv];</p>
<p>//begin the GTK loop<br />
[mainWindow startGtkMainLoop];</p>
<p>//free the GUI<br />
[mainWindow release];</p>
<p>//drain the pool<br />
[pool release];</p>
<p>//exit application<br />
return 0;<br />
}</p></blockquote>
<p><strong>Compiling it all together</strong></p>
<p>Use the following command to compile the program. This will automatically include <strong>all</strong> <em>.m</em> files in the current directory so be careful when and where you run this.</p>
<p>gcc `pkg-config &#8211;cflags &#8211;libs gtk+-2.0` -lgnustep-base -fconstant-string-class=NSConstantString -o &#8220;./myprogram&#8221; $(find . -name &#8216;*.m&#8217;) -I /usr/include/GNUstep/ -L /usr/lib/GNUstep/ -std=c99 -O3</p>
<p>Once complete you will notice a new executable in the directory called <em>myprogram</em>. Start this program and you will see our GTK+ window in action.</p>
<p><a href="http://www.tylerburton.ca/files/wordpress/2010/12/window1.jpg"><img class="aligncenter size-full wp-image-546" title="window1" src="http://www.tylerburton.ca/files/wordpress/2010/12/window1.jpg" alt="" width="242" height="186" /></a></p>
<p>If you run it from the command line you can see the output that we coded when the button is pushed.</p>
<p><a href="http://www.tylerburton.ca/files/wordpress/2010/12/window2.jpg"><img class="aligncenter size-full wp-image-547" title="window2" src="http://www.tylerburton.ca/files/wordpress/2010/12/window2.jpg" alt="" width="658" height="289" /></a></p>
<p><strong>Wrapping it up</strong></p>
<p>There you have it. We now have a program that is written in Objective-C, using C&#8217;s native GTK+ &#8216;bindings&#8217; for the GUI, that can call both regular C and Objective-C functions and code. In addition, thanks to the porting of both GTK+ and GNUstep to Windows, this same code will also produce a cross-platform application that works on both Mac OSX and Windows.</p>
<p><strong>Source Code Downloads</strong></p>
<table border="1">
<tbody>
<tr>
<td></td>
<td><strong>Source Only Package</strong></td>
</tr>
<tr>
<td><strong>File name:</strong></td>
<td>objective_c_gtk_source.zip</td>
</tr>
<tr>
<td><strong>File hashes:</strong></td>
<td style="text-align: center;"><a href="http://www.tylerburton.ca/files/hashes/objective_c_gtk_source.hashes.txt">Download Here</a></td>
</tr>
<tr>
<td><strong>File size:</strong></td>
<td>2.4KB</td>
</tr>
<tr>
<td><strong>File download:</strong></td>
<td style="text-align: center;"><a href="http://www.tylerburton.ca/files/apps/objective_c_gtk_source.zip">Download Here</a></td>
</tr>
</tbody>
</table>
<div class="shr-publisher-538"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.tylerburton.ca/2010/12/create-a-gtk-application-on-linux-with-objective-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compile Windows programs on Linux</title>
		<link>http://www.tylerburton.ca/2010/09/compile-windows-programs-on-linux/</link>
		<comments>http://www.tylerburton.ca/2010/09/compile-windows-programs-on-linux/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 18:25:53 +0000</pubDate>
		<dc:creator>Tyler Burton</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[mingw]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.tylerburton.ca/?p=429</guid>
		<description><![CDATA[Windows?? *GASP!* Sometimes you just have to compile Windows programs from the comfort of your Linux install. This is a relatively simple process that basically requires you to only install the following (Ubuntu) packages: To compile 32-bit programs mingw32 (swap out for gcc-mingw32 if you need 64-bit support) mingw32-binutils mingw32-runtime Additionally for 64-bit programs (*PLEASE [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Windows?? <strong>*GASP!*</strong></p>
<p>Sometimes you just have to compile Windows programs from the comfort  of your Linux install. This is a relatively simple process that  basically requires you to only install the following (Ubuntu) packages:</p>
<p><strong>To compile 32-bit programs</strong></p>
<ul>
<li>mingw32 (swap out for gcc-mingw32 if you need 64-bit support)</li>
<li>mingw32-binutils</li>
<li>mingw32-runtime</li>
</ul>
<p><strong>Additionally for 64-bit programs (*PLEASE SEE NOTE)<br />
</strong></p>
<ul>
<li>mingw-w64</li>
<li>gcc-mingw32</li>
</ul>
<p>Once you have those packages you just need to swap out &#8220;gcc&#8221; in your  normal compile commands with either &#8220;i586-mingw32msvc-gcc&#8221; (for 32-bit)  or &#8220;amd64-mingw32msvc-gcc&#8221; (for 64-bit). So for example if we take the  following hello world program in C</p>
<blockquote><p>#include &lt;stdio.h&gt;<br />
int main(int argc, char** argv)<br />
{<br />
printf(&#8220;Hello world!\n&#8221;);<br />
return 0;<br />
}</p></blockquote>
<p>we can compile it to a 32-bit Windows program by using something  similar to the following command (assuming the code is contained within a  file called <em>main.c</em>)</p>
<blockquote><p>i586-mingw32msvc-gcc -Wall &#8220;main.c&#8221; -o &#8220;Program.exe&#8221;</p></blockquote>
<p>You can even compile Win32 GUI programs as well. Take the following code as an example</p>
<blockquote><p>#include &lt;windows.h&gt;<br />
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)<br />
{<br />
char *msg = &#8220;The message box&#8217;s message!&#8221;;<br />
MessageBox(NULL, msg, &#8220;MsgBox Title&#8221;, MB_OK | MB_ICONINFORMATION);</p>
<p>return 0;<br />
}</p></blockquote>
<p>this time I&#8217;ll compile it into a 64-bit Windows application using</p>
<blockquote><p>amd64-mingw32msvc-gcc -Wall -mwindows &#8220;main.c&#8221; -o &#8220;Program.exe&#8221;</p></blockquote>
<p>You can even test to make sure it worked properly by running the program through <a href="http://www.winehq.org/">wine</a> like</p>
<blockquote><p>wine Program.exe</p></blockquote>
<p>You might need to install some extra packages to get Wine to run 64-bit applications but in general this will work.</p>
<p>That&#8217;s pretty much it. You might have a couple of other issues (like  linking against Windows libraries instead of the Linux ones) but overall  this is a very simple drop-in replacement for your regular <em>gcc</em> command.</p>
<p><strong>*NOTE:</strong> There is currently a problem with the Lucid packages for the 64-bit compilers. As a work around you can get the packages from <a href="https://launchpad.net/%7Epali/+archive/pali" target="_blank">this PPA instead</a>.</p>
<div class="shr-publisher-429"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.tylerburton.ca/2010/09/compile-windows-programs-on-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The return of the Hash Verifier</title>
		<link>http://www.tylerburton.ca/2009/11/the-return-of-the-hash-verifier/</link>
		<comments>http://www.tylerburton.ca/2009/11/the-return-of-the-hash-verifier/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 01:26:24 +0000</pubDate>
		<dc:creator>Tyler Burton</dc:creator>
				<category><![CDATA[Created by Tyler Burton]]></category>
		<category><![CDATA[F/OSS]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[hash verifier]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[MonoDevelop]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows.Forms]]></category>

		<guid isPermaLink="false">http://www.tylerburton.ca/?p=105</guid>
		<description><![CDATA[Some of you may remember an old Windows program of mine called Hash Verifier. It was a graphical utility that allowed people to generate hashes of their files, and then compare those to known hashes, ensuring that their files had not been corrupted. Well in recent months my foray into the world of Linux has [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Some of you may remember an old Windows program of mine called <a href="http://www.tylerburton.ca/2009/09/hash-verifier/" target="_blank">Hash Verifier</a>. It was a graphical utility that allowed people to generate <a href="http://en.wikipedia.org/wiki/Cryptographic_hash_function" target="_blank">hashes</a> of their files, and then compare those to known hashes, ensuring that their files had not been corrupted. Well in recent months my foray into <a href="http://www.thelinuxexperiment.com" target="_blank">the world of Linux</a> has finally taken me into the realm of programming on that platform. Being primarily a <a href="http://en.wikipedia.org/wiki/.NET_Framework" target="_blank">.NET</a> developer on Windows I have found the <a href="http://mono-project.com/Main_Page" target="_blank">Mono project</a> on Linux to be an absolute breath of fresh air.</p>
<h2>&#8220;Monkey&#8221; project</h2>
<p>The Mono project is an open source implementation of Microsoft&#8217;s .NET common language runtime and a C# compiler. On Linux the easiest way to program in a Mono language is within the project&#8217;s own integrated development environment called <a href="http://en.wikipedia.org/wiki/MonoDevelop" target="_blank">MonoDevelop</a>.</p>
<h2>C is a sharp language</h2>
<p><a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29" target="_blank">C#</a> is a very powerful programming language that falls somewhere between <a href="http://en.wikipedia.org/wiki/C_%28programming_language%29" target="_blank">C</a> and <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29" target="_blank">Java</a> in terms of syntax. While my experience with C# has been limited in the past, I was easily able to pick it up quickly thanks to my background in both C and Java, as well as fellow .NET language <a href="http://en.wikipedia.org/wiki/Visual_Basic_.NET" target="_blank">Visual Basic</a>.</p>
<h2>The challenge</h2>
<p>Digging up an old .NET project of mine, Hash Verifier, I decided to challenge myself to port the application to Mono. In order to do this I needed to accomplish the following:</p>
<ul>
<li>The original application ran on Microsoft&#8217;s .NET on the Windows platform. The new application must run on both .NET on Windows and Mono on supported platforms.</li>
<li>The original application was written in Visual Basic. The new application must be written in C#.</li>
<li>The original application has a GUI powered by the native Windows.Forms. The new application needs to have a GUI that works in a similar way on all platforms.</li>
<li>The new application must be able to fully re-create all of the old application&#8217;s features and functions.</li>
</ul>
<h2>Porting = easy<span style="text-decoration: underline;"><strong><br />
</strong></span></h2>
<p>I must say that porting this old application to C#/Mono was a relatively straightforward task. Although I had plenty of <a href="http://www.mono-project.com/Gui_Toolkits" target="_blank">GUI toolkits to choose from</a> I ended up sticking with the existing Windows.Forms. Once I had decided on using Windows.Forms as the basis for my GUI (<a href="http://www.mono-project.com/WinForms" target="_blank">WinForms</a> is a free and open source implementation for non-Windows users!) I set out to create my new application. I was literally able to open the old Visual Basic GUI designer file, copy the code into my Mono workspace, change the syntax to C# and voila it worked!</p>
<p>In fact the only tricky part was trying to figure out a compatibility issue that .NET/Mono 2.0 seem to have with the new <a href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation" target="_blank">Windows Presentation Foundation (WPF)</a>. I&#8217;ll save you the gory details but basically drag and drop functionality would not work. I eventually rectified this issue by including a compiler flag telling .NET/Mono to execute the form in <a href="http://www.csharphelp.com/archives3/archive558.html" target="_blank">single thread apartments</a> mode. You can see where I did this in my code by looking right above my static main function:</p>
<blockquote><p>[STAThreadAttribute]<br />
public static void Main()<br />
{<br />
&#8230;<br />
}</p></blockquote>
<h2>Final result</h2>
<p>With the application complete I must say I am impressed. Crafting and running applications for Mono is extraordinarily simple to do, seems very powerful, and the application itself only takes up a couple of MiB to run. In the future I definitely plan on doing more of this type of development now that I am using different operating systems every day.</p>
<h2>Hash Verifier<span style="text-decoration: underline;"><strong><br />
</strong></span></h2>
<p>If you are <a href="http://www.jonathanfritz.ca/software/automating-command-line-applications-in-visualbasic-dot-net" target="_blank">still</a> <a href="http://www.jonathanfritz.ca/software/opengl-in-visualstudionet-with-the-tao-framework" target="_blank">using</a> the <a href="http://www.jonathanfritz.ca/software/areca-the-open-sourced-backup-solution" target="_blank">old</a> version of Hash Verifier, or if you would just like to try it out you can download the new Hash Verifier in two different ways. The package marked <em>binary only</em> contains just the program itself and the relevant documentation. The package marked <em>all</em> contains both the program, documentation as well as the source code.</p>
<p><em>Requirements:</em></p>
<ul>
<li><strong>All platforms:</strong> .NET 2.0+ / Mono, a graphical display</li>
<li><strong>*nix platforms:</strong> WinForms (identified as System.Windows.Forms)</li>
</ul>
<table border="1">
<tbody>
<tr>
<td></td>
<td><strong>Binary Only Package</strong></td>
<td><strong>All Package</strong></td>
</tr>
<tr>
<td><strong>File name:</strong></td>
<td>hash_verifier_0_1_0_0_binary.zip</td>
<td>hash_verifier_0_1_0_0_all.zip</td>
</tr>
<tr>
<td><strong>File hashes:</strong></td>
<td style="text-align: center;" colspan="2"><a href="http://www.tylerburton.ca/files/hashes/hash_verifier_0_1_0_0.hashes.txt">Download Here</a></td>
</tr>
<tr>
<td><strong>GPG signature:</strong></td>
<td><a href="http://www.tylerburton.ca/files/sigs/hash_verifier_0_1_0_0_binary.zip.sig" target="_blank">Download Here</a></td>
<td><a href="http://www.tylerburton.ca/files/sigs/hash_verifier_0_1_0_0_all.zip.sig" target="_blank">Download Here</a></td>
</tr>
<tr>
<td><strong>License:</strong></td>
<td style="text-align: center;" colspan="2">(LGPL) <a href="http://www.gnu.org/licenses/lgpl.html" target="_blank">View Here</a></td>
</tr>
<tr>
<td><strong>Version:</strong></td>
<td style="text-align: center;" colspan="2">0.1.0.0</td>
</tr>
<tr>
<td><strong>File download:</strong></td>
<td><a href="http://www.tylerburton.ca/files/apps/hash_verifier_0_1_0_0_binary.zip" target="_blank">Download Here</a></td>
<td><a href="http://www.tylerburton.ca/files/apps/hash_verifier_0_1_0_0_all.zip" target="_blank">Download Here</a></td>
</tr>
</tbody>
</table>
<div class="shr-publisher-105"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.tylerburton.ca/2009/11/the-return-of-the-hash-verifier/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Of eye candy and desktop environments</title>
		<link>http://www.tylerburton.ca/2009/10/of-eye-candy-and-desktop-environments/</link>
		<comments>http://www.tylerburton.ca/2009/10/of-eye-candy-and-desktop-environments/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 23:46:52 +0000</pubDate>
		<dc:creator>Tyler Burton</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[graphics]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[The Linux Experiment]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.tylerburton.ca/?p=94</guid>
		<description><![CDATA[As a long time Windows user I have had my fair share of dull, gray toolbars, buttons and controls. Prior to Windows Vista, Microsoft&#8217;s first real attempt to pretty up the system &#8211; sorry XP, making the taskbar blue just doesn&#8217;t cut it &#8211; I even looked to Mac OSX with some jealousy. Flash forward [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>As a long time Windows user I have had my fair share of dull, gray toolbars, buttons and controls. Prior to Windows Vista, Microsoft&#8217;s first real attempt to pretty up the system &#8211; sorry XP, making the taskbar blue just doesn&#8217;t cut it &#8211; I even looked to Mac OSX with some jealousy.</p>
<p>Flash forward to <a href="http://www.thelinuxexperiment.com" target="_blank">The Linux Experiment</a> and I have been introduced to a whole new set of environment graphics. Some of them are quite beautiful and some are just&#8230; plain ugly. On the plus side, the nice thing about Linux is it&#8217;s ability to customize just about every detail, including how my desktop looks. But is there really any excuse for some of the horrible themes, colour choices (*cough* <a href="http://en.wikipedia.org/wiki/Ubuntu_%28operating_system%29" target="_blank">Ubuntu</a> *cough*), and graphics that are <em>still</em> present in Linux today? Surely there are some artists out there in the open source community that could be let loose on these problems? Come on people, I know you can do better!</p>
<div class="shr-publisher-94"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.tylerburton.ca/2009/10/of-eye-candy-and-desktop-environments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

