<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.3" -->
<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/"
	>

<channel>
	<title>Vacuous Virtuoso &#187; Quicksilver</title>
	<link>http://lipidity.com</link>
	<description>Despotic Development</description>
	<pubDate>Wed, 02 Apr 2008 14:18:15 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
	<language>en</language>
			<item>
		<title>Quicksilver &#8216;cleaned&#8217;</title>
		<link>http://lipidity.com/apple/quicksilver/quicksilver-cleaned/</link>
		<comments>http://lipidity.com/apple/quicksilver/quicksilver-cleaned/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 10:12:40 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Quicksilver]]></category>

		<guid isPermaLink="false">http://lipidity.com/apple/quicksilver/quicksilver-cleaned/</guid>
		<description><![CDATA[Quicksilver&#8217;s losing weight; a far cry from the 30+ MB RAM usage it once required while idling. The speed at which it runs is also nearing &#8220;spectacular&#8221; status.



Not for human consumption. Yet.
]]></description>
			<content:encoded><![CDATA[<p>Quicksilver&#8217;s losing weight; a far cry from the 30+ MB RAM usage it once required while idling. The speed at which it runs is also nearing &#8220;spectacular&#8221; status.</p>

<p class="centre"><img style='border:1px solid #ccc;border-left:0' src="http://images.lipidity.com/QS-RAM-20080326-210458.png" alt="Quicksilver RAM usage" /></p>

<p>Not for human consumption. Yet.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/quicksilver/quicksilver-cleaned/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quicksilver B5X download</title>
		<link>http://lipidity.com/apple/quicksilver-b5x-download/</link>
		<comments>http://lipidity.com/apple/quicksilver-b5x-download/#comments</comments>
		<pubDate>Tue, 18 Dec 2007 06:34:37 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<category><![CDATA[Application]]></category>

		<category><![CDATA[Download]]></category>

		<guid isPermaLink="false">http://lipidity.com/apple/quicksilver-b5x-download/</guid>
		<description><![CDATA[A download link is up. I&#8217;ll be periodically uploading a compiled version of Quicksilver for those who&#8217;re keen on testing out the latest revisions.

The incompatibility with the File Tagging plugin hasn&#8217;t yet been worked out as the source isn&#8217;t available. If you&#8217;re using the download from B5X, be sure to disable this plugin until the [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://lipidity.com/software/quicksilver/">download link</a> is up. I&#8217;ll be periodically uploading a compiled version of Quicksilver for those who&#8217;re keen on testing out the latest revisions.</p>

<p>The incompatibility with the File Tagging plugin hasn&#8217;t yet been worked out as the source isn&#8217;t available. If you&#8217;re using the download from B5X, be sure to disable this plugin until the conflict is resolved.</p>

<p class='centre'><a href="http://lipidity.com/software/quicksilver/"><img src='http://lipidity.com/wordpress/wp-content/uploads/2007/12/file-conflict-panel.jpg' alt='The new Smart Replace option in the file conflict panel replaces old files only' title='Smart Replace' /></a></p>

<p>Note that some features (such as the &#8220;smart replace&#8221; pictured above) require setting the feature level to &#8220;developer&#8221;. You can do this by running the following two commands, then relaunching:</p>

<pre><code>defaults write com.blacktree.Quicksilver "Cutting Edge Features" -bool yes
defaults write com.blacktree.Quicksilver "Feature Level" 3
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/quicksilver-b5x-download/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quicksilver B5X branch</title>
		<link>http://lipidity.com/apple/quicksilver-b5x-branch/</link>
		<comments>http://lipidity.com/apple/quicksilver-b5x-branch/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 23:10:12 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<category><![CDATA[Application]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[Source Code]]></category>

		<guid isPermaLink="false">http://lipidity.com/apple/quicksilver-b5x-branch/</guid>
		<description><![CDATA[Just committed my changes to the subversion repository.

A few new features and general stability improvements, but mostly a very thorough cleanup of the source code, so you can actually compile it now.

Compilation Instructions

Open Xcode preferences, scroll across to Source Trees and add one with a Setting Name of &#8220;QSFrameworks&#8221; and path of /Applications/Quicksilver.app/Contents/Frameworks/.

Then unzip Quicksilver.xcodeproj.zip, [...]]]></description>
			<content:encoded><![CDATA[<p>Just committed my changes to the <a href="http://blacktree-alchemy.googlecode.com/svn/branches/B5X/">subversion repository</a>.</p>

<p>A few <a href="http://lipidity.com/apple/cleaning-up-quicksilver/">new features</a> and general stability improvements, but mostly a very thorough cleanup of the source code, so you can actually compile it now.</p>

<h4>Compilation Instructions</h4>

<p>Open Xcode preferences, scroll across to Source Trees and add one with a Setting Name of &#8220;QSFrameworks&#8221; and path of /Applications/Quicksilver.app/Contents/Frameworks/.</p>

<p>Then unzip Quicksilver.xcodeproj.zip, and open the Quicksilver.xcodeproj project in Xcode. Make sure you set the Active Build Configuration to &#8220;Release&#8221;. Click the Build button and you&#8217;re away.</p>

<p><strong>Note:</strong> This build appears to be incompatible with the File Tagging plugin.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/quicksilver-b5x-branch/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cleaning up Quicksilver</title>
		<link>http://lipidity.com/apple/cleaning-up-quicksilver/</link>
		<comments>http://lipidity.com/apple/cleaning-up-quicksilver/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 08:38:31 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[Source Code]]></category>

		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://lipidity.com/apple/cleaning-up-quicksilver/</guid>
		<description><![CDATA[Given the Quicksilver source code is now out in the open, I&#8217;m trying to learn from it while at the same time cleaning it up. Here&#8217;s what I&#8217;ve done so far.



Bug fixes

A lot of features were buried in the source, available only by setting some preferences to allow them. Mostly it was due to buggy [...]]]></description>
			<content:encoded><![CDATA[<p>Given the <a href="http://code.google.com/p/blacktree-alchemy/source">Quicksilver source code</a> is now out in the open, I&#8217;m trying to learn from it while at the same time cleaning it up. Here&#8217;s what I&#8217;ve done so far.</p>

<!--more-->

<h3>Bug fixes</h3>

<p>A lot of features were buried in the source, available only by setting some preferences to allow them. Mostly it was due to buggy implementation or pending improvements. I managed to resurrect a few of these nifty ones and fix a few old bugs that have annoyed me for ages.</p>

<h4>Color handling</h4>

<p>Color handling was commented out in the Quicksilver source; probably because it resulted in errors. A simple change in the source allowed correct handling of color values, and the code for drawing the icon was already there. I added functionality to allow dropping colors from the Quicksilver object pane into color wells and the like - which is what makes this useful.</p>

<p class="centre"><img src="http://images.lipidity.com/QS-Color-handling-20071207-185619.jpg" alt="Handling color in the object pane is now possible" title="A color stored in the object pane" /></p>

<h4>Uninstalled plugins</h4>

<p>Added a plugin set to the plugins preference pane to list plugins that you haven&#8217;t yet installed or downloaded. Not sure why this was commented out; I didn&#8217;t have to add any new code here.</p>

<p class="centre"><img src="http://images.lipidity.com/QS-Plug-ins-20071207-185845.jpg" alt="Uninstalled Plugins can now be listed" title="Listing uninstalled plugins in the preference pane" /></p>

<h4>Triggers</h4>

<p>There was a very annoying bug in the triggers preference pane that haunted me from the day I started using Quicksilver. Switching to the iTunes trigger set resulted in errors, and often froze or messed up Quicksilver. Finally, it&#8217;s fixed, and we can see and use these triggers.</p>

<p class="centre"><img src="http://images.lipidity.com/QS-Triggers-20071207-190435.jpg" alt="Quicksilver triggers preference pane has been fixed" /></p>

<p>Speaking of plugins; I think I heard mention of a &#8220;plugin check bug&#8221; fixed somewhere, but it wasn&#8217;t working for me so I&#8217;ve also fixed the issue where the plugin list would be blank until you hit refresh.</p>

<h4>Miscellaneous bug fixes</h4>

<p>Other things like crashing when you try to relaunch with the &#8220;Customize&#8221; preference pane open, and with the source, hundreds of warnings when trying to compile, errors in the shell scripts when working in a path with non-alphanumeric characters, etc. have also been fixed.</p>

<p class='centre'><img src="http://images.lipidity.com/QS-Customize-20071207-190804.jpg" alt="Fixed a crash with the Quicksilver customize pane" /></p>

<h3>Tidy up</h3>

<blockquote>
  <p>[I wonder] how long it&#8217;ll take people to notice the Frankensteinian nature of the source and respond  - appropriately - with pitchforks. <cite><a href="http://twitter.com/alcor/statuses/388774142" rel="nofollow">Alcor</a></cite></p>
</blockquote>

<p>I&#8217;ll have to agree with Alcor - to say the source is a mess would be an understatement. There are hundreds of compiler warnings, unused or unimplemented features, classes, objects, code, structures, nibs, etc. Hundreds. I&#8217;ve tried to remove as much of the redundant or test code as possible and I&#8217;ve yet to reach the end. Mind you, I&#8217;ve been doing this for hours a day for the past week. The formatting and indentation is almost as bad. I&#8217;m cleaning that up too, with some good old regular expressions and elbow grease. As I go, I&#8217;m also trying to improve the logic where I see potential for improvement. Already the application is feeling more responsive but I want to also reduce the memory footprint.</p>

<p>Why go to all this trouble? Mainly, to</p>

<ul>
<li>Make the source more readable; make it easier for people to understand what&#8217;s going on.</li>
<li>Improve the performance of the application in both speed and memory usage.</li>
<li>Fix existing bugs and add new features.</li>
</ul>

<hr />

<p>In the meantime, I&#8217;ll continue my clean up of the Quicksilver source and when it&#8217;s lookin&#8217; fine perhaps post it up (the QS license doesn&#8217;t really say much about the source, so I might have to ask Alcor first. Perhaps he&#8217;d like to add it to the subversion repository after reviewing?).</p>

<p>Lastly, let me just say, I&#8217;ve learnt a lot from looking at the source code to Quicksilver. There are some very neat tricks in there, and great little snippets that could be very useful elsewhere. So thank you Mr. Jitkoff; thank you for writing the application, and thank you for the releasing the source code. It is highly appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/cleaning-up-quicksilver/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Another guide to Quicksilver</title>
		<link>http://lipidity.com/apple/another-guide-to-quicksilver/</link>
		<comments>http://lipidity.com/apple/another-guide-to-quicksilver/#comments</comments>
		<pubDate>Tue, 04 Dec 2007 10:49:13 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[Review]]></category>

		<category><![CDATA[Source Code]]></category>

		<guid isPermaLink="false">http://lipidity.com/general/another-guide-to-quicksilver/</guid>
		<description><![CDATA[Joe Dunn is doing a nice series of articles on Quicksilver. He&#8217;s covered triggers and scripts so far with more on the way.

One thing I disagree with, though, is the excessive use of the &#8220;do shell script&#8221; AppleScript. I like the &#8220;Run Command in Shell&#8221; action just fine. But if you want an icon, writing [...]]]></description>
			<content:encoded><![CDATA[<p>Joe Dunn is doing a nice series of articles on Quicksilver. He&#8217;s covered <a href="http://jwdunn.com/2007/11/24/how-i-use-quicksilver-i-triggers/">triggers</a> and <a href="http://jwdunn.com/2007/11/29/how-i-use-quicksilver-ii-scripts/">scripts</a> so far with more on the way.</p>

<p>One thing I disagree with, though, is the excessive use of the &#8220;do shell script&#8221; AppleScript. I like the &#8220;Run Command in Shell&#8221; action just fine. But if you want an icon, writing an Obj-C wrapper isn&#8217;t too much work. Especially since you have <a href="http://pub.lipidity.com/CocoaShell.tar.bz2">this source code</a>.</p>

<p>I&#8217;ve also got a bit more on Quicksilver coming up shortly.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/another-guide-to-quicksilver/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quicksilver Smoke</title>
		<link>http://lipidity.com/apple/quicksilver-smoke/</link>
		<comments>http://lipidity.com/apple/quicksilver-smoke/#comments</comments>
		<pubDate>Fri, 23 Nov 2007 03:53:18 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<category><![CDATA[Animation]]></category>

		<category><![CDATA[Download]]></category>

		<category><![CDATA[GUI]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[smoke]]></category>

		<guid isPermaLink="false">http://lipidity.com/apple/quicksilver-smoke/</guid>
		<description><![CDATA[I wrote this a while back as part of the Quicksilver Internal Commands tutorial. The plugin hooks onto the current Quicksilver interface so you can watch it go up in flames.





If you&#8217;re interested in this sort of thing, you can download the Quicksilver Smoke Actions plugin here.
]]></description>
			<content:encoded><![CDATA[<p>I wrote this a while back as part of the <a href="http://lipidity.com/apple/quicksilver-internal-commands/">Quicksilver Internal Commands</a> tutorial. The plugin hooks onto the current Quicksilver interface so you can watch it go up in flames.</p>

<!--more-->

<p class='centre'><a rel="lightbox" href="http://dev.lipidity.com/wp-content/uploads/2007/06/primer-smoking.jpg" title="Quicksilver Primer interface smoking"><img src="http://dev.lipidity.com/wp-content/uploads/2007/06/primer-smoking-thumb.jpg" alt="[Primer interface smoking]" title="Quicksilver Primer interface smoking" width="426" height="343" class='feature' /></a></p>

<p>If you&#8217;re interested in this sort of thing, you can download the Quicksilver Smoke Actions plugin <a href="http://lipidity.com/plugins/quicksilver/smoke">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/quicksilver-smoke/feed/</wfw:commentRss>
		</item>
		<item>
		<title>IconGrabber</title>
		<link>http://lipidity.com/apple/icongrabber/</link>
		<comments>http://lipidity.com/apple/icongrabber/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 07:51:15 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Application]]></category>

		<category><![CDATA[Download]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<guid isPermaLink="false">http://lipidity.com/apple/icongrabber/</guid>
		<description><![CDATA[
I often need to use OS X icons on the web. Unfortunately, it&#8217;s not an easy matter to extract icons from Mac files or folders. The solution? IconGrabber.



It couldn&#8217;t be easier. Just drop the file or folder that you want the icon from onto IconGrabber, and choose a place to save it. The extension you [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://lipidity.com/software/icongrabber/' title='IconGrabber'><img class='fright' src='http://lipidity.com/wordpress/wp-content/uploads/2007/11/demo.png' alt='IconGrabber' /></a>
I often need to use OS X icons on the web. Unfortunately, it&#8217;s not an easy matter to extract icons from Mac files or folders. The solution? <a href="http://lipidity.com/software/icongrabber/">IconGrabber</a>.</p>

<!--more-->

<p>It couldn&#8217;t be easier. Just drop the file or folder that you want the icon from onto <a href="http://lipidity.com/software/icongrabber/">IconGrabber</a>, and choose a place to save it. The extension you choose determines the format, otherwise it defaults to tiff. That&#8217;s it!</p>

<hr />

<p>If you&#8217;re a Quicksilver user, you can use the <a href="http://lipidity.com/plugins/quicksilver/icongrabber/">IconGrabber Quicksilver plugin</a>. (It doesn&#8217;t require the IconGrabber application.) Once installed, you&#8217;ll get a &#8220;Save Icon To&#8230;&#8221; action. Not only can you save the icons of files and directories, you can save the icon of <em>whatever</em> appears in the first &#8220;object&#8221; pane. This is <em>extremely handy</em>.</p>

<p>Enjoy!</p>

<hr />

<p><strong>Update:</strong></p>

<p>The Quicksilver plugin is now at version 0.95. Notable changes include:</p>

<ul>
<li>Forcing direct object to load icon.</li>
<li>Indirect object for &#8220;Save Icon To&#8230;&#8221; starts at <code>IconGrabberSaveTo</code> defaults key. Format used is set by the <code>IconGrabberFormat</code> defaults key. Uses png by default.</li>
<li>&#8220;Save Icon As&#8230;&#8221; action added. Indirect objects have different image formats. Images are saved to the <code>IconGrabberSaveTo</code> defaults key.</li>
<li>Image files have the <code>IconGrabberAppend</code> key appended to the filename (&#8221;-icon&#8221; by default).</li>
</ul>

<p>For example, if you want to use the tiff format for the &#8220;Save Icon To&#8230;&#8221; action, run <code>defaults write com.blacktree.Quicksilver IconGrabberFormat tiff</code>.</p>

<p>If you want to change the directory the images are generated in by &#8220;Save Icon As&#8230;&#8221;, run <code>defaults write com.blacktree.Quicksilver IconGrabberSaveTo "~/NewDirectory"</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/icongrabber/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quicksilver updated!</title>
		<link>http://lipidity.com/news/quicksilver-updated/</link>
		<comments>http://lipidity.com/news/quicksilver-updated/#comments</comments>
		<pubDate>Mon, 20 Aug 2007 05:15:43 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Application]]></category>

		<category><![CDATA[beta]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<guid isPermaLink="false">http://dev.lipidity.com/apple/quicksilver-updated</guid>
		<description><![CDATA[The developer version Quicksilver Beta 52, build 3804, has been released. Changelog reads:


  Addressed some crashes related to switching applications Fixes for Leopard


If you&#8217;re developing plugins for Quicksilver and running Leopard, you may want to download this new release.
]]></description>
			<content:encoded><![CDATA[<p>The developer version Quicksilver Beta 52, build 3804, has been released. Changelog reads:</p>

<blockquote>
  <p>Addressed some crashes related to switching applications Fixes for Leopard</p>
</blockquote>

<p>If you&#8217;re <a href="http://dev.lipidity.com/tutorial/quicksilver-plugins-in-objective-c">developing plugins</a> for Quicksilver and running Leopard, you may want to <a href="http://getqs.com/dev/">download</a> this new release.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/news/quicksilver-updated/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Writing internal commands for Quicksilver</title>
		<link>http://lipidity.com/apple/quicksilver-internal-commands/</link>
		<comments>http://lipidity.com/apple/quicksilver-internal-commands/#comments</comments>
		<pubDate>Mon, 25 Jun 2007 13:41:56 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Cocoa]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://dev.lipidity.com/feature/tutorial/quicksilver-internal-commands</guid>
		<description><![CDATA[Internal commands in Quicksilver are essentially actions that don't require a subject (direct object) defined by the user. Most tasks, such as "Force Catalog Rescan", and some commands like "QS Preferences" are internal commands. The Clipboard plugin also adds a large number of internal commands so as you can see, they're quite useful in some circumstances.]]></description>
			<content:encoded><![CDATA[<p class='centre'><img src="http://dev.lipidity.com/wp-content/uploads/2007/06/quicksilver-internal-commands1.jpg" alt="[Quicksilver internal commands screenshot]" title="Internal commands in the Quicksilver catalog" class="feature" width="542" height="137" /><br /><small>Internal commands are found in the Quicksilver section of the Catalog.</small></p>

<p>There&#8217;s absolutely no documentation on how to write an internal command for Quicksilver <em>anywhere</em> and figuring out the internal workings of the application can be frustrating at best. This tutorial aims to fill that void and, like some of my other Quicksilver-related articles, provide you with the knowledge and resources to make a working internal command.</p>

<h2>Prerequisites</h2>

<p>An internal command is written much like a standard Quicksilver action, so the only thing required is the <a href="todo:lnk">Xcode project template</a> for creating Quicksilver plugins. (However, if you really need <em>another</em> project template for writing internal commands, just ask)</p>

<p>It would also be a good idea to familiarize yourself with <a href="http://dev.lipidity.com/feature/tutorial/anatomy-of-a-plugin-part-2" title="Quicksilver plugins in Xcode and Cocoa">writing a Quicksilver action</a> before going on.</p>

<h2>Info.plist keys</h2>

<p>Somewhere in the plist, you need to set QSLoadImmediately to true for Quicksilver to load your internal command properly. That&#8217;s simply:</p>

<pre><code>&lt;key&gt;QSLoadImmediately&lt;/key&gt;
&lt;true/&gt;
</code></pre>

<p>To register our internal command with Quicksilver, we need to add <code>QSInternalMessages</code> to the <code>QSRegistration</code> key. So, find the <code>QSRegistrationTemplate</code> key, rename it to <code>QSRegistration</code>, and configure the command in the following manner:</p>

<pre><code>&lt;key&gt;QSRegistration&lt;/key&gt;
&lt;dict&gt;
    &lt;key&gt;QSInternalMessages&lt;/key&gt;
    &lt;dict&gt;
        &lt;key&gt;testInternalCommand&lt;/key&gt;
        &lt;dict&gt;
            &lt;key&gt;target&lt;/key&gt;
            &lt;string&gt;testCommand&lt;/string&gt;
            &lt;key&gt;action&lt;/key&gt;
            &lt;string&gt;doTestCommand:&lt;/string&gt;
            &lt;key&gt;name&lt;/key&gt;
            &lt;string&gt;Just a Test&lt;/string&gt;
            &lt;key&gt;icon&lt;/key&gt;
            &lt;string&gt;&lt;/string&gt;
        &lt;/dict&gt;
        ...
</code></pre>

<p>What do the keys mean?</p>

<dl>
<dt>target</dt>
<dd>
<p>The class that will be running the internal command. This needs to be a singleton. More on that later.</p>
</dd>

<dt>action</dt>
<dd>
<p>An instance method that the target class responds to; this is the command.</p>
</dd>

<dt>name</dt>
<dd>
<p>A brief and meaningful name for your internal command.</p>
</dd>

<dt>icon</dt>
<dd>
<p>An icon for your command. You can use an identifier like <code>com.blacktree.Quicksilver</code> or <code>com.apple.AddressBook</code> and Quicksilver will load up the appropriate icon for you.</p>
</dd>
</dl>

<h2>The class</h2>

<p>As I mentioned earlier, the class that runs the command should be a singleton - that means only one copy of the class is instantiated and used (<a href="http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_10.html">Apple&#8217;s documentation on singletons</a>). The internal command will be called like: <code>[[targetClass sharedInstance] doActionMethod:nil]</code> where <code>targetClass</code> is the class you specified under <code>target</code> and <code>doActionMethod:</code> is the method for the key <code>action</code> in the Info.plist.</p>

<p>From the example Info.plist excerpt given above, the class that would be written would look something like this:</p>

<pre><code>// testCommand.h

#import &lt;QSCore/QSActionProvider.h&gt;

@interface testCommand : QSActionProvider
{
}
+ (id)sharedInstance;
-(IBAction)doTestCommand:(id)sender;
@end
</code></pre>

<hr />

<pre><code>// testCommand.m

#import "testCommand.h"

@implementation testCommand

// Following few methods to make this class a singleton

static testCommand *sharedTestCommandManager = nil;

+ (id)sharedInstance {
    if (sharedTestCommandManager == nil) {
        [[self alloc] init]; // assignment not done here
    }
    return sharedTestCommandManager;
}
+ (id)allocWithZone:(NSZone *)zone{
    //    @synchronized(self) {
    if (sharedTestCommandManager == nil) {
        sharedTestCommandManager = [super allocWithZone:zone];
        return sharedTestCommandManager;  // assignment and return on first allocation
    }
    //      }
    return nil; //on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone{
    return self;
}
- (id)retain{
    return self;
}
- (unsigned)retainCount{
    return UINT_MAX;  //denotes an object that cannot be released
}
- (void)release{
    //do nothing
}
- (id)autorelease{
    return self;
}

// Method to perform the internal command

-(IBAction)doTestCommand:(id)sender
{
    NSLog(@"Running test internal command...");
    // do something useful
}

@end
</code></pre>

<p>And that&#8217;s it. Possibly the shortest ever Quicksilver development tutorial you&#8217;re going to see in a while.</p>

<p><a name="cube-smoking" id="cube-smoking"></a></p>

<p>I thought I&#8217;d drive home the usefulness of internal commands by showing off a little something I&#8217;ve been playing with for a while.</p>

<p class='centre'><img class='feature' src="http://dev.lipidity.com/wp-content/uploads/2007/06/quicksilver-cube-disco-smoking.png" alt="[Quicksilver Cube Smoking]" title="Quicksilver cube interface smoking" longdesc="http://dev.lipidity.com/feature/tutorial/now-this-is-hot-cocoa" width="290" height="375" /><br /><small>A simple internal command allows any interface to smoke</small></p>

<p>Yeah, it&#8217;s the cube interface. Smoking.</p>

<p>In fact, with this internal command, I can make <em>anything</em> smoke.</p>

<p class='centre'><a rel="lightbox" href="http://dev.lipidity.com/wp-content/uploads/2007/06/primer-smoking.jpg" title="Quicksilver Primer interface smoking"><img src="http://dev.lipidity.com/wp-content/uploads/2007/06/primer-smoking-thumb.jpg" alt="[Primer interface smoking]" title="Quicksilver Primer interface smoking" width="426" height="343" class='feature' /></a></p>

<h2>Summary</h2>

<ul>
<li>Add QSLoadImmediately key, set to true</li>
<li>Add QSInternalMessages to the QSRegistration key</li>
<li>Write singleton class that runs the command</li>
</ul>

<p>As always, I&#8217;ll be thrilled to see what you come up with.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/quicksilver-internal-commands/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Secret Quicksilver animation effects</title>
		<link>http://lipidity.com/apple/quicksilver-animation-effects/</link>
		<comments>http://lipidity.com/apple/quicksilver-animation-effects/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 02:00:14 +0000</pubDate>
		<dc:creator>Ankur</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Cocoa]]></category>

		<category><![CDATA[Quicksilver]]></category>

		<category><![CDATA[Animation]]></category>

		<category><![CDATA[CoreGraphics]]></category>

		<category><![CDATA[GUI]]></category>

		<category><![CDATA[Mac]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://dev.lipidity.com/feature/tutorial/quicksilver-animation-effects</guid>
		<description><![CDATA[You may have had a shot at creating a Quicksilver interface. (If you haven't, see <a href="http://dev.lipidity.com/feature/tutorial/quicksilver-interface-tutorial">the tutorial</a>). While it's good fun to play with changing the colors and positions of the controls, there is a whole lot of really clever code in Quicksilver that lets you go beyond that and play with some weird and wacky effects on <em>any</em> window.]]></description>
			<content:encoded><![CDATA[<p class="centre"><a rel="lightbox" href="http://dev.lipidity.com/wp-content/uploads/2007/06/quicksilver-cube-animation.png" title="Mac Cube Transition Effect"><img alt="[Quicksilver Cube Effect]" title="Image of Core Graphics cube transition effect" src="http://dev.lipidity.com/wp-content/uploads/2007/06/quicksilver-cube-effect.png" class="feature" width="292" height="233" /></a><br /><small>Quicksilver is capable of some very futuristic transition effects</small></p>

<h2>Standard Animation Effects</h2>

<p>Quicksilver adds a category to the NSWindow class to allow for some pretty cool effects.
The following should be pretty self-explanatory:</p>

<pre><code>-(void)pulse:(id)sender;
-(void)flare:(id)sender;
-(void)shrink:(id)sender;
-(void)fold:(id)sender;
</code></pre>

<p>What these methods essentially mean, is that you can pulse, flare, shrink or fold <em>any window</em> you have a reference to in a plugin - whether it&#8217;s an interface or dialog or something completely different. Eg, just call <code>[window shrink:nil]</code> and watch that NSWindow shrink down to nothing, or <code>[window flare:nil]</code> to make it burst away!</p>

<h2>Private Core Graphics Animations</h2>

<p>Quicksilver also adds methods to use private <a href="http://dev.lipidity.com/feature/tutorial/xcode-transitions-core-graphics-image-2" title="Core Graphics Transitions Tutorial">Core Graphics transitions</a> for instances of NSWindow or its subclasses. The main method is defined something like:</p>

<pre><code>- (void) displayWithTransition:(CGSTransitionType)type option:(CGSTransitionOption)option duration:(float)duration;
</code></pre>

<p>The transitions you have access to are fade, zoom, reveal, slide, warp-fade, swap, warp-switch and the famous cube animation. You can use them on any window, for example:</p>

<pre><code>[window displayWithTransition:CGSCube option:CGSLeft duration:1.3];
</code></pre>

<p>To learn more about Core Graphics transitions, see the <a href="http://dev.lipidity.com/feature/tutorial/ebook-xcode-animations-core-graphics" title="Core Graphics Animations and Transitions Tutorial">Core Graphics ebook</a>, or play around with the <a href="http://dev.lipidity.com/apple/core-transitions-framework" title="Core Graphics and Core Image transition animations">Core Transitions Framework</a>.</p>

<p class="yellow_note">Quicksilver&#8217;s CGSPrivate.h file is missing CGSFlip, but you can run the Dashboard-style flip effect by using the integer 9.</p>

<h2>Quicksilver&#8217;s own animations</h2>

<p>Alcor has used various techniques to write several very interesting animation effects into Quicksilver. You&#8217;ll be familiar with some of these (just watch the Primer interface activate and deactivate) but for whatever reason, many of these bizarre animations never made into an interface. They&#8217;re really very clever. I&#8217;ve played around with some of these:</p>

<ul>
<li>QSGrowEffect</li>
<li>QSShrinkEffect</li>
<li>QSSlightGrowEffect</li>
<li>QSSlightShrinkEffect</li>
<li>QSBingeEffect</li>
<li>QSPurgeEffect</li>
<li>QSExplodeEffect</li>
<li>QSExtraExtraEffect</li>
<li>QSShakeItLikeAPolaroidPictureEffect</li>
<li>QSBoobTubeEffect</li>
<li>QSVExpandEffect</li>
<li>QSVillainousKryptonianEffect</li>
<li>QSMMBlowEffect</li>
<li>QSLudicrousSpeedEffect</li>
</ul>

<p>Very interesting to look at, but how does one use these effects?</p>

<p>As we are dealing with Quicksilver, the solution is (as expected) very elegant. There are very simple methods to set a show, hide or execute effect for a window. These methods don&#8217;t even require an explanation; they&#8217;re so simple:</p>

<pre><code>// Effect for showing the QSWindow
[window setShowEffect:[NSDictionary dictionaryWithObjectsAndKeys:@&quot;QSSlightGrowEffect&quot;,@&quot;transformFn&quot;,@&quot;show&quot;,@&quot;type&quot;,[NSNumber numberWithFloat:2.0],@&quot;duration&quot;,nil]];

// Effect for hiding the QSWindow
[window setHideEffect:[NSDictionary dictionaryWithObjectsAndKeys:@&quot;QSSlightShrinkEffect&quot;,@&quot;transformFn&quot;,@&quot;hide&quot;,@&quot;type&quot;,[NSNumber numberWithFloat:2.0],@&quot;duration&quot;,nil]];

// The "execute" effect is slightly different:
[window setWindowProperty:[NSDictionary dictionaryWithObjectsAndKeys:@&quot;QSExplodeEffect&quot;,@&quot;transformFn&quot;,@&quot;hide&quot;,@&quot;type&quot;,[NSNumber numberWithFloat:1.5],@&quot;duration&quot;,nil] forKey:kQSWindowExecEffect];</code></pre>

<p>Easy!</p>

<h2>Sample plugin</h2>

<p><a href="http://dev.lipidity.com/wp-content/uploads/2007/06/effects.zip" title="Download Quicksilver Effects Plugin"><img class="fright" src="http://qs.lipidity.com/fumo/QSPlugin.png" title="Quicksilver Plugin Icon" alt="[Plugin Icon]" height="128" width="128" /></a> 
I don&#8217;t dare mention all this private goodness and not even provide a demonstration. I&#8217;ve created an &#8220;Effects&#8221; plugin that will allow you to change the activate, deactivate and execute effects for <em>any</em> Quicksilver interface temporarily to play around with the effects. Just for good measure, I&#8217;ve also thrown in an action that lets you explore Core Graphics transitions as well.</p>

<p>This is not really a bona fide Quicksilver plugin; while it does let you have some fun with the effects, it&#8217;s not very user-friendly and doesn&#8217;t save your configuration. 
If these animations prove to be popular, then I&#8217;ll write a proper plugin to let you configure the effects more easily (probably through a preference pane) and remembers your settings.</p>

<p class="download"><a href="http://dev.lipidity.com/wp-content/uploads/2007/06/effects.zip" title="Download Quicksilver Effects Plugin">Download Quicksilver Effects Plugin</a></p>

<h4>Usage</h4>

<p>Type in the name of the effect you want, then use &#8220;Set Hide Effect&#8221;, &#8220;Set Show Effect&#8221; or the &#8220;Set Exec Effect&#8221; action. The list of effects is given <a href="#toc-quicksilvers-own-animations">above</a>; just type one in and run the relevant action.</p>

<p>To run a Core Graphics transition, type in the name of the transition, and use the &#8220;Run CoreGraphics Transition&#8221; action. You can optionally specify a direction in the indirect selector. (You can enter text in the direct and indirect selectors by pressing the period &#8220;.&#8221; key)</p>

<h4>For example</h4>

<ul>
<li><big>&#8220;QSBingeEffect&#8221; -&gt; Set Show Effect</big></li>
<li><big>&#8220;QSPurgeEffect&#8221; -&gt; Set Hide Effect</big></li>
<li><big>&#8220;QSExplodeEffect&#8221; -&gt; Set Exec Effect</big></li>
<li><big>&#8220;flip&#8221; -&gt; Run CoreGraphics Transition</big></li>
<li><big>&#8220;slide&#8221; -&gt; Run CoreGraphics Transition -&gt; &#8220;up&#8221;</big></li>
<li><big>&#8220;swap&#8221; -&gt; Run CoreGraphics Transition -&gt; &#8220;inout&#8221;</big></li>
</ul>

<p class="centre">
<a rel="lightbox[demo]" href='http://dev.lipidity.com/wp-content/uploads/2007/06/set-show-effect.png' title='Set Show Effect'><img src='http://dev.lipidity.com/wp-content/uploads/2007/06/set-show-effect.thumbnail.png' alt='Set Show Effect' width='108' height='128' /></a>
<a rel="lightbox[demo]" href='http://dev.lipidity.com/wp-content/uploads/2007/06/set-hide-effect.png' title='Set Hide Effect'><img src='http://dev.lipidity.com/wp-content/uploads/2007/06/set-hide-effect.thumbnail.png' alt='Set Hide Effect' width='108' height='128' /></a>
<a rel="lightbox[demo]" href='http://dev.lipidity.com/wp-content/uploads/2007/06/set-exec-effect.png' title='Set Exec Effect'><img src='http://dev.lipidity.com/wp-content/uploads/2007/06/set-exec-effect.thumbnail.png' alt='Set Exec Effect' width='106' height='128' /></a>
<a rel="lightbox[demo]" href='http://dev.lipidity.com/wp-content/uploads/2007/06/core-graphics-cube.png' title='Core Graphics Cube Effect'><img src='http://dev.lipidity.com/wp-content/uploads/2007/06/core-graphics-cube.thumbnail.png' alt='Core Graphics Cube Effect' width='105' height='128' /></a>
<a rel="lightbox[demo]" href='http://dev.lipidity.com/wp-content/uploads/2007/06/core-graphics-swap-effect.png' title='Core Graphics Swap Effect'><img src='http://dev.lipidity.com/wp-content/uploads/2007/06/core-graphics-swap-effect.thumbnail.png' alt='Core Graphics Swap Effect' width='92' height='128' /></a><br />
<small>Pictures show how to use the effects plugin. Actual animations are not shown.</small>
</p>

<hr />

<p>Quicksilver has many such hidden surprises and nifty time-saving methods; it&#8217;s so well thought out and full of these amazing gems!</p>

<p>What do you think about these animations? Be sure to let me know if you&#8217;d like a proper, more user-friendly plugin to use these effects.</p>
]]></content:encoded>
			<wfw:commentRss>http://lipidity.com/apple/quicksilver-animation-effects/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
