dialogbind 0.9.1 → 0.9.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dialogbind.rb +78 -2
  3. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c26d77179c387c148e245aaea10170e798a4b2dfa68e2813d99812b045f8683
4
- data.tar.gz: f4a9a8ef1be6f577f335443215fc130b3b5a8424d96da8e685c8baa28abc909b
3
+ metadata.gz: 381f74289047af6aa93e6a28daeb6a1da99102c39dd098b3d6c384bf94dbc520
4
+ data.tar.gz: a006ae717ed3253bb8fb623550ef691c1bfb69af5c9c877249a0466e5b816a51
5
5
  SHA512:
6
- metadata.gz: ccf3e2f001e744556469cbfdf5bb209594ce6239647153b2e2274f74e441c56700e6585aefbcd18cdfd5007602f433b82710b015247fcd7d3b8cd2f1bd8a218d
7
- data.tar.gz: bca641aa1a374afd1fc484db342f456cfc215e670373f924b65e37adc784a6e13459f6164c569bfd94b07b5de1e559d3f10bc132e33b173e9384f93a55e08802
6
+ metadata.gz: '089eacd34517bcead4fc0716cb074849f49219a5f0d475a1a06d1b28eb2f1abbfd42d24a7429c675b7b7be821c083403fab66ca71646f3f3e09067abdbe5301b'
7
+ data.tar.gz: f30f98c3d6b179526d85aa4d9a30f93c4fc0932c793565b94c9863e174e044a2ffb9ad405ff42a04b0ee517255896095d955e301f59c16c75a2beaf68e4afe75
data/lib/dialogbind.rb CHANGED
@@ -5,9 +5,12 @@
5
5
  # Copyright (C) Tim K 2018-2019 <timprogrammer@rambler.ru>.
6
6
  # Licensed under MIT License.
7
7
 
8
+ require 'fiddle/import'
9
+
8
10
  $dialogbind_macos_script_cmd = ''
9
- $dialogbind_version = '0.9.1'
11
+ $dialogbind_version = '0.9.1.1'
10
12
 
13
+ # Function used internally in DialogBind to run Zenity from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
11
14
  def zenity(arg)
12
15
  args_total = ''
13
16
  arg.keys.each do |key|
@@ -30,6 +33,26 @@ def zenity(arg)
30
33
  return system('zenity ' + args_total)
31
34
  end
32
35
 
36
+ # Internal module binding Win32 API MessageBox to Ruby. While it can be used directly, it is not recommended to do so to maintain your app's portability.
37
+ module Win32NativeMessageBox
38
+ # based on https://gist.github.com/Youka/3ebbdfd03454afa7d0c4
39
+ extend Fiddle::Importer
40
+
41
+ dlload 'user32'
42
+ typealias 'HANDLE', 'void*'
43
+ typealias 'HWND', 'HANDLE'
44
+ typealias 'LPCSTR', 'const char*'
45
+ typealias 'UINT', 'unsigned int'
46
+
47
+ extern 'int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT)'
48
+ end
49
+
50
+ # Function used internally in DialogBind to run Win32 MessageBoxA from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
51
+ def win32_msgbox(text, title='DialogBind', buttons=0)
52
+ return Win32NativeMessageBox::MessageBoxA(nil, text, title, buttons)
53
+ end
54
+
55
+ # Function used internally in DialogBind to run XMessage from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
33
56
  def xmessage(arg, buttons={ 'OK' => 0 }, file=false)
34
57
  build_cmd = 'xmessage -center -buttons "'
35
58
  first = true
@@ -49,6 +72,7 @@ def xmessage(arg, buttons={ 'OK' => 0 }, file=false)
49
72
  return system(build_cmd)
50
73
  end
51
74
 
75
+ # Function used internally in DialogBind to run AppleScript ``display dialog`` from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
52
76
  def macdialog(text, buttons=['OK'], type='dialog', error=false, dryrun=false)
53
77
  text_fixed = text.gsub("!", "").gsub("'", '').gsub('"', '').gsub('$', '')
