rabbit 3.0.5 → 4.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 (241) hide show
  1. checksums.yaml +4 -4
  2. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  3. data/doc/_config.yml +2 -2
  4. data/doc/en/news.rd +54 -0
  5. data/doc/ja/news.rd +54 -0
  6. data/lib/rabbit/actions.rb +446 -0
  7. data/lib/rabbit/author-configuration.rb +7 -10
  8. data/lib/rabbit/canvas.rb +74 -42
  9. data/lib/rabbit/command/rabbit-slide.rb +11 -13
  10. data/lib/rabbit/command/rabbit-theme.rb +10 -12
  11. data/lib/rabbit/command/rabbit.rb +31 -43
  12. data/lib/rabbit/console.rb +20 -22
  13. data/lib/rabbit/dependency-canvas.rb +2 -2
  14. data/lib/rabbit/element/base.rb +93 -6
  15. data/lib/rabbit/element/block-element.rb +17 -1
  16. data/lib/rabbit/element/block.rb +17 -1
  17. data/lib/rabbit/element/container-element.rb +59 -3
  18. data/lib/rabbit/element/description-list.rb +18 -2
  19. data/lib/rabbit/element/enum-list.rb +18 -2
  20. data/lib/rabbit/element/footnote.rb +18 -2
  21. data/lib/rabbit/element/image-title-slide.rb +17 -1
  22. data/lib/rabbit/element/image.rb +32 -2
  23. data/lib/rabbit/element/index-slide.rb +29 -13
  24. data/lib/rabbit/element/item-list.rb +18 -2
  25. data/lib/rabbit/element/method-list.rb +18 -2
  26. data/lib/rabbit/element/poppler-page.rb +17 -1
  27. data/lib/rabbit/element/poppler-slide.rb +18 -2
  28. data/lib/rabbit/element/poppler-title-slide.rb +18 -2
  29. data/lib/rabbit/element/preformatted.rb +18 -2
  30. data/lib/rabbit/element/slide-element.rb +29 -2
  31. data/lib/rabbit/element/slide.rb +18 -2
  32. data/lib/rabbit/element/syntax-highlighting.rb +17 -1
  33. data/lib/rabbit/element/table.rb +19 -3
  34. data/lib/rabbit/element/tag.rb +18 -2
  35. data/lib/rabbit/element/text-block-element.rb +18 -2
  36. data/lib/rabbit/element/text-container-element.rb +41 -2
  37. data/lib/rabbit/element/text-element.rb +17 -1
  38. data/lib/rabbit/element/text-renderer.rb +17 -1
  39. data/lib/rabbit/element/text.rb +4 -4
  40. data/lib/rabbit/element/title-slide.rb +19 -3
  41. data/lib/rabbit/element/video.rb +157 -56
  42. data/lib/rabbit/element.rb +20 -20
  43. data/lib/rabbit/formatter.rb +18 -1
  44. data/lib/rabbit/frame.rb +102 -90
  45. data/lib/rabbit/front.rb +11 -4
  46. data/lib/rabbit/gem-finder.rb +4 -8
  47. data/lib/rabbit/gem-pusher.rb +4 -4
  48. data/lib/rabbit/gesture/handler.rb +26 -21
  49. data/lib/rabbit/graffiti/config-dialog.rb +18 -2
  50. data/lib/rabbit/graffiti/processor.rb +20 -4
  51. data/lib/rabbit/gtk.rb +48 -14
  52. data/lib/rabbit/html/generator.rb +18 -18
  53. data/{test/helper/fixture.rb → lib/rabbit/icon.rb} +16 -6
  54. data/lib/rabbit/image/base.rb +7 -6
  55. data/lib/rabbit/image/default.rb +17 -1
  56. data/lib/rabbit/image/dia.rb +2 -2
  57. data/lib/rabbit/image/eps.rb +16 -2
  58. data/lib/rabbit/image/gimp.rb +28 -11
  59. data/lib/rabbit/image/mermaid.rb +3 -3
  60. data/lib/rabbit/image/pdf.rb +3 -3
  61. data/lib/rabbit/image/svg.rb +2 -2
  62. data/lib/rabbit/image.rb +8 -8
  63. data/lib/rabbit/info-window.rb +55 -18
  64. data/lib/rabbit/key-handler.rb +381 -0
  65. data/lib/rabbit/keys.rb +31 -2
  66. data/lib/rabbit/logger/base.rb +17 -1
  67. data/lib/rabbit/logger/gui.rb +20 -4
  68. data/lib/rabbit/logger/stderr.rb +16 -2
  69. data/lib/rabbit/logger.rb +4 -4
  70. data/lib/rabbit/menu.rb +200 -220
  71. data/lib/rabbit/parser/base.rb +17 -1
  72. data/lib/rabbit/parser/ext/aafigure.rb +17 -1
  73. data/lib/rabbit/parser/ext/blockdiag.rb +17 -1
  74. data/lib/rabbit/parser/ext/charty.rb +2 -2
  75. data/lib/rabbit/parser/ext/coderay.rb +20 -4
  76. data/lib/rabbit/parser/ext/enscript.rb +31 -15
  77. data/lib/rabbit/parser/ext/entity.rb +17 -1
  78. data/lib/rabbit/parser/ext/image.rb +6 -6
  79. data/lib/rabbit/parser/ext/inline.rb +17 -1
  80. data/lib/rabbit/parser/ext/rouge.rb +7 -4
  81. data/lib/rabbit/parser/ext/tex.rb +18 -2
  82. data/lib/rabbit/parser/ext/video.rb +4 -4
  83. data/lib/rabbit/parser/image.rb +20 -4
  84. data/lib/rabbit/parser/markdown/converter.rb +12 -13
  85. data/lib/rabbit/parser/markdown.rb +18 -2
  86. data/lib/rabbit/parser/pause-support.rb +1 -0
  87. data/lib/rabbit/parser/pdf.rb +3 -3
  88. data/lib/rabbit/parser/rd/ext/base.rb +20 -4
  89. data/lib/rabbit/parser/rd/ext/block-verbatim.rb +24 -28
  90. data/lib/rabbit/parser/rd/ext/character-reference.rb +18 -2
  91. data/lib/rabbit/parser/rd/ext/image.rb +3 -3
  92. data/lib/rabbit/parser/rd/ext/inline-verbatim.rb +6 -6
  93. data/lib/rabbit/parser/rd/ext/refer.rb +18 -2
  94. data/lib/rabbit/parser/rd/ext/video.rb +19 -2
  95. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +24 -8
  96. data/lib/rabbit/parser/rd/rt/rt2rabbit-lib.rb +18 -2
  97. data/lib/rabbit/parser/rd/visitor.rb +18 -2
  98. data/lib/rabbit/parser/rd.rb +18 -2
  99. data/lib/rabbit/parser/wiki/output.rb +25 -28
  100. data/lib/rabbit/parser/wiki.rb +18 -2
  101. data/lib/rabbit/parser.rb +6 -6
  102. data/lib/rabbit/path-manipulatable.rb +4 -4
  103. data/lib/rabbit/progress.rb +17 -1
  104. data/lib/rabbit/properties.rb +3 -3
  105. data/lib/rabbit/rabbit.rb +15 -7
  106. data/lib/rabbit/readme-parser.rb +4 -6
  107. data/lib/rabbit/renderer/base.rb +44 -36
  108. data/lib/rabbit/renderer/color.rb +18 -2
  109. data/lib/rabbit/renderer/display/base.rb +10 -12
  110. data/lib/rabbit/renderer/display/button-handler.rb +141 -60
  111. data/lib/rabbit/renderer/display/cursor.rb +4 -5
  112. data/lib/rabbit/renderer/display/drawing-area-base.rb +32 -48
  113. data/lib/rabbit/renderer/display/drawing-area-primitive.rb +10 -61
  114. data/lib/rabbit/renderer/display/drawing-area-view-only.rb +19 -8
  115. data/lib/rabbit/renderer/display/drawing-area.rb +19 -15
  116. data/lib/rabbit/renderer/display/gesture.rb +9 -9
  117. data/lib/rabbit/renderer/display/graffiti.rb +22 -13
  118. data/lib/rabbit/renderer/display/info.rb +22 -2
  119. data/lib/rabbit/renderer/display/magnifier.rb +30 -17
  120. data/lib/rabbit/renderer/display/mask.rb +17 -1
  121. data/lib/rabbit/renderer/display/menu.rb +27 -3
  122. data/lib/rabbit/renderer/display/motion-handler.rb +45 -0
  123. data/lib/rabbit/renderer/display/progress.rb +17 -2
  124. data/lib/rabbit/renderer/display/scroll-handler.rb +60 -13
  125. data/lib/rabbit/renderer/display/search.rb +19 -2
  126. data/lib/rabbit/renderer/display/spotlight.rb +39 -25
  127. data/lib/rabbit/renderer/display.rb +16 -36
  128. data/lib/rabbit/renderer/engine/cairo.rb +4 -11
  129. data/lib/rabbit/renderer/engine.rb +17 -1
  130. data/lib/rabbit/renderer/kernel.rb +2 -20
  131. data/lib/rabbit/renderer/offscreen.rb +8 -14
  132. data/lib/rabbit/renderer/print-layout.rb +2 -2
  133. data/lib/rabbit/renderer/printer.rb +9 -16
  134. data/lib/rabbit/renderer/scene-background-widget.rb +95 -0
  135. data/lib/rabbit/renderer/scene-node-widget.rb +63 -0
  136. data/lib/rabbit/renderer/scene.rb +508 -0
  137. data/lib/rabbit/renderer.rb +6 -6
  138. data/lib/rabbit/search-window.rb +18 -2
  139. data/lib/rabbit/searcher.rb +15 -1
  140. data/lib/rabbit/size.rb +9 -1
  141. data/lib/rabbit/slide-configuration.rb +11 -14
  142. data/lib/rabbit/soap/driver.rb +20 -4
  143. data/lib/rabbit/soap/server.rb +17 -1
  144. data/lib/rabbit/source/argf.rb +5 -5
  145. data/lib/rabbit/source/base.rb +5 -6
  146. data/lib/rabbit/source/file.rb +5 -5
  147. data/lib/rabbit/source/memory.rb +20 -4
  148. data/lib/rabbit/source/uri.rb +9 -11
  149. data/lib/rabbit/source-generator/hiki.rb +2 -7
  150. data/lib/rabbit/source-generator/markdown.rb +2 -7
  151. data/lib/rabbit/source-generator/rd.rb +2 -7
  152. data/lib/rabbit/source-generator.rb +4 -4
  153. data/lib/rabbit/source.rb +5 -5
  154. data/lib/rabbit/task/slide.rb +13 -11
  155. data/lib/rabbit/task/theme.rb +8 -11
  156. data/lib/rabbit/task.rb +3 -3
  157. data/lib/rabbit/theme/applier.rb +27 -11
  158. data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
  159. data/lib/rabbit/theme/color-circle/color-circle.rb +18 -1
  160. data/lib/rabbit/theme/cozmixng/cozmixng.rb +1 -1
  161. data/lib/rabbit/theme/default/default.rb +1 -0
  162. data/lib/rabbit/theme/default-icon/default-icon.rb +1 -1
  163. data/lib/rabbit/theme/default-item-mark-setup/default-item-mark-setup.rb +17 -1
  164. data/lib/rabbit/theme/default-preformatted/default-preformatted.rb +9 -1
  165. data/lib/rabbit/theme/enishi-green/enishi-green.rb +1 -1
  166. data/lib/rabbit/theme/entry.rb +10 -12
  167. data/lib/rabbit/theme/icon/icon.rb +3 -8
  168. data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +5 -5
  169. data/lib/rabbit/theme/image-timer/image-timer.rb +3 -3
  170. data/lib/rabbit/theme/lightning-simple/lightning-simple.rb +1 -0
  171. data/lib/rabbit/theme/lightning-talk/lightning-talk.rb +1 -0
  172. data/lib/rabbit/theme/manager.rb +19 -9
  173. data/lib/rabbit/theme/rabbit-icon/rabbit-icon.rb +1 -1
  174. data/lib/rabbit/theme/ranguba/ranguba.rb +1 -1
  175. data/lib/rabbit/theme/red-frame/red-frame.rb +6 -2
  176. data/lib/rabbit/theme/ruby-gnome2/ruby-gnome2.rb +1 -0
  177. data/lib/rabbit/theme/ruby-gnome2-icon/ruby-gnome2-icon.rb +1 -1
  178. data/lib/rabbit/theme/searcher.rb +23 -7
  179. data/lib/rabbit/theme/slide-number/slide-number.rb +1 -1
  180. data/lib/rabbit/theme/slide-show/slide-show.rb +1 -1
  181. data/lib/rabbit/theme/table/table.rb +2 -2
  182. data/lib/rabbit/theme/video/property.rb +3 -0
  183. data/lib/rabbit/theme/video/video.rb +5 -0
  184. data/lib/rabbit/theme-configuration.rb +9 -11
  185. data/lib/rabbit/utils.rb +12 -94
  186. data/lib/rabbit/version.rb +1 -1
  187. data/lib/rabbit/xmlrpc/client.rb +17 -1
  188. data/lib/rabbit/xmlrpc/server.rb +17 -1
  189. data/po/en/rabbit.edit.po +324 -316
  190. data/po/en/rabbit.po +61 -55
  191. data/po/fr/rabbit.edit.po +324 -316
  192. data/po/fr/rabbit.po +61 -55
  193. data/po/ja/rabbit.edit.po +345 -370
  194. data/po/ja/rabbit.po +83 -80
  195. data/rabbit.gemspec +4 -2
  196. data/sample/block-quote.rab +13 -0
  197. data/sample/description-list.rab +17 -0
  198. data/sample/mermaid.rab +16 -0
  199. data/sample/rabbit-en.hiki +0 -1
  200. data/sample/rabbit-en.md +0 -1
  201. data/sample/rabbit-en.rd +0 -1
  202. data/sample/rabbit.hiki +0 -1
  203. data/sample/rabbit.md +0 -1
  204. data/sample/rabbit.rd +0 -1
  205. data/sample/video.rab +17 -0
  206. metadata +33 -65
  207. data/lib/rabbit/action/basic.rb +0 -304
  208. data/lib/rabbit/action/radio.rb +0 -78
  209. data/lib/rabbit/action/toggle.rb +0 -82
  210. data/lib/rabbit/action.rb +0 -140
  211. data/lib/rabbit/renderer/display/gl.rb +0 -98
  212. data/lib/rabbit/renderer/display/key-handler.rb +0 -321
  213. data/lib/rabbit/renderer/gl.rb +0 -95
  214. data/lib/rabbit/renderer/screen.rb +0 -286
  215. data/lib/rabbit/renderer/widget/drawing-area.rb +0 -93
  216. data/lib/rabbit/stock.rb +0 -31
  217. data/lib/rabbit/trackball.rb +0 -228
  218. data/lib/rabbit/video-window.rb +0 -123
  219. data/test/command/test-rabbit.rb +0 -101
  220. data/test/helper/parser.rb +0 -48
  221. data/test/helper.rb +0 -24
  222. data/test/image/test-dia.rb +0 -54
  223. data/test/image/test-eps.rb +0 -41
  224. data/test/parser/test-markdown.rb +0 -360
  225. data/test/parser/test-rd.rb +0 -43
  226. data/test/parser/test-wiki.rb +0 -71
  227. data/test/run-test.rb +0 -27
  228. data/test/source-generator/test-hiki.rb +0 -68
  229. data/test/source-generator/test-markdown.rb +0 -67
  230. data/test/source-generator/test-rd.rb +0 -69
  231. data/test/test-applier.rb +0 -73
  232. data/test/test-author-configuration.rb +0 -37
  233. data/test/test-canvas.rb +0 -70
  234. data/test/test-color.rb +0 -51
  235. data/test/test-element.rb +0 -103
  236. data/test/test-readme-parser.rb +0 -160
  237. data/test/test-size.rb +0 -155
  238. data/test/test-slide-configuration.rb +0 -74
  239. data/test/test-source.rb +0 -122
  240. data/test/test-theme-configuration.rb +0 -47
  241. data/test/test-utils.rb +0 -64
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2024 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -16,28 +16,28 @@
16
16
 
