gosu 0.11.3.pre1 → 0.11.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gosu/Version.hpp +1 -1
- data/Gosu/Window.hpp +3 -1
- data/lib/gosu/compat.rb +183 -0
- data/lib/gosu/patches.rb +0 -100
- data/lib/gosu/swig_patches.rb +1 -1
- data/lib/gosu.rb +9 -7
- data/rdoc/gosu.rb +11 -17
- data/src/RubyGosu.cxx +59 -7
- data/src/RubyGosu.h +1 -0
- data/src/TextTTFWin.cpp +10 -64
- data/src/TextWin.cpp +3 -4
- data/src/Window.cpp +26 -9
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8b68fbdbd0189edbb8b7cbb01493859fa122a0e
|
4
|
+
data.tar.gz: 382fb6970aaa117293d78a1276bcb1c95dfeb6af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 064b805c31aa7ada4b62afd6f6ad7f15c25fc4e6ccccb0f7aed8b298befe04470b3ce142fb5eefb95c3dd35a2483346fd3f075e050696ebbcc053d26fd8b23a4
|
7
|
+
data.tar.gz: 328be94282b2f6193f64d7957c020b74de6aeada8a82440889ad2d3743debf94ea0a73e4e95c707ae629385d1e21d42028573b50d984e7c4e40de50148f3f219
|
data/Gosu/Version.hpp
CHANGED
data/Gosu/Window.hpp
CHANGED
@@ -77,7 +77,9 @@ namespace Gosu
|
|
77
77
|
virtual bool tick();
|
78
78
|
|
79
79
|
//! Closes the window if it is currently shown.
|
80
|
-
|
80
|
+
//! If you do not want the window to close immediately, you should override this method and
|
81
|
+
//! only call the base implementation (Window::close) when needed.
|
82
|
+
virtual void close();
|
81
83
|
|
82
84
|
//! Called every update_interval milliseconds while the window is being shown.
|
83
85
|
//! Your application's main game logic goes here.
|
data/lib/gosu/compat.rb
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
# This whole file is about backward compatibility.
|
2
|
+
|
3
|
+
# Define some helpers to deprecate code.
|
4
|
+
module Gosu
|
5
|
+
DEPRECATION_STACKTRACE_LINES = 1
|
6
|
+
|
7
|
+
# Adapted from RubyGems, but without the date part.
|
8
|
+
def self.deprecate(klass, name, repl)
|
9
|
+
klass.class_eval {
|
10
|
+
old = "_deprecated_#{name}"
|
11
|
+
alias_method old, name
|
12
|
+
define_method name do |*args, &block|
|
13
|
+
Gosu.deprecation_message(self, name, repl)
|
14
|
+
send old, *args, &block
|
15
|
+
end
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.deprecate_const(name, repl)
|
20
|
+
send(:remove_const, name) if const_defined?(name)
|
21
|
+
|
22
|
+
@@_deprecated_constants ||= {}
|
23
|
+
@@_deprecated_constants[name] = repl
|
24
|
+
end
|
25
|
+
|
26
|
+
# Constant deprecation works by undefining the original constant and then re-adding it in
|
27
|
+
# const_missing, so that each deprecation warning is only printed once.
|
28
|
+
def self.const_missing(const_name)
|
29
|
+
if @@_deprecated_constants && repl = @@_deprecated_constants[const_name]
|
30
|
+
Gosu.deprecation_message(self, const_name, repl)
|
31
|
+
const_get(repl)
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.deprecation_message(klass_or_full_message, name=nil, repl=nil)
|
38
|
+
@@_deprecations_shown ||= {}
|
39
|
+
|
40
|
+
msg = if klass_or_full_message.is_a?(String) and name.nil? and repl.nil?
|
41
|
+
[ "DEPRECATION WARNING: #{klass_or_full_message},
|
42
|
+
\n#Called from #{caller[1, DEPRECATION_STACKTRACE_LINES]}"
|
43
|
+
]
|
44
|
+
else
|
45
|
+
# Class method deprecation warnings result in something like this:
|
46
|
+
# #<Class:Gosu::Window>::button_id_to_char is deprecated
|
47
|
+
# Remove the instance-inspect stuff to make it look a bit better:
|
48
|
+
if klass_or_full_message.kind_of?(Module)
|
49
|
+
target = "#{klass_or_full_message.to_s.gsub(/#<Class:(.*)>/, '\1')}::"
|
50
|
+
else
|
51
|
+
"#{klass_or_full_message.class}#"
|
52
|
+
end
|
53
|
+
[ "DEPRECATION WARNING: #{target}#{name} is deprecated",
|
54
|
+
repl == :none ? " with no replacement." : "; use #{repl} instead.",
|
55
|
+
"\n#{target}#{name} called from #{Gosu.deprecation_caller.join("\n")}",
|
56
|
+
]
|
57
|
+
end
|
58
|
+
return if @@_deprecations_shown.has_key?(msg[0])
|
59
|
+
@@_deprecations_shown[msg[0]] = true
|
60
|
+
|
61
|
+
warn "#{msg.join}."
|
62
|
+
end
|
63
|
+
|
64
|
+
# This method removes the deprecation methods themselves from the stacktrace.
|
65
|
+
def self.deprecation_caller
|
66
|
+
caller.delete_if { |trace_line| trace_line =~ /(deprecat|const_missing)/ }
|
67
|
+
.first(DEPRECATION_STACKTRACE_LINES)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# No need to pass a Window to Image.
|
72
|
+
class Gosu::Image
|
73
|
+
alias initialize_without_window initialize
|
74
|
+
|
75
|
+
def initialize(*args)
|
76
|
+
if args[0].is_a? Gosu::Window
|
77
|
+
Gosu.deprecation_message("Passing a Window to Image#initialize has been deprecated in Gosu 0.9 and this method now uses an options hash, see https://www.libgosu.org/rdoc/Gosu/Image.html.")
|
78
|
+
if args.size == 7
|
79
|
+
initialize_without_window args[1], :tileable => args[2], :rect => args[3..-1]
|
80
|
+
else
|
81
|
+
initialize_without_window args[1], :tileable => args[2]
|
82
|
+
end
|
83
|
+
else
|
84
|
+
initialize_without_window(*args)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
class << self
|
89
|
+
alias from_text_without_window from_text
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.from_text(*args)
|
93
|
+
if args.size == 4
|
94
|
+
Gosu.deprecation_message("Passing a Window to Image.from_text has been deprecated in Gosu 0.9 and this method now uses an options hash, see https://www.libgosu.org/rdoc/Gosu/Image.html.")
|
95
|
+
from_text_without_window(args[1], args[3], :font => args[2])
|
96
|
+
elsif args.size == 7
|
97
|
+
Gosu.deprecation_message("Passing a Window to Image.from_text has been deprecated in Gosu 0.9 and this method now uses an options hash, see https://www.libgosu.org/rdoc/Gosu/Image.html.")
|
98
|
+
from_text_without_window(args[1], args[3], :font => args[2],
|
99
|
+
:spacing => args[4], :width => args[5], :align => args[6])
|
100
|
+
else
|
101
|
+
from_text_without_window(*args)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# No need to pass a Window to Sample.
|
107
|
+
class Gosu::Sample
|
108
|
+
alias initialize_without_window initialize
|
109
|
+
|
110
|
+
def initialize(*args)
|
111
|
+
if args.first.is_a? Gosu::Window
|
112
|
+
args.shift
|
113
|
+
Gosu.deprecation_message("Passing a Window to Sample#initialize has been deprecated in Gosu 0.7.17.")
|
114
|
+
end
|
115
|
+
initialize_without_window(*args)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# No need to pass a Window to Song.
|
120
|
+
class Gosu::Song
|
121
|
+
alias initialize_without_window initialize
|
122
|
+
|
123
|
+
def initialize(*args)
|
124
|
+
if args.first.is_a? Gosu::Window
|
125
|
+
args.shift
|
126
|
+
Gosu.deprecation_message("Passing a Window to Song#initialize has been deprecated in Gosu 0.7.17.")
|
127
|
+
end
|
128
|
+
initialize_without_window(*args)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Moved some Window-methods to the Gosu::Module
|
133
|
+
class Gosu::Window
|
134
|
+
# Class methods that have been turned into module methods.
|
135
|
+
class << self
|
136
|
+
def button_id_to_char(id)
|
137
|
+
Gosu.button_id_to_char(id)
|
138
|
+
end
|
139
|
+
|
140
|
+
def char_to_button_id(ch)
|
141
|
+
Gosu.char_to_button_id(ch)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Instance methods that have been turned into module methods.
|
146
|
+
%w(draw_line draw_triangle draw_quad
|
147
|
+
flush gl clip_to record
|
148
|
+
transform translate rotate scale
|
149
|
+
button_id_to_char char_to_button_id button_down?).each do |method|
|
150
|
+
define_method method.to_sym do |*args, &block|
|
151
|
+
Gosu.send method, *args, &block
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# Constants
|
157
|
+
module Gosu
|
158
|
+
Gosu.deprecate Window, :set_mouse_position, "Window#mouse_x= and Window#mouse_y="
|
159
|
+
Gosu.deprecate Font, :draw_rot, "Font#draw with Gosu.rotate"
|
160
|
+
|
161
|
+
# This was renamed because it's not actually a "copyright notice".
|
162
|
+
# (https://en.wikipedia.org/wiki/Copyright_notice)
|
163
|
+
deprecate_const :GOSU_COPYRIGHT_NOTICE, :LICENSES
|
164
|
+
|
165
|
+
module Button; end
|
166
|
+
|
167
|
+
# Support for KbLeft instead of KB_LEFT and Gp3Button2 instead of GP_3_BUTTON_2.
|
168
|
+
Gosu.constants.grep(/^KB_|MS_|GP_/).each do |new_name|
|
169
|
+
old_name = case new_name
|
170
|
+
when :KB_ISO then "KbISO"
|
171
|
+
when :KB_NUMPAD_PLUS then "KbNumpadAdd"
|
172
|
+
when :KB_NUMPAD_MINUS then "KbNumpadSubtract"
|
173
|
+
when :KB_EQUALS then "KbEqual"
|
174
|
+
when :KB_LEFT_BRACKET then "KbBracketLeft"
|
175
|
+
when :KB_RIGHT_BRACKET then "KbBracketRight"
|
176
|
+
else new_name.to_s.capitalize.gsub(/_(.)/) { $1.upcase }
|
177
|
+
end
|
178
|
+
Gosu.const_set old_name, new_name
|
179
|
+
|
180
|
+
# Also import old-style constants into Gosu::Button.
|
181
|
+
Gosu::Button.const_set old_name, Gosu.const_get(new_name)
|
182
|
+
end
|
183
|
+
end
|
data/lib/gosu/patches.rb
CHANGED
@@ -18,79 +18,6 @@ class ::Numeric
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
# Backwards compatibility:
|
22
|
-
# Support for KbLeft instead of KB_LEFT and Gp3Button2 instead of GP_3_BUTTON_2.
|
23
|
-
# Also import old-style constants into Gosu::Button.
|
24
|
-
module Gosu::Button; end
|
25
|
-
Gosu.constants.grep(/^KB_|MS_|GP_/).each do |c|
|
26
|
-
old_name = case c
|
27
|
-
when :KB_ISO then "KbISO"
|
28
|
-
when :KB_NUMPAD_PLUS then "KbNumpadAdd"
|
29
|
-
when :KB_NUMPAD_MINUS then "KbNumpadSubtract"
|
30
|
-
when :KB_EQUALS then "KbEqual"
|
31
|
-
when :KB_LEFT_BRACKET then "KbBracketLeft"
|
32
|
-
when :KB_RIGHT_BRACKET then "KbBracketRight"
|
33
|
-
else c.to_s.capitalize.gsub(/_(.)/) { $1.upcase }
|
34
|
-
end
|
35
|
-
Gosu.const_set old_name, Gosu.const_get(c)
|
36
|
-
Gosu::Button.const_set old_name, Gosu.const_get(c)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Backwards compatibility:
|
40
|
-
# Passing a Window to initialize and from_text has been deprecated in Gosu 0.9.
|
41
|
-
class Gosu::Image
|
42
|
-
alias initialize_without_window initialize
|
43
|
-
|
44
|
-
def initialize(*args)
|
45
|
-
if args[0].is_a? Gosu::Window
|
46
|
-
if args.size == 7
|
47
|
-
initialize_without_window args[1], :tileable => args[2], :rect => args[3..-1]
|
48
|
-
else
|
49
|
-
initialize_without_window args[1], :tileable => args[2]
|
50
|
-
end
|
51
|
-
else
|
52
|
-
initialize_without_window(*args)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
class << self
|
57
|
-
alias from_text_without_window from_text
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.from_text(*args)
|
61
|
-
if args.size == 4
|
62
|
-
from_text_without_window(args[1], args[3], :font => args[2])
|
63
|
-
elsif args.size == 7
|
64
|
-
from_text_without_window(args[1], args[3], :font => args[2],
|
65
|
-
:spacing => args[4], :width => args[5], :align => args[6])
|
66
|
-
else
|
67
|
-
from_text_without_window(*args)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# Backwards compatibility:
|
73
|
-
# Passing a Window to Sample#initialize has been deprecated in Gosu 0.7.17.
|
74
|
-
class Gosu::Sample
|
75
|
-
alias initialize_without_window initialize
|
76
|
-
|
77
|
-
def initialize(*args)
|
78
|
-
args.shift if args.first.is_a? Gosu::Window
|
79
|
-
initialize_without_window(*args)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# Backwards compatibility:
|
84
|
-
# Passing a Window to Song#initialize has been deprecated in Gosu 0.7.17.
|
85
|
-
class Gosu::Song
|
86
|
-
alias initialize_without_window initialize
|
87
|
-
|
88
|
-
def initialize(*args)
|
89
|
-
args.shift if args.first.is_a? Gosu::Window
|
90
|
-
initialize_without_window(*args)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
21
|
# Color constants.
|
95
22
|
# This is cleaner than having SWIG define them.
|
96
23
|
module Gosu
|
@@ -119,29 +46,6 @@ module Gosu
|
|
119
46
|
end
|
120
47
|
|
121
48
|
class Gosu::Window
|
122
|
-
# Backwards compatibility:
|
123
|
-
# Class methods that have been turned into module methods.
|
124
|
-
|
125
|
-
def self.button_id_to_char(id)
|
126
|
-
Gosu.button_id_to_char(id)
|
127
|
-
end
|
128
|
-
|
129
|
-
def self.char_to_button_id(ch)
|
130
|
-
Gosu.char_to_button_id(ch)
|
131
|
-
end
|
132
|
-
|
133
|
-
# Backwards compatibility:
|
134
|
-
# Instance methods that have been turned into module methods.
|
135
|
-
|
136
|
-
%w(draw_line draw_triangle draw_quad
|
137
|
-
flush gl clip_to record
|
138
|
-
transform translate rotate scale
|
139
|
-
button_id_to_char char_to_button_id button_down?).each do |method|
|
140
|
-
define_method method.to_sym do |*args, &block|
|
141
|
-
Gosu.send method, *args, &block
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
49
|
# Call Thread.pass every tick, which may or may not be necessary for friendly co-existence with
|
146
50
|
# Ruby's Thread class.
|
147
51
|
|
@@ -153,10 +57,6 @@ class Gosu::Window
|
|
153
57
|
end
|
154
58
|
end
|
155
59
|
|
156
|
-
# Backwards compatibility:
|
157
|
-
# This was renamed, because it's not actually a "copyright notice" (Wikipedia: https://en.wikipedia.org/wiki/Copyright_notice).
|
158
|
-
Gosu::GOSU_COPYRIGHT_NOTICE = Gosu::LICENSES
|
159
|
-
|
160
60
|
# Release OpenAL resources during Ruby's shutdown, not Gosu's.
|
161
61
|
at_exit do
|
162
62
|
begin
|
data/lib/gosu/swig_patches.rb
CHANGED
@@ -28,7 +28,7 @@ class Gosu::Window
|
|
28
28
|
# Conveniently turn the return value into a boolean result (for needs_cursor? etc).
|
29
29
|
defined?(@_exception) ? false : !!send(callback, *args)
|
30
30
|
rescue Exception => e
|
31
|
-
# Exit the message loop naturally, then re-throw
|
31
|
+
# Exit the message loop naturally, then re-throw during the next tick.
|
32
32
|
@_exception = e
|
33
33
|
close
|
34
34
|
false
|
data/lib/gosu.rb
CHANGED
@@ -1,19 +1,21 @@
|
|
1
|
-
require
|
1
|
+
require "rbconfig"
|
2
2
|
|
3
3
|
if RUBY_PLATFORM =~ /mswin$|mingw32|mingw64|win32\-|\-win32/
|
4
4
|
binary_path = File.dirname(__FILE__)
|
5
5
|
# 64-bit builds of Windows use "x64-mingw32" as RUBY_PLATFORM
|
6
|
-
binary_path +=
|
6
|
+
binary_path += "64" if RUBY_PLATFORM =~ /^x64-/
|
7
7
|
|
8
8
|
# Add this gem to the PATH on Windows so that bundled DLLs can be found.
|
9
|
-
|
9
|
+
# When running through Ocra on Windows, we need to be careful to preserve the ENV["PATH"]
|
10
|
+
# encoding (see #385).
|
11
|
+
ENV["PATH"] = "#{binary_path.encode ENV["PATH"].encoding};#{ENV["PATH"]}"
|
10
12
|
|
11
|
-
# Add the correct directory
|
12
|
-
|
13
|
-
$LOAD_PATH.unshift "#{binary_path}/#{$1}"
|
13
|
+
# Add the correct lib directory for the current version of Ruby (major.minor).
|
14
|
+
$LOAD_PATH.unshift File.join(binary_path, RUBY_VERSION[/^\d+.\d+/])
|
14
15
|
end
|
15
16
|
|
16
|
-
require "gosu.#{RbConfig::CONFIG[
|
17
|
+
require "gosu.#{RbConfig::CONFIG["DLEXT"]}"
|
17
18
|
|
18
19
|
require "gosu/swig_patches"
|
19
20
|
require "gosu/patches"
|
21
|
+
require "gosu/compat"
|
data/rdoc/gosu.rb
CHANGED
@@ -17,10 +17,6 @@ module Gosu
|
|
17
17
|
# A version string of the form "0.1.2", "0.1.2.3" or "0.1.2pre4".
|
18
18
|
VERSION = :a_string
|
19
19
|
|
20
|
-
##
|
21
|
-
# @deprecated Use LICENSES instead as it's a more appropriate name
|
22
|
-
GOSU_COPYRIGHT_NOTICE = :a_string
|
23
|
-
|
24
20
|
##
|
25
21
|
# A block of legal copy that your game is obliged to display somewhere.
|
26
22
|
LICENSES = :a_string
|
@@ -291,13 +287,6 @@ module Gosu
|
|
291
287
|
# @see https://github.com/gosu/gosu/wiki/Basic-Concepts#z-ordering Z-ordering explained in the Gosu Wiki
|
292
288
|
def draw_rel(text, x, y, z, rel_x, rel_y, scale_x=1, scale_y=1, color=0xff_ffffff, mode=:default); end
|
293
289
|
|
294
|
-
##
|
295
|
-
# @deprecated Use {#draw} in conjunction with {Gosu.rotate} instead.
|
296
|
-
#
|
297
|
-
# @see #draw
|
298
|
-
# @see Gosu::Window#rotate
|
299
|
-
def draw_rot(text, x, y, z, angle, scale_x=1, scale_y=1, color=0xff_ffffff, mode=:default); end
|
300
|
-
|
301
290
|
# @!endgroup
|
302
291
|
|
303
292
|
##
|
@@ -778,10 +767,10 @@ module Gosu
|
|
778
767
|
def tick; end
|
779
768
|
|
780
769
|
##
|
781
|
-
# Tells the window to end the current run loop as soon as possible.
|
770
|
+
# Tells the window to end the current run loop as soon as possible.
|
782
771
|
#
|
783
772
|
# @return [void]
|
784
|
-
def close
|
773
|
+
def close!; end
|
785
774
|
|
786
775
|
# @!group Callbacks
|
787
776
|
|
@@ -813,6 +802,15 @@ module Gosu
|
|
813
802
|
# @return [true, false] whether the system cursor should be shown.
|
814
803
|
def needs_cursor?; end
|
815
804
|
|
805
|
+
##
|
806
|
+
# This method is called whenever the user tries to close the window, e.g. by clicking the [x]
|
807
|
+
# button in the window's title bar.
|
808
|
+
# If you do not want the window to close immediately, you should override this method and
|
809
|
+
# call the {#close!} when needed.
|
810
|
+
#
|
811
|
+
# @return [bool]
|
812
|
+
def close; end
|
813
|
+
|
816
814
|
##
|
817
815
|
# This method is called before {#update} if a button is pressed while the window has focus.
|
818
816
|
#
|
@@ -839,10 +837,6 @@ module Gosu
|
|
839
837
|
def button_up(id); end
|
840
838
|
|
841
839
|
# @!endgroup
|
842
|
-
|
843
|
-
##
|
844
|
-
# @deprecated Use {#mouse_x=} and {#mouse_y=} instead.
|
845
|
-
def set_mouse_position(x, y); end
|
846
840
|
end
|
847
841
|
|
848
842
|
##
|
data/src/RubyGosu.cxx
CHANGED
@@ -3172,6 +3172,9 @@ SWIGINTERN void Gosu_Window_set_mouse_x(Gosu::Window *self,double x){
|
|
3172
3172
|
SWIGINTERN void Gosu_Window_set_mouse_y(Gosu::Window *self,double y){
|
3173
3173
|
self->input().set_mouse_position(self->input().mouse_x(), y);
|
3174
3174
|
}
|
3175
|
+
SWIGINTERN void Gosu_Window_force_close(Gosu::Window *self){
|
3176
|
+
self->Gosu::Window::close();
|
3177
|
+
}
|
3175
3178
|
|
3176
3179
|
// Also mark the TextInput instance alive when the window is being marked.
|
3177
3180
|
static void mark_window(void* window)
|
@@ -3252,6 +3255,13 @@ bool SwigDirector_Window::tick() {
|
|
3252
3255
|
}
|
3253
3256
|
|
3254
3257
|
|
3258
|
+
void SwigDirector_Window::close() {
|
3259
|
+
VALUE SWIGUNUSED result;
|
3260
|
+
|
3261
|
+
result = rb_funcall(swig_get_self(), rb_intern("close"), 0, NULL);
|
3262
|
+
}
|
3263
|
+
|
3264
|
+
|
3255
3265
|
void SwigDirector_Window::update() {
|
3256
3266
|
VALUE SWIGUNUSED result;
|
3257
3267
|
|
@@ -9183,6 +9193,8 @@ _wrap_Window_close(int argc, VALUE *argv, VALUE self) {
|
|
9183
9193
|
Gosu::Window *arg1 = (Gosu::Window *) 0 ;
|
9184
9194
|
void *argp1 = 0 ;
|
9185
9195
|
int res1 = 0 ;
|
9196
|
+
Swig::Director *director = 0;
|
9197
|
+
bool upcall = false;
|
9186
9198
|
|
9187
9199
|
if ((argc < 0) || (argc > 0)) {
|
9188
9200
|
rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
|
@@ -9192,13 +9204,24 @@ _wrap_Window_close(int argc, VALUE *argv, VALUE self) {
|
|
9192
9204
|
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Gosu::Window *","close", 1, self ));
|
9193
9205
|
}
|
9194
9206
|
arg1 = reinterpret_cast< Gosu::Window * >(argp1);
|
9195
|
-
|
9196
|
-
|
9197
|
-
|
9198
|
-
|
9199
|
-
|
9200
|
-
|
9207
|
+
director = dynamic_cast<Swig::Director *>(arg1);
|
9208
|
+
upcall = (director && (director->swig_get_self() == self));
|
9209
|
+
try {
|
9210
|
+
{
|
9211
|
+
try {
|
9212
|
+
if (upcall) {
|
9213
|
+
(arg1)->Gosu::Window::close();
|
9214
|
+
} else {
|
9215
|
+
(arg1)->close();
|
9216
|
+
}
|
9217
|
+
}
|
9218
|
+
catch (const std::exception& e) {
|
9219
|
+
SWIG_exception(SWIG_RuntimeError, e.what());
|
9220
|
+
}
|
9201
9221
|
}
|
9222
|
+
} catch (Swig::DirectorException& e) {
|
9223
|
+
rb_exc_raise(e.getError());
|
9224
|
+
SWIG_fail;
|
9202
9225
|
}
|
9203
9226
|
return Qnil;
|
9204
9227
|
fail:
|
@@ -9907,6 +9930,34 @@ fail:
|
|
9907
9930
|
}
|
9908
9931
|
|
9909
9932
|
|
9933
|
+
SWIGINTERN VALUE
|
9934
|
+
_wrap_Window_closeN___(int argc, VALUE *argv, VALUE self) {
|
9935
|
+
Gosu::Window *arg1 = (Gosu::Window *) 0 ;
|
9936
|
+
void *argp1 = 0 ;
|
9937
|
+
int res1 = 0 ;
|
9938
|
+
|
9939
|
+
if ((argc < 0) || (argc > 0)) {
|
9940
|
+
rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
|
9941
|
+
}
|
9942
|
+
res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Gosu__Window, 0 | 0 );
|
9943
|
+
if (!SWIG_IsOK(res1)) {
|
9944
|
+
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Gosu::Window *","force_close", 1, self ));
|
9945
|
+
}
|
9946
|
+
arg1 = reinterpret_cast< Gosu::Window * >(argp1);
|
9947
|
+
{
|
9948
|
+
try {
|
9949
|
+
Gosu_Window_force_close(arg1);
|
9950
|
+
}
|
9951
|
+
catch (const std::exception& e) {
|
9952
|
+
SWIG_exception(SWIG_RuntimeError, e.what());
|
9953
|
+
}
|
9954
|
+
}
|
9955
|
+
return Qnil;
|
9956
|
+
fail:
|
9957
|
+
return Qnil;
|
9958
|
+
}
|
9959
|
+
|
9960
|
+
|
9910
9961
|
SWIGINTERN VALUE
|
9911
9962
|
_wrap_disown_Window(int argc, VALUE *argv, VALUE self) {
|
9912
9963
|
Gosu::Window *arg1 = (Gosu::Window *) 0 ;
|
@@ -11523,7 +11574,7 @@ SWIGEXPORT void Init_gosu(void) {
|
|
11523
11574
|
rb_define_const(mGosu, "LICENSES", SWIG_From_std_string(static_cast< std::string >(Gosu::LICENSES)));
|
11524
11575
|
rb_define_const(mGosu, "MAJOR_VERSION", SWIG_From_int(static_cast< int >(0)));
|
11525
11576
|
rb_define_const(mGosu, "MINOR_VERSION", SWIG_From_int(static_cast< int >(11)));
|
11526
|
-
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(
|
11577
|
+
rb_define_const(mGosu, "POINT_VERSION", SWIG_From_int(static_cast< int >(3)));
|
11527
11578
|
rb_define_module_function(mGosu, "milliseconds", VALUEFUNC(_wrap_milliseconds), -1);
|
11528
11579
|
rb_define_module_function(mGosu, "random", VALUEFUNC(_wrap_random), -1);
|
11529
11580
|
rb_define_module_function(mGosu, "degrees_to_radians", VALUEFUNC(_wrap_degrees_to_radians), -1);
|
@@ -11944,6 +11995,7 @@ SWIGEXPORT void Init_gosu(void) {
|
|
11944
11995
|
rb_define_method(SwigClassWindow.klass, "set_mouse_position", VALUEFUNC(_wrap_Window_set_mouse_position), -1);
|
11945
11996
|
rb_define_method(SwigClassWindow.klass, "mouse_x=", VALUEFUNC(_wrap_Window_mouse_xe___), -1);
|
11946
11997
|
rb_define_method(SwigClassWindow.klass, "mouse_y=", VALUEFUNC(_wrap_Window_mouse_ye___), -1);
|
11998
|
+
rb_define_method(SwigClassWindow.klass, "close!", VALUEFUNC(_wrap_Window_closeN___), -1);
|
11947
11999
|
SwigClassWindow.mark = (void (*)(void *)) mark_window;
|
11948
12000
|
SwigClassWindow.destroy = (void (*)(void *)) free_Gosu_Window;
|
11949
12001
|
SwigClassWindow.trackObjects = 1;
|
data/src/RubyGosu.h
CHANGED
data/src/TextTTFWin.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include <Gosu/Platform.hpp>
|
2
2
|
#if defined(GOSU_IS_WIN)
|
3
3
|
|
4
|
+
#include <Gosu/IO.hpp>
|
4
5
|
#include <Gosu/Utility.hpp>
|
5
6
|
#include <cassert>
|
6
7
|
#include <cstdio>
|
@@ -56,69 +57,18 @@ struct TT_NAME_RECORD
|
|
56
57
|
|
57
58
|
namespace Gosu
|
58
59
|
{
|
59
|
-
std::string get_name_from_ttf_file(const std::
|
60
|
+
std::string get_name_from_ttf_file(const std::string& filename)
|
60
61
|
{
|
61
62
|
FONT_PROPERTIES_ANSI fp;
|
62
63
|
FONT_PROPERTIES_ANSI * lpFontProps = &fp;
|
63
64
|
memset(lpFontProps, 0, sizeof(FONT_PROPERTIES_ANSI));
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
GENERIC_READ,// | GENERIC_WRITE,
|
68
|
-
FILE_SHARE_READ,
|
69
|
-
NULL,
|
70
|
-
OPEN_EXISTING,
|
71
|
-
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
|
72
|
-
NULL);
|
73
|
-
|
74
|
-
if (hFile == INVALID_HANDLE_VALUE)
|
75
|
-
{
|
76
|
-
TRACE(_T("ERROR: failed to open '%s'\n"), wstring_to_utf8(filename).c_str());
|
77
|
-
TRACE(_T("ERROR: %s failed, GetLastError() = 0x%x\n"), _T("CreateFile"), (int)GetLastError());
|
78
|
-
return wstring_to_utf8(filename);
|
79
|
-
}
|
66
|
+
Buffer buffer;
|
67
|
+
load_file(buffer, filename);
|
80
68
|
|
81
69
|
// get the file size
|
82
|
-
DWORD dwFileSize =
|
83
|
-
|
84
|
-
if (dwFileSize == INVALID_FILE_SIZE)
|
85
|
-
{
|
86
|
-
TRACE(_T("ERROR: %s failed\n"), _T("GetFileSize"));
|
87
|
-
::CloseHandle(hFile);
|
88
|
-
return wstring_to_utf8(filename);
|
89
|
-
}
|
90
|
-
|
91
|
-
//TRACE(_T("dwFileSize = %d\n"), dwFileSize);
|
92
|
-
|
93
|
-
// Create a file mapping object that is the current size of the file
|
94
|
-
HANDLE hMappedFile = NULL;
|
95
|
-
hMappedFile = ::CreateFileMapping(hFile,
|
96
|
-
NULL,
|
97
|
-
PAGE_READONLY, //PAGE_READWRITE,
|
98
|
-
0,
|
99
|
-
dwFileSize,
|
100
|
-
NULL);
|
101
|
-
|
102
|
-
if (hMappedFile == NULL)
|
103
|
-
{
|
104
|
-
TRACE(_T("ERROR: %s failed\n"), _T("CreateFileMapping"));
|
105
|
-
::CloseHandle(hFile);
|
106
|
-
return wstring_to_utf8(filename);
|
107
|
-
}
|
108
|
-
|
109
|
-
LPBYTE lpMapAddress = (LPBYTE) ::MapViewOfFile(hMappedFile, // handle to file-mapping object
|
110
|
-
FILE_MAP_READ,//FILE_MAP_WRITE, // access mode
|
111
|
-
0, // high-order DWORD of offset
|
112
|
-
0, // low-order DWORD of offset
|
113
|
-
0); // number of bytes to map
|
114
|
-
|
115
|
-
if (lpMapAddress == NULL)
|
116
|
-
{
|
117
|
-
TRACE(_T("ERROR: %s failed\n"), _T("MapViewOfFile"));
|
118
|
-
::CloseHandle(hMappedFile);
|
119
|
-
::CloseHandle(hFile);
|
120
|
-
return wstring_to_utf8(filename);
|
121
|
-
}
|
70
|
+
DWORD dwFileSize = buffer.size();
|
71
|
+
LPBYTE lpMapAddress = (LPBYTE) buffer.data();
|
122
72
|
|
123
73
|
BOOL bRetVal = FALSE;
|
124
74
|
int index = 0;
|
@@ -132,8 +82,9 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
132
82
|
ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion);
|
133
83
|
|
134
84
|
//check is this is a true type font and the version is 1.0
|
135
|
-
if (ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0)
|
136
|
-
|
85
|
+
if (ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0) {
|
86
|
+
throw std::runtime_error("Only version 1.0 of the TTF file format is supported");
|
87
|
+
}
|
137
88
|
|
138
89
|
TT_TABLE_DIRECTORY tblDir;
|
139
90
|
memset(&tblDir, 0, sizeof(TT_TABLE_DIRECTORY));
|
@@ -143,7 +94,6 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
143
94
|
|
144
95
|
for (int i = 0; i< ttOffsetTable.uNumOfTables; i++)
|
145
96
|
{
|
146
|
-
//f.Read(&tblDir, sizeof(TT_TABLE_DIRECTORY));
|
147
97
|
memcpy(&tblDir, &lpMapAddress[index], sizeof(TT_TABLE_DIRECTORY));
|
148
98
|
index += sizeof(TT_TABLE_DIRECTORY);
|
149
99
|
|
@@ -191,7 +141,7 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
191
141
|
|
192
142
|
if (ttRecord.uNameID == 1 || ttRecord.uNameID == 0 || ttRecord.uNameID == 7)
|
193
143
|
{
|
194
|
-
int nPos = index;
|
144
|
+
int nPos = index;
|
195
145
|
|
196
146
|
index = tblDir.uOffset + ttRecord.uStringOffset + ttNTHeader.uStorageOffset;
|
197
147
|
|
@@ -240,10 +190,6 @@ std::string get_name_from_ttf_file(const std::wstring& filename)
|
|
240
190
|
}
|
241
191
|
}
|
242
192
|
|
243
|
-
::UnmapViewOfFile(lpMapAddress);
|
244
|
-
::CloseHandle(hMappedFile);
|
245
|
-
::CloseHandle(hFile);
|
246
|
-
|
247
193
|
return lpFontProps->csName[0] ? lpFontProps->csName : lpFontProps->csFamily;
|
248
194
|
}
|
249
195
|
}
|
data/src/TextWin.cpp
CHANGED
@@ -22,7 +22,7 @@ std::string Gosu::default_font_name()
|
|
22
22
|
|
23
23
|
namespace Gosu
|
24
24
|
{
|
25
|
-
std::string get_name_from_ttf_file(const std::
|
25
|
+
std::string get_name_from_ttf_file(const std::string& filename);
|
26
26
|
|
27
27
|
namespace
|
28
28
|
{
|
@@ -93,9 +93,8 @@ namespace Gosu
|
|
93
93
|
|
94
94
|
if (font_name.find("/") != font_name.npos) {
|
95
95
|
if (custom_fonts.count(font_name) == 0) {
|
96
|
-
|
97
|
-
|
98
|
-
font_name = custom_fonts[font_name] = get_name_from_ttf_file(wfont_name);
|
96
|
+
AddFontResourceExW(utf8_to_wstring(font_name).c_str(), FR_PRIVATE, 0);
|
97
|
+
font_name = custom_fonts[font_name] = get_name_from_ttf_file(font_name);
|
99
98
|
}
|
100
99
|
else {
|
101
100
|
font_name = custom_fonts[font_name];
|
data/src/Window.cpp
CHANGED
@@ -83,6 +83,12 @@ struct Gosu::Window::Impl
|
|
83
83
|
bool fullscreen;
|
84
84
|
double update_interval;
|
85
85
|
|
86
|
+
// A single `bool open` is not good enough to support the tick() method: When close() is called
|
87
|
+
// from outside the window's call graph, the next call to tick() must return false (transition
|
88
|
+
// from CLOSING to CLOSED), but the call after that must return show the window again
|
89
|
+
// (transition from CLOSED to OPEN).
|
90
|
+
enum { CLOSED, OPEN, CLOSING } state = CLOSED;
|
91
|
+
|
86
92
|
std::unique_ptr<Graphics> graphics;
|
87
93
|
std::unique_ptr<Input> input;
|
88
94
|
};
|
@@ -93,10 +99,11 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen, double up
|
|
93
99
|
// Even in fullscreen mode, temporarily show the window in windowed mode to centre it.
|
94
100
|
// This ensures that the window will be centred correctly when exiting fullscreen mode.
|
95
101
|
// Fixes https://github.com/gosu/gosu/issues/369
|
102
|
+
// (This will implicitly create graphics() and input(), and make the OpenGL context current.)
|
96
103
|
resize(width, height, false);
|
97
104
|
SDL_SetWindowPosition(shared_window(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
|
98
105
|
|
99
|
-
//
|
106
|
+
// Really enable fullscreen if desired.
|
100
107
|
resize(width, height, fullscreen);
|
101
108
|
|
102
109
|
SDL_GL_SetSwapInterval(1);
|
@@ -104,7 +111,7 @@ Gosu::Window::Window(unsigned width, unsigned height, bool fullscreen, double up
|
|
104
111
|
pimpl->update_interval = update_interval;
|
105
112
|
|
106
113
|
input().on_button_down = [this](Button button) { button_down(button); };
|
107
|
-
input().on_button_up
|
114
|
+
input().on_button_up = [this](Button button) { button_up(button); };
|
108
115
|
}
|
109
116
|
|
110
117
|
Gosu::Window::~Window()
|
@@ -221,12 +228,20 @@ void Gosu::Window::show()
|
|
221
228
|
|
222
229
|
time_before_tick = milliseconds();
|
223
230
|
}
|
231
|
+
|
232
|
+
pimpl->state = Impl::CLOSED;
|
224
233
|
}
|
225
234
|
|
226
235
|
bool Gosu::Window::tick()
|
227
236
|
{
|
228
|
-
if (
|
237
|
+
if (pimpl->state == Impl::CLOSING) {
|
238
|
+
pimpl->state = Impl::CLOSED;
|
239
|
+
return false;
|
240
|
+
}
|
241
|
+
|
242
|
+
if (pimpl->state == Impl::CLOSED) {
|
229
243
|
SDL_ShowWindow(shared_window());
|
244
|
+
pimpl->state = Impl::OPEN;
|
230
245
|
|
231
246
|
// SDL_GL_GetDrawableSize returns different values before and after showing the window.
|
232
247
|
// -> When first showing the window, update the physical size of Graphics (=glViewport).
|
@@ -239,8 +254,7 @@ bool Gosu::Window::tick()
|
|
239
254
|
SDL_Event e;
|
240
255
|
while (SDL_PollEvent(&e)) {
|
241
256
|
if (e.type == SDL_QUIT) {
|
242
|
-
|
243
|
-
return false;
|
257
|
+
close();
|
244
258
|
}
|
245
259
|
else {
|
246
260
|
input().feed_sdl_event(&e);
|
@@ -266,14 +280,17 @@ bool Gosu::Window::tick()
|
|
266
280
|
SDL_GL_SwapWindow(shared_window());
|
267
281
|
}
|
268
282
|
|
269
|
-
|
283
|
+
if (pimpl->state == Impl::CLOSING) {
|
284
|
+
pimpl->state = Impl::CLOSED;
|
285
|
+
}
|
286
|
+
|
287
|
+
return pimpl->state == Impl::OPEN;
|
270
288
|
}
|
271
289
|
|
272
290
|
void Gosu::Window::close()
|
273
291
|
{
|
274
|
-
|
275
|
-
|
276
|
-
SDL_PushEvent(&e);
|
292
|
+
pimpl->state = Impl::CLOSING;
|
293
|
+
SDL_HideWindow(shared_window());
|
277
294
|
}
|
278
295
|
|
279
296
|
void Gosu::Window::button_down(Button button)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gosu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.3
|
4
|
+
version: 0.11.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Raschke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
2D game development library.
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- README.md
|
54
54
|
- ext/gosu/extconf.rb
|
55
55
|
- lib/gosu.rb
|
56
|
+
- lib/gosu/compat.rb
|
56
57
|
- lib/gosu/patches.rb
|
57
58
|
- lib/gosu/preview.rb
|
58
59
|
- lib/gosu/run.rb
|
@@ -150,9 +151,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
151
|
version: 1.8.2
|
151
152
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
153
|
requirements:
|
153
|
-
- - "
|
154
|
+
- - ">="
|
154
155
|
- !ruby/object:Gem::Version
|
155
|
-
version:
|
156
|
+
version: '0'
|
156
157
|
requirements: []
|
157
158
|
rubyforge_project:
|
158
159
|
rubygems_version: 2.6.8
|