54
78
  cmd = "osascript -e 'tell app \"System Events\" to display " + type + ' "' + text_fixed + '"'
@@ -68,11 +92,13 @@ def macdialog(text, buttons=['OK'], type='dialog', error=false, dryrun=false)
68
92
  return false
69
93
  end
70
94
 
71
- $dialogbind_available_backends = [ 'xmessage', 'zenity', 'macos' ]
95
+ $dialogbind_available_backends = [ 'xmessage', 'zenity', 'macos', 'win32' ]
72
96
  $dialogbind_dialog_backend = 'xmessage'
73
97
 
74
98
  if system('command -v zenity > /dev/null 2>&1') then
75
99
  $dialogbind_dialog_backend = 'zenity'
100
+ elsif ENV.keys.include?('OS') && ENV['OS'] == 'Windows_NT' then
101
+ $dialogbind_dialog_backend = 'win32'
76
102
  elsif `uname`.gsub("\n", "") == 'Darwin' then
77
103
  $dialogbind_dialog_backend = 'macos'
78
104
  end
@@ -84,6 +110,11 @@ if $dialogbind_available_backends.include?($dialogbind_dialog_backend) == false
84
110
  raise 'Dialog backend "' + $dialogbind_dialog_backend + '" is not available. Available frontends: ' + $dialogbind_available_backends.join(', ')
85
111
  end
86
112
 
113
+ # Shows a simple message box (or information message box when using Zenity backend).
114
+ #
115
+ # @param text [String] the text that should be displayed in a message box
116
+ # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
117
+ # @return [Boolean] true on success, false if something went wrong
87
118
  def guiputs(text, title='DialogBind')
88
119
  if $dialogbind_dialog_backend == 'xmessage' then
89
120
  return xmessage(text, { 'OK' => 0 })
@@ -91,6 +122,9 @@ def guiputs(text, title='DialogBind')
91
122
  return zenity({ 'info' => nil, 'title' => title, 'text' => text })
92
123
  elsif $dialogbind_dialog_backend == 'macos' then
93
124
  return macdialog(text)
125
+ elsif $dialogbind_dialog_backend == 'win32' then
126
+ win32_msgbox(text, title, 0)
127
+ return true
94
128
  else
95
129
  puts title + ': ' + text
96
130
  return true
@@ -98,6 +132,11 @@ def guiputs(text, title='DialogBind')
98
132
  return false
99
133
  end
100
134
 
135
+ # Shows a question message box with "Yes" and "No" buttons.
136
+ #
137
+ # @param text [String] the text that should be displayed in a message box
138
+ # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
139
+ # @return [Boolean] true if the user presses yes, false if the user pressed no
101
140
  def guiyesno(text, title='DialogBind')
102
141
  if $dialogbind_dialog_backend == 'xmessage' then
103
142
  return xmessage(text, { 'Yes' => 0, 'No' => 1})
@@ -112,12 +151,20 @@ def guiyesno(text, title='DialogBind')
112
151
  if output.split(':')[1].downcase == 'yes' then
113
152
  return true
114
153
  end
154
+ elsif $dialogbind_dialog_backend == 'win32' then
155
+ retv_msgbox = win32_msgbox(text, title, 4)
156
+ return (retv_msgbox == 6)
115
157
  else
116
158
  raise 'The selected backend does not support question message boxes.'
117
159
  end
118
160
  return false
119
161
  end
120
162
 
163
+ # Shows an error message box with only single OK button.
164
+ #
165
+ # @param text [String] the text that should be displayed in a message box
166
+ # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
167
+ # @return [Boolean] true on success, false if something went wrong
121
168
  def guierror(text, title='DialogBind')
122
169
  if $dialogbind_dialog_backend == 'xmessage' then
123
170
  return xmessage('ERROR. ' + text, { 'OK' => 0 })
@@ -125,12 +172,20 @@ def guierror(text, title='DialogBind')
125
172
  return zenity('error' => nil, 'title' => title, 'text' => text)
126
173
  elsif $dialogbind_dialog_backend == 'macos' then
127
174
  return macdialog(text, [ 'OK' ], 'dialog', true)
