/
swig_patches.rb
60 lines (54 loc) · 1.89 KB
/
swig_patches.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# SWIG workarounds
# These are offloaded into a separate file because rb_eval_string() is weird on Ruby 1.8.
# Exceptions in Window callbacks often get lost, this is especially annoying in draw/update.
# It is not clear whether this is a SWIG issue or if some stack frame is not exception
# compatible, but I just call protected_update etc. in the Ruby wrapper so I can add this
# custom debugging help:
class Gosu::Window
%w(update draw needs_redraw? needs_cursor?
lose_focus button_down button_up).each do |callback|
define_method "protected_#{callback}" do |*args|
begin
# If there has been an exception, don't do anything as to not make matters worse.
# Conveniently turn the return value into a boolean result (for needs_cursor? etc).
defined?(@_exception) ? false : !!send(callback, *args)
rescue Exception => e
# Exit the message loop naturally, then re-throw
@_exception = e
close
end
end
end
def protected_draw_2
protected_draw
$gosu_gl_blocks_2 = $gosu_gl_blocks
$gosu_gl_blocks = nil
end
def gl(*args, &block)
$gosu_gl_blocks ||= []
$gosu_gl_blocks << block
unsafe_gl(*args, &block)
end
alias show_internal show
def show
show_internal
# Try to format the message nicely, without any useless patching that we are
# doing here.
if defined? @_exception then
if @_exception.backtrace.is_a? Array and not @_exception.backtrace.frozen? then
@_exception.backtrace.reject! { |line| line.include? 'lib/gosu/swig_patches.rb' }
end
raise @_exception
end
end
end
# SWIG doesn't understand the C++ overloading, so we need this simple check in Ruby.
class Gosu::Image
def self.from_text(*args)
args.size == 4 ? from_text4(*args) : from_text7(*args)
end
end
# SWIG won't let me rename my method to '[]='.
class Gosu::Font
alias []= set_image
end