17
17
  require "forwardable"
18
18
  require "erb"
19
- require "rabbit/gtk"
20
19
 
21
- require "rabbit/rabbit"
22
- require "rabbit/trackball"
23
- require "rabbit/renderer/color"
20
+ require_relative "../gtk"
21
+
22
+ require_relative "../rabbit"
23
+ require_relative "color"
24
24
 
25
25
  module Rabbit
26
26
  module Renderer
27
- module Base
27
+ class Base
28
28
  extend Forwardable
29
29
 
30
30
  include ERB::Util
31
31
  include GetText
32
32
  include DirtyCount
33
33
 
34
- def_delegators(:@canvas, :reload_source)
35
-
36
34
  attr_accessor :base_width
37
35
  attr_accessor :base_height
38
36
  attr_accessor :paper_width, :paper_height, :slides_per_page
39
37
  attr_accessor :margin_left, :margin_right
40
38
  attr_accessor :margin_top, :margin_bottom
39
+ attr_accessor :foreground
40
+ attr_accessor :background
41
41
  attr_accessor :progress_foreground
42
42
  attr_accessor :progress_background
43
43
  attr_accessor :adjustment_x, :adjustment_y
@@ -68,13 +68,14 @@ module Rabbit
68
68
  @blackout = false
69
69
  @adjustment_x = 0
