gtk3 3.1.0-x64-mingw32 → 3.1.1-x64-mingw32

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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/lib/2.2/gtk3.so +0 -0
  3. data/lib/2.3/gtk3.so +0 -0
  4. data/lib/2.4/gtk3.so +0 -0
  5. data/lib/gtk3/container.rb +2 -7
  6. data/lib/gtk3/dialog.rb +10 -1
  7. data/lib/gtk3/loader.rb +0 -14
  8. data/lib/gtk3/tree-selection.rb +0 -2
  9. data/lib/gtk3/tree-view-column.rb +34 -8
  10. data/sample/gtk-demo/TODO +19 -20
  11. data/sample/gtk-demo/assistant.rb +0 -2
  12. data/sample/gtk-demo/blendmodes.ui +391 -0
  13. data/sample/gtk-demo/blends.png +0 -0
  14. data/sample/gtk-demo/button_box.rb +16 -19
  15. data/sample/gtk-demo/clipboard.rb +2 -3
  16. data/sample/gtk-demo/cmy.jpg +0 -0
  17. data/sample/gtk-demo/colorsel.rb +1 -2
  18. data/sample/gtk-demo/context_menu_cursor.png +0 -0
  19. data/sample/gtk-demo/css_accordion.css +1 -1
  20. data/sample/gtk-demo/css_blendmodes.css +77 -0
  21. data/sample/gtk-demo/cssview.css +1 -1
  22. data/sample/gtk-demo/data/16x16/{gtk3-demo-symbolic.symbolic.png → gtk4-demo-symbolic.symbolic.png} +0 -0
  23. data/sample/gtk-demo/data/16x16/{gtk3-demo.png → gtk4-demo.png} +0 -0
  24. data/sample/gtk-demo/data/22x22/{gtk3-demo-symbolic.symbolic.png → gtk4-demo-symbolic.symbolic.png} +0 -0
  25. data/sample/gtk-demo/data/22x22/{gtk3-demo.png → gtk4-demo.png} +0 -0
  26. data/sample/gtk-demo/data/24x24/{gtk3-demo-symbolic.symbolic.png → gtk4-demo-symbolic.symbolic.png} +0 -0
  27. data/sample/gtk-demo/data/24x24/{gtk3-demo.png → gtk4-demo.png} +0 -0
  28. data/sample/gtk-demo/data/256x256/{gtk3-demo-symbolic.symbolic.png → gtk4-demo-symbolic.symbolic.png} +0 -0
  29. data/sample/gtk-demo/data/256x256/{gtk3-demo.png → gtk4-demo.png} +0 -0
  30. data/sample/gtk-demo/data/32x32/{gtk3-demo-symbolic.symbolic.png → gtk4-demo-symbolic.symbolic.png} +0 -0
  31. data/sample/gtk-demo/data/32x32/{gtk3-demo.png → gtk4-demo.png} +0 -0
  32. data/sample/gtk-demo/data/48x48/{gtk3-demo-symbolic.symbolic.png → gtk4-demo-symbolic.symbolic.png} +0 -0
  33. data/sample/gtk-demo/data/48x48/{gtk3-demo.png → gtk4-demo.png} +0 -0
  34. data/sample/gtk-demo/data/512x512/{gtk3-demo-symbolic.symbolic.png → gtk4-demo-symbolic.symbolic.png} +0 -0
  35. data/sample/gtk-demo/data/512x512/{gtk3-demo.png → gtk4-demo.png} +0 -0
  36. data/sample/gtk-demo/demo.gresource.xml +15 -2
  37. data/sample/gtk-demo/demo.ui +2 -1
  38. data/sample/gtk-demo/dialog.rb +2 -3
  39. data/sample/gtk-demo/drawingarea.rb +1 -2
  40. data/sample/gtk-demo/ducky.png +0 -0
  41. data/sample/gtk-demo/editable_cells.rb +1 -1
  42. data/sample/gtk-demo/entry_buffer.rb +1 -1
  43. data/sample/gtk-demo/entry_completion.rb +1 -1
  44. data/sample/gtk-demo/filtermodel.ui +15 -6
  45. data/sample/gtk-demo/fishbowl.ui +49 -0
  46. data/sample/gtk-demo/{glarea-fragment.glsl → glarea-gl.fs.glsl} +0 -0
  47. data/sample/gtk-demo/{glarea-vertex.glsl → glarea-gl.vs.glsl} +0 -0
  48. data/sample/gtk-demo/glarea-gles.fs.glsl +7 -0
  49. data/sample/gtk-demo/glarea-gles.vs.glsl +7 -0
  50. data/sample/gtk-demo/glarea.rb +15 -6
  51. data/sample/gtk-demo/hypertext.rb +0 -1
  52. data/sample/gtk-demo/images.rb +151 -168
  53. data/sample/gtk-demo/infobar.rb +5 -3
  54. data/sample/gtk-demo/links.rb +0 -1
  55. data/sample/gtk-demo/list_store.rb +1 -1
  56. data/sample/gtk-demo/listbox.ui +1 -1
  57. data/sample/gtk-demo/main.rb +4 -1
  58. data/sample/gtk-demo/markup.rb +2 -0
  59. data/sample/gtk-demo/menus.rb +0 -2
  60. data/sample/gtk-demo/no_drop_cursor.png +0 -0
  61. data/sample/gtk-demo/{cairo-arc-negative.rb → old_demos/cairo-arc-negative.rb} +0 -0
  62. data/sample/gtk-demo/{cairo-arc.rb → old_demos/cairo-arc.rb} +0 -0
  63. data/sample/gtk-demo/{cairo-clip-image.rb → old_demos/cairo-clip-image.rb} +0 -0
  64. data/sample/gtk-demo/{cairo-clip-rectangle.rb → old_demos/cairo-clip-rectangle.rb} +0 -0
  65. data/sample/gtk-demo/{cairo-clip.rb → old_demos/cairo-clip.rb} +0 -0
  66. data/sample/gtk-demo/{cairo-curve-rectangle.rb → old_demos/cairo-curve-rectangle.rb} +0 -0
  67. data/sample/gtk-demo/{cairo-curve-to.rb → old_demos/cairo-curve-to.rb} +0 -0
  68. data/sample/gtk-demo/{cairo-dash.rb → old_demos/cairo-dash.rb} +0 -0
  69. data/sample/gtk-demo/{cairo-fill-and-stroke.rb → old_demos/cairo-fill-and-stroke.rb} +0 -0
  70. data/sample/gtk-demo/{cairo-fill-and-stroke2.rb → old_demos/cairo-fill-and-stroke2.rb} +0 -0
  71. data/sample/gtk-demo/{cairo-gradient.rb → old_demos/cairo-gradient.rb} +0 -0
  72. data/sample/gtk-demo/{cairo-image-pattern.rb → old_demos/cairo-image-pattern.rb} +0 -0
  73. data/sample/gtk-demo/{cairo-image.rb → old_demos/cairo-image.rb} +0 -0
  74. data/sample/gtk-demo/{cairo-line-cap.rb → old_demos/cairo-line-cap.rb} +0 -0
  75. data/sample/gtk-demo/{cairo-line-join.rb → old_demos/cairo-line-join.rb} +0 -0
  76. data/sample/gtk-demo/{cairo-long-lines.rb → old_demos/cairo-long-lines.rb} +0 -0
  77. data/sample/gtk-demo/{cairo-operator.rb → old_demos/cairo-operator.rb} +0 -0
  78. data/sample/gtk-demo/{cairo-path.rb → old_demos/cairo-path.rb} +0 -0
  79. data/sample/gtk-demo/{cairo-pattern-fill.rb → old_demos/cairo-pattern-fill.rb} +0 -0
  80. data/sample/gtk-demo/{cairo-self-intersect.rb → old_demos/cairo-self-intersect.rb} +0 -0
  81. data/sample/gtk-demo/{cairo-text-align-center.rb → old_demos/cairo-text-align-center.rb} +0 -0
  82. data/sample/gtk-demo/{cairo-text-extents.rb → old_demos/cairo-text-extents.rb} +0 -0
  83. data/sample/gtk-demo/{cairo-text.rb → old_demos/cairo-text.rb} +0 -0
  84. data/sample/gtk-demo/{changedisplay.rb → old_demos/changedisplay.rb} +0 -0
  85. data/sample/gtk-demo/{common.rb → old_demos/common.rb} +0 -0
  86. data/sample/gtk-demo/{item_factory.rb → old_demos/item_factory.rb} +0 -0
  87. data/sample/gtk-demo/{stock_browser.rb → old_demos/stock_browser.rb} +0 -0
  88. data/sample/gtk-demo/old_demos/textview.rb +436 -0
  89. data/sample/gtk-demo/{tree_store.rb → old_demos/tree_store.rb} +0 -0
  90. data/sample/gtk-demo/panes.rb +2 -3
  91. data/sample/gtk-demo/pickers.rb +6 -5
  92. data/sample/gtk-demo/popover.rb +2 -7
  93. data/sample/gtk-demo/popover.ui +1 -0
  94. data/sample/gtk-demo/revealer.rb +4 -2
  95. data/sample/gtk-demo/revealer.ui +0 -1
  96. data/sample/gtk-demo/scale.ui +7 -1
  97. data/sample/gtk-demo/search_entry.rb +1 -2
  98. data/sample/gtk-demo/search_entry2.rb +0 -3
  99. data/sample/gtk-demo/shortcuts-builder.ui +42 -27
  100. data/sample/gtk-demo/sizegroup.rb +15 -14
  101. data/sample/gtk-demo/spinner.rb +1 -1
  102. data/sample/gtk-demo/textview.rb +358 -382
  103. data/sample/gtk-demo/theming.ui +0 -29
  104. data/sample/gtk-demo/theming_style_classes.rb +0 -1
  105. data/sample/gtk-demo/transparent.rb +0 -1
  106. data/test/test-gtk-tree-view-column.rb +44 -1
  107. metadata +77 -63
