goocanvas 0.90.6

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 (51) hide show
  1. data/ChangeLog +87 -0
  2. data/README +37 -0
  3. data/Rakefile +14 -0
  4. data/ext/goocanvas/Makefile +162 -0
  5. data/ext/goocanvas/depend +5 -0
  6. data/ext/goocanvas/extconf.rb +66 -0
  7. data/ext/goocanvas/goocanvas.def +2 -0
  8. data/ext/goocanvas/goocanvas.so +0 -0
  9. data/ext/goocanvas/rbgoo_canvasversion.h +25 -0
  10. data/ext/goocanvas/rbgoocairo.c +74 -0
  11. data/ext/goocanvas/rbgoocairo.o +0 -0
  12. data/ext/goocanvas/rbgoocanvas.c +236 -0
  13. data/ext/goocanvas/rbgoocanvas.h +66 -0
  14. data/ext/goocanvas/rbgoocanvas.o +0 -0
  15. data/ext/goocanvas/rbgoocanvasellipse.c +50 -0
  16. data/ext/goocanvas/rbgoocanvasellipse.o +0 -0
  17. data/ext/goocanvas/rbgoocanvasgroup.c +41 -0
  18. data/ext/goocanvas/rbgoocanvasgroup.o +0 -0
  19. data/ext/goocanvas/rbgoocanvasimage.c +45 -0
  20. data/ext/goocanvas/rbgoocanvasimage.o +0 -0
  21. data/ext/goocanvas/rbgoocanvasitem.c +358 -0
  22. data/ext/goocanvas/rbgoocanvasitem.o +0 -0
  23. data/ext/goocanvas/rbgoocanvaspolyline.c +102 -0
  24. data/ext/goocanvas/rbgoocanvaspolyline.o +0 -0
  25. data/ext/goocanvas/rbgoocanvasrect.c +47 -0
  26. data/ext/goocanvas/rbgoocanvasrect.o +0 -0
  27. data/ext/goocanvas/rbgoocanvasstyle.c +61 -0
  28. data/ext/goocanvas/rbgoocanvasstyle.o +0 -0
  29. data/ext/goocanvas/rbgoocanvastable.c +41 -0
  30. data/ext/goocanvas/rbgoocanvastable.o +0 -0
  31. data/ext/goocanvas/rbgoocanvastext.c +58 -0
  32. data/ext/goocanvas/rbgoocanvastext.o +0 -0
  33. data/ext/goocanvas/rbgoocanvaswidget.c +48 -0
  34. data/ext/goocanvas/rbgoocanvaswidget.o +0 -0
  35. data/ext/goocanvas/rbgooutils.c +44 -0
  36. data/ext/goocanvas/rbgooutils.o +0 -0
  37. data/ext/goocanvas/ruby-goocanvas.pc +3 -0
  38. data/extconf.rb +49 -0
  39. data/lib/goocanvas.rb +145 -0
  40. data/sample/demo-arrowhead.rb +315 -0
  41. data/sample/demo-fifteen.rb +218 -0
  42. data/sample/demo-primitives.rb +720 -0
  43. data/sample/demo.rb +84 -0
  44. data/sample/flower.png +0 -0
  45. data/sample/scalability-demo.rb +130 -0
  46. data/sample/simple-demo.rb +35 -0
  47. data/sample/table-demo.rb +137 -0
  48. data/sample/toroid.png +0 -0
  49. data/sample/units-demo.rb +80 -0
  50. data/sample/widgets-demo.rb +197 -0
  51. metadata +133 -0