70
70
  @adjustment_y = 0
71
+ @foreground = nil
72
+ @background = nil
71
73
  @progress_foreground = nil
72
74
  @progress_background = nil
73
75
  @graffiti_color = nil
74
76
  @graffiti_line_width = nil
75
77
  @draw_scaled_image = true
76
78
  clean
77
- init_gl_parameters
78
79
  end
79
80
 
80
81
  def page_margin_left
@@ -100,12 +101,24 @@ module Rabbit
100
101
  @font_families
101
102
  end
102
103
 
104
+ def make_color(color)
105
+ return color if color.is_a?(Color)
106
+ if color.nil?
107
+ @foreground
108
+ else
109
+ Color.parse(color)
110
+ end
111
+ end
112
+
113
+ def set_font_resolution(context)
114
+ end
115
+
103
116
  def print(&block)
104
117
  if printable?
105
118
  do_print(&block)
106
119
  else
107
120
  canvas = make_canvas_with_printable_renderer
108
- pre_print(canvas.slide_size)
121
+ pre_print(canvas.n_slides)
109
122
  canceled = false
110
123
  canvas.print do |i|
111
124
  result = printing(i)
@@ -133,7 +146,7 @@ module Rabbit
133
146
  def each_slide_pixbuf
134
147
  canvas = offscreen_canvas