@@ -0,0 +1,49 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <interface>
3
+ <!-- interface-requires gtk+ 3.6 -->
4
+ <object class="GtkWindow" id="window">
5
+ <property name="title" translatable="yes">Fishbowl</property>
6
+ <child type="titlebar">
7
+ <object class="GtkHeaderBar" id="">
8
+ <property name="visible">True</property>
9
+ <property name="show-close-button">True</property>
10
+ <child>
11
+ <object class="GtkLabel" id="info_label">
12
+ <property name="visible">True</property>
13
+ <property name="label">0 icons - 0 fps</property>
14
+ </object>
15
+ <packing>
16
+ <property name="pack_type">end</property>
17
+ </packing>
18
+ </child>
19
+ <child>
20
+ <object class="GtkToggleButton" id="changes_allow">
21
+ <property name="active">False</property>
22
+ <property name="visible" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean">True</property>
23
+ <property name="icon-name">changes-allow</property>
24
+ <property name="relief">none</property>
25
+ </object>
26
+ <packing>
27
+ <property name="pack_type">end</property>
28
+ </packing>
29
+ </child>
30
+ <child>
31
+ <object class="GtkToggleButton" id="changes_prevent">
32
+ <property name="active" bind-source="changes_allow" bind-property="active" bind-flags="bidirectional|invert-boolean">True</property>
33
+ <property name="visible" bind-source="changes_prevent" bind-property="active" bind-flags="invert-boolean">False</property>
34
+ <property name="icon-name">changes-prevent</property>
35
+ <property name="relief">none</property>
36
+ </object>
37
+ <packing>
38
+ <property name="pack_type">end</property>
39
+ </packing>
40
+ </child>
41
+ </object>
42
+ </child>
43
+ <child>
44
+ <object class="GtkFixed" id="bowl">
45
+ <property name="visible">True</property>
46
+ </object>
47
+ </child>
48
+ </object>
49
+ </interface>
@@ -0,0 +1,7 @@
1
+ precision highp float;
2
+
3
+ void main() {
4
+ float lerpVal = gl_FragCoord.y / 500.0f;
5
+
6
+ gl_FragColor = mix(vec4(1.0f, 0.85f, 0.35f, 1.0f), vec4(0.2f, 0.2f, 0.2f, 1.0f), lerpVal);
7
+ }
@@ -0,0 +1,7 @@
1
+ attribute vec4 position;
2
+
3
+ uniform mat4 mvp;
4
+
5
+ void main() {
6
+ gl_Position = mvp * position;
7
+ }
@@ -24,9 +24,9 @@ class GlareaDemo
24
24
  @window.screen = main_window.screen
