Write a Quicksilver plugin with RubyCocoa
I wrote a Quicksilver plugin with RubyCocoa, that adds “hello world” to the passed string.
- Xcode project codes : in CodeRepos
- License : revised BSD
It should work on Tiger/Leopard if RubyCocoa is installed.
How does it work
As I mentioned in QuartzComposer CustomPatch with RubyCocoa, we just call RBBundleInit() function in plugin initializaiton phase to write some plugin with RubyCocoa. But wait, where should be the initializaiton code in Quicksilver plugin ?
We write actual plugin behavior in the class that inherits QSActionProvider, so I tried to call RBBundleInit() in the init() method in that class… however, that resulted in crashing Quicksilver :(
Then I called RBBundleInit() at only first time in performActionOnObject() of the actual Action class, and made references between Objective-C and Ruby class instances.
After that, I implemented an actual action behavior in Ruby class, and delegates from Objective-C to Ruby method, thats’ all. This is ugly, confusing, … I know, but it does work well :)
Code Snippets
ActionProvider in Objective-C:
(QSObject *)performActionOnObject:(QSObject *)dObject{ // initialize RubyCocoa static bool loaded = false; if (!loaded) { if (RBBundleInit("qs_action.rb", [self class], self)) { NSLog(@"[RubyCocoaPluginAction.performActionOnObject] RBBundleInit failed" ); abort(); } loaded = true; } // delegate actual action to Ruby class QSObject *ret = [QSObject objectWithString:[rb_ act:dObject]]; return ret; }
RubyCocoa side:
class Action def initialize(logger) @logger = logger end # write something great :) # - arg : QSObject def act(arg) val = arg.stringValue @logger.info(val) 'Hello world, ' + val end end # Action require 'osx/cocoa' OSX.init_for_bundle do |bdl, owner, log| # bdl - the bundle related with the 2nd argument of RBBundleInit # owner - the 3rd argument of RBBundleInit as optional data # log - logger for this block act = Action.new(log) owner.setInstance act end
Future works
- Better initializaiton. It should be in constractor of some class)
- Inherits QSActionProvider by Ruby class (more pure Ruby)
- Use ns_import ?
It should not be “With RubyCocoa”, but rather “By RubyCocoa”.
Conclusion
I made a start point to write a Quicksilver plugin by RubyCocoa. It is timing of initialization that is to be considered about writing some bundle in RubyCocoa. I made it in this article somehow. This article is for someone who wants to create Quicksilver plugin by Ruby, not learning unfamiliar Objective-C.
Reference
- QuartzComposer CustomPatch by RubyCocoa
- PyObjC Plug-ins : Article about writing Quicksilver plugin by PyObjC (a bit obsolete…)
Comments:0
Trackbacks:2
- Trackback URL for this entry
- http://blog.deadbeaf.org/2008/02/03/quicksilver-plugin-with-rubycocoa-en/trackback/
- Listed below are links to weblogs that reference
- Write a Quicksilver plugin with RubyCocoa from mootoh.log
- pingback from links for 2008-02-04 | Lazycoder 08-02-04 (Mon) 19:24
-
[...] mootoh.log : Write a Quicksilver plugin with RubyCocoa (tags: ruby Cocoa OSX Programming Development lazycoder) [...]
- pingback from The Ultimate List of RubyCocoa Tutorials, Tips and Tools 08-02-07 (Thu) 6:45
-
[...] Write a QuickSilver Plugin with RubyCocoa - How to use Objective C and Ruby to build a plugin for the QuickSilver launcher / general purpose tool. [...]