135
148
  previous_index = canvas.current_index
136
- pre_to_pixbuf(canvas.slide_size)
149
+ pre_to_pixbuf(canvas.n_slides)
137
150
  canceled = false
138
151
  canvas.slides.each_with_index do |slide, i|
139
152
  if !to_pixbufing(i) or !yield(slide, canvas.to_pixbuf(i), i)
@@ -214,9 +227,24 @@ module Rabbit
214
227
  def toggle_info_window
215
228
  end
216
229
 
230
+ def info_window_showing?
231
+ false
232
+ end
233
+
217
234
  def toggle_spotlight
218
235
  end
219
236
 
237
+ def spotlighting?
238
+ false
239
+ end
240
+
241
+ def toggle_magnifier
242
+ end
243
+
244
+ def magnifying?
245
+ false
246
+ end
247
+
220
248
  def gl_available?
221
249
  @canvas.use_gl? and gl_supported?
222
250
  end
@@ -252,12 +280,6 @@ module Rabbit
252
280
  false
253
281
  end
254
282
 
255
- def connect_key(keyval, modifier, flags, &block)
256
- end
257
-
258
- def disconnect_key(keyval, modifier)
259
- end
260
-
261
283
  def change_graffiti_color
262
284
  end
263
285
 
@@ -276,7 +298,7 @@ module Rabbit
276
298
  end