25
25
  @window.title = "OpenGL Area"
26
26
  @window.set_default_size(400, 600)
27
- @window.border_width = 12
28
27
 
29
28
  box = Gtk::Box.new(:vertical, false)
29
+ box.margin = 12
30
30
  box.spacing = 6
31
31
  @window.add(box)
32
32
 
@@ -42,7 +42,7 @@ class GlareaDemo
42
42
  widget.make_current
43
43
  unless widget.error
44
44
  init_buffers
45
- @program, @mvp_location = init_shaders
45
+ @program, @mvp_location = init_shaders(widget)
46
46
  end
47
47
  end
48
48
 
@@ -110,9 +110,18 @@ class GlareaDemo
110
110
  end
111
111
 
112
112
  # Initialize shaders and link them into a programm
113
- def init_shaders
114
- src_vertex = Gio::Resources.lookup_data("/glarea/glarea-vertex.glsl", 0)
115
- src_fragment = Gio::Resources.lookup_data("/glarea/glarea-fragment.glsl", 0)
113
+ def init_shaders(widget)
114
+ context = widget.context
115
+
116
+ if context.use_es?
117
+ vertex_path = "/glarea/glarea-gles.vs.glsl"
118
+ fragment_path = "/glarea/glarea-gles.fs.glsl"
119
+ else
120
+ vertex_path = "/glarea/glarea-gl.vs.glsl"
121
+ fragment_path = "/glarea/glarea-gl.fs.glsl"
122
+ end
123
+ src_vertex = Gio::Resources.lookup_data(vertex_path, 0)
124
+ src_fragment = Gio::Resources.lookup_data(fragment_path, 0)
116
125
  vertex = create_shader(GL_VERTEX_SHADER, src_vertex)
