ffi-tk 2010.08.23 → 2018.02.20
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.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +371 -0
- data/AUTHORS +4 -2
- data/CHANGELOG +302 -262
- data/Gemfile +10 -0
- data/Gemfile.lock +45 -0
- data/MANIFEST +6 -6
- data/README.md +1 -1
- data/Rakefile +12 -11
- data/bin/rwish +6 -5
- data/example/choose_color.rb +5 -4
- data/example/choose_directory.rb +5 -4
- data/example/dialog.rb +9 -8
- data/example/hello.rb +2 -1
- data/example/message_box.rb +8 -5
- data/example/option_menu.rb +4 -3
- data/example/popup.rb +4 -3
- data/example/set_palette.rb +5 -4
- data/example/text.rb +30 -30
- data/example/tile/kroc_demo_small.rb +51 -55
- data/example/tile/kroc_rb_demo.rb +74 -83
- data/example/tile/notebook.rb +6 -9
- data/example/tile/theme_hello.rb +6 -8
- data/example/tile/themes.rb +4 -2
- data/example/tile/treeview.rb +16 -14
- data/example/tkgo.rb +120 -88
- data/example/various.rb +8 -7
- data/example/wait.rb +3 -2
- data/ffi-tk.gemspec +21 -20
- data/gemset.nix +134 -0
- data/lib/ffi-tk.rb +10 -11
- data/lib/ffi-tk/command.rb +3 -2
- data/lib/ffi-tk/command/after.rb +8 -7
- data/lib/ffi-tk/command/bell.rb +2 -1
- data/lib/ffi-tk/command/bind.rb +1 -0
- data/lib/ffi-tk/command/bindtags.rb +1 -0
- data/lib/ffi-tk/command/cget.rb +31 -24
- data/lib/ffi-tk/command/choose_color.rb +2 -1
- data/lib/ffi-tk/command/choose_directory.rb +2 -1
- data/lib/ffi-tk/command/clipboard.rb +6 -5
- data/lib/ffi-tk/command/configure.rb +23 -21
- data/lib/ffi-tk/command/destroy.rb +2 -1
- data/lib/ffi-tk/command/dialog.rb +4 -3
- data/lib/ffi-tk/command/event.rb +1 -0
- data/lib/ffi-tk/command/focus.rb +2 -1
- data/lib/ffi-tk/command/font.rb +12 -9
- data/lib/ffi-tk/command/get_open_file.rb +1 -0
- data/lib/ffi-tk/command/get_save_file.rb +1 -0
- data/lib/ffi-tk/command/grab.rb +2 -1
- data/lib/ffi-tk/command/grid.rb +7 -6
- data/lib/ffi-tk/command/image.rb +5 -4
- data/lib/ffi-tk/command/lower.rb +1 -0
- data/lib/ffi-tk/command/message_box.rb +2 -1
- data/lib/ffi-tk/command/option_menu.rb +3 -2
- data/lib/ffi-tk/command/pack.rb +5 -4
- data/lib/ffi-tk/command/place.rb +5 -4
- data/lib/ffi-tk/command/popup.rb +2 -1
- data/lib/ffi-tk/command/raise.rb +1 -0
- data/lib/ffi-tk/command/scrollable.rb +7 -10
- data/lib/ffi-tk/command/selection.rb +4 -3
- data/lib/ffi-tk/command/set_palette.rb +2 -1
- data/lib/ffi-tk/command/tk_cmd.rb +1 -0
- data/lib/ffi-tk/command/vars.rb +2 -1
- data/lib/ffi-tk/command/wait.rb +2 -1
- data/lib/ffi-tk/command/winfo.rb +9 -8
- data/lib/ffi-tk/command/wm.rb +11 -10
- data/lib/ffi-tk/core_extensions.rb +5 -4
- data/lib/ffi-tk/event/data.rb +32 -31
- data/lib/ffi-tk/event/handler.rb +4 -3
- data/lib/ffi-tk/ffi/tcl.rb +42 -31
- data/lib/ffi-tk/ffi/tcl/cmd_proc.rb +2 -1
- data/lib/ffi-tk/ffi/tcl/eval_result.rb +47 -8
- data/lib/ffi-tk/ffi/tcl/interp.rb +7 -4
- data/lib/ffi-tk/ffi/tcl/obj.rb +7 -32
- data/lib/ffi-tk/ffi/tcl/time.rb +2 -1
- data/lib/ffi-tk/ffi/tk.rb +8 -7
- data/lib/ffi-tk/geometry.rb +20 -17
- data/lib/ffi-tk/thread_sender.rb +1 -0
- data/lib/ffi-tk/tk.rb +23 -23
- data/lib/ffi-tk/variable.rb +25 -3
- data/lib/ffi-tk/version.rb +1 -1
- data/lib/ffi-tk/widget.rb +2 -1
- data/lib/ffi-tk/widget/button.rb +4 -1
- data/lib/ffi-tk/widget/canvas.rb +18 -15
- data/lib/ffi-tk/widget/canvas/arc.rb +2 -1
- data/lib/ffi-tk/widget/canvas/bitmap.rb +2 -1
- data/lib/ffi-tk/widget/canvas/image.rb +2 -1
- data/lib/ffi-tk/widget/canvas/item.rb +4 -4
- data/lib/ffi-tk/widget/canvas/line.rb +2 -1
- data/lib/ffi-tk/widget/canvas/oval.rb +2 -1
- data/lib/ffi-tk/widget/canvas/polygon.rb +2 -1
- data/lib/ffi-tk/widget/canvas/rectangle.rb +2 -1
- data/lib/ffi-tk/widget/canvas/text.rb +2 -1
- data/lib/ffi-tk/widget/canvas/window.rb +2 -1
- data/lib/ffi-tk/widget/checkbutton.rb +4 -1
- data/lib/ffi-tk/widget/entry.rb +4 -1
- data/lib/ffi-tk/widget/frame.rb +4 -1
- data/lib/ffi-tk/widget/label.rb +4 -1
- data/lib/ffi-tk/widget/labelframe.rb +4 -1
- data/lib/ffi-tk/widget/listbox.rb +5 -2
- data/lib/ffi-tk/widget/menu.rb +4 -1
- data/lib/ffi-tk/widget/menubutton.rb +4 -1
- data/lib/ffi-tk/widget/message.rb +4 -1
- data/lib/ffi-tk/widget/panedwindow.rb +5 -2
- data/lib/ffi-tk/widget/radiobutton.rb +4 -1
- data/lib/ffi-tk/widget/root.rb +1 -0
- data/lib/ffi-tk/widget/scale.rb +4 -1
- data/lib/ffi-tk/widget/scrollbar.rb +4 -1
- data/lib/ffi-tk/widget/spinbox.rb +4 -1
- data/lib/ffi-tk/widget/text.rb +20 -16
- data/lib/ffi-tk/widget/text/peer.rb +1 -0
- data/lib/ffi-tk/widget/tile.rb +2 -1
- data/lib/ffi-tk/widget/tile/button.rb +4 -1
- data/lib/ffi-tk/widget/tile/checkbutton.rb +4 -1
- data/lib/ffi-tk/widget/tile/combobox.rb +5 -2
- data/lib/ffi-tk/widget/tile/entry.rb +4 -1
- data/lib/ffi-tk/widget/tile/frame.rb +4 -1
- data/lib/ffi-tk/widget/tile/label.rb +4 -2
- data/lib/ffi-tk/widget/tile/labelframe.rb +4 -1
- data/lib/ffi-tk/widget/tile/menubutton.rb +4 -1
- data/lib/ffi-tk/widget/tile/notebook.rb +4 -1
- data/lib/ffi-tk/widget/tile/panedwindow.rb +4 -1
- data/lib/ffi-tk/widget/tile/progressbar.rb +4 -2
- data/lib/ffi-tk/widget/tile/radiobutton.rb +4 -1
- data/lib/ffi-tk/widget/tile/scale.rb +4 -1
- data/lib/ffi-tk/widget/tile/scrollbar.rb +7 -4
- data/lib/ffi-tk/widget/tile/separator.rb +4 -1
- data/lib/ffi-tk/widget/tile/sizegrip.rb +4 -1
- data/lib/ffi-tk/widget/tile/style.rb +16 -17
- data/lib/ffi-tk/widget/tile/treeview.rb +11 -5
- data/lib/ffi-tk/widget/toplevel.rb +4 -1
- data/shell.nix +19 -0
- data/spec/ffi-tk/command/bind.rb +5 -4
- data/spec/ffi-tk/command/bindtags.rb +2 -1
- data/spec/ffi-tk/command/clipboard.rb +4 -3
- data/spec/ffi-tk/command/font.rb +20 -19
- data/spec/ffi-tk/command/image.rb +13 -5
- data/spec/ffi-tk/command/pack.rb +3 -2
- data/spec/ffi-tk/command/place.rb +4 -3
- data/spec/ffi-tk/command/selection.rb +2 -1
- data/spec/ffi-tk/command/vars.rb +3 -2
- data/spec/ffi-tk/command/winfo.rb +10 -10
- data/spec/ffi-tk/command/wm.rb +23 -22
- data/spec/ffi-tk/event.rb +23 -21
- data/spec/ffi-tk/tile/button.rb +8 -8
- data/spec/ffi-tk/tile/checkbutton.rb +1 -1
- data/spec/ffi-tk/tile/combobox.rb +11 -12
- data/spec/ffi-tk/tile/entry.rb +18 -19
- data/spec/ffi-tk/tile/frame.rb +13 -13
- data/spec/ffi-tk/tile/label.rb +2 -2
- data/spec/ffi-tk/tile/labelframe.rb +1 -1
- data/spec/ffi-tk/tile/menubutton.rb +1 -1
- data/spec/ffi-tk/tile/notebook.rb +22 -20
- data/spec/ffi-tk/tile/panedwindow.rb +1 -1
- data/spec/ffi-tk/tile/progressbar.rb +1 -1
- data/spec/ffi-tk/tile/radiobutton.rb +1 -1
- data/spec/ffi-tk/tile/scale.rb +1 -1
- data/spec/ffi-tk/tile/scrollbar.rb +1 -16
- data/spec/ffi-tk/tile/separator.rb +2 -2
- data/spec/ffi-tk/tile/sizegrip.rb +1 -1
- data/spec/ffi-tk/tile/style.rb +63 -65
- data/spec/ffi-tk/tile/treeview.rb +11 -10
- data/spec/ffi-tk/variable.rb +5 -4
- data/spec/ffi-tk/widget/button.rb +3 -2
- data/spec/ffi-tk/widget/canvas.rb +59 -58
- data/spec/ffi-tk/widget/checkbutton.rb +6 -5
- data/spec/ffi-tk/widget/entry.rb +112 -103
- data/spec/ffi-tk/widget/frame.rb +2 -1
- data/spec/ffi-tk/widget/label.rb +2 -1
- data/spec/ffi-tk/widget/labelframe.rb +1 -0
- data/spec/ffi-tk/widget/listbox.rb +5 -4
- data/spec/ffi-tk/widget/menu.rb +3 -2
- data/spec/ffi-tk/widget/menubutton.rb +1 -0
- data/spec/ffi-tk/widget/message.rb +1 -0
- data/spec/ffi-tk/widget/panedwindow.rb +1 -0
- data/spec/ffi-tk/widget/radiobutton.rb +1 -0
- data/spec/ffi-tk/widget/root.rb +2 -1
- data/spec/ffi-tk/widget/scale.rb +1 -0
- data/spec/ffi-tk/widget/scrollbar.rb +1 -0
- data/spec/ffi-tk/widget/spinbox.rb +1 -0
- data/spec/ffi-tk/widget/text.rb +63 -54
- data/spec/ffi-tk/widget/toplevel.rb +1 -0
- data/spec/helper.rb +3 -1
- data/tasks/authors.rake +3 -2
- data/tasks/bacon.rake +13 -11
- data/tasks/changelog.rake +1 -0
- data/tasks/gem.rake +13 -11
- data/tasks/manifest.rake +2 -1
- data/tasks/release.rake +11 -32
- data/tasks/reversion.rake +2 -1
- metadata +52 -75
- data/spec/ffi-tk/command/grid.rb +0 -6
- data/tasks/gem_setup.rake +0 -113
- data/tasks/grancher.rake +0 -12
- data/tasks/rcov.rake +0 -17
- data/tasks/setup.rake +0 -12
- data/tasks/ycov.rake +0 -84
data/lib/ffi-tk/command/wm.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Tk
|
2
3
|
# Communicate with window manager
|
3
4
|
# The wm command is used to interact with window managers in order to control
|
@@ -303,7 +304,7 @@ module Tk
|
|
303
304
|
Tk.execute_only(:wm, :aspect, window, '', '', '', '')
|
304
305
|
else
|
305
306
|
result = Tk.execute_only(:wm, :aspect, window,
|
306
|
-
|
307
|
+
min_numer, min_denom, max_numer, max_denom)
|
307
308
|
if result.to_s == ''
|
308
309
|
nil
|
309
310
|
else
|
@@ -409,8 +410,8 @@ module Tk
|
|
409
410
|
alpha: :float,
|
410
411
|
topmost: :boolean,
|
411
412
|
zoomed: :boolean,
|
412
|
-
fullscreen: :boolean
|
413
|
-
}
|
413
|
+
fullscreen: :boolean
|
414
|
+
}.freeze
|
414
415
|
|
415
416
|
# If name is specified, this command stores name (which should be the name
|
416
417
|
# of the host on which the application is executing) in window's
|
@@ -422,7 +423,7 @@ module Tk
|
|
422
423
|
# WM_CLIENT_MACHINE property from window.
|
423
424
|
def client(window, name = None)
|
424
425
|
if name == None
|
425
|
-
Tk.execute(:wm, :client, window)
|
426
|
+
Tk.execute(:wm, :client, window)
|
426
427
|
else
|
427
428
|
Tk.execute_only(:wm, :client, window, name)
|
428
429
|
end
|
@@ -471,7 +472,7 @@ module Tk
|
|
471
472
|
# WM_COMMAND property from window.
|
472
473
|
def command(window, value = None)
|
473
474
|
if value == None
|
474
|
-
Tk.execute(:wm, :command, window)
|
475
|
+
Tk.execute(:wm, :command, window)&.split
|
475
476
|
else
|
476
477
|
Tk.execute_only(:wm, :command, window, value)
|
477
478
|
end
|
@@ -594,7 +595,7 @@ module Tk
|
|
594
595
|
# functionality.
|
595
596
|
def grid(window, base_width = None, base_height = None, width_inc = None, height_inc = None)
|
596
597
|
if base_width == None
|
597
|
-
Tk.execute(:wm, :grid, window)
|
598
|
+
Tk.execute(:wm, :grid, window)
|
598
599
|
else
|
599
600
|
Tk.execute_only(:wm, :grid, window, base_width, base_height, width_inc, height_inc)
|
600
601
|
end
|
@@ -611,13 +612,13 @@ module Tk
|
|
611
612
|
# if window is not part of any group.
|
612
613
|
def group(window, pathname = None)
|
613
614
|
if None == pathname
|
614
|
-
Tk.execute(:wm, :group, window)
|
615
|
+
Tk.execute(:wm, :group, window)
|
615
616
|
else
|
616
617
|
Tk.execute_only(:wm, :group, window, pathname)
|
617
618
|
end
|
618
619
|
end
|
619
620
|
|
620
|
-
#wm iconbitmap window ?bitmap?
|
621
|
+
# wm iconbitmap window ?bitmap?
|
621
622
|
# If bitmap is specified, then it names a bitmap in the standard forms
|
622
623
|
# accepted by Tk (see the Tk_GetBitmap manual entry for details).
|
623
624
|
# This bitmap is passed to the window manager to be dis? played in window's
|
@@ -630,7 +631,7 @@ module Tk
|
|
630
631
|
# On the Windows operating system, an additional flag is supported:
|
631
632
|
def iconbitmap(window, bitmap = None)
|
632
633
|
if None == bitmap
|
633
|
-
Tk.execute(:wm, :iconbitmap, window)
|
634
|
+
Tk.execute(:wm, :iconbitmap, window)
|
634
635
|
else
|
635
636
|
Tk.execute_only(:wm, :iconbitmap, window, bitmap)
|
636
637
|
end
|
@@ -780,7 +781,7 @@ module Tk
|
|
780
781
|
# maximum width and height currently in effect.
|
781
782
|
# The maximum size defaults to the size of the screen.
|
782
783
|
# See the sections on geometry management below for more information.
|
783
|
-
def maxsize(
|
784
|
+
def maxsize(_window, width = None, height = None)
|
784
785
|
if width == None || height == None
|
785
786
|
Tk.execute(:wm, :maxsize)
|
786
787
|
else
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Tk
|
2
3
|
# Already converted statement, don't process again
|
3
4
|
class TclString < String
|
@@ -11,7 +12,7 @@ module Tk
|
|
11
12
|
module CoreExtensions
|
12
13
|
module Array
|
13
14
|
def to_tcl
|
14
|
-
TclString.new(
|
15
|
+
TclString.new("{#{map(&:to_tcl).compact.join(' ')}}")
|
15
16
|
end
|
16
17
|
|
17
18
|
# try to convert to a Hash.
|
@@ -92,13 +93,13 @@ module Tk
|
|
92
93
|
pattern = "(?#{embed.join})#{source}"
|
93
94
|
end
|
94
95
|
|
95
|
-
TclString.new(
|
96
|
+
TclString.new(%({#{pattern.gsub(/([^\\])(?=[{}])/, '\1\\\\\2')}}))
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
99
100
|
module String
|
100
101
|
def to_tcl
|
101
|
-
TclString.new(
|
102
|
+
TclString.new(%("#{gsub(/[\[\]{}$"\\]/, '\\\\\&')}"))
|
102
103
|
end
|
103
104
|
|
104
105
|
def to_tcl_option
|
@@ -128,7 +129,7 @@ module Tk
|
|
128
129
|
end
|
129
130
|
end
|
130
131
|
|
131
|
-
module
|
132
|
+
module Integer
|
132
133
|
def tcl_to_ruby(option, hints)
|
133
134
|
name = option.sub(/^-/, '').to_sym
|
134
135
|
|
data/lib/ffi-tk/event/data.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Tk
|
2
3
|
module Event
|
3
4
|
Data = Struct.new(
|
@@ -10,41 +11,41 @@ module Tk
|
|
10
11
|
|
11
12
|
class Data
|
12
13
|
PROPERTIES = [
|
13
|
-
['%#', :Integer, :serial
|
14
|
-
['%b', :Integer, :button
|
15
|
-
['%c', :Integer, :count
|
16
|
-
['%d', :String, :detail
|
17
|
-
['%f', :String, :focus
|
18
|
-
['%h', :Integer, :height
|
19
|
-
['%i', :String, :window
|
20
|
-
['%k', :Integer, :keycode
|
21
|
-
['%m', :String, :mode
|
22
|
-
['%o', :String, :override_redirect
|
23
|
-
['%p', :String, :place
|
24
|
-
['%s', :String, :state
|
25
|
-
['%t', :Integer, :time
|
26
|
-
['%w', :Integer, :width
|
27
|
-
['%x', :Integer, :x
|
28
|
-
['%y', :Integer, :y
|
29
|
-
['%A', :String, :unicode
|
30
|
-
['%B', :Integer, :border_width
|
31
|
-
['%D', :Integer, :mousewheel_delta
|
32
|
-
['%E', :Integer, :send_event
|
33
|
-
['%K', :String, :keysym
|
34
|
-
['%N', :Integer, :keysym_number
|
35
|
-
['%P', :String, :property
|
36
|
-
['%R', :String, :root
|
37
|
-
['%S', :String, :subwindow
|
38
|
-
['%T', :Integer, :type
|
39
|
-
['%W', :String, :window_path
|
40
|
-
['%X', :Integer, :x_root
|
41
|
-
['%Y', :Integer, :y_root
|
42
|
-
]
|
14
|
+
['%#', :Integer, :serial],
|
15
|
+
['%b', :Integer, :button],
|
16
|
+
['%c', :Integer, :count],
|
17
|
+
['%d', :String, :detail],
|
18
|
+
['%f', :String, :focus],
|
19
|
+
['%h', :Integer, :height],
|
20
|
+
['%i', :String, :window],
|
21
|
+
['%k', :Integer, :keycode],
|
22
|
+
['%m', :String, :mode],
|
23
|
+
['%o', :String, :override_redirect],
|
24
|
+
['%p', :String, :place],
|
25
|
+
['%s', :String, :state],
|
26
|
+
['%t', :Integer, :time],
|
27
|
+
['%w', :Integer, :width],
|
28
|
+
['%x', :Integer, :x],
|
29
|
+
['%y', :Integer, :y],
|
30
|
+
['%A', :String, :unicode],
|
31
|
+
['%B', :Integer, :border_width],
|
32
|
+
['%D', :Integer, :mousewheel_delta],
|
33
|
+
['%E', :Integer, :send_event],
|
34
|
+
['%K', :String, :keysym],
|
35
|
+
['%N', :Integer, :keysym_number],
|
36
|
+
['%P', :String, :property],
|
37
|
+
['%R', :String, :root],
|
38
|
+
['%S', :String, :subwindow],
|
39
|
+
['%T', :Integer, :type],
|
40
|
+
['%W', :String, :window_path],
|
41
|
+
['%X', :Integer, :x_root],
|
42
|
+
['%Y', :Integer, :y_root]
|
43
|
+
].freeze
|
43
44
|
|
44
45
|
def initialize(id, pattern, *properties)
|
45
46
|
super id, pattern
|
46
47
|
|
47
|
-
PROPERTIES.each do |
|
48
|
+
PROPERTIES.each do |_code, conv, name|
|
48
49
|
value = properties.shift
|
49
50
|
converted = String(value)
|
50
51
|
next if converted == '??'
|
data/lib/ffi-tk/event/handler.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Tk
|
2
3
|
module Event
|
3
4
|
module Handler
|
@@ -17,12 +18,12 @@ module Tk
|
|
17
18
|
def register_block(block)
|
18
19
|
id = nil
|
19
20
|
|
20
|
-
@mutex.synchronize
|
21
|
+
@mutex.synchronize do
|
21
22
|
@store << block
|
22
23
|
id = @store.size - 1
|
23
|
-
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
+
id
|
26
27
|
end
|
27
28
|
|
28
29
|
def register(tag, sequence, &block)
|
data/lib/ffi-tk/ffi/tcl.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'ffi-tk/ffi/tcl/obj'
|
2
3
|
require 'ffi-tk/ffi/tcl/interp'
|
3
4
|
require 'ffi-tk/ffi/tcl/cmd_proc'
|
@@ -9,40 +10,50 @@ module FFI
|
|
9
10
|
extend FFI::Library
|
10
11
|
ffi_lib ::Tk::TCL_LIBPATH
|
11
12
|
|
12
|
-
attach_function :Tcl_AppendAllObjTypes, [
|
13
|
-
attach_function :Tcl_CreateInterp, [],
|
14
|
-
attach_function :Tcl_DeleteInterp, [
|
15
|
-
attach_function :Tcl_DoOneEvent, [
|
16
|
-
attach_function :Tcl_EvalEx, [
|
17
|
-
attach_function :Tcl_GetBoolean, [
|
18
|
-
attach_function :Tcl_GetBooleanFromObj, [
|
19
|
-
attach_function :Tcl_GetDoubleFromObj, [
|
20
|
-
attach_function :Tcl_GetIntFromObj, [
|
21
|
-
attach_function :Tcl_GetObjResult, [
|
22
|
-
attach_function :Tcl_GetObjType, [:string],
|
23
|
-
attach_function :Tcl_GetString, [
|
24
|
-
attach_function :Tcl_GetStringFromObj, [
|
25
|
-
attach_function :Tcl_GetStringResult, [
|
26
|
-
attach_function :Tcl_GetUnicode, [
|
27
|
-
attach_function :Tcl_Init, [
|
28
|
-
attach_function :Tcl_ListObjGetElements, [
|
29
|
-
attach_function :Tcl_ListObjIndex, [
|
30
|
-
attach_function :Tcl_ListObjLength, [
|
31
|
-
attach_function :Tcl_NewBooleanObj, [:int],
|
32
|
-
attach_function :Tcl_NewIntObj, [:int],
|
33
|
-
attach_function :Tcl_NewListObj, [
|
34
|
-
attach_function :Tcl_NewStringObj, [:string, :int],
|
35
|
-
attach_function :
|
36
|
-
attach_function :
|
37
|
-
attach_function :
|
38
|
-
attach_function :
|
39
|
-
attach_function :
|
40
|
-
attach_function :
|
13
|
+
attach_function :Tcl_AppendAllObjTypes, [:pointer, :pointer], :int
|
14
|
+
attach_function :Tcl_CreateInterp, [], :pointer
|
15
|
+
attach_function :Tcl_DeleteInterp, [:pointer], :void
|
16
|
+
attach_function :Tcl_DoOneEvent, [:int], :int
|
17
|
+
attach_function :Tcl_EvalEx, [:pointer, :string, :int, :int], :int
|
18
|
+
attach_function :Tcl_GetBoolean, [:pointer, :string, :pointer], :int
|
19
|
+
attach_function :Tcl_GetBooleanFromObj, [:pointer, :pointer, :pointer], :int
|
20
|
+
attach_function :Tcl_GetDoubleFromObj, [:pointer, :pointer, :pointer], :int
|
21
|
+
attach_function :Tcl_GetIntFromObj, [:pointer, :pointer, :pointer], :int
|
22
|
+
attach_function :Tcl_GetObjResult, [:pointer], :pointer
|
23
|
+
attach_function :Tcl_GetObjType, [:string], :pointer
|
24
|
+
attach_function :Tcl_GetString, [:pointer], :string
|
25
|
+
attach_function :Tcl_GetStringFromObj, [:pointer, :pointer], :string
|
26
|
+
attach_function :Tcl_GetStringResult, [:pointer], :string
|
27
|
+
attach_function :Tcl_GetUnicode, [:pointer], :string
|
28
|
+
attach_function :Tcl_Init, [:pointer], :int
|
29
|
+
attach_function :Tcl_ListObjGetElements, [:pointer, :pointer, :pointer, :pointer], :int
|
30
|
+
attach_function :Tcl_ListObjIndex, [:pointer, :pointer, :int, :pointer], :int
|
31
|
+
attach_function :Tcl_ListObjLength, [:pointer, :pointer, :pointer], :int
|
32
|
+
attach_function :Tcl_NewBooleanObj, [:int], :pointer
|
33
|
+
attach_function :Tcl_NewIntObj, [:int], :pointer
|
34
|
+
attach_function :Tcl_NewListObj, [:int, :pointer], :pointer
|
35
|
+
attach_function :Tcl_NewStringObj, [:string, :int], :pointer
|
36
|
+
attach_function :Tcl_NewDictObj, [], :pointer
|
37
|
+
attach_function :Tcl_ObjGetVar2, [:pointer, :pointer, :pointer, :int], :pointer
|
38
|
+
attach_function :Tcl_ObjSetVar2, [:pointer, :pointer, :pointer, :pointer, :int], :pointer
|
39
|
+
attach_function :Tcl_ParseVar, [:pointer, :pointer, :pointer], :pointer
|
40
|
+
attach_function :Tcl_SetObjResult, [:pointer, :pointer], :void
|
41
|
+
attach_function :Tcl_WaitForEvent, [:pointer], :int
|
42
|
+
attach_function :Tcl_SetMaxBlockTime, [:pointer], :void
|
43
|
+
attach_function :Tcl_DictObjGet, [:pointer, :pointer, :pointer, :pointer], :int
|
44
|
+
attach_function :Tcl_DictObjPut, [:pointer, :pointer, :pointer, :pointer], :int
|
45
|
+
attach_function :Tcl_DictObjRemove, [:pointer, :pointer, :pointer], :int
|
46
|
+
attach_function :Tcl_DictObjSize, [:pointer, :pointer, :pointer], :int
|
47
|
+
attach_function :Tcl_DictObjFirst, [:pointer, :pointer, :pointer, :pointer, :pointer, :pointer], :int
|
48
|
+
attach_function :Tcl_DictObjNext, [:pointer, :pointer, :pointer, :pointer], :void
|
49
|
+
attach_function :Tcl_DictObjDone, [:pointer], :void
|
50
|
+
attach_function :Tcl_DictObjPutKeyList, [:pointer, :pointer, :int, :pointer, :pointer], :int
|
51
|
+
attach_function :Tcl_DictObjRemoveKeyList, [:pointer, :pointer, :int, :pointer], :int
|
41
52
|
|
42
|
-
callback :obj_cmd_proc, [:int,
|
53
|
+
callback :obj_cmd_proc, [:int, :pointer, :int, :pointer], :int
|
43
54
|
callback :obj_delete_proc, [:int], :void
|
44
55
|
attach_function :Tcl_CreateObjCommand, [
|
45
|
-
|
56
|
+
:pointer, :string, :obj_cmd_proc, :int, :obj_delete_proc], :pointer
|
46
57
|
|
47
58
|
module_function
|
48
59
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module FFI
|
2
3
|
module Tcl
|
3
4
|
# This whole class feels very awkward, maybe it should be merged with Obj.
|
@@ -15,6 +16,7 @@ module FFI
|
|
15
16
|
string_length_ptr = MemoryPointer.new(:int)
|
16
17
|
|
17
18
|
if Tcl.list_obj_get_elements(interp, list, objc_ptr, objv_ptr) == 0
|
19
|
+
return [] if objv_ptr.get_pointer(0).null?
|
18
20
|
array_ptr = objv_ptr.get_pointer(0)
|
19
21
|
array_length = objc_ptr.get_int(0)
|
20
22
|
array = array_ptr.read_array_of_pointer(array_length)
|
@@ -30,6 +32,7 @@ module FFI
|
|
30
32
|
|
31
33
|
def self.guess(interp, obj, fallback = nil)
|
32
34
|
obj = Obj.new(obj) unless obj.respond_to?(:type)
|
35
|
+
# p obj: obj, obj_type: obj.type
|
33
36
|
type = TYPES[obj.type.to_i]
|
34
37
|
|
35
38
|
case type
|
@@ -41,16 +44,49 @@ module FFI
|
|
41
44
|
to_int(interp, obj)
|
42
45
|
when :double
|
43
46
|
to_double(interp, obj)
|
47
|
+
when :dict
|
48
|
+
to_dict(interp, obj)
|
49
|
+
when :window
|
50
|
+
to_window(interp, obj)
|
44
51
|
else
|
45
52
|
if fallback
|
46
53
|
__send__(fallback, interp, obj)
|
54
|
+
elsif type.nil? && obj.bytes == ''
|
55
|
+
nil
|
56
|
+
elsif type.nil?
|
57
|
+
to_string(interp, obj)
|
47
58
|
else
|
48
|
-
raise
|
49
|
-
new(interp, obj)
|
59
|
+
raise 'Unknown type: %p' % [type]
|
50
60
|
end
|
51
61
|
end
|
52
62
|
end
|
53
63
|
|
64
|
+
def self.to_window(interp, obj)
|
65
|
+
p interp: interp, obj: obj
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.to_dict(interp, obj)
|
69
|
+
out = {}
|
70
|
+
|
71
|
+
search = MemoryPointer.new(:pointer)
|
72
|
+
done = MemoryPointer.new(:int)
|
73
|
+
key_ptr = MemoryPointer.new(:pointer)
|
74
|
+
value_ptr = MemoryPointer.new(:pointer)
|
75
|
+
strlen = MemoryPointer.new(:int)
|
76
|
+
|
77
|
+
Tcl.dict_obj_first(interp, obj, search, key_ptr, value_ptr, done)
|
78
|
+
|
79
|
+
while done.get_int(0) != 1
|
80
|
+
key = Tcl.get_string_from_obj(key_ptr.get_pointer(0), strlen)
|
81
|
+
value = Tcl.get_string_from_obj(value_ptr.get_pointer(0), strlen)
|
82
|
+
out[key] = value
|
83
|
+
|
84
|
+
Tcl.dict_obj_next(search, key_ptr, value_ptr, done)
|
85
|
+
end
|
86
|
+
|
87
|
+
out
|
88
|
+
end
|
89
|
+
|
54
90
|
def self.to_double(interp, obj)
|
55
91
|
double_pointer = MemoryPointer.new(:double)
|
56
92
|
|
@@ -73,9 +109,10 @@ module FFI
|
|
73
109
|
objv_ptr = MemoryPointer.new(:pointer)
|
74
110
|
|
75
111
|
if Tcl.list_obj_get_elements(interp, obj, objc_ptr, objv_ptr) == 0
|
76
|
-
objv_ptr.get_pointer(0).
|
77
|
-
|
78
|
-
|
112
|
+
return [] if objv_ptr.get_pointer(0).null?
|
113
|
+
objv_ptr.get_pointer(0)
|
114
|
+
.read_array_of_pointer(objc_ptr.get_int(0))
|
115
|
+
.map(&block)
|
79
116
|
else
|
80
117
|
panic(interp, 'Tcl_ListObjGetElements')
|
81
118
|
end
|
@@ -94,14 +131,16 @@ module FFI
|
|
94
131
|
def self.to_int(interp, obj)
|
95
132
|
int_pointer = MemoryPointer.new(:int)
|
96
133
|
|
97
|
-
if
|
134
|
+
if obj.bytes == ''
|
135
|
+
'' # used by text widget -endline
|
136
|
+
elsif Tcl.get_int_from_obj(interp, obj, int_pointer) == 0
|
98
137
|
int_pointer.get_int(0)
|
99
138
|
else
|
100
139
|
panic(interp, 'Tcl_GetIntFromObj')
|
101
140
|
end
|
102
141
|
end
|
103
142
|
|
104
|
-
def self.to_string(
|
143
|
+
def self.to_string(_interp, obj)
|
105
144
|
length_pointer = MemoryPointer.new(:int)
|
106
145
|
|
107
146
|
string = Tcl.get_string_from_obj(obj, length_pointer)
|
@@ -162,7 +201,7 @@ module FFI
|
|
162
201
|
end
|
163
202
|
|
164
203
|
def inspect
|
165
|
-
"#<EvalResult #{
|
204
|
+
"#<EvalResult #{self}>"
|
166
205
|
end
|
167
206
|
end
|
168
207
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module FFI
|
2
3
|
module Tcl
|
3
4
|
class Interp < PrettyStruct
|
@@ -11,7 +12,7 @@ module FFI
|
|
11
12
|
EVAL_DIRECT = 0x40000
|
12
13
|
|
13
14
|
def inspect
|
14
|
-
|
15
|
+
'Interp'
|
15
16
|
end
|
16
17
|
|
17
18
|
def guess_result
|
@@ -31,7 +32,7 @@ module FFI
|
|
31
32
|
Tcl.new_boolean_obj(0)
|
32
33
|
when String
|
33
34
|
Tcl.new_string_obj(ruby_obj, ruby_obj.bytesize)
|
34
|
-
when
|
35
|
+
when Integer
|
35
36
|
Tcl.new_int_obj(ruby_obj)
|
36
37
|
when Exception
|
37
38
|
string = [ruby_obj.message, *ruby_obj.backtrace].join("\n")
|
@@ -79,16 +80,18 @@ module FFI
|
|
79
80
|
def eval(string)
|
80
81
|
if $DEBUG
|
81
82
|
if string =~ /\n/
|
82
|
-
puts "
|
83
|
+
puts "\neval: %p" % [string]
|
83
84
|
else
|
84
|
-
puts "
|
85
|
+
puts "\neval: %s" % [string]
|
85
86
|
end
|
86
87
|
end
|
87
88
|
|
88
89
|
code = Tcl.eval_ex(self, string, string.bytesize, EVAL_DIRECT)
|
90
|
+
puts 'eval= %p' % [code] if $DEBUG
|
89
91
|
return true if code == 0
|
90
92
|
|
91
93
|
message = guess_result.to_s
|
94
|
+
puts 'eval= %p' % [message] if $DEBUG
|
92
95
|
|
93
96
|
if message.empty?
|
94
97
|
raise 'Failure during eval of: %p' % [string]
|