gir_ffi-gtk 0.8.1 → 0.9.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.
- checksums.yaml +4 -4
- data/Changelog.md +15 -0
- data/README.md +1 -1
- data/lib/gir_ffi-gtk/base.rb +19 -8
- data/lib/gir_ffi-gtk/builder.rb +32 -0
- data/lib/gir_ffi-gtk/container.rb +30 -0
- data/lib/gir_ffi-gtk/gtk2/list_store.rb +14 -0
- data/lib/gir_ffi-gtk/{radio_action.rb → gtk2/radio_action.rb} +0 -0
- data/lib/gir_ffi-gtk/{radio_button.rb → gtk2/radio_button.rb} +4 -6
- data/lib/gir_ffi-gtk/gtk2/target_entry.rb +12 -0
- data/lib/gir_ffi-gtk/gtk2/tree_store.rb +16 -0
- data/lib/gir_ffi-gtk/gtk3/target_entry.rb +15 -0
- data/lib/gir_ffi-gtk/list_store.rb +21 -0
- data/lib/gir_ffi-gtk/message_dialog.rb +3 -5
- data/lib/gir_ffi-gtk/tree_store.rb +15 -0
- data/lib/gir_ffi-gtk/tree_view_column.rb +26 -0
- data/lib/gir_ffi-gtk2.rb +11 -2
- data/lib/gir_ffi-gtk3.rb +7 -0
- data/tasks/test.rake +7 -1
- data/test/callback_exceptions_test.rb +59 -0
- data/test/gir_ffi-gtk/base_test.rb +1 -3
- data/test/gir_ffi-gtk/builder_test.rb +70 -0
- data/test/gir_ffi-gtk/container_test.rb +33 -0
- data/test/gir_ffi-gtk/generated_gtk_test.rb +5 -5
- data/test/gir_ffi-gtk/list_store_test.rb +38 -0
- data/test/gir_ffi-gtk/target_entry_test.rb +19 -0
- data/test/gir_ffi-gtk/tree_store_test.rb +38 -0
- data/test/gir_ffi-gtk/tree_view_column_test.rb +49 -0
- data/test/test_helper.rb +3 -1
- metadata +30 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44dcee9edb2115e16f8d3db797a6c84bca61e6b6
|
4
|
+
data.tar.gz: b5f54fc463e5a501e5d603815114348248a734fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc76784425a3bdaf0f83b37e1f8915a86fa900f907d5bd20222d6bacf3450c3cad55269f946d649742c6e798116fc61b1f6770060acc4aba5bec650a97c5aa8d
|
7
|
+
data.tar.gz: 3007b00f4ecc6492ab2198480c2a76e49844b9901da87a90d4d1ae2c8bfb33ed4f41f689fa4f1a7fe8310c698d04584a98095954d74a28bb74acd08050b54186
|
data/Changelog.md
CHANGED
@@ -3,6 +3,21 @@
|
|
3
3
|
All notable changes to this project will be documented in this file. See the
|
4
4
|
Git log for all changes.
|
5
5
|
|
6
|
+
## 0.9.0 / 2016-01-21
|
7
|
+
|
8
|
+
* Propagate exceptions from callbacks during event loops
|
9
|
+
* Add new overrides:
|
10
|
+
* for Gtk::Container
|
11
|
+
* for Gtk::TreeViewColumn
|
12
|
+
* for Gtk::TreeStore
|
13
|
+
* for Gtk::ListStore
|
14
|
+
* for Gtk::TargetEntry.new
|
15
|
+
* for GtkBuilder#connect_signals
|
16
|
+
* Depend on GirFFI 0.9.0
|
17
|
+
* Use GirFFI's new way of handling callback parameters and user data and
|
18
|
+
destroy notifier handling
|
19
|
+
|
20
|
+
|
6
21
|
## 0.8.1 / 2015-12-02
|
7
22
|
|
8
23
|
* Add override for Gtk::RadioAction#set_group
|
data/README.md
CHANGED
@@ -46,7 +46,7 @@ and for Gtk+ 2:
|
|
46
46
|
|
47
47
|
## License
|
48
48
|
|
49
|
-
Copyright © 2012–
|
49
|
+
Copyright © 2012–2016 [Matijs van Zuijlen](http://www.matijs.net)
|
50
50
|
|
51
51
|
GirFFI-Gtk is free software, distributed under the terms of the GNU Lesser
|
52
52
|
General Public License, version 2.1 or later. See the file COPYING.LIB for
|
data/lib/gir_ffi-gtk/base.rb
CHANGED
@@ -20,26 +20,37 @@ module GirFFIGtk
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Override main to start an idle thread to allow Ruby threads to run during
|
23
|
-
# the main loop
|
24
|
-
module
|
23
|
+
# the main loop, and to handle exceptions
|
24
|
+
module MainLoopOverride
|
25
|
+
class DummyLoop
|
26
|
+
def quit
|
27
|
+
Gtk.main_quit
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
25
31
|
def self.included(base)
|
26
32
|
base.extend ClassMethods
|
27
33
|
class << base
|
28
|
-
alias_method :
|
29
|
-
alias_method :main, :
|
34
|
+
alias_method :main_without_override, :main
|
35
|
+
alias_method :main, :main_with_override
|
30
36
|
end
|
31
37
|
end
|
32
38
|
|
33
|
-
# Implementation of class methods for
|
39
|
+
# Implementation of class methods for MainLoopOverride
|
34
40
|
module ClassMethods
|
35
|
-
def
|
41
|
+
def main_with_override
|
36
42
|
case RUBY_ENGINE
|
37
43
|
when 'jruby'
|
38
44
|
when 'rbx'
|
39
45
|
else # 'ruby' most likely
|
40
46
|
GLib::MainLoop::ThreadEnabler.instance.setup_idle_handler
|
41
47
|
end
|
42
|
-
|
48
|
+
GLib::MainLoop::RUNNING_LOOPS << DummyLoop.new
|
49
|
+
result = main_without_override
|
50
|
+
ex = GLib::MainLoop::EXCEPTIONS.shift
|
51
|
+
GLib::MainLoop::RUNNING_LOOPS.pop
|
52
|
+
raise ex if ex
|
53
|
+
result
|
43
54
|
end
|
44
55
|
end
|
45
56
|
end
|
@@ -51,5 +62,5 @@ module Gtk
|
|
51
62
|
setup_method 'main'
|
52
63
|
|
53
64
|
include GirFFIGtk::AutoArgv
|
54
|
-
include GirFFIGtk::
|
65
|
+
include GirFFIGtk::MainLoopOverride
|
55
66
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Gtk.load_class :Builder
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkBuilder
|
4
|
+
class Builder
|
5
|
+
setup_instance_method :add_from_string
|
6
|
+
|
7
|
+
def add_from_string_with_auto_length(buffer)
|
8
|
+
add_from_string_without_auto_length buffer, buffer.length
|
9
|
+
end
|
10
|
+
|
11
|
+
alias_method :add_from_string_without_auto_length, :add_from_string
|
12
|
+
alias_method :add_from_string, :add_from_string_with_auto_length
|
13
|
+
|
14
|
+
setup_instance_method :connect_signals_full
|
15
|
+
remove_method :connect_signals
|
16
|
+
|
17
|
+
AFTER_FLAG = GObject::ConnectFlags[:after]
|
18
|
+
|
19
|
+
def connect_signals
|
20
|
+
connect_signals_full do |_builder, object, signal_name, handler_name, _connect_object, flags, _user_data|
|
21
|
+
handler = yield handler_name
|
22
|
+
return unless handler
|
23
|
+
|
24
|
+
if flags & AFTER_FLAG == AFTER_FLAG
|
25
|
+
object.signal_connect_after signal_name, &handler
|
26
|
+
else
|
27
|
+
object.signal_connect signal_name, &handler
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Gtk.load_class :Container
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkContainer
|
4
|
+
class Container
|
5
|
+
def add_with_properties(widget, properties)
|
6
|
+
add widget
|
7
|
+
properties.each do |property_name, value|
|
8
|
+
child_set_property widget, property_name.to_s, value
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
setup_instance_method :child_get_property
|
13
|
+
|
14
|
+
def child_get_property_with_override(widget, property_name)
|
15
|
+
param_spec = object_class.find_child_property property_name
|
16
|
+
unless param_spec
|
17
|
+
raise ArgumentError,
|
18
|
+
"child property named '#{property_name}' not found in #{self.class}"
|
19
|
+
end
|
20
|
+
gtype = param_spec.value_type
|
21
|
+
gvalue = GObject::Value.for_gtype gtype
|
22
|
+
|
23
|
+
child_get_property_without_override widget, property_name, gvalue
|
24
|
+
gvalue.get_value
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :child_get_property_without_override, :child_get_property
|
28
|
+
alias_method :child_get_property, :child_get_property_with_override
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Gtk.load_class :ListStore
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkListStore
|
4
|
+
class ListStore
|
5
|
+
setup_method :newv
|
6
|
+
setup_instance_method :set_valuesv
|
7
|
+
|
8
|
+
alias_method :old_initialize, :initialize
|
9
|
+
alias_method :initialize, :initializev
|
10
|
+
remove_method :old_initialize
|
11
|
+
|
12
|
+
alias_method :set, :set_valuesv
|
13
|
+
end
|
14
|
+
end
|
File without changes
|
@@ -8,24 +8,22 @@ module Gtk
|
|
8
8
|
|
9
9
|
# Overrides for GtkRadioButton
|
10
10
|
class RadioButton
|
11
|
-
def self.new(*args)
|
12
|
-
obj = allocate
|
13
|
-
obj.send :initialize, *args
|
14
|
-
obj
|
15
|
-
end
|
16
|
-
|
17
11
|
def self.new_from_widget(*args)
|
18
12
|
obj = allocate
|
19
13
|
obj.send :initialize_from_widget, *args
|
20
14
|
obj
|
21
15
|
end
|
22
16
|
|
17
|
+
alias_method :old_initialize, :initialize
|
18
|
+
|
23
19
|
def initialize(group)
|
24
20
|
list = GLib::SList.from(Gtk::RadioButton, group)
|
25
21
|
ptr = Gtk::Lib.gtk_radio_button_new(list)
|
26
22
|
store_pointer(ptr)
|
27
23
|
end
|
28
24
|
|
25
|
+
remove_method :old_initialize
|
26
|
+
|
29
27
|
def initialize_from_widget(radio_group_member)
|
30
28
|
widget = Gtk::RadioButton.from(radio_group_member)
|
31
29
|
ptr = Gtk::Lib.gtk_radio_button_new_from_widget(widget)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Gtk.load_class :TargetEntry
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkTargetEntry
|
4
|
+
class TargetEntry
|
5
|
+
def initialize(target, flags, info)
|
6
|
+
super()
|
7
|
+
self.target = target
|
8
|
+
self.flags = Gtk::TargetFlags.to_native flags, nil
|
9
|
+
self.info = info
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Gtk.load_class :TreeStore
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkTreeStore
|
4
|
+
class TreeStore
|
5
|
+
setup_method :newv
|
6
|
+
setup_instance_method :set_valuesv
|
7
|
+
setup_instance_method :insert_with_valuesv
|
8
|
+
|
9
|
+
alias_method :old_initialize, :initialize
|
10
|
+
alias_method :initialize, :initializev
|
11
|
+
remove_method :old_initialize
|
12
|
+
|
13
|
+
alias_method :insert_with_values, :insert_with_valuesv
|
14
|
+
alias_method :set, :set_valuesv
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Gtk.load_class :TargetEntry
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkTargetEntry
|
4
|
+
class TargetEntry
|
5
|
+
setup_method :new
|
6
|
+
|
7
|
+
def initialize_with_flags_conversion(target, flags, info)
|
8
|
+
native_flags = Gtk::TargetFlags.to_native flags, nil
|
9
|
+
initialize_without_flags_conversion target, native_flags, info
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :initialize_without_flags_conversion, :initialize
|
13
|
+
alias_method :initialize, :initialize_with_flags_conversion
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Gtk.load_class :ListStore
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkListStore
|
4
|
+
class ListStore
|
5
|
+
setup_instance_method :insert_with_valuesv
|
6
|
+
|
7
|
+
alias_method :insert_with_values, :insert_with_valuesv
|
8
|
+
|
9
|
+
setup_instance_method :set_value
|
10
|
+
|
11
|
+
def set_value_with_value_conversion(iter, column, value)
|
12
|
+
if value.nil?
|
13
|
+
value = GObject::Value.for_gtype get_column_type(column)
|
14
|
+
end
|
15
|
+
set_value_without_value_conversion iter, column, value
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :set_value_without_value_conversion, :set_value
|
19
|
+
alias_method :set_value, :set_value_with_value_conversion
|
20
|
+
end
|
21
|
+
end
|
@@ -13,11 +13,7 @@ module Gtk
|
|
13
13
|
|
14
14
|
# Overrides for GtkMessageDialog
|
15
15
|
class MessageDialog
|
16
|
-
|
17
|
-
obj = allocate
|
18
|
-
obj.send :initialize, *args
|
19
|
-
obj
|
20
|
-
end
|
16
|
+
alias_method :old_initialize, :initialize
|
21
17
|
|
22
18
|
def initialize(parent, flags, type, buttons, message)
|
23
19
|
ptr = Gtk::Lib.gtk_message_dialog_new(parent, flags, type, buttons,
|
@@ -25,5 +21,7 @@ module Gtk
|
|
25
21
|
:string, message)
|
26
22
|
store_pointer(ptr)
|
27
23
|
end
|
24
|
+
|
25
|
+
remove_method :old_initialize
|
28
26
|
end
|
29
27
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Gtk.load_class :TreeStore
|
2
|
+
module Gtk
|
3
|
+
# Overrides for GtkTreeStore
|
4
|
+
class TreeStore
|
5
|
+
def set_value_with_value_conversion(iter, column, value)
|
6
|
+
if value.nil?
|
7
|
+
value = GObject::Value.for_gtype get_column_type(column)
|
8
|
+
end
|
9
|
+
set_value_without_value_conversion iter, column, value
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method :set_value_without_value_conversion, :set_value
|
13
|
+
alias_method :set_value, :set_value_with_value_conversion
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Gtk.load_class :TreeViewColumn
|
2
|
+
module Gtk
|
3
|
+
# Overrides for Gtk::TreeViewColumn
|
4
|
+
class TreeViewColumn
|
5
|
+
def self.new_with_attributes(*args)
|
6
|
+
obj = allocate
|
7
|
+
obj.send :initialize_with_attributes, *args
|
8
|
+
obj
|
9
|
+
end
|
10
|
+
|
11
|
+
def set_attributes(renderer, attributes)
|
12
|
+
attributes.each do |attribute, column|
|
13
|
+
add_attribute renderer, attribute.to_s, column
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def initialize_with_attributes(title, renderer, attributes = {})
|
20
|
+
initialize
|
21
|
+
set_title title
|
22
|
+
pack_start(renderer, false)
|
23
|
+
set_attributes(renderer, attributes)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/gir_ffi-gtk2.rb
CHANGED
@@ -3,8 +3,17 @@ require 'gir_ffi'
|
|
3
3
|
GirFFI.setup :Gtk, '2.0'
|
4
4
|
|
5
5
|
require 'gir_ffi-gtk/base'
|
6
|
+
require 'gir_ffi-gtk/builder'
|
7
|
+
require 'gir_ffi-gtk/container'
|
8
|
+
require 'gir_ffi-gtk/list_store'
|
6
9
|
require 'gir_ffi-gtk/menu'
|
7
10
|
require 'gir_ffi-gtk/message_dialog'
|
8
|
-
require 'gir_ffi-gtk/radio_action'
|
9
|
-
require 'gir_ffi-gtk/radio_button'
|
10
11
|
require 'gir_ffi-gtk/tree_path'
|
12
|
+
require 'gir_ffi-gtk/tree_store'
|
13
|
+
require 'gir_ffi-gtk/tree_view_column'
|
14
|
+
|
15
|
+
require 'gir_ffi-gtk/gtk2/list_store'
|
16
|
+
require 'gir_ffi-gtk/gtk2/radio_action'
|
17
|
+
require 'gir_ffi-gtk/gtk2/radio_button'
|
18
|
+
require 'gir_ffi-gtk/gtk2/target_entry'
|
19
|
+
require 'gir_ffi-gtk/gtk2/tree_store'
|
data/lib/gir_ffi-gtk3.rb
CHANGED
@@ -3,6 +3,13 @@ require 'gir_ffi'
|
|
3
3
|
GirFFI.setup :Gtk, '3.0'
|
4
4
|
|
5
5
|
require 'gir_ffi-gtk/base'
|
6
|
+
require 'gir_ffi-gtk/builder'
|
7
|
+
require 'gir_ffi-gtk/container'
|
8
|
+
require 'gir_ffi-gtk/list_store'
|
6
9
|
require 'gir_ffi-gtk/menu'
|
7
10
|
require 'gir_ffi-gtk/message_dialog'
|
8
11
|
require 'gir_ffi-gtk/tree_path'
|
12
|
+
require 'gir_ffi-gtk/tree_store'
|
13
|
+
require 'gir_ffi-gtk/tree_view_column'
|
14
|
+
|
15
|
+
require 'gir_ffi-gtk/gtk3/target_entry'
|
data/tasks/test.rake
CHANGED
@@ -10,7 +10,13 @@ namespace :test do
|
|
10
10
|
Rake::TestTask.new(:gtk2) do |t|
|
11
11
|
t.libs = ['lib']
|
12
12
|
t.test_files = FileList['test/**/*_test.rb']
|
13
|
-
t.ruby_opts += ['-
|
13
|
+
t.ruby_opts += ['-w', '-Itest']
|
14
|
+
end
|
15
|
+
|
16
|
+
task gtk2: :set_gtk_version_2
|
17
|
+
|
18
|
+
task :set_gtk_version_2 do
|
19
|
+
ENV['GTK_VERSION'] = '2'
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CallbackTestException < RuntimeError; end
|
4
|
+
|
5
|
+
describe "An exception in a callback" do
|
6
|
+
describe "for signals" do
|
7
|
+
let(:object) { Gtk::Window.new :toplevel }
|
8
|
+
|
9
|
+
before do
|
10
|
+
object.signal_connect "destroy" do
|
11
|
+
raise CallbackTestException, "Boom"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "when the signal is emitted synchronously" do
|
16
|
+
it "raises an error" do
|
17
|
+
lambda { GObject.signal_emit object, "destroy" }.must_raise CallbackTestException
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "when the signal is emitted during an event loop" do
|
22
|
+
it "causes loop run to be terminated with an exception" do
|
23
|
+
GLib.timeout_add GLib::PRIORITY_DEFAULT, 1 do
|
24
|
+
GObject.signal_emit object, "destroy"
|
25
|
+
false
|
26
|
+
end
|
27
|
+
# Guard against runaway loop
|
28
|
+
@guard = GLib.timeout_add(GLib::PRIORITY_DEFAULT, 1000) { Gtk.main_quit }
|
29
|
+
proc do
|
30
|
+
Gtk.main
|
31
|
+
end.must_raise CallbackTestException
|
32
|
+
end
|
33
|
+
|
34
|
+
after do
|
35
|
+
GLib.source_remove @guard
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "for other callbacks" do
|
41
|
+
describe "when the callback occurs during an event loop" do
|
42
|
+
it "causes loop run to be terminated with an exception" do
|
43
|
+
GLib.timeout_add GLib::PRIORITY_DEFAULT, 1 do
|
44
|
+
raise CallbackTestException, "Boom"
|
45
|
+
end
|
46
|
+
# Guard against runaway loop
|
47
|
+
@guard = GLib.timeout_add(GLib::PRIORITY_DEFAULT, 1000) { Gtk.main_quit }
|
48
|
+
proc do
|
49
|
+
Gtk.main
|
50
|
+
end.must_raise CallbackTestException
|
51
|
+
end
|
52
|
+
|
53
|
+
after do
|
54
|
+
GLib.source_remove @guard
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -28,9 +28,7 @@ describe Gtk do
|
|
28
28
|
describe "::main" do
|
29
29
|
it "allows other threads to run" do
|
30
30
|
a = []
|
31
|
-
GLib.timeout_add(GLib::PRIORITY_DEFAULT, 150
|
32
|
-
proc { Gtk.main_quit },
|
33
|
-
nil, nil)
|
31
|
+
GLib.timeout_add(GLib::PRIORITY_DEFAULT, 150) { Gtk.main_quit }
|
34
32
|
|
35
33
|
slow_thread = Thread.new do
|
36
34
|
sleep 0.005
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Gtk::Builder do
|
4
|
+
let(:builder) { Gtk::Builder.new }
|
5
|
+
let(:spec) do
|
6
|
+
<<-EOS
|
7
|
+
<interface>
|
8
|
+
<object class="GtkButton" id="foo">
|
9
|
+
<signal handler="on_button_clicked" name="clicked"/>
|
10
|
+
</object>
|
11
|
+
</interface>
|
12
|
+
EOS
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#add_from_string" do
|
16
|
+
it 'takes one string as argument' do
|
17
|
+
builder.add_from_string spec
|
18
|
+
pass
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#connect_signals" do
|
23
|
+
before do
|
24
|
+
builder.add_from_string spec
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'passes the handler name to the block' do
|
28
|
+
name = nil
|
29
|
+
builder.connect_signals do |handler_name|
|
30
|
+
name = handler_name
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
34
|
+
name.must_equal 'on_button_clicked'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'connects the signal to the proc returned by the block' do
|
38
|
+
name = nil
|
39
|
+
builder.connect_signals do |handler_name|
|
40
|
+
proc { name = handler_name }
|
41
|
+
end
|
42
|
+
button = builder.get_object('foo')
|
43
|
+
GObject.signal_emit button, 'clicked'
|
44
|
+
name.must_equal 'on_button_clicked'
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'with a signal with after flag' do
|
48
|
+
let(:spec) do
|
49
|
+
<<-EOS
|
50
|
+
<interface>
|
51
|
+
<object class="GtkButton" id="foo">
|
52
|
+
<signal handler="handler_after" name="clicked" after="true"/>
|
53
|
+
<signal handler="handler_before" name="clicked"/>
|
54
|
+
</object>
|
55
|
+
</interface>
|
56
|
+
EOS
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'connects the handlers in the right order' do
|
60
|
+
name = nil
|
61
|
+
builder.connect_signals do |handler_name|
|
62
|
+
proc { name = handler_name }
|
63
|
+
end
|
64
|
+
button = builder.get_object('foo')
|
65
|
+
GObject.signal_emit button, 'clicked'
|
66
|
+
name.must_equal 'handler_after'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Gtk::Container do
|
4
|
+
let(:container) { Gtk::Table.new 1, 1, true }
|
5
|
+
let(:widget) { Gtk::Label.new 'foo' }
|
6
|
+
|
7
|
+
describe '#add_with_properties' do
|
8
|
+
before do
|
9
|
+
container.add_with_properties widget, :'left-attach' => 1
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'adds the widget to the container' do
|
13
|
+
container.get_children.to_a.must_equal [widget]
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'sets the child properties for the widget' do
|
17
|
+
container.child_get_property(widget, 'left-attach').must_equal 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#child_get_property' do
|
22
|
+
it 'fetches the given child property' do
|
23
|
+
container.add widget
|
24
|
+
container.child_set_property(widget, 'left-attach', 1)
|
25
|
+
container.child_get_property(widget, 'left-attach').must_equal 1
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'raises an ArgumentError for unknown properties' do
|
29
|
+
container.add widget
|
30
|
+
proc { container.child_get_property(widget, 'foobar') }.must_raise ArgumentError
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -17,12 +17,12 @@ describe "In the generated Gtk module" do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it "loads the interface spec" do
|
20
|
-
assert_nothing_raised { @builder.add_from_string @spec
|
20
|
+
assert_nothing_raised { @builder.add_from_string @spec }
|
21
21
|
end
|
22
22
|
|
23
23
|
describe "its #get_object method" do
|
24
24
|
it "returns objects of the proper class" do
|
25
|
-
@builder.add_from_string @spec
|
25
|
+
@builder.add_from_string @spec
|
26
26
|
o = @builder.get_object "foo"
|
27
27
|
assert_instance_of Gtk::Button, o
|
28
28
|
end
|
@@ -30,11 +30,11 @@ describe "In the generated Gtk module" do
|
|
30
30
|
|
31
31
|
describe "its #connect_signals_full method" do
|
32
32
|
before do
|
33
|
-
@builder.add_from_string @spec
|
33
|
+
@builder.add_from_string @spec
|
34
34
|
end
|
35
35
|
it "passes arguments correctly" do
|
36
36
|
aa = nil
|
37
|
-
@builder.connect_signals_full
|
37
|
+
@builder.connect_signals_full {|*args| aa = args}
|
38
38
|
b, o, sn, hn, co, f, ud = aa
|
39
39
|
assert_instance_of Gtk::Builder, b
|
40
40
|
assert_equal b.to_ptr, @builder.to_ptr
|
@@ -43,7 +43,7 @@ describe "In the generated Gtk module" do
|
|
43
43
|
assert_equal "on_button_clicked", hn
|
44
44
|
assert_equal nil, co
|
45
45
|
assert_equal 0, f
|
46
|
-
|
46
|
+
ud.wont_be_nil
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Gtk::ListStore do
|
4
|
+
describe '.new' do
|
5
|
+
it 'takes an array of column types' do
|
6
|
+
store = Gtk::ListStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
7
|
+
store.must_be_instance_of Gtk::ListStore
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#insert_with_values' do
|
12
|
+
it 'inserts a row with the given values' do
|
13
|
+
store = Gtk::ListStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
14
|
+
row = store.insert_with_values(0, [0, 1], ['foo', 42])
|
15
|
+
store.get_value(row, 0).must_equal 'foo'
|
16
|
+
store.get_value(row, 1).must_equal 42
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#set' do
|
21
|
+
it 'updates a row with the given values' do
|
22
|
+
store = Gtk::ListStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
23
|
+
row = store.insert_with_values(0, [0, 1], ['foo', 42])
|
24
|
+
store.set(row, [1, 0], [3, 'bar'])
|
25
|
+
store.get_value(row, 0).must_equal 'bar'
|
26
|
+
store.get_value(row, 1).must_equal 3
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#set_value' do
|
31
|
+
it 'allows setting a value to nil' do
|
32
|
+
store = Gtk::ListStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
33
|
+
row = store.insert_with_values(0, [0, 1], ['foo', 42])
|
34
|
+
store.set_value(row, 0, nil)
|
35
|
+
store.get_value(row, 0).must_equal nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Gtk::TargetEntry do
|
4
|
+
describe '.new' do
|
5
|
+
it 'takes and uses three arguments' do
|
6
|
+
entry = Gtk::TargetEntry.new('foo', 3, 42)
|
7
|
+
entry.target.must_equal 'foo'
|
8
|
+
entry.flags.must_equal 3
|
9
|
+
entry.info.must_equal 42
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'allows symbol values for the second argument' do
|
13
|
+
entry = Gtk::TargetEntry.new('foo', :same_app, 42)
|
14
|
+
entry.target.must_equal 'foo'
|
15
|
+
entry.flags.must_equal 1
|
16
|
+
entry.info.must_equal 42
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Gtk::TreeStore do
|
4
|
+
describe '.new' do
|
5
|
+
it 'takes an array of column types' do
|
6
|
+
store = Gtk::TreeStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
7
|
+
store.must_be_instance_of Gtk::TreeStore
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#insert_with_values' do
|
12
|
+
it 'inserts a row with the given values' do
|
13
|
+
store = Gtk::TreeStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
14
|
+
row = store.insert_with_values(nil, 0, [0, 1], ['foo', 42])
|
15
|
+
store.get_value(row, 0).must_equal 'foo'
|
16
|
+
store.get_value(row, 1).must_equal 42
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#set' do
|
21
|
+
it 'updates a row with the given values' do
|
22
|
+
store = Gtk::TreeStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
23
|
+
row = store.insert_with_values(nil, 0, [0, 1], ['foo', 42])
|
24
|
+
store.set(row, [1, 0], [3, 'bar'])
|
25
|
+
store.get_value(row, 0).must_equal 'bar'
|
26
|
+
store.get_value(row, 1).must_equal 3
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#set_value' do
|
31
|
+
it 'allows setting a value to nil' do
|
32
|
+
store = Gtk::TreeStore.new([GObject::TYPE_STRING, GObject::TYPE_INT])
|
33
|
+
row = store.insert_with_values(nil, 0, [0, 1], ['foo', 42])
|
34
|
+
store.set_value(row, 0, nil)
|
35
|
+
store.get_value(row, 0).must_equal nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Gtk::TreeViewColumn do
|
4
|
+
describe '.new_with_attributes' do
|
5
|
+
let(:renderer) { Gtk::CellRendererText.new }
|
6
|
+
let(:column) { Gtk::TreeViewColumn.new_with_attributes('foo-title',
|
7
|
+
renderer,
|
8
|
+
text: 1) }
|
9
|
+
let(:list_store) { Gtk::ListStore.new([GObject::TYPE_INT, GObject::TYPE_STRING]) }
|
10
|
+
|
11
|
+
it "sets the column's title" do
|
12
|
+
column.title.must_equal 'foo-title'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'packs the renderer into the column' do
|
16
|
+
column.get_cells.to_a.must_equal [renderer]
|
17
|
+
end
|
18
|
+
|
19
|
+
it "adds the attribute mapping for the renderer" do
|
20
|
+
row = list_store.append
|
21
|
+
list_store.set_value(row, 1, 'foo-value')
|
22
|
+
column.cell_set_cell_data(list_store, row, false, false)
|
23
|
+
renderer.text.must_equal 'foo-value'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'allows not specifying any attributes' do
|
27
|
+
col = Gtk::TreeViewColumn.new_with_attributes('foo-title', renderer)
|
28
|
+
col.must_be_instance_of Gtk::TreeViewColumn
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#set_attributes' do
|
33
|
+
let(:renderer) { Gtk::CellRendererText.new }
|
34
|
+
let(:column) { Gtk::TreeViewColumn.new }
|
35
|
+
let(:list_store) { Gtk::ListStore.new([GObject::TYPE_INT, GObject::TYPE_STRING]) }
|
36
|
+
|
37
|
+
before do
|
38
|
+
column.pack_start(renderer, false)
|
39
|
+
column.set_attributes(renderer, text: 1)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "adds the attribute mapping for the renderer" do
|
43
|
+
row = list_store.append
|
44
|
+
list_store.set_value(row, 1, 'foo-value')
|
45
|
+
column.cell_set_cell_data(list_store, row, false, false)
|
46
|
+
renderer.text.must_equal 'foo-value'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gir_ffi-gtk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matijs van Zuijlen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gir_ffi
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.9.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.9.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,21 +87,37 @@ files:
|
|
87
87
|
- examples/08_webkit_headless.rb
|
88
88
|
- examples/09_webkit2_headless.rb
|
89
89
|
- lib/gir_ffi-gtk/base.rb
|
90
|
+
- lib/gir_ffi-gtk/builder.rb
|
91
|
+
- lib/gir_ffi-gtk/container.rb
|
92
|
+
- lib/gir_ffi-gtk/gtk2/list_store.rb
|
93
|
+
- lib/gir_ffi-gtk/gtk2/radio_action.rb
|
94
|
+
- lib/gir_ffi-gtk/gtk2/radio_button.rb
|
95
|
+
- lib/gir_ffi-gtk/gtk2/target_entry.rb
|
96
|
+
- lib/gir_ffi-gtk/gtk2/tree_store.rb
|
97
|
+
- lib/gir_ffi-gtk/gtk3/target_entry.rb
|
98
|
+
- lib/gir_ffi-gtk/list_store.rb
|
90
99
|
- lib/gir_ffi-gtk/menu.rb
|
91
100
|
- lib/gir_ffi-gtk/message_dialog.rb
|
92
|
-
- lib/gir_ffi-gtk/radio_action.rb
|
93
|
-
- lib/gir_ffi-gtk/radio_button.rb
|
94
101
|
- lib/gir_ffi-gtk/tree_path.rb
|
102
|
+
- lib/gir_ffi-gtk/tree_store.rb
|
103
|
+
- lib/gir_ffi-gtk/tree_view_column.rb
|
95
104
|
- lib/gir_ffi-gtk2.rb
|
96
105
|
- lib/gir_ffi-gtk3.rb
|
97
106
|
- tasks/test.rake
|
107
|
+
- test/callback_exceptions_test.rb
|
98
108
|
- test/gir_ffi-gtk/base_test.rb
|
109
|
+
- test/gir_ffi-gtk/builder_test.rb
|
110
|
+
- test/gir_ffi-gtk/container_test.rb
|
99
111
|
- test/gir_ffi-gtk/generated_gtk_test.rb
|
112
|
+
- test/gir_ffi-gtk/list_store_test.rb
|
100
113
|
- test/gir_ffi-gtk/menu_test.rb
|
101
114
|
- test/gir_ffi-gtk/message_dialog_test.rb
|
102
115
|
- test/gir_ffi-gtk/radio_action_test.rb
|
103
116
|
- test/gir_ffi-gtk/radio_button_test.rb
|
117
|
+
- test/gir_ffi-gtk/target_entry_test.rb
|
104
118
|
- test/gir_ffi-gtk/tree_path_test.rb
|
119
|
+
- test/gir_ffi-gtk/tree_store_test.rb
|
120
|
+
- test/gir_ffi-gtk/tree_view_column_test.rb
|
105
121
|
- test/test_helper.rb
|
106
122
|
homepage: http://www.github.com/mvz/gir_ffi-gtk
|
107
123
|
licenses:
|
@@ -115,7 +131,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
131
|
requirements:
|
116
132
|
- - ">="
|
117
133
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
134
|
+
version: 2.0.0
|
119
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
136
|
requirements:
|
121
137
|
- - ">="
|
@@ -128,11 +144,18 @@ signing_key:
|
|
128
144
|
specification_version: 4
|
129
145
|
summary: GirFFI-based Ruby bindings for Gtk+ 2 and 3
|
130
146
|
test_files:
|
147
|
+
- test/callback_exceptions_test.rb
|
131
148
|
- test/gir_ffi-gtk/base_test.rb
|
149
|
+
- test/gir_ffi-gtk/builder_test.rb
|
150
|
+
- test/gir_ffi-gtk/container_test.rb
|
132
151
|
- test/gir_ffi-gtk/generated_gtk_test.rb
|
152
|
+
- test/gir_ffi-gtk/list_store_test.rb
|
133
153
|
- test/gir_ffi-gtk/menu_test.rb
|
134
154
|
- test/gir_ffi-gtk/message_dialog_test.rb
|
135
155
|
- test/gir_ffi-gtk/radio_action_test.rb
|
136
156
|
- test/gir_ffi-gtk/radio_button_test.rb
|
157
|
+
- test/gir_ffi-gtk/target_entry_test.rb
|
137
158
|
- test/gir_ffi-gtk/tree_path_test.rb
|
159
|
+
- test/gir_ffi-gtk/tree_store_test.rb
|
160
|
+
- test/gir_ffi-gtk/tree_view_column_test.rb
|
138
161
|
- test/test_helper.rb
|