117
126
  return [0, nil] if vertex.zero?
118
127
  fragment = create_shader(GL_FRAGMENT_SHADER, src_fragment)
@@ -160,7 +169,7 @@ class GlareaDemo
160
169
  info_log = " " * (len + 1)
161
170
  glGetShaderInfoLog(shader, len, nil, info_log)
162
171
  type_name = type == GL_VERTEX_SHADER ? "vertex" : "fragment"
163
- STDERR.puts "Compile failure in #{type_name}:\n#{info_log}\n"
172
+ STDERR.puts "Compile failure in #{type_name}:\n#{info_log}"
164
173
  return 0
165
174
  end
166
175
  shader
@@ -74,7 +74,6 @@ class HypertextDemo
74
74
  @window.screen = main_window.screen
75
75
  @window.title = "Hypertext"
76
76
  @window.set_default_size(450, 450)
77
- @window.border_width = 0
78
77
  end
79
78
 
80
79
  def initialize_cursors(main_window)
@@ -1,197 +1,180 @@
1
- # Copyright (c) 2003-2005 Ruby-GNOME2 Project Team
1
+ # Copyright (c) 2017 Ruby-GNOME2 Project Team
2
2
  # This program is licenced under the same licence as Ruby-GNOME2.
3
3
  #
4
- # $Id: images.rb,v 1.5 2006/04/08 12:30:03 mutoh Exp $
5
4
  =begin
6
- = Images
5
+ = Images
7
6
 
8
- Gtk::Image is used to display an image; the image can be in a number of formats.
9
- Typically, you load an image into a Gdk::Pixbuf, then display the pixbuf.
7
+ GtkImage is used to display an image; the image can be in a number of formats.
8
+ Typically, you load an image into a GdkPixbuf, then display the pixbuf.
10
9
 
11
- This demo code shows some of the more obscure cases, in the simple
12
- case a call to Gtk::Image.new is all you need.
10
+ This demo code shows some of the more obscure cases, in the simple
11
+ case a call to gtk_image_new_from_file() is all you need.
13
12
 