277
299
 
278
300
  def do_print(&block)
279
- pre_print(@canvas.slide_size)
301
+ pre_print(@canvas.n_slides)
280
302
  canceled = false
281
303
  @canvas.slides.each_with_index do |slide, i|
282
304
  @canvas.move_to_if_can(i)
@@ -292,7 +314,7 @@ module Rabbit
292
314
  end
293
315
 
294
316
  def make_canvas_with_renderer(renderer)
295
- canvas = Canvas.new(@canvas.logger, renderer)
317
+ canvas = Canvas.new(renderer)
296
318
  yield canvas
297
319
  canvas.apply_theme(@canvas.theme_name)
298
320
  @canvas.source_force_modified(true) do |source|
@@ -353,23 +375,7 @@ module Rabbit
353
375
  def not_support_method(name)
354
376
  format = _("%s does not support: %s")
355
377
  msg = format % [self.class.name, name]
356
- @canvas.logger.warn(msg)
357
- end
358
-
359
- def init_gl_parameters
360
- angle = 0.0 * (Math::PI / 180.0)
361
- axis_x = 1.0
362
- axis_y = 0.0
363
- axis_z = 0.0
364
- sine = Math.sin(0.5 * angle)
365
- quaternion = [
366
- axis_x * sine,
367
- axis_y * sine,
368
- axis_z * sine,
369
- Math.cos(0.5 * angle)
370
- ]
371
- @gl_quaternion = TrackBall::Vector.new(quaternion)
372
- @gl_scale = 1.0
378
+ Rabbit.logger.warn(msg)
373
379
  end
