clutter 1.2.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.
- data/Rakefile +41 -0
- data/lib/clutter.rb +135 -0
- data/lib/clutter/actor-iter.rb +33 -0
- data/lib/clutter/actor.rb +34 -0
- data/lib/clutter/animatable.rb +26 -0
- data/lib/clutter/cairo.rb +24 -0
- data/lib/clutter/color.rb +55 -0
- data/lib/clutter/event.rb +21 -0
- data/lib/clutter/point.rb +25 -0
- data/lib/clutter/text.rb +23 -0
- data/lib/clutter/threads.rb +38 -0
- data/sample/basic-actor.rb +125 -0
- data/sample/bin-layout.rb +215 -0
- data/sample/box-layout.rb +196 -0
- data/sample/canvas.rb +117 -0
- data/sample/constraints.rb +81 -0
- data/sample/drag-action.rb +177 -0
- data/sample/drop-action.rb +198 -0
- data/sample/easing-modes.rb +145 -0
- data/sample/flow-layout.rb +121 -0
- data/sample/grid-layout.rb +239 -0
- data/sample/image-content.rb +88 -0
- data/sample/pan-action.rb +100 -0
- data/sample/redhand.png +0 -0
- data/sample/rounded-rectangle.rb +90 -0
- data/sample/scroll-actor.rb +105 -0
- data/test/clutter-test-utils.rb +21 -0
- data/test/run-test.rb +50 -0
- metadata +120 -0
@@ -0,0 +1,145 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This sample code is a port of clutter/examples/easing-mode.c.
|
4
|
+
# It is licensed under the terms of the GNU Lesser General Public
|
5
|
+
# License, version 2.1 or (at your option) later.
|
6
|
+
#
|
7
|
+
# Copyright (C) 2013 Ruby-GNOME2 Project Team
|
8
|
+
#
|
9
|
+
# This library is free software; you can redistribute it and/or
|
10
|
+
# modify it under the terms of the GNU Lesser General Public
|
11
|
+
# License as published by the Free Software Foundation; either
|
12
|
+
# version 2.1 of the License, or (at your option) any later version.
|
13
|
+
#
|
14
|
+
# This library is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
17
|
+
# Lesser General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU Lesser General Public
|
20
|
+
# License along with this library; if not, write to the Free Software
|
21
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
22
|
+
|
23
|
+
require "optparse"
|
24
|
+
|
25
|
+
require "clutter"
|
26
|
+
|
27
|
+
Clutter.init
|
28
|
+
|
29
|
+
duration = 1
|
30
|
+
|
31
|
+
parser = OptionParser.new
|
32
|
+
parser.on("--duration=SECONDS", Integer,
|
33
|
+
"Duration of the animation",
|
34
|
+
"(#{duration})") do |_duration|
|
35
|
+
duration = _duration
|
36
|
+
end
|
37
|
+
parser.parse!
|
38
|
+
|
39
|
+
current_mode_index = 0
|
40
|
+
easing_modes = Clutter::AnimationMode.values.reject do |mode|
|
41
|
+
mode == Clutter::AnimationMode::CUSTOM_MODE
|
42
|
+
end
|
43
|
+
|
44
|
+
help_text = lambda do
|
45
|
+
format = <<-EOT.chomp
|
46
|
+
<b>Easing mode: %s (%d of %d)</b>
|
47
|
+
Left click to tween
|
48
|
+
Middle click to jump
|
49
|
+
Right click to change the easing mode
|
50
|
+
EOT
|
51
|
+
current_mode = easing_modes[current_mode_index]
|
52
|
+
format % [current_mode.nick, current_mode_index, easing_modes.size]
|
53
|
+
end
|
54
|
+
|
55
|
+
stage = Clutter::Stage.new
|
56
|
+
stage.title = "Easing Modes"
|
57
|
+
stage.background_color = Clutter::Color.new(:sky_blue_light)
|
58
|
+
stage.signal_connect("destroy") do
|
59
|
+
Clutter.main_quit
|
60
|
+
end
|
61
|
+
|
62
|
+
main_stage = stage
|
63
|
+
|
64
|
+
stage_size = stage.size
|
65
|
+
stage_width = stage_size.width
|
66
|
+
stage_height = stage_size.height
|
67
|
+
|
68
|
+
bouncer_width = 50
|
69
|
+
bouncer_height = 50
|
70
|
+
|
71
|
+
canvas = Clutter::Canvas.new
|
72
|
+
canvas.signal_connect("draw") do |_canvas, cairo_context, width, height|
|
73
|
+
cairo_context.operator = :clear
|
74
|
+
cairo_context.paint
|
75
|
+
|
76
|
+
cairo_context.operator = :over
|
77
|
+
|
78
|
+
radius = [width, height].max
|
79
|
+
|
80
|
+
cairo_context.arc(radius / 2, radius / 2, radius / 2, 0.0, 2.0 * Math::PI)
|
81
|
+
|
82
|
+
bouncer_color = Clutter::Color.new(:scarlet_red_dark)
|
83
|
+
|
84
|
+
pattern = Cairo::RadialPattern.new(radius / 2, radius / 2, 0,
|
85
|
+
radius, radius, radius)
|
86
|
+
pattern.add_color_stop_rgba(0,
|
87
|
+
bouncer_color.red / 255.0,
|
88
|
+
bouncer_color.green / 255.0,
|
89
|
+
bouncer_color.blue / 255.0,
|
90
|
+
bouncer_color.alpha / 255.0)
|
91
|
+
pattern.add_color_stop_rgba(0.85,
|
92
|
+
bouncer_color.red / 255.0,
|
93
|
+
bouncer_color.green / 255.0,
|
94
|
+
bouncer_color.blue / 255.0,
|
95
|
+
0.25);
|
96
|
+
|
97
|
+
cairo_context.set_source(pattern)
|
98
|
+
cairo_context.fill
|
99
|
+
|
100
|
+
Clutter::Event::STOP
|
101
|
+
end
|
102
|
+
canvas.set_size(bouncer_width, bouncer_height)
|
103
|
+
|
104
|
+
rectangle = Clutter::Actor.new
|
105
|
+
rectangle.name = "bouncer"
|
106
|
+
rectangle.set_size(bouncer_width, bouncer_height)
|
107
|
+
rectangle.set_pivot_point(0.5, 0.5)
|
108
|
+
rectangle.set_translation(bouncer_width / -2.0, bouncer_height / -2.0, 0.0)
|
109
|
+
rectangle.reactive = true
|
110
|
+
rectangle.content = canvas
|
111
|
+
|
112
|
+
stage.add_child(rectangle)
|
113
|
+
rectangle.set_position(stage_width / 2, stage_height / 2)
|
114
|
+
|
115
|
+
label = Clutter::Text.new
|
116
|
+
stage.add_child(label)
|
117
|
+
label.markup = help_text.call
|
118
|
+
label.line_alignment = :right
|
119
|
+
label.add_constraint(Clutter::AlignConstraint.new(stage, :x_axis, 0.95))
|
120
|
+
label.add_constraint(Clutter::AlignConstraint.new(stage, :y_axis, 0.95))
|
121
|
+
easing_mode_label = label
|
122
|
+
|
123
|
+
stage.signal_connect("button-press-event") do |actor, event|
|
124
|
+
case event.button
|
125
|
+
when Clutter::BUTTON_SECONDARY
|
126
|
+
current_mode_index = (current_mode_index + 1) % easing_modes.size
|
127
|
+
label.markup = help_text.call
|
128
|
+
when Clutter::BUTTON_MIDDLE
|
129
|
+
rectangle.set_position(event.x, event.y)
|
130
|
+
when Clutter::BUTTON_PRIMARY
|
131
|
+
current_mode = easing_modes[current_mode_index]
|
132
|
+
rectangle.save_easing_state do
|
133
|
+
rectangle.easing_mode = current_mode
|
134
|
+
rectangle.easing_duration = duration * 1000
|
135
|
+
|
136
|
+
rectangle.set_position(event.x, event.y)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
Clutter::Event::STOP
|
141
|
+
end
|
142
|
+
|
143
|
+
stage.show
|
144
|
+
|
145
|
+
Clutter.main
|
@@ -0,0 +1,121 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This sample code is a port of clutter/examples/flow-layout.c.
|
4
|
+
# It is licensed under the terms of the GNU Lesser General Public
|
5
|
+
# License, version 2.1 or (at your option) later.
|
6
|
+
#
|
7
|
+
# Copyright (C) 2013 Ruby-GNOME2 Project Team
|
8
|
+
#
|
9
|
+
# This library is free software; you can redistribute it and/or
|
10
|
+
# modify it under the terms of the GNU Lesser General Public
|
11
|
+
# License as published by the Free Software Foundation; either
|
12
|
+
# version 2.1 of the License, or (at your option) any later version.
|
13
|
+
#
|
14
|
+
# This library is distributed in the hope that it will be useful,
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
17
|
+
# Lesser General Public License for more details.
|
18
|
+
#
|
19
|
+
# You should have received a copy of the GNU Lesser General Public
|
20
|
+
# License along with this library; if not, write to the Free Software
|
21
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
22
|
+
|
23
|
+
require "optparse"
|
24
|
+
|
25
|
+
require "clutter"
|
26
|
+
|
27
|
+
Clutter.init
|
28
|
+
|
29
|
+
random_size_p = false
|
30
|
+
n_rects = 20
|
31
|
+
vertical_p = false
|
32
|
+
homogeneous_p = false
|
33
|
+
x_spacing = 0
|
34
|
+
y_spacing = 0
|
35
|
+
fixed_size_p = false
|
36
|
+
|
37
|
+
parser = OptionParser.new
|
38
|
+
parser.on("--[no-]random-size",
|
39
|
+
"Randomly size the rectangles",
|
40
|
+
"(#{random_size_p})") do |boolean|
|
41
|
+
random_size_p = boolean
|
42
|
+
end
|
43
|
+
parser.on("--n-rects=N", Integer,
|
44
|
+
"Number of rectangles",
|
45
|
+
"(#{n_rects})") do |n|
|
46
|
+
n_rects = n
|
47
|
+
end
|
48
|
+
parser.on("--[no-]vertical",
|
49
|
+
"Set vertical orientation",
|
50
|
+
"(#{vertical_p})") do |boolean|
|
51
|
+
vertical_p = boolean
|
52
|
+
end
|
53
|
+
parser.on("--[no-]homogeneous",
|
54
|
+
"Whether the layout should be homogeneous",
|
55
|
+
"(#{homogeneous_p})") do |boolean|
|
56
|
+
homogeneous_p = boolean
|
57
|
+
end
|
58
|
+
parser.on("--x-spacing=PIXEL", Integer,
|
59
|
+
"Horizontal spacing between elements",
|
60
|
+
"(#{x_spacing})") do |pixel|
|
61
|
+
x_spacing = pixel
|
62
|
+
end
|
63
|
+
parser.on("--y-spacing=PIXEL", Integer,
|
64
|
+
"Vertical spacing between elements",
|
65
|
+
"(#{y_spacing})") do |pixel|
|
66
|
+
y_spacing = pixel
|
67
|
+
end
|
68
|
+
parser.on("--[no-]fixed-size",
|
69
|
+
"Fix the layout size",
|
70
|
+
"(#{fixed_size_p})") do |boolean|
|
71
|
+
fixed_size_p = boolean
|
72
|
+
end
|
73
|
+
parser.parse!
|
74
|
+
|
75
|
+
stage = Clutter::Stage.new
|
76
|
+
stage.background_color = Clutter::Color.new(:sky_blue_light)
|
77
|
+
stage.title = "Flow Layout"
|
78
|
+
stage.user_resizable = true
|
79
|
+
stage.signal_connect("destroy") do
|
80
|
+
Clutter.main_quit
|
81
|
+
end
|
82
|
+
|
83
|
+
layout = Clutter::FlowLayout.new(vertical_p ? :vertical : :horizontal)
|
84
|
+
layout.homogeneous = homogeneous_p
|
85
|
+
layout.column_spacing = x_spacing
|
86
|
+
layout.row_spacing = y_spacing
|
87
|
+
|
88
|
+
box = Clutter::Actor.new
|
89
|
+
box.layout_manager = layout
|
90
|
+
box.background_color = Clutter::Color.new(:aluminium_2)
|
91
|
+
stage.add_child(box)
|
92
|
+
|
93
|
+
unless fixed_size_p
|
94
|
+
box.add_constraint(Clutter::BindConstraint.new(stage, :size, 0.0))
|
95
|
+
end
|
96
|
+
|
97
|
+
box.set_position(0, 0)
|
98
|
+
box.name = "box"
|
99
|
+
|
100
|
+
n_rects.times do |i|
|
101
|
+
color = Clutter::Color.hls(360.0 / n_rects * i,
|
102
|
+
0.5,
|
103
|
+
0.8)
|
104
|
+
rect = Clutter::Actor.new
|
105
|
+
rect.background_color = color
|
106
|
+
if random_size_p
|
107
|
+
width = rand(50..100)
|
108
|
+
height = rand(50..100)
|
109
|
+
else
|
110
|
+
width = height = 50.0
|
111
|
+
end
|
112
|
+
|
113
|
+
rect.set_size(width, height)
|
114
|
+
rect.name = "rect%02d" % i
|
115
|
+
|
116
|
+
box.add_child(rect)
|
117
|
+
end
|
118
|
+
|
119
|
+
stage.show
|
120
|
+
|
121
|
+
Clutter.main
|
@@ -0,0 +1,239 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This sample code is a port of clutter/examples/grid-layout.c.
|
4
|
+
# The original header:
|
5
|
+
# Copyright 2012 Bastian Winkler <buz@netbuz.org>
|
6
|
+
#
|
7
|
+
# This program is free software; you can redistribute it and/or modify it
|
8
|
+
# under the terms and conditions of the GNU Lesser General Public License,
|
9
|
+
# version 2.1, as published by the Free Software Foundation.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope it will be useful, but WITHOUT ANY
|
12
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
13
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
|
14
|
+
# more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with this program; if not, write to the Free Software Foundation,
|
18
|
+
# Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
19
|
+
# Boston, MA 02111-1307, USA.
|
20
|
+
#
|
21
|
+
#
|
22
|
+
# Copyright (C) 2013 Ruby-GNOME2 Project Team
|
23
|
+
#
|
24
|
+
# This library is free software; you can redistribute it and/or
|
25
|
+
# modify it under the terms of the GNU Lesser General Public
|
26
|
+
# License, version 2.1, as published by the Free Software Foundation.
|
27
|
+
#
|
28
|
+
# This library is distributed in the hope that it will be useful,
|
29
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
30
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
31
|
+
# Lesser General Public License for more details.
|
32
|
+
#
|
33
|
+
# You should have received a copy of the GNU Lesser General Public
|
34
|
+
# License along with this library; if not, write to the Free Software
|
35
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
36
|
+
|
37
|
+
require "optparse"
|
38
|
+
|
39
|
+
require "clutter"
|
40
|
+
|
41
|
+
Clutter.init
|
42
|
+
|
43
|
+
random_size_p = false
|
44
|
+
random_align_p = false
|
45
|
+
default_expand_p = true
|
46
|
+
use_box_p = false
|
47
|
+
vertical_p = false
|
48
|
+
|
49
|
+
parser = OptionParser.new
|
50
|
+
parser.on("--[no-]random-size",
|
51
|
+
"Randomly size the rectangles",
|
52
|
+
"(#{random_size_p})") do |boolean|
|
53
|
+
random_size_p = boolean
|
54
|
+
end
|
55
|
+
parser.on("--[no-]random-align",
|
56
|
+
"Randomly set the align values",
|
57
|
+
"(#{random_align_p})") do |boolean|
|
58
|
+
random_align_p = boolean
|
59
|
+
end
|
60
|
+
parser.on("--no-expand",
|
61
|
+
"Don't expand all actors by default",
|
62
|
+
"(#{default_expand_p})") do |boolean|
|
63
|
+
default_expand_p = boolean
|
64
|
+
end
|
65
|
+
parser.on("--[no-]box",
|
66
|
+
"Use the layout in a Clutter::BoxLayout style",
|
67
|
+
"(#{use_box_p})") do |boolean|
|
68
|
+
use_box_p = boolean
|
69
|
+
end
|
70
|
+
parser.on("--[no-]vertical",
|
71
|
+
"Use a vertical orientation when used with --box",
|
72
|
+
"(#{vertical_p})") do |boolean|
|
73
|
+
vertical_p = boolean
|
74
|
+
end
|
75
|
+
parser.parse!
|
76
|
+
|
77
|
+
stage = Clutter::Stage.new
|
78
|
+
stage.user_resizable = true
|
79
|
+
|
80
|
+
stage_layout = Clutter::BoxLayout.new
|
81
|
+
stage_layout.orientation = :vertical
|
82
|
+
stage.layout_manager = stage_layout
|
83
|
+
|
84
|
+
grid_layout = Clutter::GridLayout.new
|
85
|
+
if vertical_p
|
86
|
+
grid_layout.orientation = :vertical
|
87
|
+
end
|
88
|
+
|
89
|
+
box = Clutter::Actor.new
|
90
|
+
box.background_color = Clutter::Color.new(:light_gray)
|
91
|
+
box.x_expand = true
|
92
|
+
box.y_expand = true
|
93
|
+
box.layout_manager = grid_layout
|
94
|
+
stage_layout.pack(box, true, true, true, :center, :center)
|
95
|
+
|
96
|
+
add_actor = lambda do |left, top, width, height|
|
97
|
+
color = Clutter::Color.hls(rand(0.0...360.0),
|
98
|
+
0.5,
|
99
|
+
0.5)
|
100
|
+
color.alpha = 255
|
101
|
+
|
102
|
+
layout = Clutter::BinLayout.new(:center, :center)
|
103
|
+
rect = Clutter::Actor.new
|
104
|
+
rect.layout_manager = layout
|
105
|
+
rect.background_color = color
|
106
|
+
rect.reactive = true
|
107
|
+
|
108
|
+
if random_size_p
|
109
|
+
rect.set_size(rand(40..80),
|
110
|
+
rand(40..80))
|
111
|
+
else
|
112
|
+
rect.set_size(60, 60)
|
113
|
+
end
|
114
|
+
rect.x_expand = default_expand_p
|
115
|
+
rect.y_expand = default_expand_p
|
116
|
+
|
117
|
+
unless default_expand_p
|
118
|
+
rect.x_align = :center
|
119
|
+
rect.y_align = :center
|
120
|
+
end
|
121
|
+
|
122
|
+
if random_align_p
|
123
|
+
aligns = Clutter::ActorAlign.values
|
124
|
+
rect.x_align = aligns[rand(aligns.size)]
|
125
|
+
rect.y_align = aligns[rand(aligns.size)]
|
126
|
+
end
|
127
|
+
|
128
|
+
text = Clutter::Text.new("Sans 8px", "")
|
129
|
+
text.line_alignment = :center
|
130
|
+
rect.add_child(text)
|
131
|
+
|
132
|
+
changed = lambda do |actor, pspec|
|
133
|
+
layout = box.layout_manager
|
134
|
+
meta = layout.get_child_meta(box, actor)
|
135
|
+
|
136
|
+
label = <<-EOL.chomp
|
137
|
+
attach: #{meta.left_attach},#{meta.top_attach}
|
138
|
+
span: #{meta.width},#{meta.height}
|
139
|
+
expand: #{actor.x_expand?},#{actor.y_expand?}
|
140
|
+
align: #{actor.x_align.nick},#{actor.y_align.nick}"
|
141
|
+
EOL
|
142
|
+
text.text = label
|
143
|
+
end
|
144
|
+
|
145
|
+
rect.signal_connect("button-release-event") do |actor, event|
|
146
|
+
x_align = actor.x_align
|
147
|
+
y_align = actor.y_align
|
148
|
+
x_expand_p = actor.x_expand?
|
149
|
+
y_expand_p = actor.y_expand?
|
150
|
+
|
151
|
+
processed = true
|
152
|
+
aligns = Clutter::ActorAlign.values
|
153
|
+
case event.button
|
154
|
+
when Clutter::BUTTON_PRIMARY
|
155
|
+
if event.has_shift_modifier?
|
156
|
+
actor.x_expand = !actor.x_expand?
|
157
|
+
else
|
158
|
+
actor.x_align = aligns[(actor.x_align.to_i + 1) % aligns.size]
|
159
|
+
end
|
160
|
+
when Clutter::BUTTON_SECONDARY
|
161
|
+
if event.has_shift_modifier?
|
162
|
+
actor.y_expand = !actor.y_expand?
|
163
|
+
else
|
164
|
+
actor.y_align = aligns[(actor.y_align.to_i + 1) % aligns.size]
|
165
|
+
end
|
166
|
+
else
|
167
|
+
processed = false
|
168
|
+
end
|
169
|
+
processed
|
170
|
+
end
|
171
|
+
rect.signal_connect("notify::x-expand", &changed)
|
172
|
+
rect.signal_connect("notify::y-expand", &changed)
|
173
|
+
rect.signal_connect("notify::x-align", &changed)
|
174
|
+
rect.signal_connect("notify::y-align", &changed)
|
175
|
+
|
176
|
+
layout = box.layout_manager
|
177
|
+
if use_box_p
|
178
|
+
box.add_child(rect)
|
179
|
+
else
|
180
|
+
layout.attach(rect, left, top, width, height)
|
181
|
+
end
|
182
|
+
changed.call(rect, nil)
|
183
|
+
end
|
184
|
+
|
185
|
+
add_actor.call(0, 0, 1, 1)
|
186
|
+
add_actor.call(1, 0, 1, 1)
|
187
|
+
add_actor.call(2, 0, 1, 1)
|
188
|
+
add_actor.call(0, 1, 1, 1)
|
189
|
+
add_actor.call(1, 1, 2, 1)
|
190
|
+
add_actor.call(0, 2, 3, 1)
|
191
|
+
add_actor.call(0, 3, 2, 2)
|
192
|
+
add_actor.call(2, 3, 1, 1)
|
193
|
+
add_actor.call(2, 4, 1, 1)
|
194
|
+
|
195
|
+
instructions = Clutter::Text.new("Sans 12px", <<-EOI.chomp)
|
196
|
+
Press r\t\342\236\236\tSwitch row homogeneous
|
197
|
+
Press c\t\342\236\236\tSwitch column homogeneous
|
198
|
+
Press s\t\342\236\236\tIncrement spacing (up to 12px)
|
199
|
+
Press q\t\342\236\236\tQuit
|
200
|
+
|
201
|
+
Left/right click\t\t\342\236\236\tChange actor align
|
202
|
+
Shift left/right click\t\342\236\236\tChange actor expand
|
203
|
+
EOI
|
204
|
+
instructions.margin_top = 4
|
205
|
+
instructions.margin_left = 4
|
206
|
+
instructions.margin_bottom = 4
|
207
|
+
stage_layout.pack(instructions, false, true, false, :start, :center)
|
208
|
+
|
209
|
+
stage.signal_connect("destroy") do
|
210
|
+
Clutter.main_quit
|
211
|
+
end
|
212
|
+
|
213
|
+
stage.signal_connect("key-release-event") do |actor, event|
|
214
|
+
layout = box.layout_manager
|
215
|
+
|
216
|
+
processed = true
|
217
|
+
case event.key_symbol
|
218
|
+
when Clutter::Keys::KEY_c
|
219
|
+
homogeneous_p = layout.column_homogeneous?
|
220
|
+
layout.column_homogeneous = !homogeneous_p
|
221
|
+
when Clutter::Keys::KEY_r
|
222
|
+
homogeneous_p = layout.row_homogeneous?
|
223
|
+
layout.row_homogeneous = !homogeneous_p
|
224
|
+
when Clutter::Keys::KEY_s
|
225
|
+
spacing = (layout.column_spacing + 1) % 12
|
226
|
+
layout.column_spacing = spacing
|
227
|
+
layout.row_spacing = spacing
|
228
|
+
when Clutter::Keys::KEY_q
|
229
|
+
Clutter.main_quit
|
230
|
+
else
|
231
|
+
processed = false
|
232
|
+
end
|
233
|
+
|
234
|
+
processed
|
235
|
+
end
|
236
|
+
|
237
|
+
stage.show
|
238
|
+
|
239
|
+
Clutter.main
|