14
- If you want to put image data in your program as a String variable,
15
- use the make-inline-pixbuf program that comes with GTK+.
16
- This way you won't need to depend on loading external files, your
17
- application binary can be self-contained.
13
+ If you want to put image data in your program as a C variable,
14
+ use the make-inline-pixbuf program that comes with GTK+.
15
+ This way you won't need to depend on loading external files, your
16
+ application binary can be self-contained.
18
17
  =end
19
- require 'common'
20
-
21
- module Demo
22
- class Images < BasicWindow
23
- def initialize
24
- @pixbuf_loader = nil
25
- @load_timeout = 0
26
- @image_stream = nil
27
-
28
- super('Images')
29
- signal_connect('destroy') do
30
- cleanup_callback
31
- end
32
-
33
- self.border_width = 8
34
-
35
- vbox = Gtk::VBox.new(false, 8)
36
- vbox.border_width = 8
37
- add(vbox)
38
-
39
- label = Gtk::Label.new
40
- label.set_markup('<u>Image loaded from a file</u>')
41
- vbox.pack_start(label, :expand => false, :fill => false, :padding => 0)
42
-
43
- frame = Gtk::Frame.new
44
- frame.shadow_type = :in
45
-
46
- # The alignment keeps the frame from growing when users resize
47
- # the window
48
- align = Gtk::Alignment.new(0.5, 0.5, 0, 0)
49
- align.add(frame)
50
- vbox.pack_start(align, :expand => false, :fill => false, :padding => 0)
51
-
52
- # demo_find_file looks in the the current directory first,
53
- # so you can run gtk-demo without installing GTK, then looks
54
- # in the location where the file is installed.
55
- pixbuf = nil
56
- begin
57
- filename = Demo.find_file('gtk-logo-rgb.gif')
58
- pixbuf = Gdk::Pixbuf.new(filename)
59
- rescue
60
- # This code shows off error handling. You can just use
61
- # Gtk::Image.new instead if you don't want to report
62
- # errors to the user. If the file doesn't load when using
63
- # Gtk::Image.new, a 'missing image' icon will
64
- # be displayed instead.
65
- dialog = Gtk::MessageDialog.new(self,
66
- Gtk::Dialog::DESTROY_WITH_PARENT,
67
- Gtk::MessageDialog::ERROR,
68
- Gtk::MessageDialog::BUTTONS_CLOSE,
69
- "Unable to open image file 'gtk-logo-rgb.gif': #{$1}")
70
-
71
- dialog.signal_connect('response') do |widget, data|
72
- widget.destroy
73
- end
74
- dialog.show
75
- end
76
-
77
- image = Gtk::Image.new(pixbuf)
78
- frame.add(image)
79
-
80
-
81
- # Animation
82
- label = Gtk::Label.new
83
- label.set_markup('<u>Animation loaded from a file</u>')
84
- vbox.pack_start(label, :expand => false, :fill => false, :padding => 0)
85
-
86
- frame = Gtk::Frame.new
87
- frame.shadow_type = :in
88
-
89
- # The alignment keeps the frame from growing when users resize
90
- # the window
91
- align = Gtk::Alignment.new(0.5, 0.5, 0, 0)
92
- align.add(frame)
93
- vbox.pack_start(align, :expand => false, :fill => false, :padding => 0)
94
-
95
- filename = Demo.find_file('floppybuddy.gif')
96
- image = Gtk::Image.new(filename)
97
- frame.add(image)
98
18
 
19
+ require "thread"
99
20
 
100
- # Progressive
101
- label = Gtk::Label.new
102
- label.set_markup('<u>Progressive image loading</u>')
103
- vbox.pack_start(label, :expand => false, :fill => false, :padding => 0)
104
-
105
- frame = Gtk::Frame.new(nil)
106
- frame.shadow_type = :in
107
-
108
- # The alignment keeps the frame from growing when users resize
109
- # the window
110
- align = Gtk::Alignment.new(0.5, 0.5, 0, 0)
111
- align.add(frame)
112
- vbox.pack_start(align, :expand => false, :fill => false, :padding => 0)
113
-
114
- # Create an empty image for now; the progressive loader
115
- # will create the pixbuf and fill it in.
116
- image = Gtk::Image.new
117
- frame.add(image)
118
-
119
- start_progressive_loading(image)
120
-
121
- # Sensitivity control
122
- button = Gtk::ToggleButton.new('_Insensitive', true)
123
- vbox.pack_start(button, :expand => false, :fill => false, :padding => 0)
124
-
125
- button.signal_connect('toggled') do |widget|
126
- vbox.children.each do |widget|
127
- if widget != button
128
- widget.sensitive = ! button.active?
129
- end
130
- end
131
- end
21
+ class ImagesDemo
22
+ def initialize(main_window)
23
+ @window = Gtk::Window.new(:toplevel)
24
+ @window.screen = main_window.screen
25
+ @window.title = "Images"
26
+ @window.signal_connect "destroy" do
27
+ GLib::Source.remove(@load_timeout) if @load_timeout
28
+ @pixbuf_loader.close
132
29
  end