374
380
 
375
381
  def clear_keys
@@ -391,6 +397,8 @@ module Rabbit
391
397
 
392
398
  def init_color
393
399
  @background_color = "white"
400
+ @foreground = make_color("black")
401
+ @background = make_color(@background_color)
394
402
  end
395
403
 
396
404
  def clear_gesture_actions
@@ -1,6 +1,22 @@
1
- require "rabbit/gtk"
1
+ # Copyright (C) 2005-2025 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.
2
16
 
3
- require "rabbit/rabbit"
17
+ require_relative "../gtk"
18
+
19
+ require_relative "../rabbit"
4
20
 
5
21
  module Rabbit
6
22
  module Renderer
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2006-2024 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2006-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,14 +14,12 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require "rabbit/renderer/base"
18
- require "rabbit/renderer/display/hook-handler"
17
+ require_relative "hook-handler"
19
18
 
20
19
  module Rabbit
21
20
  module Renderer
22
21
  module Display
23
22
  module Base
24
- include Renderer::Base
25
23
  include HookHandler
26
24
 
27
25
  def initialize(*args, &block)
@@ -54,6 +52,14 @@ module Rabbit
54
52
  @size
55
53
  end
56
54
 
55
+ def update_size(w, h)
56
+ return if @real_width == w and @real_height == h
57
+
58
+ @real_width = w
59
+ @real_height = h
60
+ @size_dirty = true
61
+ end
62
+
57
63
  def redraw
58
64
  widget.queue_draw
59
65
  end
@@ -174,14 +180,6 @@ module Rabbit
174
180
  ratio)
175
181
  end
176
182
 
177
- def update_size(w, h)
178
- return if @real_width == w and @real_height == h
179
-
180
- @real_width = w
181
- @real_height = h
182
- @size_dirty = true
183
- end
184
-
185
183
  def set_size_ratio(ratio)
186
184
  ratio ||= @base_width.to_f / @base_height.to_f
187
185
  return if @size.ratio == ratio
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2024 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require "rabbit/gtk"
17
+ require_relative "../../gtk"
18
18
 
19
19
  module Rabbit
20
20
  module Renderer
@@ -37,75 +37,162 @@ module Rabbit
37
37
  @button_handler = []
38
38
  end
39
39
 
40
- def set_button_event(widget)
41
- last_button_press_event = nil
42
- widget.signal_connect("button_press_event") do |_widget, event|
43
- last_button_press_event = event
44
- call_hook_procs(@button_press_hook_procs, event)
40
+ if Gtk.const_defined?(:GestureClick)
41
+ ButtonPressEvent = Struct.new(:button,
42
+ :n_presses,
43
+ :x,
44
+ :y,
45
+ :state) do
46
+ def event_type
47
+ Gdk::EventType::BUTTON_PRESS
48
+ end
49
+ end
50
+ ButtonReleaseEvent = Struct.new(:button,
51
+ :n_presses,
52
+ :x,
53
+ :y,
54
+ :state) do
55
+ def event_type
56
+ Gdk::EventType::BUTTON_RELEASE
57
+ end
45
58
  end
