ruby-snarl 0.0.5

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.
@@ -0,0 +1,32 @@
1
+
2
+ <?xml version="1.0" encoding="iso-8859-1"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Files
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Files</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Files</h1>
22
+ <div id="index-entries">
23
+ <a href="files/examples/example1_rb.html">examples/example1.rb</a><br />
24
+ <a href="files/examples/example2_rb.html">examples/example2.rb</a><br />
25
+ <a href="files/examples/example3_rb.html">examples/example3.rb</a><br />
26
+ <a href="files/examples/example4_rb.html">examples/example4.rb</a><br />
27
+ <a href="files/lib/autosnarl_rb.html">lib/autosnarl.rb</a><br />
28
+ <a href="files/lib/snarl_rb.html">lib/snarl.rb</a><br />
29
+ </div>
30
+ </div>
31
+ </body>
32
+ </html>
@@ -0,0 +1,40 @@
1
+
2
+ <?xml version="1.0" encoding="iso-8859-1"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Methods
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Methods</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Methods</h1>
22
+ <div id="index-entries">
23
+ <a href="classes/Snarl.html#M000004">hide (Snarl)</a><br />
24
+ <a href="classes/AutoSnarl.html#M000013">icon (AutoSnarl)</a><br />
25
+ <a href="classes/Snarl.html#M000007">id (Snarl)</a><br />
26
+ <a href="classes/Snarl.html#M000001">new (Snarl)</a><br />
27
+ <a href="classes/Snarl.html#M000009">send (Snarl)</a><br />
28
+ <a href="classes/Snarl/SnarlAPI.html#M000012">send (Snarl::SnarlAPI)</a><br />
29
+ <a href="classes/Snarl.html#M000010">send? (Snarl)</a><br />
30
+ <a href="classes/Snarl.html#M000008">show (Snarl)</a><br />
31
+ <a href="classes/Snarl.html#M000002">show_message (Snarl)</a><br />
32
+ <a href="classes/AutoSnarl.html#M000014">snarl (AutoSnarl)</a><br />
33
+ <a href="classes/Snarl/SnarlAPI.html#M000011">to_cha (Snarl::SnarlAPI)</a><br />
34
+ <a href="classes/Snarl.html#M000003">update (Snarl)</a><br />
35
+ <a href="classes/Snarl.html#M000006">version (Snarl)</a><br />
36
+ <a href="classes/Snarl.html#M000005">visible? (Snarl)</a><br />
37
+ </div>
38
+ </div>
39
+ </body>
40
+ </html>
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
5
+
6
+ <!--
7
+
8
+ RDoc Documentation
9
+
10
+ -->
11
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
12
+ <head>
13
+ <title>RDoc Documentation</title>
14
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
15
+ </head>
16
+ <frameset rows="20%, 80%">
17
+ <frameset cols="25%,35%,45%">
18
+ <frame src="fr_file_index.html" title="Files" name="Files" />
19
+ <frame src="fr_class_index.html" name="Classes" />
20
+ <frame src="fr_method_index.html" name="Methods" />
21
+ </frameset>
22
+ <frame src="files/examples/example1_rb.html" name="docwin" />
23
+ </frameset>
24
+ </html>
@@ -0,0 +1,208 @@
1
+
2
+ body {
3
+ font-family: Verdana,Arial,Helvetica,sans-serif;
4
+ font-size: 90%;
5
+ margin: 0;
6
+ margin-left: 40px;
7
+ padding: 0;
8
+ background: white;
9
+ }
10
+
11
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
12
+ h1 { font-size: 150%; }
13
+ h2,h3,h4 { margin-top: 1em; }
14
+
15
+ a { background: #eef; color: #039; text-decoration: none; }
16
+ a:hover { background: #039; color: #eef; }
17
+
18
+ /* Override the base stylesheet's Anchor inside a table cell */
19
+ td > a {
20
+ background: transparent;
21
+ color: #039;
22
+ text-decoration: none;
23
+ }
24
+
25
+ /* and inside a section title */
26
+ .section-title > a {
27
+ background: transparent;
28
+ color: #eee;
29
+ text-decoration: none;
30
+ }
31
+
32
+ /* === Structural elements =================================== */
33
+
34
+ div#index {
35
+ margin: 0;
36
+ margin-left: -40px;
37
+ padding: 0;
38
+ font-size: 90%;
39
+ }
40
+
41
+
42
+ div#index a {
43
+ margin-left: 0.7em;
44
+ }
45
+
46
+ div#index .section-bar {
47
+ margin-left: 0px;
48
+ padding-left: 0.7em;
49
+ background: #ccc;
50
+ font-size: small;
51
+ }
52
+
53
+
54
+ div#classHeader, div#fileHeader {
55
+ width: auto;
56
+ color: white;
57
+ padding: 0.5em 1.5em 0.5em 1.5em;
58
+ margin: 0;
59
+ margin-left: -40px;
60
+ border-bottom: 3px solid #006;
61
+ }
62
+
63
+ div#classHeader a, div#fileHeader a {
64
+ background: inherit;
65
+ color: white;
66
+ }
67
+
68
+ div#classHeader td, div#fileHeader td {
69
+ background: inherit;
70
+ color: white;
71
+ }
72
+
73
+
74
+ div#fileHeader {
75
+ background: #057;
76
+ }
77
+
78
+ div#classHeader {
79
+ background: #048;
80
+ }
81
+
82
+
83
+ .class-name-in-header {
84
+ font-size: 180%;
85
+ font-weight: bold;
86
+ }
87
+
88
+
89
+ div#bodyContent {
90
+ padding: 0 1.5em 0 1.5em;
91
+ }
92
+
93
+ div#description {
94
+ padding: 0.5em 1.5em;
95
+ background: #efefef;
96
+ border: 1px dotted #999;
97
+ }
98
+
99
+ div#description h1,h2,h3,h4,h5,h6 {
100
+ color: #125;;
101
+ background: transparent;
102
+ }
103
+
104
+ div#validator-badges {
105
+ text-align: center;
106
+ }
107
+ div#validator-badges img { border: 0; }
108
+
109
+ div#copyright {
110
+ color: #333;
111
+ background: #efefef;
112
+ font: 0.75em sans-serif;
113
+ margin-top: 5em;
114
+ margin-bottom: 0;
115
+ padding: 0.5em 2em;
116
+ }
117
+
118
+
119
+ /* === Classes =================================== */
120
+
121
+ table.header-table {
122
+ color: white;
123
+ font-size: small;
124
+ }
125
+
126
+ .type-note {
127
+ font-size: small;
128
+ color: #DEDEDE;
129
+ }
130
+
131
+ .xxsection-bar {
132
+ background: #eee;
133
+ color: #333;
134
+ padding: 3px;
135
+ }
136
+
137
+ .section-bar {
138
+ color: #333;
139
+ border-bottom: 1px solid #999;
140
+ margin-left: -20px;
141
+ }
142
+
143
+
144
+ .section-title {
145
+ background: #79a;
146
+ color: #eee;
147
+ padding: 3px;
148
+ margin-top: 2em;
149
+ margin-left: -30px;
150
+ border: 1px solid #999;
151
+ }
152
+
153
+ .top-aligned-row { vertical-align: top }
154
+ .bottom-aligned-row { vertical-align: bottom }
155
+
156
+ /* --- Context section classes ----------------------- */
157
+
158
+ .context-row { }
159
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
160
+ .context-item-value { font-size: small; color: #448; }
161
+ .context-item-desc { color: #333; padding-left: 2em; }
162
+
163
+ /* --- Method classes -------------------------- */
164
+ .method-detail {
165
+ background: #efefef;
166
+ padding: 0;
167
+ margin-top: 0.5em;
168
+ margin-bottom: 1em;
169
+ border: 1px dotted #ccc;
170
+ }
171
+ .method-heading {
172
+ color: black;
173
+ background: #ccc;
174
+ border-bottom: 1px solid #666;
175
+ padding: 0.2em 0.5em 0 0.5em;
176
+ }
177
+ .method-signature { color: black; background: inherit; }
178
+ .method-name { font-weight: bold; }
179
+ .method-args { font-style: italic; }
180
+ .method-description { padding: 0 0.5em 0 0.5em; }
181
+
182
+ /* --- Source code sections -------------------- */
183
+
184
+ a.source-toggle { font-size: 90%; }
185
+ div.method-source-code {
186
+ background: #262626;
187
+ color: #ffdead;
188
+ margin: 1em;
189
+ padding: 0.5em;
190
+ border: 1px dashed #999;
191
+ overflow: hidden;
192
+ }
193
+
194
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
195
+
196
+ /* --- Ruby keyword styles --------------------- */
197
+
198
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
199
+
200
+ .ruby-constant { color: #7fffd4; background: transparent; }
201
+ .ruby-keyword { color: #00ffff; background: transparent; }
202
+ .ruby-ivar { color: #eedd82; background: transparent; }
203
+ .ruby-operator { color: #00ffee; background: transparent; }
204
+ .ruby-identifier { color: #ffdead; background: transparent; }
205
+ .ruby-node { color: #ffa07a; background: transparent; }
206
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
207
+ .ruby-regexp { color: #ffa07a; background: transparent; }
208
+ .ruby-value { color: #7fffd4; background: transparent; }
@@ -0,0 +1,3 @@
1
+ require 'snarl'
2
+
3
+ Snarl.show_message('title', 'body test', 'test.png')
@@ -0,0 +1,14 @@
1
+ require 'snarl'
2
+
3
+ puts "Snarl Version: #{Snarl.version}"
4
+
5
+ 10.downto(1) do |i|
6
+ Snarl.show_message("Message", "Counting down #{i}", i)
7
+ end
8
+
9
+ sleep 11
10
+
11
+ 10.times do |i|
12
+ Snarl.show_message("Message", "Counting down #{i+1}", i+1)
13
+ end
14
+
@@ -0,0 +1,9 @@
1
+ require 'snarl'
2
+
3
+ clock_message = Snarl.new('Time', Time.now.to_s, 0)
4
+ while clock_message.visible?
5
+ clock_message.update('Time', Time.now.to_s)
6
+ sleep 0.75
7
+ end
8
+
9
+
@@ -0,0 +1,11 @@
1
+ require'snarl'
2
+
3
+ m = Snarl.new("Count down", "Here we go", 0)
4
+
5
+ 10.downto(0) do |i|
6
+ m.update("Count down", "T Minus #{i} and counting")
7
+ sleep 1
8
+ end
9
+ m.update("*BOOM*")
10
+ m.hide
11
+
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,47 @@
1
+ require 'snarl'
2
+
3
+ module AutoSnarl
4
+ def self.icon
5
+ # icons from http://www.famfamfam.com/lab/icons/silk/
6
+ path = File.join(File.dirname(__FILE__), "/../icons")
7
+ {
8
+ :green => "#{path}/accept.png",
9
+ :red => "#{path}/exclamation.png",
10
+ :info => "#{path}/information.png"
11
+ }
12
+ end
13
+
14
+ def self.snarl title, msg, ico = nil
15
+ Snarl.show_message(title, msg, icon[ico])
16
+ end
17
+
18
+ Autotest.add_hook :run do |at|
19
+ snarl "Run", "Run" unless $TESTING
20
+ end
21
+
22
+ Autotest.add_hook :red do |at|
23
+ failed_tests = at.files_to_test.inject(0){ |s,a| k,v = a; s + v.size}
24
+ snarl "Tests Failed", "#{failed_tests} tests failed", :red
25
+ end
26
+
27
+ Autotest.add_hook :green do |at|
28
+ snarl "Tests Passed", "All tests passed", :green #if at.tainted
29
+ end
30
+
31
+ Autotest.add_hook :run do |at|
32
+ snarl "autotest", "autotest was started", :info unless $TESTING
33
+ end
34
+
35
+ Autotest.add_hook :interrupt do |at|
36
+ snarl "autotest", "autotest was reset", :info unless $TESTING
37
+ end
38
+
39
+ Autotest.add_hook :quit do |at|
40
+ snarl "autotest", "autotest is exiting", :info unless $TESTING
41
+ end
42
+
43
+ Autotest.add_hook :all do |at|_hook
44
+ snarl "autotest", "Tests have fully passed", :green unless $TESTING
45
+ end
46
+
47
+ end
@@ -0,0 +1,151 @@
1
+ require 'dl/import'
2
+ require 'dl/struct'
3
+
4
+ # Snarl (http://www.fullphat.net/snarl.html) is a simple notification system,
5
+ # similar to Growl under OSX. This is a simple pure Ruby wrapper to the
6
+ #native API (using DL).
7
+ class Snarl
8
+
9
+ # This is the lowlevel API implemenation using DL and a few handy
10
+ # constants from the snarl api and the Win32 API
11
+ # Note that I have jump through some hoops to get the array of
12
+ # characters to work corretly -- if you know a better way please
13
+ # send me (phurley@gmail.com) a note.
14
+ module SnarlAPI
15
+ extend DL::Importable
16
+ dlload 'User32.dll'
17
+ extern "HWND FindWindow(const char*, const char*)"
18
+ extern "BOOL IsWindow(HWND)"
19
+ extern "int SendMessage(HWND, uint, uint, void*)"
20
+
21
+ SNARL_SHOW = 1
22
+ SNARL_HIDE = 2
23
+ SNARL_UPDATE = 3
24
+ SNARL_IS_VISIBLE = 4
25
+ SNARL_GET_VERSION = 5
26
+ SNARL_REGISTER_CONFIG_WINDOW = 6
27
+ SNARL_REVOKE_CONFIG_WINDOW = 7
28
+ SNARL_TEXT_LENGTH = 1024
29
+ WM_COPYDATA = 0x4a
30
+
31
+ SnarlStruct = struct [
32
+ "int cmd",
33
+ "long id",
34
+ "long timeout",
35
+ "long data2",
36
+ "char title[#{SNARL_TEXT_LENGTH}]",
37
+ "char text[#{SNARL_TEXT_LENGTH}]",
38
+ "char icon[#{SNARL_TEXT_LENGTH}]",
39
+ ]
40
+
41
+ CopyDataStruct = struct [
42
+ "long dwData",
43
+ "long cbData",
44
+ "void* lpData",
45
+ ]
46
+
47
+ # character array hoop jumping, we take the passed string and convert
48
+ # it into an array of integers, padded out to the correct length
49
+ # to_cha --> to character array
50
+ # I do this as it seems necessary to fit the DL API, if there is a
51
+ # better way please let me know
52
+ def self.to_cha(str)
53
+ result = str.split(/(.)/).map { |ch| ch[0] }.compact
54
+ result + Array.new(SNARL_TEXT_LENGTH - result.size, 0)
55
+ end
56
+
57
+ # Send the structure off to snarl, the routine will return (if everything
58
+ # goes well) the result of SendMessage which has an overloaded meaning
59
+ # based upon the cmd being sent
60
+ def self.send(ss)
61
+ if isWindow(hwnd = findWindow(nil, 'Snarl'))
62
+ cd = CopyDataStruct.malloc
63
+ cd.dwData = 2
64
+ cd.cbData = ss.size
65
+ cd.lpData = ss.to_ptr
66
+ sendMessage(hwnd, WM_COPYDATA, 0, cd.to_ptr)
67
+ end
68
+ end
69
+ end
70
+
71
+ include SnarlAPI
72
+ DEFAULT_TIMEOUT = 3
73
+
74
+ # Create a new snarl message, the only thing you need to send is a title
75
+ # note that if you decide to send an icon, you must provide the complete
76
+ # path
77
+ def initialize(title, msg=" ", icon=nil, timeout=DEFAULT_TIMEOUT)
78
+ @ss = SnarlStruct.malloc
79
+ show(title, msg, icon, timeout)
80
+ end
81
+
82
+ # a quick and easy method to create a new message, when you don't care
83
+ # to access it again
84
+ def self.show_message(title, msg=" ", icon=nil, timeout=DEFAULT_TIMEOUT)
85
+ Snarl.new(title, msg, icon, timeout)
86
+ end
87
+
88
+ # Update an existing message, it will return true/false depending upon
89
+ # success (it will fail if the message has already timed out or been
90
+ # dismissed)
91
+ def update(title,msg=" ",icon=nil)
92
+ @ss.cmd = SNARL_UPDATE
93
+ @ss.title = SnarlAPI.to_cha(title)
94
+ @ss.text = SnarlAPI.to_cha(msg)
95
+ icon = File.expand_path(icon)
96
+ @ss.icon = SnarlAPI.to_cha(icon) if icon && File.exist?(icon)
97
+ send?
98
+ end
99
+
100
+ # Hide you message -- this is the same as dismissing it
101
+ def hide
102
+ @ss.cmd = SNARL_HIDE
103
+ send?
104
+ end
105
+
106
+ # Check to see if the message is still being displayed
107
+ def visible?
108
+ @ss.cmd = SNARL_IS_VISIBLE
109
+ send?
110
+ end
111
+
112
+ # Return the current version of snarl (not the snarl gem) as a character
113
+ # string "1.0" format
114
+ def self.version
115
+ ss = SnarlAPI::SnarlStruct.malloc
116
+ ss.cmd = SNARL_GET_VERSION
117
+ version = SnarlAPI.send(ss)
118
+ "#{version >> 16}.#{version & 0xffff}"
119
+ end
120
+
121
+ protected
122
+ # Return the internal snarl id
123
+ def id
124
+ @ss.id
125
+ end
126
+
127
+ # exactly like the contructor -- this will create a new message, loosing
128
+ # the original
129
+ def show(title,msg=" ", icon=nil, timeout=DEFAULT_TIMEOUT)
130
+ @ss.title = SnarlAPI.to_cha(title)
131
+ @ss.text = SnarlAPI.to_cha(msg)
132
+ if icon
133
+ icon = File.expand_path(icon)
134
+ @ss.icon = SnarlAPI.to_cha(icon) if File.exist?(icon.to_s)
135
+ end
136
+ @ss.timeout = timeout
137
+ @ss.cmd = SNARL_SHOW
138
+ @ss.id = send
139
+ end
140
+
141
+ # Send the snarl structure, return the unfiltered result
142
+ def send
143
+ SnarlAPI.send(@ss)
144
+ end
145
+
146
+ # Send the snarl structure, return a true/false (interpreted from snarl)
147
+ def send?
148
+ !send.zero?
149
+ end
150
+ end
151
+