<?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>El Tramo &#187; C++</title>
	<atom:link href="http://el-tramo.be/blog/tag/c/feed" rel="self" type="application/rss+xml" />
	<link>http://el-tramo.be</link>
	<description>Remko Tronçon&#039;s Homepage</description>
	<lastBuildDate>Fri, 11 Jun 2010 19:08:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>“Beautiful Testing” XMPP Chapter</title>
		<link>http://el-tramo.be/blog/beautiful-xmpp-testing-intro</link>
		<comments>http://el-tramo.be/blog/beautiful-xmpp-testing-intro#comments</comments>
		<pubDate>Sun, 03 May 2009 11:57:21 +0000</pubDate>
		<dc:creator>Remko Tronçon</dc:creator>
				<category><![CDATA[Swift]]></category>
		<category><![CDATA[Writing]]></category>
		<category><![CDATA[Books]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[Nothing But Nets]]></category>
		<category><![CDATA[O’Reilly]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<category><![CDATA[XMPP]]></category>

		<guid isPermaLink="false">http://el-tramo.be/?p=367</guid>
		<description><![CDATA[Adam Goucher and Tim Riley (Director of QA at Mozilla) announced a few months ago that they are putting together a Beautiful Testing book for O’Reilly. I took the opportunity to write a chapter about testing in the context of XMPP (more specifically, about testing protocol implementations in Swift),  and just submitted the final [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adam.goucher.ca/">Adam Goucher</a> and Tim Riley (Director of QA at Mozilla) <a href="http://adam.goucher.ca/?p=684">announced</a> a few months ago that they are putting together a <a href="http://oreilly.com/catalog/9780596159818"><em>Beautiful Testing</em></a> book for O’Reilly. I took the opportunity to write a chapter about testing in the context of XMPP (more specifically, about testing protocol implementations in <a href="http://swift.im">Swift</a>),  and just submitted the final draft for technical review. The book is expected to be released this August.</p>
<p><span id="more-367"></span>Although there are many types of testing being done in the XMPP world, the chapter focuses on the beauty of testing the functionality of XMPP protocol implementations. After a brief introduction on XMPP, it starts out with a description of unit testing simple IQ request/response protocols, and  then gradually moves on to higher-level testing of more complex, multi-stage protocols such as session initialization. As you might expect from a developer like me, the chapter is quite heavy on the (C++) code, but I’m told it compensates for the rest of the book <img src='http://el-tramo.be/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>As with all other books in the O’Reilly “Beautiful” series (which started with <em><a href="http://oreilly.com/catalog/9780596510046/">Beautiful Code</a></em>, but has since been followed up by <em><a href="http://oreilly.com/catalog/9780596517984/">Beautiful Architecture</a></em>, <em><a href="http://oreilly.com/catalog/9780596518028/">Beautiful Teams</a></em>, <em><a href="http://oreilly.com/catalog/9780596527488/">Beautiful Security</a></em>, and <em><a href="http://oreilly.com/catalog/9780596157111/">Beautiful Data</a></em>), all proceeds of the book go to charity, in this case <a href="http://www.nothingbutnets.net/">“Nothing But Nets”</a> (which provides mosquito netting to malaria infested areas of Africa). This means that I can plug this book as much as I want, and still have the feeling I’m actually doing a noble, unselfish thing. (contrary to when I casually mention that you can buy our book <em><a href="http://oreilly.com/catalog/9780596521264/">XMPP: The Definitive Guide</a></em> at very sharp prices these days). Some time after the book’s release this summer, I will even make a free version of the chapter available here, so check back soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://el-tramo.be/blog/beautiful-xmpp-testing-intro/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Improving QtTest usability with QtTestUtil</title>
		<link>http://el-tramo.be/blog/qttestutil</link>
		<comments>http://el-tramo.be/blog/qttestutil#comments</comments>
		<pubDate>Thu, 06 Nov 2008 17:49:09 +0000</pubDate>
		<dc:creator>Remko Tronçon</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[CppUnit]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[QtUnit]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://el-tramo.be/?p=223</guid>
		<description><![CDATA[As much as I like CppUnit for writing C++ unit tests, I still prefer using Qt&#8217;s built-in QtTest module for Qt-based projects. This avoids a dependency on an external library, lowering the threshold for running and writing unit tests. Unfortunately, QtTest is very basic, and lacks some useful features such as automatic test registration and [...]]]></description>
			<content:encoded><![CDATA[<p>As much as I like <a href="http://cppunit.sourceforge.net">CppUnit</a> for writing C++ unit tests, I still prefer using Qt&#8217;s built-in <a href="http://doc.trolltech.com/4.4/qttest.html">QtTest</a> module for Qt-based projects. This avoids a dependency on an external library, lowering the threshold for running and writing unit tests. Unfortunately, QtTest is very basic, and lacks some useful features such as automatic test registration and running multiple test suites in one test binary. In order to improve QtTest&#8217;s usability, I started creating some macros and classes that fill in some of the gaps, and bundled them into <a href="/git/qttestutil/snapshot/qttestutil-master.zip">QtTestUtil</a>.</p>
<p><span id="more-223"></span><br />
QtTest&#8217;s recommended way to write unit tests is to compile and link one test suite per class separately, and using the <code>QTEST_MAIN</code> macro to generate a <code>main()</code> that runs this particular test suite. However, this introduces quite a bit of overhead in writing (creating a project file for every test/class), building (linking a binary for every test/class), and running (running a separate binary for every test/class, usually using a custom script) all unit tests. This overhead is especially painful in a project with many classes. All this conflicts with the general rule that both creating and running unit tests should be very efficient, and makes QtTest not well suited for unit testing as it is.</p>
<p>A first attempt at solving this problem is by manually creating a <code>main()</code> function that runs all tests. For example:</p>
<blockquote>
<pre>#include "MyFirstTest.h"
#include "MySecondTest.h"

int main(int argc, char* argv) {
  int result = 0;
  MyFirstTest test1;
  result |= QTest::qExec(&amp;test1, argc, argv);
  MySecondTest test2;
  result |= QTest::qExec(&amp;test2, argc, argv);
  return result;
}</pre>
</blockquote>
<p>The resulting binary runs all listed test suites. The downside of this approach is that you have to write quite a bit of boilerplate code: every test binary needs to have its own <code>main()</code> function that explicitly runs all the tests in that test suite, and which needs to be put in a file that has to include all the tests separately. In order remedy this, I took the idea from CppUnit to provide a macro which auto-registers a test suite, and makes it easy to run all registered test suites at once. Creating a test suite is now as simple as creating a <code>.cpp</code> file for every unit test, adding a call to<br />
<code>QTTESTUTIL_REGISTER_TEST</code> to that file, and compiling that together with a shared <code>main()</code> that does nothing but call <code>runTests()</code> on the test registry. Since this <code>main()</code> does not explicitly depend on any test, QtTestUtil comes with a <a href="/git/qttestutil/tree/QtTestUtil/SimpleChecker.cpp"><code>SimpleChecker.cpp</code></a> containing this call, and which can be used by all unit test modules. As a result, no module needs to provide its own <code>main()</code> anymore.</p>
<p>An example of a unit test module using the macro and the shared checker described above can be found in the <a href="/git/qttestutil/tree/Example">Example</a> subdir of the <a href="/git/qttestutil">QtTestUtil repository</a>. It is worth noticing that these QtTest-based unit tests are more compact than the same unit test written in CppUnit (because the latter requires you to call a macro for every test in a fixture).</p>
<p>This is just a first set of utilities that QtTestUtil provides on top of QtTest. More utility classes and macros will be added as they are needed.</p>
]]></content:encoded>
			<wfw:commentRss>http://el-tramo.be/blog/qttestutil/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Mixing Cocoa and Qt</title>
		<link>http://el-tramo.be/blog/mixing-cocoa-and-qt</link>
		<comments>http://el-tramo.be/blog/mixing-cocoa-and-qt#comments</comments>
		<pubDate>Sat, 16 Aug 2008 11:47:20 +0000</pubDate>
		<dc:creator>Remko Tronçon</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Sparkle]]></category>

		<guid isPermaLink="false">http://el-tramo.be/?p=155</guid>
		<description><![CDATA[Qt does a great job at abstracting out platform-specific features into platform-independent C++ APIs. However, sometimes you still need to write platform-specific code for features that are not in Qt (e.g. to access the platform&#8217;s address book),  or to access platform-specific applications (e.g. iTunes) or libraries (e.g. Sparkle). On Mac OS X, almost all interfaces [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://trolltech.com/products/qt/index">Qt</a> does a great job at abstracting out platform-specific features into platform-independent C++ APIs. However, sometimes you still need to write platform-specific code for features that are not in Qt (e.g. to access the platform&#8217;s address book),  or to access platform-specific applications (e.g. iTunes) or libraries (e.g. <a href="http://sparkle.andymatuschak.org/">Sparkle</a>). On Mac OS X, almost all interfaces are offered through the <a href="http://developer.apple.com/cocoa/">Cocoa</a> Objective-C interface, and the interfaces that are written in C++ have been deprecated and will disappear soon in favor of Cocoa. Although the language of Cocoa is different from Qt&#8217;s, Qt and <a href="http://gcc.gnu.org">GCC</a> make it very easy to call these interfaces from within your application. In this post, I will show how this can be done by making an auto-updating application using Sparkle.</p>
<p><span id="more-155"></span></p>
<p>To create our auto-updating application, we first lay down the auto-updater interface in a (pure) virtual class:</p>
<blockquote>
<pre>class AutoUpdater {
  public:
    virtual void checkForUpdates() = 0;
};</pre>
</blockquote>
<p>The Sparkle implementation of this interface has the following C++ header:</p>
<blockquote>
<pre>class SparkleAutoUpdater : public AutoUpdater {
  public:
    SparkleAutoUpdater(const QString&amp; url);
    ~SparkleAutoUpdater();
    virtual void checkForUpdates();
  private:
    class Private;
    Private* d;
};</pre>
</blockquote>
<p>Note that I am using the <a href="http://c2.com/cgi/wiki?PimplIdiom">Pimpl</a> idiom to hide Cocoa-specific internals from the API into a private internal class.</p>
<p>The actual impementation of the <code>SparkleUpdater</code> needs to call Sparkle&#8217;s Objective-C API. However, we cannot write the implementation in Objective-C, since the header for our updater (which will be included from within our application) is written in C++. Luckily, GCC&#8217;s Objective-C++ extension allows you to mix Objective-C with C++ without any problem. So, we create an Objective-C++ implementation of our updater, and put it in a <code>.mm</code> file:</p>
<blockquote>
<pre>class SparkleAutoUpdater::Private {
  public:
    SUUpdater* updater;
};

SparkleAutoUpdater::SparkleAutoUpdater(const QString&amp; aUrl) {
  d = new Private;
  d-&gt;updater = [[SUUpdater sharedUpdater] retain];
  NSURL* url = [NSURL URLWithString:
      [NSString stringWithUTF8String: aUrl.toUtf8().data()]];
  [d-&gt;updater setFeedURL: url];
}

SparkleAutoUpdater::~SparkleAutoUpdater() {
  [d-&gt;updater release];
  delete d;
}

void SparkleAutoUpdater::checkForUpdates() {
  [d-&gt;updater checkForUpdatesInBackground];
}</pre>
</blockquote>
<p>All we do here is create an <code>SUUpdater</code> (Sparkle&#8217;s updater class), set it up, and activate it in our <code>checkForUpdates()</code> method.</p>
<p>To integrate Objective-C++ classes into a Qt project, <code>qmake</code> provides the <code>OBJECTIVE_SOURCES</code> variable. Knowing this, we add our new classes to our <code>qmake</code> project file:</p>
<blockquote>
<pre>HEADERS += AutoUpdater.h
SOURCES += AutoUpdater.cpp
mac {
  HEADERS += SparkleAutoUpdater.h
  OBJECTIVE_SOURCES += SparkleAutoUpdater.mm
  LIBS += -framework Sparkle
}</pre>
</blockquote>
<p>Before we integrate the updater into our application, there is still one detail we have to take care of: if you write Objective-C code that creates objects, you need to instantiate an <code>NSAutoReleasePool</code> to enable Cocoa&#8217;s memory management. Although we could do this in <code>SparkleAutoUpdater</code>, we&#8217;re going to put this in a separate initializer class, so we can share this with other Objective-C++ implementations in our application. The body of this class looks as follows:</p>
<blockquote>
<pre>class CocoaInitializer::Private {
  public:
    NSAutoreleasePool* autoReleasePool;
};

CocoaInitializer::CocoaInitializer() {
  d = new CocoaInitializer::Private();
  NSApplicationLoad();
  d-&gt;autoReleasePool = [[NSAutoreleasePool alloc] init];
}

CocoaInitializer::~CocoaInitializer() {
  [d-&gt;autoReleasePool release];
  delete d;
}</pre>
</blockquote>
<p>Now all that&#8217;s left to do is integrate all this into our application:</p>
<blockquote><p><code> </code></p>
<pre>int main(int argc, char* argv[]) {
  ...
  AutoUpdater* updater = 0;
#ifdef Q_WS_MAC
  CocoaInitializer cocoaInitiarizer;
  updater = new SparkleUpdater("http://el-tramo.be/myapp/appcast.xml");
#endif
  ...
  if (updater) {
    updater-&gt;checkForUpdates();
  }
  ...
}</pre>
</blockquote>
<p>That&#8217;s it! If you want to try this out yourself, just download the <a href="http://el-tramo.be/files/blog/mixing-cocoa-and-qt/mixing-cocoa-and-qt.zip">sources</a> of this mini-project, build them, and off you go. Don&#8217;t forget to remove <code>~/Library/Preferences/be.el-tramo.mixing-cocoa-and-qt.plist</code> to clear Sparkle&#8217;s state cache.</p>
]]></content:encoded>
			<wfw:commentRss>http://el-tramo.be/blog/mixing-cocoa-and-qt/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>:set noexpandtab</title>
		<link>http://el-tramo.be/blog/set-noexpandtab</link>
		<comments>http://el-tramo.be/blog/set-noexpandtab#comments</comments>
		<pubDate>Wed, 18 Jun 2008 20:58:24 +0000</pubDate>
		<dc:creator>Remko Tronçon</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Coding Style]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Tabs]]></category>

		<guid isPermaLink="false">http://el-tramo.be/?p=97</guid>
		<description><![CDATA[Google recently published a C++ style guide, containing all the rules that Google code adheres to. Many of the style tips are quite sensible, and well accepted by many developers out there. However, I was surprised to find the following rule:
Spaces vs. Tabs: Use only spaces, and indent 2 spaces at a time.
We use spaces for [...]]]></description>
			<content:encoded><![CDATA[<p>Google recently published a <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">C++ style guide</a>, containing all the rules that Google code adheres to. Many of the style tips are quite sensible, and well accepted by many developers out there. However, I was surprised to find the following rule:</p>
<blockquote><p><span><strong>Spaces vs. Tabs:</strong><em> Use only spaces, and indent 2 spaces at a time.<br />
<span style="font-style: normal;">We use spaces for indentation. Do not use tabs in your code. You should set your editor to emit spaces when you hit the tab key.</span></em></span></p></blockquote>
<p>I never really understood why so many people have such a hatred towards tabs. Is it just because they have seen code where some editor has mixed tabs with spaces (which of course results in a horrible mess)? Or do they have valid counter-arguments, even when tabs are used consistently?</p>
<p><span id="more-97"></span>Why would you force presentation of your code upon someone if you don&#8217;t need to? If you use tabs, you don&#8217;t need rules like ‘indent 2 spaces at a time’: I can choose whether I want 2 spaces, 4, or whatever indentation I feel most comfortable with when reading code. </p>
<p>After some discussion, the pro-space people typically come up with the following piece of code, where they have their parameter names aligned:</p>
<blockquote><p><code>
<pre>void SomeClass::someMethodName(int parameterA,
                               unsigned int parameterB,
                               std::string parameterC)
{
    ...
}</pre>
<p></code></p></blockquote>
<p>No, you can&#8217;t do that with tabs, that&#8217;s true. But why would you do that in the first place (unless you&#8217;re using an editor which does such annoying auto-formating automatically)? When your method name gets too long, it won&#8217;t fit on your screen anyway. Why don&#8217;t you indent 2 tabs for your parameter names instead:</p>
<blockquote><p><code>
<pre>void SomeClassWithALongName::someMethodName(
        unsigned int parameterA,
        int parameterB,
        std::string parameterC)
{
    ...
}</pre>
<p></code></p></blockquote>
<p>Another popular argument is aligning member declarations:</p>
<blockquote><p><code></p>
<pre>FooClass foo_;
Bar      bar_;</pre>
<p></code></p></blockquote>
<p>Same remark: why would you do this? Does it really make your code more readable? Besides, it doesn&#8217;t scale: whenever someone comes along and has to add a <code>VeryLongClassName</code> member, your alignment  will be messed up, and you will have to change every member again.</p>
<p>My opinion: let the person who reads your code decide how he/she wants to see it, and lay out your code in a way it is flexible to be seen with different view settings. This avoids lengthy discussions about whether tabs should be 2, 3, 4, or 13 spaces wide. Besides, people have been preaching the separation of presentation and content for ages for HTML and CSS, why would this be any different for code?</p>
]]></content:encoded>
			<wfw:commentRss>http://el-tramo.be/blog/set-noexpandtab/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Unit testing method overrides</title>
		<link>http://el-tramo.be/blog/unit-testing-overrides</link>
		<comments>http://el-tramo.be/blog/unit-testing-overrides#comments</comments>
		<pubDate>Fri, 07 Mar 2008 19:18:01 +0000</pubDate>
		<dc:creator>Remko Tronçon</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://el-tramo.be/blog/unit-testing-overrides</guid>
		<description><![CDATA[It probably happened to most of us developers before: while refactoring, you change the name of a virtual method, but forget to change the name of the overriding method in one of your derived classes. Compilation works fine, all unit tests pass, but your program doesn&#8217;t work: the overriding method is never called. Java (and [...]]]></description>
			<content:encoded><![CDATA[<p>It probably happened to most of us developers before: while refactoring, you change the name of a virtual method, but forget to change the name of the overriding method in one of your derived classes. Compilation works fine, all unit tests pass, but your program doesn&#8217;t work: the overriding method is never called. Java (and C#) programmers can avoid this problem by putting <code>@Override</code> (and <code>override</code>) in front of their methods, which causes the compiler to print out an error message if the method is not overriding anything. However, most other languages leave you hanging with this problem. Luckily, with statically typed languages like C++, you can avoid these bugs by slightly adapting your unit tests.</p>
<p><span id="more-82"></span></p>
<p>Suppose you have a base class <code>Oracle</code>, and a derived class <code>GeekyOracle</code>, defined as follows:<br />
<code></p>
<pre>  class Oracle {
    virtual int getLckyNmbr() {
      return 13;
    }
  };

  class GeekyOracle : public Oracle {
    virtual int getLckyNmbr() {
      return 42;
    }
  };</pre>
<p></code></p>
<p> </p>
<p>Being a good developer, you unit test <code>GeekyOracle</code>&#8217;s <code>getLckyNmbr()</code>:<br />
<code></p>
<pre>  void GeekyOracleTest::testGetLckyNmbr() {
    GeekyOracle* oracle = createGeekyOracle();
    assertEquals(42, oracle-&gt;getLckyNmbr());
  }</pre>
<p></code></p>
<p> </p>
<p>After a while, you realize that using abbreviations in method names is actually not very good practice, so you change your method name to something more readable:<br />
<code></p>
<pre>  class Oracle {
    virtual int getLuckyNumber() {
      return 13;
    }
  };</pre>
<p></code></p>
<p> </p>
<p>However, when you compile your program now, it is behaving completely different than before, although all unit tests passed. It requires manual debugging to find out that you forgot to rename <code>GeekyOracle</code>&#8217;s method as well, causing <code>Oracle</code>&#8217;s <code>getLuckyNumber()</code> to be executed, no matter what oracle you instantiate. Your unit tests didn&#8217;t catch this, because they test every method of a class separately, but don&#8217;t test the class being used in your application.</p>
<p>A way to check for this in your unit tests is to make sure that, when testing a virtual method, you always call it on an object that is <strong>statically typed with its base class</strong>. In our example, our unit test would call <code>getLckyNmbr()</code> on an <code>Oracle</code> instead of on a <code>GeekyOracle</code>:<br />
<code></p>
<pre>  void GeekyOracleTest::testGetLckyNmbr() {
    Oracle* oracle = createGeekyOracle();
    assertEquals(42, oracle-&gt;getLckyNmbr());
  }</pre>
<p></code></p>
<p> </p>
<p>This unit test will fail to compile when you change the method name of the base class, which avoids you end up with the silly bug in your program.</p>
<p>If your test allocates your object under test on the stack (e.g. for simplicity), you could use the following alternative:<br />
<code></p>
<pre>  void GeekyOracleTest::testGetLckyNmbr() {
    GeekyOracle oracle;
    assertEquals(42, ((Oracle*) &amp;oracle)-&gt;getLckyNmbr());
  }</pre>
<p></code></p>
<p> </p>
<p>However, since this degrades the readability of the test, I prefer to add a static helper method to my unit test, and write the test as follows:<br />
<code></p>
<pre>  static inline Oracle* p(Oracle&amp; foo) {
    return &amp;foo;
  }

  void GeekyOracleTest::testGetLckyNmbr() {
    GeekyOracle oracle;
    assertEquals(42, p(oracle)-&gt;getLckyNmbr());
  }</pre>
<p></code></p>
<p> </p>
<p> </p>
<p>Although I used C++ in my example, this technique should work for all statically typed languages. Advocates of dynamically typed languages claim they can compensate the lack of types by unit testing their classes properly; I wonder how they avoid this kind of problems, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://el-tramo.be/blog/unit-testing-overrides/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LGMTray: A Lightweight GMail Notifier</title>
		<link>http://el-tramo.be/blog/lgmtray</link>
		<comments>http://el-tramo.be/blog/lgmtray#comments</comments>
		<pubDate>Fri, 19 Oct 2007 16:11:43 +0000</pubDate>
		<dc:creator>Remko Tronçon</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[FreeDesktop.org]]></category>
		<category><![CDATA[GMail]]></category>
		<category><![CDATA[LGMTray]]></category>
		<category><![CDATA[Tray]]></category>

		<guid isPermaLink="false">http://el-tramo.be/blog/lgmtray</guid>
		<description><![CDATA[I have been looking for a Linux system tray application to notify me of new mail on my GMail account. Unfortunately, all the notifiers I found either did not run on Linux, or had dependencies I was unable to meet on my machine (because I lack system administrator privileges). This is why I wrote LGMTray, [...]]]></description>
			<content:encoded><![CDATA[<p>I have been looking for a Linux system tray application to notify me of new mail on my GMail account. Unfortunately, all the notifiers I found either did not run on Linux, or had dependencies I was unable to meet on my machine (because I lack system administrator privileges). This is why I wrote <a href="http://el-tramo.be/software/lgmtray">LGMTray</a>, a very basic GMail notifier, with very few dependencies.</p>
<p><span id="more-72"></span> LGMTray is implemented in C++, and only depends on <a href="http://curl.haxx.se/">libcurl</a> (for opening secure connections to the GMail server),  <a href="http://xmlsoft.org/">LibXML2</a> (for parsing the GMail feed), and libxpm (for rendering the icons). It uses the <a href="http://standards.freedesktop.org/systemtray-spec/latest/">FreeDesktop.org System Tray Specification</a> to dock the application to the system tray, and uses Xlib directly for all the graphical functions (drawing the icons, communicating with the tray, &#8230;). It is currently very limited in features, but will probably evolve in the future (depending on personal and other people&#8217;s interest).</p>
]]></content:encoded>
			<wfw:commentRss>http://el-tramo.be/blog/lgmtray/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