46
59
 
47
- widget.signal_connect("button_release_event") do |_widget, event|
48
- if last_button_press_event
49
- handled = call_hook_procs(@button_release_hook_procs,
50
- event, last_button_press_event)
51
- if handled
52
- clear_button_handler
60
+ def set_button_event(widget)
61
+ ["primary", "middle", "secondary"].each do |button_type|
62
+ click = Gtk::GestureClick.new
63
+ click.name = "rabbit-click-#{button_type}"
64
+ click.button = Gdk.const_get("BUTTON_#{button_type.upcase}")
65
+
66
+ last_button_press_event = nil
67
+ click.signal_connect(:pressed) do |_, n_presses, x, y|
68
+ last_button_press_event =
69
+ ButtonPressEvent.new(click.current_button,
70
+ n_presses,
71
+ x,
72
+ y,
73
+ click.current_event_state)
74
+ call_hook_procs(@button_press_hook_procs,
75
+ last_button_press_event)
76
+ end
77
+
78
+ click.signal_connect(:released) do |_, n_presses, x, y|
79
+ event = ButtonReleaseEvent.new(click.current_button,
80
+ n_presses,
81
+ x,
82
+ y,
83
+ click.current_event_state)
84
+ if last_button_press_event
85
+ handled = call_hook_procs(@button_release_hook_procs,
86
+ event,
87
+ last_button_press_event)
88
+ unless handled
89
+ click_type = nil
90
+ case n_presses
91
+ when 1
92
+ click_type = "single_click"
93
+ when 2
94
+ click_type = "double_click" if button_type == "primary"
95
+ end
96
+ if click_type
97
+ handler = "handle_button_#{button_type}_#{click_type}"
98
+ __send__(handler, last_button_press_event, event)
99
+ start_button_handler
100
+ end
101
+ end
102
+ else
103
+ clear_button_handler
104
+ end
105
+ end
106
+
107
+ widget.add_controller(click)
108
+ end
109
+ end
110
+ else
111
+ def set_button_event(widget)
112
+ widget.add_events(Gdk::EventMask::BUTTON_PRESS_MASK |
113
+ Gdk::EventMask::BUTTON_RELEASE_MASK)
114
+ last_button_press_event = nil
115
+ widget.signal_connect("button_press_event") do |_widget, event|
116
+ last_button_press_event = event
117
+ call_hook_procs(@button_press_hook_procs, event)
118
+ end
119
+
120
+ widget.signal_connect("button_release_event") do |_widget, event|
121
+ if last_button_press_event
122
+ handled = call_hook_procs(@button_release_hook_procs,
123
+ event, last_button_press_event)
124
+ if handled
125
+ clear_button_handler
126
+ else
127
+ handled = handle_button_release(event, last_button_press_event)
128
+ end
129
+ handled
53
130
  else
54
- handled = handle_button_release(event, last_button_press_event)
131
+ clear_button_handler
132
+ false
55
133
  end
56
- handled
57
- else
58
- clear_button_handler
59
- false
60
134
  end
61
135
  end
62
- end
63
136
 
64
- def handle_button_release(event, last_button_press_event)
65
- press_event_type = last_button_press_event.event_type
66
- handlers = {
67
- Gdk::EventType::BUTTON_PRESS => :handle_button_press,
68
- Gdk::EventType::BUTTON2_PRESS => :handle_button2_press,
69
- Gdk::EventType::BUTTON3_PRESS => :handle_button3_press,
70
- }
71
- handler = handlers[press_event_type]
72
- if handler
73
- __send__(handler, last_button_press_event, event)
74
- start_button_handler
137
+ def handle_button_release(event, last_button_press_event)
138
+ button_types = {
139
+ 1 => "primary",
140
+ 2 => "middle",
141
+ 3 => "secondary",
142
+ 5 => "primary",
143
+ 4 => "middle",
144
+ }
145
+ click_types = {
146
+ Gdk::EventType::BUTTON_PRESS => "single_click",
147
+ Gdk::EventType::BUTTON2_PRESS => "double_click",
148
+ }
149
+ button_type = button_types[event.button]
150
+ click_type = click_types[last_button_press_event.event_type]
151
+ if button_type and click_type
152
+ handler = "handle_button_#{button_type}_#{click_type}"
153
+ if respond_to?(handler, true)
154
+ __send__(handler, last_button_press_event, event)
155
+ start_button_handler
156
+ return true
157
+ end
158
+ end
159
+ false
75
160
  end