175
+ elsif $dialogbind_dialog_backend == 'win32' then
176
+ return win32_msgbox('Error. ' + text, title, 0)
128
177
  else
129
178
  raise 'The selected backend does not support question message boxes.'
130
179
  end
131
180
  return false
132
181
  end
133
182
 
183
+ # Shows either a buttonless message box with the specified text or a progress message box with the specified text. Does not work on Windows.
184
+ # This function is not async, just like all other functions, so you should actually start it in a seperate thread.
185
+ #
186
+ # @param text [String] the text that should be displayed in a message box
187
+ # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
188
+ # @return [Boolean] true on success, false if something went wrong
134
189
  def guiprogress(text='Please wait...', title='DialogBind')
135
190
  if $dialogbind_dialog_backend == 'xmessage' then
136
191
  return xmessage(text, { })
@@ -145,6 +200,11 @@ def guiprogress(text='Please wait...', title='DialogBind')
145
200
  return false
146
201
  end
147
202
 
203
+ # Shows a message box containing the license agreement that is stored in the specified file.
204
+ #
205
+ # @param file [String] the file that contains the licensing terms
206
+ # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
207
+ # @return [Boolean] true if the user accepts the terms of the license agreement or false if not
148
208
  def guilicense(file, title='DialogBind')
149
209
  if File.exists?(file) == false then
150
210
  guierror('File "' + file + '" does not exist.', title)
@@ -154,6 +214,13 @@ def guilicense(file, title='DialogBind')
154
214
  return xmessage(file, { 'Accept' => 0, 'Decline' => 1 }, true)
155
215
  elsif $dialogbind_dialog_backend == 'zenity' then
156
216
  return zenity({ 'text-info' => nil, 'title' => title, 'filename' => file, 'checkbox' => 'I have read and accepted the terms of the license agreement.' })
217
+ elsif $dialogbind_dialog_backend == 'macos' then
218
+ macdialog('Right now, the license agreement will be shown in TextEdit. Close TextEdit using Command-Q to continue,', ['OK'])
219
+ system('open -e "' + file.gsub('"', "\\\"") + '"')
220
+ return guiyesno('Do you accept the terms of the license agreement?', title)
221
+ elsif $dialogbind_dialog_backend == 'win32' then
222
+ retv_msgbox = win32_msgbox("Do you accept the terms of the license agreement below?\n\n" + File.read(file), title, 4)
223
+ return (retv_msgbox == 6)
157
224
  else
158
225
  raise 'The selected backend does not support license message boxes.'
159
226
  return false
@@ -171,6 +238,12 @@ def entry2buttonshash(entries)
171
238
  return hash
172
239
  end
173
240
 
241
+ # Shows either a message box with buttons matching the items specified in the array ``entries`` or a list message box.
242
+ #
243
+ # @param entries [Array] an array of strings that should be displayed as list in a message box. More than two items are currently not supported.
244
+ # @param text [String] the text that should be displayed in a message box
245
+ # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
246
+ # @return [String] the selected string or nil on cancel
174
247
  def guiselect(entries, text='Choose one of the items below:', title='DialogBind')
175
248
  if entries.length > 2 then
176
249
  raise 'More than 2 entries for guiselect are not supported by xmessage.'
@@ -199,6 +272,9 @@ def guiselect(entries, text='Choose one of the items below:', title='DialogBind'
199
272
  return nil
200
273
  end
201
274
  return output.split(':')[1]
275
+ else
276
+ raise 'The selected backend does not support license message boxes.'
277
+ return false
202
278
  end
203
279
  return nil
204
280
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dialogbind
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim K
@@ -41,5 +41,6 @@ rubygems_version: 3.0.4
41
41
  signing_key:
42
42
  specification_version: 4
43
43
  summary: DialogBind provides a Ruby API that wraps around Linux and macOS message
44
- box-generating tools.
44
+ box-generating tools. As of version 0.9.2, Windows is also (partially) supported.
45
+ See https://gitlab.com/timkoi/dialogbind/blob/master/README.md for documentation.
45
46
  test_files: []