Responding To Growl Notification Clicks With MacRuby

In my last post, I detailed the process of setting up a MacRuby app to send Growl notifications. To get even more mileage out of Growl, though, it’s a good idea to response to various interactions with the notifications that you send. For example, you can have your application respond to your notice being clicked, or to the notice timing out and disappearing from the screen.

To get started, open the sample app that we created from the previous post.

 

The Growl Delegate

Open the ApplicationDelegate.rb file – this is the file that responds to our general application events. In the “awakeFromNib” event, we set our Growl delegate to “self” – the ApplicationDelegate class. It turns out you don’t have to do this if you are not going to respond to any growl events. You can set the delegate to “” and Growl will not send any events to your app.

In our application, though, we want to set up a click event. Since we already have the delegate set to self, we can simply add the delegate method for clicked:

def growlNotificationWasClicked(context)

end

This method will be called any time a user clicks on a notification that our application sends. From this method, we can do anything we want – take our app to a specific screen, run a background process, kick off another app or process, send another growl notification or anything else that we can think of. It’s our code, after all, and we get to determine what it does.

 

The Context Parameter

Having the method defined and the delegate set up is only part of what we need. The context parameter (which can be named anything you like) is also important.

Looking back at the growl notification that we are sending from our ApplicationDelegate, there is a clickContext key in the hash. At this point, we have set it to nil, but if we want to use any of the callback methods from Growl, we need to set this to something other than nil. When we set this value, it will be passed to our clicked callback method. This allows us to provide context to the method – hence the name of the parameter – which can be used to determine what actions to take.

For this example, set the value of clickContext to “You Clicked A Notification!”

  GrowlApplicationBridge.notifyWithTitle("Our Growling Title",
    description: "this is a really big description of really cool things! now you can take over the world with Growl from MacRuby!",
    notificationName: "Test",
    iconData: nil,
    priority: 0,
    isSticky: false,
    clickContext: "You Clicked A Notification!")

If you do not provide some form of data for the context, the clicked callback will not execute.

 

The Clicked Callback Method

As a simple example of using the clicked callback method, we can send another Growl notification. In this case, we will take the context and use it as the Growl description. The ApplicationDelegate class now looks like this:

framework "Growl"

 

class ApplicationDelegate

def awakeFromNib()

GrowlApplicationBridge.setGrowlDelegate(self)

end


def growlNotificationWasClicked(context)

GrowlApplicationBridge.notifyWithTitle("Clicked Title",

description: context,

notificationName: "Test",

iconData: nil,

priority: 0,

isSticky: false,

clickContext: nil)

end

end

Note that we are setting the clickContext to nil for this send notification. If we set it to anything else, we would allow the user to click it and it would call back into this same method. This isn’t necessarily a bad thing – but could be if we aren’t careful.

 

The End Results

Run the app from Xcode and when the first notification pops up, click on it. You will then see a second notification that should look like this:

Screen shot 2011-01-23 at 10.36.10 AM.png

 


Post Footer automatically generated by Add Post Footer Plugin for wordpress.

About Derick Bailey

Derick Bailey is an entrepreneur, problem solver (and creator? :P ), software developer, screecaster, writer, blogger, speaker and technology leader in central Texas (north of Austin). He runs SignalLeaf.com - the amazingly awesome podcast audio hosting service that everyone should be using, and WatchMeCode.net where he throws down the JavaScript gauntlets to get you up to speed. He has been a professional software developer since the late 90's, and has been writing code since the late 80's. Find me on twitter: @derickbailey, @mutedsolutions, @backbonejsclass Find me on the web: SignalLeaf, WatchMeCode, Kendo UI blog, MarionetteJS, My Github profile, On Google+.
This entry was posted in Growl, MacRuby, OSX, Ruby, Xcode. Bookmark the permalink. Follow any comments here with the RSS feed for this post.
  • http://www.oddbeat.net/ oddBeat

    Hi,
    as far I understand this post is, when one click on the growl notification balloon, it should open appropriate application?

    So, I wanna have Growl act this way: when I see a new email, or Skype notification in Growl display, I click on it and then it opens an email, Skype, etc…

    How do I do that?

    Thnx,

    Roger