Ruby & Cocoa: mooi en smakelijk?

Door CJ_Latitude op zondag 1 januari 2012 17:12 - Reacties (2)
Categorie: media center, Views: 4.793

Het is even sinds de laatste post, maar we waren druk met verbouwing en verhuizing, dus even geen tijd om hier mee bezig te gaan.

Als onderdeel van de inventarisatie van de verschillende mogelijkheden voor het maken van mijn media center software kwam ik ook op het pad van RubyCocoa (sourceforge). Hiermee kan je Objective-C objecten die onder OS-X beschikbaar zijn met Ruby manipuleren (en andersom, maar daar heb ik niet naar gekeken).

Waarom is dit relevant? Omdat iTunes gebruik maakt van het notificatieframework van OS-X (klik hier voor een introductie in dit framework). Het gebruikt dit om andere applicaties te laten weten wanneer er iets aan de state van iTunes veranderd (track dat speelt, volume, etc). Aangezien ik bezig was met Ruby en iTunes (zie eerdere posts) was het opvangen van deze notificaties een must.

Nu wordt Ruby standaard meegeleverd op OS-X, alsmede het RubyCocoa framework. Alles wat je nodig hebt om het te gaan gebruiken is:

code:
1
require 'osx/cocoa'



Vanaf dat moment zijn de objecten die in Objective-C beschikbaar zijn, ook in Ruby vorm aanwezig. Om zelf objecten te maken die gebruikt kunnen worden binnen functies van Cocoa, moeten ze overerven van OSX::NSObject:

code:
1
2
class MyFirstCocoaClass < OSX::NSObject
end



Zodra je weet hoe het notification center van OS-X werkt, hoef je voor een groot deel enkel syntax aan te passen om de calls die je in Objective-C zou maken in Ruby te maken. Zie onderstaande voorbeeld om de notificaties voor het wisselen van het afgespeelde track op te vangen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
require 'osx/cocoa'

# Nodig om een 'shared state' in te stellen. Zonder dit werkt het niet, weet eigenlijk niet waarom...
@@application = OSX::NSApplication.sharedApplication

# Dit is de class die de notificaties uiteindelijk verwerkt
class ITunesNotifier < OSX::NSObject
  
  def notify(notification)
    track_info = notification.userInfo
    
    puts "Track changed:"
    puts "  artist: #{track_info['Artist']}"
    puts "  title:  #{track_info['Name']}"
    puts "  album:  #{track_info['Album']}"
  end
  
end

# Draadje, geleend van Meow
def start_runner
  @@background_runner = Thread.new do
    sleep 0.1
    OSX::NSApp.run
  end
  at_exit do
    loop do
      sleep 1
      @@application.terminate(@@application) if false
    end
  end
end

# Bind de playerInfo notification aan de ITunesNotifier#notify methode
OSX::NSDistributedNotificationCenter.defaultCenter.objc_send(
  :addObserver, ITunesNotifier.new,
  :selector,    "notify:",
  :name,        "com.apple.iTunes.playerInfo",
  :object,      nil
)

# Start het draadje
start_runner



Op het moment dat er een 'com.apple.iTunes.playerInfo' notificatie rond wordt gestuurd, wordt de #notify methode van de ITunesNotifier aangeroepen met als enigste argument een NSNotification instantie, waar in het userInfo object alle inhoudelijke informatie over de notificatie staat.

Een gedeelte van bovenstaande code is gebaseerd op / geleend van Meow, wat een library is om vanuit Ruby Growl notificaties mogelijk te maken. Hoe gaaf is dat!? :D

Volgende: Wat kan je met OS-X, iTunes, Ruby on Rails en AppleScript? 11-'11 Wat kan je met OS-X, iTunes, Ruby on Rails en AppleScript?

Reacties


Door Tweakers user jurp5, maandag 2 januari 2012 16:45

What about MacRuby? Is nog mooier geÔntegreerd in OS X/Cocoa en wordt mede ontwikkeld door Apple zelf :)

Door Tweakers user CJ_Latitude, zaterdag 7 januari 2012 15:59

Heb ik ook langs zien komen, maar nooit in verdiept.
Dus heb geen idee wat dat biedt :)

Reageren is niet meer mogelijk