76
- true
77
161
  end
78
162
 
79
- def handle_button_press(event, release_event)
80
- case event.button
81
- when 1, 5
82
- if release_event.state.control_mask?
83
- add_button_handler do
84
- popup_menu
85
- true
86
- end
87
- elsif !release_event.state.mod1_mask?
88
- add_button_handler do
89
- @canvas.activate("NextSlide")
90
- true
91
- end
163
+ def handle_button_primary_single_click(event, release_event)
164
+ if release_event.state.control_mask?
165
+ add_button_handler do
166
+ toggle_menu(release_event.x, release_event.y)
167
+ true
92
168
  end
93
- when 2, 4
94
- unless release_event.state.mod1_mask?
95
- add_button_handler do
96
- @canvas.activate("PreviousSlide")
97
- true
98
- end
169
+ elsif !release_event.state.alt_mask?
170
+ add_button_handler do
171
+ popdown_menu
172
+ @canvas.activate("NextSlide")
173
+ true
99
174
  end
100
- when 3
175
+ end
176
+ end
177
+
178
+ def handle_button_middle_single_click(event, release_event)
179
+ unless release_event.state.alt_mask?
101
180
  add_button_handler do
102
- popup_menu
181
+ popdown_menu
182
+ @canvas.activate("PreviousSlide")
103
183
  true
104
184
  end
105
185
  end
106
186
  end
107
187
 
108
- def handle_button2_press(event, release_event)
188
+ def handle_button_secondary_single_click(event, release_event)
189
+ add_button_handler do
190
+ toggle_menu(release_event.x, release_event.y)
191
+ true
192
+ end
193
+ end
194
+
195
+ def handle_button_primary_double_click(event, release_event)
109
196
  add_button_handler do
110
197
  if @canvas.index_mode?
111
198
  index = @canvas.current_slide.slide_number(@canvas,
@@ -113,7 +200,7 @@ module Rabbit
113
200
  event.y)
114
201
  if index
115
202
  @canvas.activate("ToggleIndexMode")
116
- @canvas.activate("JumpTo") {index}
203
+ @canvas.activate("JumpToSlide", GLib::Variant.new(index, "i"))
117
204
  end
118
205
  true
119
206
  else
@@ -122,12 +209,6 @@ module Rabbit
122
209
  end
123
210
  end
124
211
 
125
- def handle_button3_press(event, release_event)
126
- add_button_handler do
127
- false
128
- end
129
- end
130
-
131
212
  def add_button_handler(handler=nil, &block)
132
213
  handler ||= Proc.new(&block)
133
214
  @button_handler.push(handler)
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2024 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require "rabbit/cursor-manager"
17
+ require_relative "../../cursor-manager"
18
18
 
19
19
  module Rabbit
20
20
  module Renderer
@@ -35,16 +35,15 @@ module Rabbit
35
35
  end
36
36
 
37
37
  def restore_cursor(name)
38
- @cursor_manager.restore(@surface, name)
38
+ @cursor_manager.restore(@surface || @window, name)
39
39
  end
40
40
 
41
41
  def update_cursor(cursor_type, update_current_cursor=false)
42
42
  @cursor_manager.current = cursor_type if update_current_cursor
43
43
  cursor_type = :pencil if @graffiti_mode
44
- @cursor_manager.update(@surface, cursor_type)
44
+ @cursor_manager.update(@surface || @window, cursor_type)
45
45
  end
46
46
  end
47
47
  end
48
48
  end
49
49
  end
50
-