133
30
 
134
- def start_progressive_loading(image)
135
- @load_timeout = Gtk.timeout_add(150) do
136
- progressive_timeout(image)
31
+ @vbox = Gtk::Box.new(:vertical, 8)
32
+ @vbox.margin = 16
33
+ @window.add(@vbox)
34
+
35
+ frame = generate_frame("<u>Image loaded from a file </u>")
36
+ image = Gtk::Image.new(:icon_name => "gtk3-demo", :size => :dialog)
37
+ frame.add(image)
38
+
39
+ # Animation
40
+ frame = generate_frame("<u>Animation loaded from a file</u>")
41
+ image = Gtk::Image.new(:resource => "/images/floppybuddy.gif")
42
+ frame.add(image)
43
+
44
+ # Symbolic icon
45
+ frame = generate_frame("<u>Symbolic themed icon</u>")
46
+ gicon = Gio::ThemedIcon.new("battery-caution-charging-symbolic")
47
+ image = Gtk::Image.new(:icon => gicon, :size => :dialog)
48
+ frame.add(image)
49
+
50
+ # Progressive
51
+ frame = generate_frame("<u>Progressive image loading</u>")
52
+
53
+ # Create an empty image for now; the progressive loader
54
+ # will create the pixbuf and fill it in.
55
+ image = Gtk::Image.new
56
+ frame.add(image)
57
+ start_progressive_loading(image)
58
+
59
+ # Sensitivity control
60
+ button = Gtk::ToggleButton.new(:label => "_Insensitive",
61
+ :use_underline => true)
62
+ @vbox.pack_start(button)
63
+ button.signal_connect "toggled" do |toggle|
64
+ @vbox.children.each do |child|
65
+ child.sensitive = !toggle.active? if child.class != Gtk::ToggleButton
137
66
  end
138
67
  end
68
+ end
139
69
 
140
- def progressive_timeout(image)
141
- if @image_stream
142
- buf = @image_stream.read(256)
70
+ def run
71
+ if !@window.visible?
72
+ @window.show_all
73
+ else
74
+ @window.destroy
75
+ end
76
+ @window
77
+ end
143
78
 
