rabbit 2.2.1 → 3.0.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.
Files changed (177) hide show
  1. checksums.yaml +5 -5
  2. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  3. data/doc/_config.yml +2 -2
  4. data/doc/_layouts/en.html +1 -1
  5. data/doc/_layouts/ja.html +1 -1
  6. data/doc/en/news.rd +140 -0
  7. data/doc/en/sample/hiki/rabbit.hiki +2 -2
  8. data/doc/en/sample/markdown/rabbit.md +1 -1
  9. data/doc/en/sample/rd/rabbit.rd +1 -1
  10. data/doc/en/usage/rabbit-slide.rd +3 -3
  11. data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
  12. data/doc/images/screenshots/en/blue-circle.png +0 -0
  13. data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
  14. data/doc/images/screenshots/en/clear-blue.png +0 -0
  15. data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
  16. data/doc/images/screenshots/en/cozmixng.png +0 -0
  17. data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
  18. data/doc/images/screenshots/en/dark-gradation.png +0 -0
  19. data/doc/images/screenshots/en/day-white-raw.png +0 -0
  20. data/doc/images/screenshots/en/day-white.png +0 -0
  21. data/doc/images/screenshots/en/debian-raw.png +0 -0
  22. data/doc/images/screenshots/en/debian.png +0 -0
  23. data/doc/images/screenshots/en/green-circle-raw.png +0 -0
  24. data/doc/images/screenshots/en/green-circle.png +0 -0
  25. data/doc/images/screenshots/en/night-black-raw.png +0 -0
  26. data/doc/images/screenshots/en/night-black.png +0 -0
  27. data/doc/images/screenshots/en/rabbit-raw.png +0 -0
  28. data/doc/images/screenshots/en/rabbit.png +0 -0
  29. data/doc/images/screenshots/en/ranguba-raw.png +0 -0
  30. data/doc/images/screenshots/en/ranguba.png +0 -0
  31. data/doc/images/screenshots/en/red-frame-raw.png +0 -0
  32. data/doc/images/screenshots/en/red-frame.png +0 -0
  33. data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  34. data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
  35. data/doc/images/screenshots/en/rubykaigi2011-raw.png +0 -0
  36. data/doc/images/screenshots/en/rubykaigi2011.png +0 -0
  37. data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
  38. data/doc/images/screenshots/ja/blue-circle.png +0 -0
  39. data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
  40. data/doc/images/screenshots/ja/clear-blue.png +0 -0
  41. data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
  42. data/doc/images/screenshots/ja/cozmixng.png +0 -0
  43. data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
  44. data/doc/images/screenshots/ja/dark-gradation.png +0 -0
  45. data/doc/images/screenshots/ja/day-white-raw.png +0 -0
  46. data/doc/images/screenshots/ja/day-white.png +0 -0
  47. data/doc/images/screenshots/ja/debian-raw.png +0 -0
  48. data/doc/images/screenshots/ja/debian.png +0 -0
  49. data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
  50. data/doc/images/screenshots/ja/green-circle.png +0 -0
  51. data/doc/images/screenshots/ja/night-black-raw.png +0 -0
  52. data/doc/images/screenshots/ja/night-black.png +0 -0
  53. data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
  54. data/doc/images/screenshots/ja/rabbit.png +0 -0
  55. data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
  56. data/doc/images/screenshots/ja/ranguba.png +0 -0
  57. data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
  58. data/doc/images/screenshots/ja/red-frame.png +0 -0
  59. data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  60. data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
  61. data/doc/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
  62. data/doc/images/screenshots/ja/rubykaigi2011.png +0 -0
  63. data/doc/ja/how-to-make/index.rd +1 -1
  64. data/doc/ja/news.rd +143 -0
  65. data/doc/ja/sample/hiki/rabbit.hiki +2 -2
  66. data/doc/ja/sample/markdown/rabbit.md +1 -1
  67. data/doc/ja/sample/rd/rabbit.rd +1 -1
  68. data/doc/ja/slides.rd +1 -1
  69. data/doc/ja/usage/rabbit-slide.rd +3 -3
  70. data/doc/ja/users.rd +1 -1
  71. data/lib/rabbit/action.rb +23 -4
  72. data/lib/rabbit/canvas.rb +70 -14
  73. data/lib/rabbit/command/rabbit-slide.rb +252 -67
  74. data/lib/rabbit/command/rabbit-slide.ui +180 -0
  75. data/lib/rabbit/command/rabbit.rb +14 -20
  76. data/lib/rabbit/console.rb +9 -3
  77. data/lib/rabbit/dependency-canvas.rb +19 -1
  78. data/lib/rabbit/element.rb +34 -7
  79. data/lib/rabbit/element/poppler-page.rb +1 -2
  80. data/lib/rabbit/element/text-container-element.rb +2 -2
  81. data/lib/rabbit/element/text-renderer.rb +5 -4
  82. data/lib/rabbit/element/title-slide.rb +8 -0
  83. data/lib/rabbit/element/video.rb +1 -2
  84. data/lib/rabbit/filename.rb +39 -0
  85. data/lib/rabbit/formatter.rb +61 -30
  86. data/lib/rabbit/frame.rb +1 -19
  87. data/lib/rabbit/front.rb +23 -2
  88. data/lib/rabbit/gesture/handler.rb +21 -2
  89. data/lib/rabbit/graffiti/config-dialog.rb +15 -18
  90. data/lib/rabbit/gtk.rb +2 -191
  91. data/lib/rabbit/html/generator.rb +38 -30
  92. data/lib/rabbit/image-data-loader.rb +6 -1
  93. data/lib/rabbit/image.rb +22 -4
  94. data/lib/rabbit/image/base.rb +34 -2
  95. data/lib/rabbit/image/default.rb +1 -1
  96. data/lib/rabbit/image/eps.rb +1 -1
  97. data/lib/rabbit/image/gimp.rb +1 -1
  98. data/lib/rabbit/info-window.rb +27 -15
  99. data/lib/rabbit/logger/gui.rb +21 -23
  100. data/lib/rabbit/logger/stderr.rb +1 -1
  101. data/lib/rabbit/pango-markup.rb +44 -0
  102. data/lib/rabbit/parser.rb +20 -3
  103. data/lib/rabbit/parser/ext/image.rb +25 -8
  104. data/lib/rabbit/parser/ext/video.rb +21 -2
  105. data/lib/rabbit/parser/markdown.rb +1 -2
  106. data/lib/rabbit/parser/pdf.rb +23 -7
  107. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +20 -0
  108. data/lib/rabbit/progress.rb +34 -23
  109. data/lib/rabbit/renderer.rb +17 -23
  110. data/lib/rabbit/renderer/base.rb +31 -57
  111. data/lib/rabbit/renderer/color.rb +46 -53
  112. data/lib/rabbit/renderer/display/base.rb +71 -62
  113. data/lib/rabbit/renderer/display/button-handler.rb +2 -1
  114. data/lib/rabbit/renderer/display/clutter-embed.rb +60 -26
  115. data/lib/rabbit/renderer/display/drawing-area-base.rb +1 -1
  116. data/lib/rabbit/renderer/display/drawing-area-primitive.rb +34 -21
  117. data/lib/rabbit/renderer/display/graffiti.rb +1 -3
  118. data/lib/rabbit/renderer/display/hook-handler.rb +8 -4
  119. data/lib/rabbit/renderer/display/key-handler.rb +7 -2
  120. data/lib/rabbit/renderer/display/magnifier.rb +2 -2
  121. data/lib/rabbit/renderer/display/progress.rb +10 -2
  122. data/lib/rabbit/renderer/display/spotlight.rb +2 -2
  123. data/lib/rabbit/renderer/engine/cairo.rb +0 -3
  124. data/lib/rabbit/renderer/kernel.rb +54 -0
  125. data/lib/rabbit/renderer/offscreen.rb +14 -6
  126. data/lib/rabbit/renderer/print-layout.rb +150 -0
  127. data/lib/rabbit/renderer/printer.rb +236 -0
  128. data/lib/rabbit/renderer/screen.rb +288 -0
  129. data/lib/rabbit/renderer/widget/drawing-area.rb +93 -0
  130. data/lib/rabbit/size.rb +52 -25
  131. data/lib/rabbit/slide-configuration.rb +56 -12
  132. data/lib/rabbit/source.rb +24 -8
  133. data/lib/rabbit/task/slide.rb +1 -1
  134. data/lib/rabbit/theme/applier.rb +26 -9
  135. data/lib/rabbit/theme/base/base.rb +7 -7
  136. data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
  137. data/lib/rabbit/theme/image-timer/image-timer.rb +3 -1
  138. data/lib/rabbit/theme/image-viewer/image-viewer.rb +13 -1
  139. data/lib/rabbit/theme/image/image.rb +4 -4
  140. data/lib/rabbit/theme/lightning-talk-toolkit/lightning-talk-toolkit.rb +3 -1
  141. data/lib/rabbit/theme/tag/tag.rb +12 -4
  142. data/lib/rabbit/version.rb +2 -2
  143. data/lib/rabbit/video-window.rb +75 -89
  144. data/misc/emacs/rabbit-mode.el +11 -7
  145. data/po/en/rabbit.edit.po +189 -185
  146. data/po/en/rabbit.po +15 -12
  147. data/po/fr/rabbit.edit.po +189 -185
  148. data/po/fr/rabbit.po +15 -12
  149. data/po/ja/rabbit.edit.po +190 -186
  150. data/po/ja/rabbit.po +16 -13
  151. data/rabbit.gemspec +34 -16
  152. data/test/command/test-rabbit.rb +100 -0
  153. data/test/{rabbit-test-utils.rb → helper.rb} +7 -4
  154. data/test/{rabbit-test-utils → helper}/fixture.rb +2 -2
  155. data/test/{rabbit-test-utils → helper}/parser.rb +2 -2
  156. data/test/image/test-dia.rb +2 -2
  157. data/test/image/test-eps.rb +2 -2
  158. data/test/parser/test-markdown.rb +3 -5
  159. data/test/parser/test-rd.rb +1 -3
  160. data/test/parser/test-wiki.rb +3 -5
  161. data/test/run-test.rb +3 -3
  162. data/test/test-applier.rb +60 -29
  163. data/test/test-canvas.rb +70 -0
  164. data/test/test-color.rb +18 -9
  165. data/test/test-element.rb +15 -3
  166. data/test/test-size.rb +25 -22
  167. data/test/test-slide-configuration.rb +16 -6
  168. data/test/test-source.rb +15 -5
  169. data/test/test-utils.rb +15 -1
  170. metadata +55 -84
  171. data/lib/rabbit/renderer/print.rb +0 -31
  172. data/lib/rabbit/renderer/print/base.rb +0 -78
  173. data/lib/rabbit/renderer/print/cairo.rb +0 -122
  174. data/lib/rabbit/renderer/print/layout.rb +0 -123
  175. data/lib/rabbit/renderer/print/multiple.rb +0 -202
  176. data/lib/rabbit/source/hiki.rb +0 -36
  177. data/lib/rabbit/source/slide-share.rb +0 -53
