real-growl 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +60 -0
- data/ext/extconf.rb +1 -1
- data/ext/real_growl_api.c +40 -12
- data/ext/real_growl_api.h +1 -1
- data/ext/{ruby_delegate.m → ruby_delegate.c} +12 -2
- data/ext/ruby_delegate.h +7 -0
- data/lib/real_growl.rb +3 -1
- metadata +5 -5
- data/README.rdoc +0 -47
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
real-growl
|
2
|
+
|
3
|
+
Description
|
4
|
+
===========
|
5
|
+
|
6
|
+
A Growl notification library that uses native c bindings to interact with GrowlApplicationBridge rather than Growl's network API.
|
7
|
+
|
8
|
+
Synopsis
|
9
|
+
========
|
10
|
+
|
11
|
+
### rg
|
12
|
+
|
13
|
+
>> require 'real_growl'
|
14
|
+
=> true
|
15
|
+
>> rg("Check out", ["Real", "Growl"], :icon => "/path/to/a/picture.jpg")
|
16
|
+
>> rg("Google", ["Real", "Growl"], :icon => "http://www.google.com/logos/stpatricks_d4gwinner_eo09.gif")
|
17
|
+
=> nil
|
18
|
+
|
19
|
+
>> Kernel.rg_sticky = false
|
20
|
+
=> false
|
21
|
+
>> Kernel.rg_priority = 3
|
22
|
+
=> 3
|
23
|
+
>> Kernel.rg_icon = "/the/path/cool.png"
|
24
|
+
=> "/the/path/cool.png"
|
25
|
+
|
26
|
+
### Custom Application
|
27
|
+
|
28
|
+
>> require 'real_growl'
|
29
|
+
>> my_own_application = RealGrowl::Application.new("AppName")
|
30
|
+
=> #<RealGrowl::Application:0x1018eb6b8>
|
31
|
+
>> my_own_application.notify(:title => "Title", :description => "Desc", :priority => 0, :sticky => true, :icon => "/path/to/image.png")
|
32
|
+
|
33
|
+
### Extras
|
34
|
+
>> RealGrowl.installed?
|
35
|
+
=> true
|
36
|
+
>> RealGrowl.running?
|
37
|
+
=> true
|
38
|
+
|
39
|
+
TODO
|
40
|
+
====
|
41
|
+
* Add executable script
|
42
|
+
* Enable growl callbacks
|
43
|
+
|
44
|
+
Requirements
|
45
|
+
============
|
46
|
+
|
47
|
+
* MacOS X 10.5 > ??
|
48
|
+
* Growl Framework - http://growl.info/downloads_developers.php
|
49
|
+
|
50
|
+
INSTALL
|
51
|
+
=======
|
52
|
+
|
53
|
+
Download and install Growl.framework into either ~/Library/Frameworks or /Library/Frameworks
|
54
|
+
gem install real-growl
|
55
|
+
|
56
|
+
INSTALLATION HINTS
|
57
|
+
==================
|
58
|
+
|
59
|
+
Make sure that the Growl.framework is either 32bit or the 64bit depending on the version of MacOS X
|
60
|
+
installed and the kind of machine it is installed on.
|
data/ext/extconf.rb
CHANGED
data/ext/real_growl_api.c
CHANGED
@@ -12,6 +12,28 @@ build_nsstring(VALUE string) {
|
|
12
12
|
}
|
13
13
|
}
|
14
14
|
|
15
|
+
static NSData*
|
16
|
+
get_icon_data(VALUE pathOrUrl) {
|
17
|
+
NSString *nsPathOrUrl = build_nsstring(pathOrUrl);
|
18
|
+
NSData *iconData = nil;
|
19
|
+
|
20
|
+
if(nsPathOrUrl != nil) {
|
21
|
+
iconData = [NSData dataWithContentsOfFile: nsPathOrUrl];
|
22
|
+
|
23
|
+
if(iconData == nil) {
|
24
|
+
iconData = [NSData dataWithContentsOfURL: [NSURL URLWithString: nsPathOrUrl]];
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
return iconData;
|
29
|
+
}
|
30
|
+
|
31
|
+
|
32
|
+
static NSAutoreleasePool*
|
33
|
+
create_autorelease_pool() {
|
34
|
+
return [[NSAutoreleasePool alloc] init];
|
35
|
+
}
|
36
|
+
|
15
37
|
static void
|
16
38
|
free_delegate(id delegate) {
|
17
39
|
[delegate release];
|
@@ -22,11 +44,6 @@ alloc_delegate(VALUE klass) {
|
|
22
44
|
return Data_Wrap_Struct(klass, 0, free_delegate, [[RubyDelegate alloc] init]);
|
23
45
|
}
|
24
46
|
|
25
|
-
static NSAutoreleasePool*
|
26
|
-
create_autorelease_pool() {
|
27
|
-
return [[NSAutoreleasePool alloc] init];
|
28
|
-
}
|
29
|
-
|
30
47
|
VALUE
|
31
48
|
classMethod_installed(VALUE self) {
|
32
49
|
NSAutoreleasePool *pool = create_autorelease_pool();
|
@@ -54,22 +71,34 @@ classMethod_running(VALUE self) {
|
|
54
71
|
}
|
55
72
|
|
56
73
|
VALUE
|
57
|
-
// VALUE title, VALUE description, VALUE priority, VALUE sticky, VALUE iconPath
|
58
74
|
method_notify(VALUE self, VALUE options) {
|
59
75
|
NSAutoreleasePool *pool = create_autorelease_pool();
|
76
|
+
id delegate = NULL;
|
77
|
+
Data_Get_Struct(self, RubyDelegate, delegate);
|
60
78
|
|
61
79
|
VALUE title = rb_hash_aref(options, ID2SYM(rb_intern("title")));
|
62
80
|
VALUE description = rb_hash_aref(options, ID2SYM(rb_intern("description")));
|
63
|
-
VALUE priority = rb_hash_aref(options, ID2SYM(rb_intern("priority")));
|
64
|
-
priority = (priority == Qnil) ? INT2NUM(0) : priority;
|
81
|
+
VALUE priority = rb_Integer(rb_hash_aref(options, ID2SYM(rb_intern("priority"))));
|
65
82
|
VALUE sticky = rb_hash_aref(options, ID2SYM(rb_intern("sticky")));
|
66
83
|
VALUE iconPath = rb_hash_aref(options, ID2SYM(rb_intern("icon")));
|
84
|
+
VALUE click = rb_hash_aref(options, ID2SYM(rb_intern("click")));
|
85
|
+
|
67
86
|
BOOL nsSticky = (sticky == Qtrue) ? YES : NO;
|
68
|
-
NSData *data =
|
87
|
+
NSData *data = get_icon_data(iconPath);
|
69
88
|
NSString *nsTitle = build_nsstring(title);
|
70
89
|
NSString *nsDescription = build_nsstring(description);
|
90
|
+
NSNumber *clickContext = [NSNumber numberWithUnsignedLong: self];
|
71
91
|
|
72
|
-
[
|
92
|
+
[delegate setCallbackProc: click];
|
93
|
+
[GrowlApplicationBridge setGrowlDelegate: delegate];
|
94
|
+
[GrowlApplicationBridge
|
95
|
+
notifyWithTitle: nsTitle
|
96
|
+
description: nsDescription
|
97
|
+
notificationName: REAL_GROWL_NOTIFICATION
|
98
|
+
iconData: data
|
99
|
+
priority: NUM2INT(priority)
|
100
|
+
isSticky:nsSticky
|
101
|
+
clickContext:clickContext];
|
73
102
|
|
74
103
|
[pool drain];
|
75
104
|
|
@@ -82,9 +111,8 @@ method_init(VALUE self, VALUE applicationName) {
|
|
82
111
|
id delegate = NULL;
|
83
112
|
|
84
113
|
Data_Get_Struct(self, RubyDelegate, delegate);
|
85
|
-
NSString *nsAppName =
|
114
|
+
NSString *nsAppName = build_nsstring(applicationName);
|
86
115
|
[delegate setApplicationName: nsAppName];
|
87
|
-
[GrowlApplicationBridge setGrowlDelegate: delegate];
|
88
116
|
|
89
117
|
[pool drain];
|
90
118
|
|
data/ext/real_growl_api.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#include "ruby_delegate.h"
|
2
2
|
|
3
3
|
@implementation RubyDelegate
|
4
|
-
@synthesize applicationName;
|
4
|
+
@synthesize applicationName, callbackProc;
|
5
5
|
|
6
6
|
-(id)init {
|
7
7
|
if(self = [super init]) {
|
@@ -12,9 +12,19 @@
|
|
12
12
|
return nil;
|
13
13
|
}
|
14
14
|
|
15
|
+
-(NSString *)applicationNameForGrowl {
|
16
|
+
return applicationName;
|
17
|
+
}
|
18
|
+
|
15
19
|
-(NSDictionary *)registrationDictionaryForGrowl {
|
16
20
|
NSArray *notifications = [NSArray arrayWithObject:REAL_GROWL_NOTIFICATION];
|
17
|
-
return [NSDictionary dictionaryWithObjectsAndKeys: [self applicationName], GROWL_APP_ID, [self applicationName], GROWL_APP_NAME, notifications, GROWL_NOTIFICATIONS_ALL, nil];
|
21
|
+
return [NSDictionary dictionaryWithObjectsAndKeys: [self applicationName], GROWL_APP_ID, [self applicationName], GROWL_APP_NAME, notifications, GROWL_NOTIFICATIONS_ALL, notifications, GROWL_NOTIFICATIONS_DEFAULT, nil];
|
22
|
+
}
|
23
|
+
|
24
|
+
-(void)growlNotificationWasClicked:(id)clickContext {
|
25
|
+
if(callbackProc != Qnil) {
|
26
|
+
rb_funcall(callbackProc, rb_intern("call"), 0);
|
27
|
+
}
|
18
28
|
}
|
19
29
|
|
20
30
|
-(void)dealloc {
|
data/ext/ruby_delegate.h
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
#include <Foundation/Foundation.h>
|
2
2
|
#include <Growl/Growl.h>
|
3
|
+
#include "ruby.h"
|
4
|
+
|
3
5
|
#define REAL_GROWL_NOTIFICATION XSTR("RealGrowlNotification")
|
4
6
|
|
5
7
|
@interface RubyDelegate : NSObject<GrowlApplicationBridgeDelegate>
|
6
8
|
{
|
7
9
|
NSString *applicationName;
|
10
|
+
VALUE callbackProc;
|
8
11
|
}
|
9
12
|
|
10
13
|
-(NSDictionary *) registrationDictionaryForGrowl;
|
14
|
+
-(void) growlNotificationWasClicked:(id)clickContext;
|
15
|
+
-(NSString *)applicationNameForGrowl;
|
16
|
+
|
17
|
+
@property(nonatomic, assign) VALUE callbackProc;
|
11
18
|
@property(nonatomic, retain) NSString *applicationName;
|
12
19
|
@end
|
data/lib/real_growl.rb
CHANGED
@@ -10,11 +10,13 @@ module Kernel
|
|
10
10
|
Kernel.rg_priority ||= 0
|
11
11
|
Kernel.rg_sticky = true if Kernel.rg_sticky.nil?
|
12
12
|
icon = Kernel.rg_icon
|
13
|
+
click = nil
|
13
14
|
|
14
15
|
@__growl_app ||= RealGrowl::Application.new("RealGrowl")
|
15
16
|
|
16
|
-
if args.last.is_a?(Hash) and args.last[:icon]
|
17
|
+
if args.last.is_a?(Hash) and (args.last[:icon] or args.last[:click])
|
17
18
|
icon = args.last[:icon]
|
19
|
+
click = args.last[:click]
|
18
20
|
args.pop
|
19
21
|
end
|
20
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: real-growl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin DeWind
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-05 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -20,15 +20,15 @@ executables: []
|
|
20
20
|
extensions:
|
21
21
|
- ext/extconf.rb
|
22
22
|
extra_rdoc_files:
|
23
|
-
- README.
|
23
|
+
- README.md
|
24
24
|
files:
|
25
|
-
- README.rdoc
|
26
25
|
- Rakefile
|
27
26
|
- ext/real_growl_api.c
|
28
27
|
- ext/real_growl_api.h
|
28
|
+
- ext/ruby_delegate.c
|
29
29
|
- ext/ruby_delegate.h
|
30
|
-
- ext/ruby_delegate.m
|
31
30
|
- lib/real_growl.rb
|
31
|
+
- README.md
|
32
32
|
has_rdoc: true
|
33
33
|
homepage: http://github.com/dewind/real-growl
|
34
34
|
licenses: []
|
data/README.rdoc
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
real-growl
|
2
|
-
|
3
|
-
== DESCRIPTION:
|
4
|
-
|
5
|
-
A Growl notification library that uses native c bindings to interact with GrowlApplicationBridge rather than Growl's network API.
|
6
|
-
|
7
|
-
== SYNOPSIS:
|
8
|
-
|
9
|
-
>> require 'real_growl'
|
10
|
-
=> true
|
11
|
-
>> rg("Check out", ["Real", "Growl"], :icon => "/path/to/a/picture.jpg")
|
12
|
-
=> nil
|
13
|
-
|
14
|
-
>> Kernel.rg_sticky = false
|
15
|
-
=> false
|
16
|
-
>> Kernel.rg_priority = 3
|
17
|
-
=> 3
|
18
|
-
>> Kernel.rg_icon = "/the/path/cool.png"
|
19
|
-
=> "/the/path/cool.png"
|
20
|
-
|
21
|
-
>> my_own_application = RealGrowl::Application.new("AppName")
|
22
|
-
=> #<RealGrowl::Application:0x1018eb6b8>
|
23
|
-
>> my_own_application.notify(:title => "Title", :description => "Desc", :priority => 0, :sticky => true, :icon => "/path/to/image.png")
|
24
|
-
|
25
|
-
>> RealGrowl.installed?
|
26
|
-
=> true
|
27
|
-
>> RealGrowl.running?
|
28
|
-
=> true
|
29
|
-
|
30
|
-
== TODO:
|
31
|
-
* Add executable script
|
32
|
-
* Enable growl callbacks
|
33
|
-
|
34
|
-
== REQUIREMENTS:
|
35
|
-
|
36
|
-
* MacOS X 10.5 > ??
|
37
|
-
* Growl Framework - http://growl.info/downloads_developers.php
|
38
|
-
|
39
|
-
== INSTALL:
|
40
|
-
|
41
|
-
Download and install Growl.framework into either ~/Library/Frameworks or /Library/Frameworks
|
42
|
-
gem install real-growl
|
43
|
-
|
44
|
-
== INSTALLATION HINTS:
|
45
|
-
|
46
|
-
Make sure that the Growl.framework is either 32bit or the 64bit depending on the version of MacOS X
|
47
|
-
installed and the kind of machine it is installed on.
|