@@ -0,0 +1,84 @@
1
+ # -*- indent-tabs-mode: nil -*-
2
+ =begin header
3
+
4
+ demo.rb - Canvas test rewritten in Ruby/GooCanvas
5
+
6
+ Rewritten by Emmanuel Pinault <seatmanu@yahoo.com>
7
+
8
+ Original Copyright:
9
+
10
+ Author : Richard Hestilow <hestgray@ionet.net>
11
+
12
+ Copyright (C) 1998 Free Software Foundation
13
+
14
+ This program is free software; you can redistribute it and/or modify
15
+ it under the terms of the GNU General Public License as published by
16
+ the Free Software Foundation; either version 2, or (at your option)
17
+ any later version.
18
+
19
+ This program is distributed in the hope that it will be useful,
20
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
+ GNU General Public License for more details.
23
+
24
+ You should have received a copy of the GNU General Public License
25
+ along with this program; if not, write to the Free Software
26
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27
+ 02111-1307, USA.
28
+
29
+ =end
30
+
31
+ base_dir = File.dirname(__FILE__)
32
+ src_dir = File.expand_path(File.join(base_dir, "..", "src"))
33
+ lib_dir = File.join(src_dir, "lib")
34
+
35
+ $LOAD_PATH.unshift(src_dir)
36
+ $LOAD_PATH.unshift(lib_dir)
37
+ $LOAD_PATH.unshift(base_dir)
38
+
39
+ require 'goocanvas'
40
+ require 'demo-primitives'
41
+ require 'demo-arrowhead'
42
+ require 'demo-fifteen'
43
+
44
+ class GooCanvasSample < Gtk::Window
45
+ def initialize
46
+ super(Gtk::Window::TOPLEVEL)
47
+
48
+ signal_connect("destroy") do |widget, event|
49
+ Gtk::main_quit()
50
+ end
51
+
52
+ signal_connect("key_press_event") do |widget, event|
53
+ if event.state.control_mask? and event.keyval == Gdk::Keyval::GDK_q
54
+ destroy
55
+ true
56
+ else
57
+ false
58
+ end
59
+ end
60
+
61
+ set_default_size(640, 600)
62
+ notebook = Gtk::Notebook.new
63
+ add(notebook)
64
+ notebook.show
65
+
66
+ notebook.append_page(CanvasSamplePrimitives.new(false),
67
+ Gtk::Label.new("Primitives"))
68
+ notebook.append_page(CanvasSampleArrowhead.new,
69
+ Gtk::Label.new("Arrowhead"))
70
+ notebook.append_page(CanvasSampleFifteen.new,
71
+ Gtk::Label.new("Fifteen"))
72
+ # notebook.append_page(CanvasSampleFeatures.new,
73
+ # Gtk::Label.new("Feature"))
74
+ # notebook.append_page(CanvasSampleRichText.new,
75
+ # Gtk::Label.new("Rich Text"))
76
+ # notebook.append_page(CanvasSampleBezierCurve.new,
77
+ # Gtk::Label.new("Bezier Curve"))
78
+ show
79
+ end
80
+ end
81
+
82
+ canvas = GooCanvasSample.new
83
+
84
+ Gtk.main
Binary file
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env ruby
2
+ require 'goocanvas'
3
+
4
+ # the values behind the comments are the ones used in the C version
5
+ # but as with them it takes more than 20 sec on my computer for the window
6
+ # to show upm I decreased them a little
7
+ N_GROUP_COLS = 15 #25
8
+ N_GROUP_ROWS = 10 #20
9
+ N_COLS = 10
10
+ N_ROWS = 10
11
+
12
+ PADDING = 10
13
+
14
+ ONLY_ONE = false
15
+
16
+ def setup_canvas(canvas)
17
+ root = canvas.root_item
18
+ root.font = 'Sans 8'
19
+
20
+ item_width = 400
21
+ item_height = 19
22
+
23
+ cell_width = item_width + PADDING * 2
24
+ cell_height = item_height + PADDING * 2
25
+
26
+ group_width = N_COLS * cell_width
27
+ group_height = N_ROWS * cell_height
28
+
29
+ total_width = N_GROUP_COLS * group_width
30
+ total_height = N_GROUP_ROWS * group_height
31
+
32
+ # We use -ve offsets to test if -ve coords are handled correctly.
33
+ left_offset = -total_width / 2
34
+ top_offset = -total_height / 2
35
+
36
+ style = Goo::CanvasStyle.new
37
+ color = Gdk::Color.parse("mediumseagreen")
38
+ pattern = Cairo::SolidPattern.new(color.red / 65535.0, color.green / 65535.0, color.blue / 65535.0)
39
+ style.fill_pattern = pattern
40
+
41
+ style2 = Goo::CanvasStyle.new
42
+ color = Gdk::Color.parse("steelblue")
43
+ pattern = Cairo::SolidPattern.new(color.red / 65535.0, color.green / 65535.0, color.blue / 65535.0)
44
+ style2.fill_pattern = pattern
45
+
46
+ total_items = 0
47
+
48
+ N_GROUP_COLS.times do |group_i|
49
+ N_GROUP_ROWS.times do |group_j|
50
+ group_x = left_offset + (group_i * group_width);
51
+ group_y = top_offset + (group_j * group_height);
52
+
53
+ group = Goo::CanvasGroup.new(root)
54
+ total_items += 1
55
+ group.translate(group_x, group_y)
56
+
57
+ N_COLS.times do |i|
58
+ N_ROWS.times do |j|
59
+ item_x = (i * cell_width) + PADDING
60
+ item_y = (j * cell_height) + PADDING
61
+ rotation = i % 10 * 2
62
+ rotation_x = item_x + item_width / 2
63
+ rotation_y = item_y + item_height / 2
64
+
65
+ current_id = "#{group_x + item_x}, #{group_y + item_y}"
66
+
67
+ item = Goo::CanvasRect.new(group, item_x, item_y, item_width, item_height)
68
+ item.style = (j % 2) == 1 ? style : style2
69
+ item.rotate(rotation, rotation_x, rotation_y)
70
+
71
+ item.signal_connect('motion_notify_event') do
72
+ puts "#{current_id} item received 'motion-notify' signal"
73
+ end
74
+
75
+ item = Goo::CanvasText.new(group, current_id,
76
+ item_x + item_width / 2, item_y + item_height / 2, -1, Gtk::ANCHOR_CENTER)
77
+ item.rotate(rotation, rotation_x, rotation_y)
78
+
79
+ total_items += 2
80
+ break if ONLY_ONE
81
+ end
82
+ break if ONLY_ONE
83
+ end
84
+ break if ONLY_ONE
85
+ end
86
+ break if ONLY_ONE
87
+ end
88
+
89
+ puts "Total items: #{total_items}"
90
+ [ total_width, total_height, left_offset, top_offset ]
91
+ end
92
+
93
+ def create_canvas
94
+ # Create the canvas.
95
+ canvas = Goo::Canvas.new
96
+ canvas.set_size_request(600, 450)
97
+
98
+ start = Time.new
99
+ total_width, total_height, left_offset, top_offset = setup_canvas(canvas)
100
+ puts "Create Canvas Time Used: #{Time.new - start}"
101
+
102
+ start = Time.new
103
+ canvas.set_bounds(left_offset, top_offset, left_offset + total_width, top_offset + total_height)
104
+ canvas.show
105
+
106
+ first_time = true
107
+ canvas.signal_connect("expose_event") do
108
+ if first_time
109
+ puts "Update Canvas Time Used: #{Time.new - start}"
110
+ first_time = false
111
+ end
112
+ false
113
+ end
114
+
115
+ canvas
116
+ end
117
+
118
+ window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
119
+ window.set_default_size(640, 600)
120
+ window.show
121
+ window.signal_connect('delete_event') { Gtk.main_quit }
122
+
123
+ scrolled_win = Gtk::ScrolledWindow.new
124
+ scrolled_win.show
125
+ window.add(scrolled_win)
126
+
127
+ canvas = create_canvas
128
+ scrolled_win.add(canvas)
129
+
130
+ Gtk.main
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ require 'goocanvas'
3
+
4
+ # Create the window and widgets.
5
+ window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
6
+ window.set_default_size(640, 600)
7
+ window.show
8
+ window.signal_connect('delete_event') { Gtk.main_quit }
9
+
10
+ scrolled_win = Gtk::ScrolledWindow.new
11
+ scrolled_win.shadow_type = Gtk::SHADOW_IN
12
+ scrolled_win.show
13
+ window.add(scrolled_win)
14
+
15
+ canvas = Goo::Canvas.new
16
+ canvas.set_size_request(600, 450)
17
+ canvas.set_bounds(0, 0, 1000, 1000)
18
+ canvas.show
19
+ scrolled_win.add(canvas)
20
+
21
+ root = canvas.root_item
22
+
23
+ rect_item = Goo::CanvasRect.new(root, 100, 100, 400, 400,
24
+ :line_width => 10.0,
25
+ :radius_x => 20.0,
26
+ :radius_y => 10.0,
27
+ :stroke_color => 'yellow',
28
+ :fill_color => 'red')
29
+ rect_item.signal_connect('button_press_event') { puts "rect item received button press event\n" }
30
+
31
+ text_item = Goo::CanvasText.new(root, 'Hello World', 300, 300, -1, Gtk::ANCHOR_CENTER, :font => 'Sans 24')
32
+
33
+ text_item.rotate(45, 300, 300)
34
+
35
+ Gtk.main
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env ruby
2
+ require 'goocanvas'
3
+ DEMO_RECT_ITEM = 0
4
+ DEMO_TEXT_ITEM = 1
5
+ DEMO_WIDGET_ITEM = 2
6
+
7
+ def create_demo_item(table, demo_item_type, row, column, rows, columns, text)
8
+ case demo_item_type
9
+ when DEMO_RECT_ITEM
10
+ item = Goo::CanvasRect.new(table, 0, 0, 38, 19, :fill_color => 'red')
11
+ when DEMO_TEXT_ITEM
12
+ item = Goo::CanvasText.new(table, text, 0, 0, -1, Gtk::ANCHOR_NW, nil)
13
+ when DEMO_WIDGET_ITEM
14
+ widget = Gtk::Button.new(text)
15
+ item = Goo::CanvasWidget.new(table, widget, 0, 0, -1, -1)
16
+ end
17
+
18
+ table.set_child_properties(item, :row => row, :column => column, :rows => rows, :columns => columns,
19
+ :x_expand => true, :x_fill => true, :y_expand => true, :y_fill => true)
20
+
21
+ item.signal_connect('button_press_event') do |item, target, event|
22
+ puts "#{text} received 'button-press' signal at #{event.x}, #{event.y} (root: #{event.x_root}, #{event.y_root})"
23
+ true
24
+ end
25
+ end
26
+
27
+ def create_table(parent, row, column, embedding_level, x, y, rotation, scale, demo_item_type)
28
+ # Add a few simple items.
29
+ table = Goo::CanvasTable.new(parent, :row_spacing => 4.0, :column_spacing => 4.0)
30
+
31
+ table.translate(x, y)
32
+ table.rotate(rotation, 0, 0)
33
+ table.scale(scale, scale)
34
+
35
+ parent.set_child_properties(table, :row => row, :column => column, :x_expand => true, :x_fill => true) if row
36
+
37
+ if embedding_level > 0
38
+ level = embedding_level - 1
39
+ create_table(table, 0, 0, level, 50, 50, 0, 0.7, demo_item_type)
40
+ create_table(table, 0, 1, level, 50, 50, 45, 1.0, demo_item_type)
41
+ create_table(table, 0, 2, level, 50, 50, 90, 1.0, demo_item_type)
42
+ create_table(table, 1, 0, level, 50, 50, 135, 1.0, demo_item_type)
43
+ create_table(table, 1, 1, level, 50, 50, 180, 1.5, demo_item_type)
44
+ create_table(table, 1, 2, level, 50, 50, 225, 1.0, demo_item_type)
45
+ create_table(table, 2, 0, level, 50, 50, 270, 1.0, demo_item_type)
46
+ create_table(table, 2, 1, level, 50, 50, 315, 1.0, demo_item_type)
47
+ create_table(table, 2, 2, level, 50, 50, 360, 2.0, demo_item_type)
48
+ else
49
+ create_demo_item(table, demo_item_type, 0, 0, 1, 1, "(0,0)")
50
+ create_demo_item(table, demo_item_type, 0, 1, 1, 1, "(1,0)")
51
+ create_demo_item(table, demo_item_type, 0, 2, 1, 1, "(2,0)")
52
+ create_demo_item(table, demo_item_type, 1, 0, 1, 1, "(0,1)")
53
+ create_demo_item(table, demo_item_type, 1, 1, 1, 1, "(1,1)")
54
+ create_demo_item(table, demo_item_type, 1, 2, 1, 1, "(2,1)")
55
+ create_demo_item(table, demo_item_type, 2, 0, 1, 1, "(0,2)")
56
+ create_demo_item(table, demo_item_type, 2, 1, 1, 1, "(1,2)")
57
+ create_demo_item(table, demo_item_type, 2, 2, 1, 1, "(2,2)")
58
+ end
59
+ table
60
+ end
61
+
62
+ def create_demo_table(root, x, y, width, height)
63
+ table = Goo::CanvasTable.new(root, :row_spacing => 4.0, :column_spacing => 4.0, :width => width, :height => height)
64
+ table.translate(x, y)
65
+
66
+ square = Goo::CanvasRect.new(table, 0.0, 0.0, 50.0, 50.0, :fill_color => 'red')
67
+ table.set_child_properties(square, :row => 0, :column => 0, :x_shrink => true)
68
+ square.signal_connect('button_press_event') do |item, target, event|
69
+ puts "Red square received 'button-press' signal at #{event.x}, #{event.y} (root: #{event.x_root}, #{event.y_root})"
70
+ true
71
+ end
72
+
73
+ circle = Goo::CanvasEllipse.new(table, 0.0, 0.0, 25.0, 25.0, :fill_color => 'blue')
74
+ table.set_child_properties(circle, :row => 0, :column => 1, :x_shrink => true)
75
+ circle.signal_connect('button_press_event') do |item, target, event|
76
+ puts "Blue circle received 'button-press' signal at #{event.x}, #{event.y} (root: #{event.x_root}, #{event.y_root})"
77
+ true
78
+ end
79
+
80
+ triangle = Goo::CanvasPolyline.new(table, true, [ [ 25.0, 0.0], [ 0.0, 50.0 ], [ 50.0, 50.0 ] ], :fill_color => "yellow")
81
+ table.set_child_properties(triangle, :row => 0, :column => 2, :x_shrink => true)
82
+ triangle.signal_connect('button_press_event') do |item, target, event|
83
+ puts "Yellow triangle received 'button-press' signal at #{event.x}, #{event.y} (root: #{event.x_root}, #{event.y_root})"
84
+ true
85
+ end
86
+ end
87
+
88
+ window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
89
+ window.set_default_size(640, 600)
90
+ window.signal_connect('delete_event') { Gtk.main_quit }
91
+
92
+ vbox = Gtk::VBox.new(false, 4)
93
+ vbox.border_width = 4
94
+ vbox.show
95
+ window.add(vbox)
96
+
97
+ hbox = Gtk::HBox.new(false, 4)
98
+ vbox.pack_start(hbox, false, false, 0)
99
+ hbox.show
100
+
101
+ scrolled_win = Gtk::ScrolledWindow.new
102
+ scrolled_win.shadow_type = Gtk::SHADOW_IN
103
+ scrolled_win.show
104
+ vbox.pack_start(scrolled_win, true, true, 0)
105
+
106
+ canvas = Goo::Canvas.new
107
+ canvas.flags = Gtk::Widget::CAN_FOCUS
108
+ canvas.set_size_request(600, 450)
109
+ canvas.set_bounds(0, 0, 1000, 1000)
110
+ scrolled_win.add(canvas)
111
+
112
+ root = canvas.root_item
113
+
114
+ create_demo_table(root, 400, 200, -1, -1)
115
+ create_demo_table(root, 400, 260, 100, -1)
116
+
117
+ create_table(root, nil, nil, 0, 10, 10, 0, 1.0, DEMO_TEXT_ITEM)
118
+ create_table(root, nil, nil, 0, 180, 10, 30, 1.0, DEMO_TEXT_ITEM)
119
+ create_table(root, nil, nil, 0, 350, 10, 60, 1.0, DEMO_TEXT_ITEM)
120
+ create_table(root, nil, nil, 0, 500, 10, 90, 1.0, DEMO_TEXT_ITEM)
121
+
122
+ table = create_table(root, nil, nil, 0, 30, 150, 0, 1.0, DEMO_TEXT_ITEM)
123
+ table.width = 300.0
124
+ table.height = 100.0
125
+
126
+ create_table(root, nil, nil, 1, 200, 200, 30, 0.8, DEMO_TEXT_ITEM)
127
+
128
+ table = create_table(root, nil, nil, 0, 10, 700, 0, 1.0, DEMO_WIDGET_ITEM)
129
+ table.width = 300.0
130
+ table.height = 200.0
131
+
132
+ canvas.show
133
+
134
+ window.show
135
+
136
+ Gtk.main
137
+
Binary file
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+ require 'goocanvas'
3
+
4
+ DATA = {
5
+ Gtk::PaperSize::UNIT_PIXEL => [ 100, 100, 200, 20, 10, 200, 310, 24 ],
6
+ Gtk::PaperSize::UNIT_POINTS => [ 100, 100, 200, 20, 10, 200, 310, 24 ],
7
+ Gtk::PaperSize::UNIT_INCH => [ 1, 1, 3, 0.5, 0.16, 3, 4, 0.3 ],
8
+ Gtk::PaperSize::UNIT_MM => [ 30, 30, 100, 10, 5, 80, 60, 10 ],
9
+ }
10
+
11
+ def setup_canvas(canvas, units, units_name)
12
+ d = DATA[units]
13
+
14
+ root = canvas.root_item
15
+
16
+ item = Goo::CanvasRect.new(root, d[0], d[1], d[2], d[3])
17
+ item.signal_connect('motion_notify_event') { puts "received 'motion-notify' signal" }
18
+
19
+ item = Goo::CanvasText.new(root, "This box is #{d[2]}x#{d[3]} #{units_name}",
20
+ d[0] + d[2] / 2.0, d[1] + d[3] / 2.0, -1, Gtk::ANCHOR_CENTER, :font => "Sans #{d[4]}px")
21
+
22
+ item = Goo::CanvasText.new(root, "This font is #{d[7]} #{units_name} high",
23
+ d[5], d[6], -1, Gtk::ANCHOR_CENTER, :font => "Sans #{d[7]}px")
24
+ end
25
+
26
+ def create_canvas(units, units_name)
27
+ vbox = Gtk::VBox.new(false, 4)
28
+ vbox.show
29
+
30
+ hbox = Gtk::HBox.new(false, 4)
31
+ vbox.pack_start(hbox, false, false, 0)
32
+ hbox.show
33
+
34
+ canvas = Goo::Canvas.new
35
+
36
+ w = Gtk::Label.new('Zoom:')
37
+ hbox.pack_start(w, false, false, 0)
38
+ w.show
39
+
40
+ adj = Gtk::Adjustment.new(1, 0.05, 100, 0.05, 0.5, 0.5)
41
+ w = Gtk::SpinButton.new(adj, 0, 2)
42
+ adj.signal_connect('value_changed') { |new_adj| canvas.scale = new_adj.value }
43
+
44
+ w.set_size_request(50, -1)
45
+ hbox.pack_start(w, false, false, 0)
46
+ w.show
47
+
48
+ scrolled_win = Gtk::ScrolledWindow.new
49
+ vbox.pack_start(scrolled_win, true, true, 0)
50
+ scrolled_win.show
51
+
52
+ # Create the canvas.
53
+ canvas.set_size_request(600, 450)
54
+ setup_canvas(canvas, units, units_name)
55
+
56
+ canvas.set_bounds(0, 0, 1000, 1000)
57
+ canvas.units = units
58
+ canvas.anchor = Gtk::ANCHOR_CENTER
59
+ canvas.show
60
+
61
+ scrolled_win.add(canvas)
62
+
63
+ vbox
64
+ end
65
+
66
+ window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
67
+ window.set_default_size(640, 600)
68
+ window.show
69
+ window.signal_connect('delete_event') { Gtk.main_quit }
70
+
71
+ notebook = Gtk::Notebook.new
72
+ notebook.show
73
+ window.add(notebook)
74
+
75
+ notebook.append_page(create_canvas(Gtk::PaperSize::UNIT_PIXEL, 'pixels'), Gtk::Label.new('Pixels'))
76
+ notebook.append_page(create_canvas(Gtk::PaperSize::UNIT_POINTS, 'points'), Gtk::Label.new('Points'))
77
+ notebook.append_page(create_canvas(Gtk::PaperSize::UNIT_INCH, 'inches'), Gtk::Label.new('Inches'))
78
+ notebook.append_page(create_canvas(Gtk::PaperSize::UNIT_MM, 'millimeters'), Gtk::Label.new('Millimeters'))
79
+
80
+ Gtk.main