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.
- data/doc/classes/AutoSnarl.html +170 -0
- data/doc/classes/Snarl.html +457 -0
- data/doc/classes/Snarl/SnarlAPI.html +255 -0
- data/doc/created.rid +1 -0
- data/doc/files/examples/example1_rb.html +108 -0
- data/doc/files/examples/example2_rb.html +108 -0
- data/doc/files/examples/example3_rb.html +108 -0
- data/doc/files/examples/example4_rb.html +108 -0
- data/doc/files/lib/autosnarl_rb.html +108 -0
- data/doc/files/lib/snarl_rb.html +109 -0
- data/doc/fr_class_index.html +29 -0
- data/doc/fr_file_index.html +32 -0
- data/doc/fr_method_index.html +40 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/examples/example1.rb +3 -0
- data/examples/example2.rb +14 -0
- data/examples/example3.rb +9 -0
- data/examples/example4.rb +11 -0
- data/examples/test.png +0 -0
- data/icons/accept.png +0 -0
- data/icons/exclamation.png +0 -0
- data/icons/information.png +0 -0
- data/lib/autosnarl.rb +47 -0
- data/lib/snarl.rb +151 -0
- data/readme.txt +70 -0
- data/ruby-snarl.gemspec +18 -0
- data/test/readme.txt +8 -0
- metadata +83 -0
@@ -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>
|
data/doc/index.html
ADDED
@@ -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>
|
data/doc/rdoc-style.css
ADDED
@@ -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; }
|
data/examples/test.png
ADDED
Binary file
|
data/icons/accept.png
ADDED
Binary file
|
Binary file
|
Binary file
|
data/lib/autosnarl.rb
ADDED
@@ -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
|
data/lib/snarl.rb
ADDED
@@ -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
|
+
|