@@ -0,0 +1,236 @@
1
+ # Copyright (C) 2005-2019 Sutou Kouhei <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ require "rabbit/rabbit"
18
+
19
+ require "rabbit/filename"
20
+
21
+ require "rabbit/renderer/base"
22
+ require "rabbit/renderer/engine/cairo"
23
+ require "rabbit/renderer/print-layout"
24
+
25
+ module Rabbit
26
+ module Renderer
27
+ class Printer
28
+ A4_WIDTH = 596
29
+ A4_HEIGHT = 842
30
+
31
+ include Renderer::Base
32
+ include Engine::Cairo
33
+
34
+ attr_writer :filename
35
+
36
+ def initialize(canvas)
37
+ super
38
+ @filename = nil
39
+ init_paper
40
+ init_color
41
+ update_layout
42
+ end
43
+
44
+ def width
45
+ @base_width
46
+ end
47
+
48
+ def height
49
+ @base_height
50
+ end
51
+
52
+ def page_width
53
+ @page_width - page_margin_left - page_margin_right
54
+ end
55
+
56
+ def page_height
57
+ @page_height - page_margin_top - page_margin_bottom
58
+ end
59
+
60
+ def paper_width=(value)
61
+ super
62
+ init_paper
63
+ end
64
+
65
+ def paper_height=(value)
66
+ super
67
+ init_paper
68
+ end
69
+
70
+ def slides_per_page=(slides)
71
+ super
72
+ init_paper
73
+ update_layout
74
+ end
75
+
76
+ def printable?
77
+ true
78
+ end
79
+
80
+ def filename
81
+ @filename || default_filename
82
+ end
83
+
84
+ def pre_print(slide_size)
85
+ init_context(create_context)
86
+ end
87
+
88
+ def post_print(canceled)
89
+ return if canceled
90
+ @context.target.finish
91
+ end
92
+
93
+ def pre_parse
94
+ end
95
+
96
+ def post_parse
97
+ end
98
+
99
+ def post_apply_theme
100
+ end
101
+
102
+ def post_move(old_index, index)
103
+ end
104
+
105
+ def post_move_in_slide(old_index, index)
106
+ end
107
+
108
+ def draw_slide(slide, simulation)
109
+ if simulation
110
+ yield
111
+ else
112
+ slide_width = @layout.slide_width
113
+ slide_height = @layout.slide_height
114
+ size = Size.new(@base_width,
115
+ @base_height,
116
+ slide_width,
117
+ slide_height,
118
+ @base_width.to_f / @base_height.to_f)
119
+ x = @layout.normalize_x(0)
120
+ y = @layout.normalize_y(0)
121
+ save_context do
122
+ translate_context(x, y)
123
+ clip_slide(0, 0, slide_width, slide_height)
124
+ draw_background(0, 0, slide_width, slide_height)
125
+ scale_context(*size.logical_scale)
126
+ translate_context(size.logical_margin_left,
127
+ size.logical_margin_top)
128
+ yield
129
+ if @slides_per_page > 1
130
+ draw_rectangle(false,
131
+ 0,
132
+ 0,
133
+ size.logical_width,
134
+ size.logical_height,
135
+ @black)
136
+ end
137
+ end
138
+ @context.show_page if need_show_page?
139
+ end
140
+ end
141
+
142
+ def clip_slide(x, y, w, h)
143
+ x, y = from_screen(x, y)
144
+ @context.rectangle(x, y, w, h)
145
+ @context.clip
146
+ end
147
+
148
+ def draw_background(x, y, w, h)
149
+ draw_rectangle(true, x, y, w, h, @background)
150
+ end
151
+
152
+ private
153
+ def default_filename
154
+ sanitized_title = Filename.sanitize(@canvas.title)
155
+ Filename.new("#{sanitized_title}.pdf").encode
156
+ end
157
+
158
+ def init_paper
159
+ if @slides_per_page > 1
160
+ @paper_width = A4_WIDTH
161
+ @paper_height = A4_HEIGHT
162
+ end
163
+
164
+ default_width_mm = 360
165
+ default_height_mm = 270
166
+ if @paper_width.nil? and @paper_height.nil?
167
+ size = Size.new(@base_width,
168
+ @base_height,
169
+ default_width_mm,
170
+ default_height_mm,
171
+ @base_width.to_f / @base_height.to_f)
172
+ @page_width = size.real_content_width
173
+ @page_height = size.real_content_height
174
+ else
175
+ @page_width = @paper_width || default_width_mm
176
+ @page_height = @paper_height || default_height_mm
177
+ end
178
+ end
179
+
180
+ def init_color
181
+ super
182
+ @foreground = make_color("black")
183
+ @background = make_color(@background_color)
184
+ end
185
+
186
+ def init_dpi
187
+ super
188
+ @x_dpi = 300
189
+ @y_dpi = 300
190
+ end
191
+
192
+ def update_layout
193
+ @layout = PrintLayout.create(self, @canvas)
194
+ end
195
+
196
+ def create_context(output=nil)
197
+ surface = find_surface(filename, output)
198
+ surface.set_fallback_resolution(@x_dpi, @y_dpi)
199
+ ::Cairo::Context.new(surface)
200
+ end
201
+
202
+ def create_pango_context
203
+ context = create_context(StringIO.new).create_pango_layout.context
204
+ set_font_resolution(context)
205
+ context
206
+ end
207
+
208
+ def find_surface(filename, output=nil)
209
+ args = [output || filename, @page_width, @page_height]
210
+ case File.extname(filename)
211
+ when /\.ps/i
212
+ ::Cairo::PSSurface.new(*args)
213
+ when /\.pdf/i
214
+ ::Cairo::PDFSurface.new(*args)
215
+ when /\.svg/i
216
+ surface = ::Cairo::SVGSurface.new(*args)
217
+ surface.restrict_to_version(::Cairo::SVG_VERSION_1_2)
218
+ surface
219
+ when /\.cs/i
220
+ args[0] = ::Cairo::ScriptDevice.new(args[0])
221
+ ::Cairo::ScriptSurface.new(*args)
222
+ else
223
+ @canvas.logger.warn(_("can't find printer for %s") % filename)
224
+ args[0] = "default.ps"
225
+ ::Cairo::PSSurface.new(*args)
226
+ end
227
+ end
228
+
229
+ def need_show_page?
230
+ @slides_per_page == 1 or
231
+ @canvas.last_slide? or
232
+ ((@canvas.current_index + 1) % @slides_per_page).zero?
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,288 @@
1
+ # Copyright (C) 2018 Kouhei Sutou <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ require "forwardable"
18
+
19
+ require "rabbit/renderer/base"
20
+
21
+ require "rabbit/renderer/display/base"
22
+ require "rabbit/renderer/display/menu"
23
+ require "rabbit/renderer/display/progress"
24
+ require "rabbit/renderer/display/mask"
25
+ require "rabbit/renderer/display/search"
26
+ require "rabbit/renderer/display/gesture"
27
+ require "rabbit/renderer/display/graffiti"
28
+ require "rabbit/renderer/display/menu"
29
+ require "rabbit/renderer/display/button-handler"
30
+ require "rabbit/renderer/display/key-handler"
31
+ require "rabbit/renderer/display/scroll-handler"
32
+ require "rabbit/renderer/display/info"
33
+ require "rabbit/renderer/display/spotlight"
34
+ require "rabbit/renderer/display/magnifier"
35
+
36
+ require "rabbit/renderer/widget/drawing-area"
37
+
38
+ module Rabbit
39
+ module Renderer
40
+ class Screen
41
+ extend Forwardable
42
+
43
+ include Display::Base
44
+
45
+ include Display::Cursor
46
+ # include Display::Menu
47
+ # include Display::Graffiti
48
+ # include Display::Mask
49
+ # include Display::Progress
50
+ # include Display::Search
51
+ # include Display::Gesture
52
+ include Display::KeyHandler
53
+ # include Display::ButtonHandler
54
+ # include Display::ScrollHandler
55
+ # include Display::Info
56
+ # include Display::Spotlight
57
+ # include Display::Magnifier
58
+
59
+ def_delegators(:@slide_widget, :make_color)
60
+ def_delegators(:@slide_widget, :foreground=)
61
+ def_delegators(:@slide_widget, :background=)
62
+ def_delegators(:@slide_widget, :set_font_resolution)
63
+
64
+ def_delegators(:@slide_widget, :flag_size)
65
+
66
+ def_delegators(:@slide_widget, :draw_layout)
67
+ def_delegators(:@slide_widget, :draw_pixbuf)
68
+ def_delegators(:@slide_widget, :draw_line)
69
+ def_delegators(:@slide_widget, :draw_rectangle)
70
+ def_delegators(:@slide_widget, :draw_rsvg_handle)
71
+ def_delegators(:@slide_widget, :draw_link)
72
+ def_delegators(:@slide_widget, :draw_flag)
73
+
74
+ attr_accessor :filename
75
+ def initialize(canvas)
76
+ super
77
+ @filename = nil
78
+ init_ui
79
+ end
80
+
81
+ def attach_to(window, container=nil)
82
+ super
83
+ @window.add(@fixed)
84
+ @fixed.show
85
+ attach_key(@window)
86
+ end
87
+
88
+ def detach
89
+ detach_key(@window)
90
+ @fixed.hide
91
+ super
92
+ end
93
+
94
+ def widget
95
+ @fixed
96
+ end
97
+
98
+ def clear_slide
99
+ super
100
+ @slide_widget.clear_compiled_slide
101
+ redraw
102
+ end
103
+
104
+ def post_fullscreen
105
+ update_cursor(:blank, true)
106
+ @slide_widget.clear_compiled_slides
107
+ end
108
+
109
+ def post_unfullscreen
110
+ update_cursor(nil, true)
111
+ update_menu
112
+ end
113
+
114
+ def post_iconify
115
+ end
116
+
117
+ def post_apply_theme
118
+ @slide_widget.clear_compiled_slides
119
+ queue_draw
120
+ end
121
+
122
+ def post_move(old_index, index)
123
+ queue_draw
124
+ end
125
+
126
+ def post_move_in_slide(old_index, index)
127
+ queue_draw
128
+ end
129
+
130
+ def pre_parse
131
+ end
132
+
133
+ def post_parse
134
+ @slide_widget.clear_compiled_slides
135
+ end
136
+
137
+ def pre_toggle_index_mode
138
+ end
139
+
140
+ def post_toggle_index_mode
141
+ queue_draw
142
+ end
143
+
144
+ def pre_to_pixbuf(slide_size)
145
+ end
146
+
147
+ def to_pixbufing(i)
148
+ true
149
+ end
150
+
151
+ def post_to_pixbuf(canceled)
152
+ end
153
+
154
+ def index_mode_on
155
+ keep_cursor(:index)
156
+ update_cursor(nil, true)
157
+ end
158
+
159
+ def index_mode_off
160
+ restore_cursor(:index)
161
+ end
162
+
163
+ # TODO: screen?
164
+ def display?
165
+ true
166
+ end
167
+
168
+ def draw_slide(slide, simulation, &block)
169
+ set_size_ratio(slide.size_ratio || @default_size_ratio)
170
+
171
+ if simulation
172
+ @slide_widget.draw_slide(slide, simulation, &block)
173
+ else
174
+ @slide_widget.save_context do
175
+ @slide_widget.translate_context(@size.logical_margin_left,
176
+ @size.logical_margin_top)
177
+ @slide_widget.draw_slide(slide, simulation, &block)
178
+ end
179
+
180
+ unless @size.have_logical_margin?
181
+ return
182
+ end
183
+
184
+ margin_background = @slide_widget.make_color("black")
185
+ if @size.have_logical_margin_x?
186
+ @slide_widget.draw_rectangle(true,
187
+ 0,
188
+ 0,
189
+ @size.logical_margin_left,
190
+ @size.real_height,
191
+ margin_background)
192
+ @slide_widget.draw_rectangle(true,
193
+ @size.real_width - @size.logical_margin_right,
194
+ 0,
195
+ @size.logical_margin_right,
196
+ @size.real_height,
197
+ margin_background)
198
+ end
199
+ if @size.have_logical_margin_y?
200
+ @slide_widget.draw_rectangle(true,
201
+ 0,
202
+ 0,
203
+ @size.real_width,
204
+ @size.logical_margin_top,
205
+ margin_background)
206
+ @slide_widget.draw_rectangle(true,
207
+ 0,
208
+ @size.real_height - @size.logical_margin_bottom,
209
+ @size.real_width,
210
+ @size.logical_margin_bottom,
211
+ margin_background)
212
+ end
213
+ end
214
+ end
215
+
216
+ private
217
+ def init_dpi
218
+ @x_dpi = ScreenInfo.screen_x_resolution
219
+ @y_dpi = ScreenInfo.screen_y_resolution
220
+ end
221
+
222
+ def init_ui
223
+ @fixed = Gtk::Fixed.new
224
+ @fixed.can_focus = true
225
+ set_map
226
+ set_size_allocate
227
+
228
+ set_key_press_event(@fixed)
229
+
230
+ @slide_widget = Widget::DrawingArea.new(@canvas)
231
+ @slide_widget.raw.show
232
+ @fixed.put(@slide_widget.raw, 0, 0)
233
+ end
234
+
235
+ def depth
236
+ @fixed.window.depth
237
+ end
238
+
239
+ def set_map
240
+ @fixed.signal_connect_after(:map) do |widget|
241
+ mapped(widget)
242
+ end
243
+ end
244
+
245
+ def mapped(widget)
246
+ allocation = widget.allocation
247
+ set_default_size(allocation.width,
248
+ allocation.height)
249
+ end
250
+
251
+ def set_size_allocate
252
+ @fixed.signal_connect(:size_allocate) do |widget, allocation|
253
+ w = allocation.width
254
+ h = allocation.height
255
+ @slide_widget.raw.allocation = allocation
256
+ update_size(w, h)
257
+ reload_theme
258
+ end
259
+ end
260
+
261
+ def reload_theme(&callback)
262
+ callback ||= Utils.process_pending_events_proc
263
+ @canvas.activate("ReloadTheme", &callback)
264
+ end
265
+
266
+ def grab
267
+ @fixed.grab_add
268
+ Gdk.pointer_grab(@fixed.window, false,
269
+ Gdk::EventMask::BUTTON_PRESS_MASK |
270
+ Gdk::EventMask::BUTTON_RELEASE_MASK |
271
+ Gdk::EventMask::SCROLL_MASK |
272
+ Gdk::EventMask::POINTER_MOTION_MASK,
273
+ nil, nil,
274
+ Gdk::CURRENT_TIME)
275
+ end
276
+
277
+ def ungrab
278
+ @fixed.grab_remove
279
+ Gdk.pointer_ungrab(Gdk::CURRENT_TIME)
280
+ end
281
+
282
+ def pointer
283
+ window, x, y, mask = @fixed.window.pointer
284
+ [x, y, mask]
285
+ end
286
+ end
287
+ end
288
+ end