144
- @pixbuf_loader.write(buf)
79
+ private
80
+
81
+ def start_progressive_loading(image)
82
+ # This is obviously totally contrived (we slow down loading
83
+ # on purpose to show how incremental loading works).
84
+ # The real purpose of incremental loading is the case where
85
+ # you are reading data from a slow source such as the network.
86
+ # The timeout simply simulates a slow data source by inserting
87
+ # pauses in the reading process.
88
+ image_stream = nil
89
+ pixbuf_loader = nil
90
+ @load_timeout = GLib::Timeout.add(150) do
91
+ if image_stream
92
+ begin
93
+ buf = image_stream.read(256)
94
+ rescue => error
95
+ buf = ""
96
+ show_dialog_on_error("Failure reading image file 'alphatest.png': \
97
+ #{error.message}")
98
+ end
145
99
 
146
- if @image_stream.eof?
147
- @image_stream.close
148
- @image_stream = nil
100
+ if buf.empty?
101
+ # Errors can happen on close, e.g. if the image
102
+ # file was truncated we'll know on close that
103
+ # it was incomplete.
104
+ begin
105
+ image_stream.close
106
+ rescue => error
107
+ show_dialog_on_error("Failed to load image: #{error.message}")
108
+ end
149
109
 
150
- @pixbuf_loader.close
151
- @pixbuf_loader = nil
110
+ begin
111
+ pixbuf_loader.close
112
+ rescue => error
113
+ show_dialog_on_error("Failed to load image: #{error.message}")
114
+ end
115
+ GLib::Source::REMOVE
116
+ else
117
+ begin
118
+ pixbuf_loader.write(buf)
119
+ rescue => error
120
+ show_dialog_on_error("Failed to load image: #{error.message}")
121
+ end
122
+ GLib::Source::CONTINUE
152
123
  end
153
124
  else
154
- filename = Demo.find_file('alphatest.png')
155
- @image_stream = File.open(filename, 'rb')
156
-
157
- if @pixbuf_loader != nil
158
- @pixbuf_loader.close
159
- @pixbuf_loader = nil
125
+ begin
126
+ image_stream = Gio::Resources.open_stream("/images/alphatest.png")
127
+ rescue => error
128
+ show_dialog_on_error(error.message)
160
129
  end
161
-
162
- @pixbuf_loader = Gdk::PixbufLoader.new
163
-
164
- @pixbuf_loader.signal_connect('area_prepared') do |loader|
130
+ pixbuf_loader.close if pixbuf_loader
131
+ pixbuf_loader = GdkPixbuf::PixbufLoader.new
132
+ pixbuf_loader.signal_connect "area-prepared" do |loader|
165
133
  pixbuf = loader.pixbuf
166
-
167
- # Avoid displaying random memory contents, since the pixbuf
168
- # isn't filled in yet.
169
- pixbuf.fill!(0xaaaaaaff)
170
-
171
- image.pixbuf = pixbuf
134
+ pixbuf.fill(0xaaaaaaff)
135
+ image.from_pixbuf = pixbuf
172
136
  end
173
137
 
174
- @pixbuf_loader.signal_connect('area_updated') do
175
- # We know the pixbuf inside the Gtk::Image has changed, but the image
176
- # itself doesn't know this; so queue a redraw. If we wanted to be
177
- # really efficient, we could use a drawing area or something
178
- # instead of a Gtk::Image, so we could control the exact position of
179
- # the pixbuf on the display, then we could queue a draw for only
180
- # the updated area of the image.
181
- image.queue_draw
138
+ pixbuf_loader.signal_connect "area-updated" do
139
+ # progressive_updated_callback
140
+ # We know the pixbuf inside the GtkImage has changed, but the image
141
+ # itself doesn't know this; so give it a hint by setting the pixbuf
142
+ # again. Queuing a redraw used to be sufficient, but nowadays
143
+ # GtkImage uses GtkIconHelper which caches the pixbuf state and will
144
+ # just redraw from the cache.
145
+ pixbuf = image.pixbuf
146
+ image.from_pixbuf = pixbuf
182
147
  end
148
+ GLib::Source::CONTINUE
183
149
  end
184
-
185
- # leave timeout installed
186
- return true
187
150
  end
151
+ source = GLib::MainContext.default.find_source(@load_timeout)
152
+ source.name = "[gtk+] progressive_timeout"
153
+ end
188
154
 
189
- def cleanup_callback
190
- @pixbuf_loader.close if @pixbuf_loader
191
- @pixbuf_loader = nil
192
- if @load_timeout != 0
193
- Gtk.timeout_remove(@load_timeout)
194
- end
195
- end
155
+ def show_dialog_on_error(message)
156
+ dialog = Gtk::MessageDialog.new(:parent => @window,
157
+ :flags => :destroy_with_parent,
158
+ :type => :error, :buttons => :close,
159
+ :message => message)
160
+ dialog.modal = true
161
+ dialog.present
162
+ dialog.signal_connect("response") { |w| w.destroy }
163
+ GLib::Source.remove(@load_timeout)
164
+ @load_timeout = nil
165
+ false
166
+ end
167
+
168
+ def generate_frame(title)
169
+ label = Gtk::Label.new
170
+ label.markup = title
171
+ @vbox.pack_start(label)
172
+
173
+ frame = Gtk::Frame.new
174
+ frame.shadow_type = :in
175
+ frame.halign = :center
176
+ frame.valign = :center
177
+ @vbox.pack_start(frame)
178
+ frame
196
179
  end
197
180
  end