249 changes: 135 additions & 114 deletions ext/ruby/qtruby/src/Qt.cpp

Large diffs are not rendered by default.

362 changes: 186 additions & 176 deletions ext/ruby/qtruby/src/handlers.cpp
100755 → 100644

Large diffs are not rendered by default.

32 changes: 20 additions & 12 deletions extconf.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,24 @@
windows = false
macosx = false
processor, platform, *rest = RUBY_PLATFORM.split("-")
windows = true if platform == 'mswin32' or platform == 'mingw32'
windows = true if platform =~ /mswin32/ or platform =~ /mingw32/
macosx = true if platform =~ /darwin/

ruby_version = '1.9'
ruby_version = '1.8' if RUBY_VERSION.split('.')[1].to_i == 8
ruby_version_split = RUBY_VERSION.split('.')
if ruby_version_split[0].to_i == 1
ruby_version = '1.9'
if ruby_version_split[1].to_i == 8
puts "Ruby 1.8.x is no longer supported. Install qtbindings 4.8.3.0. gem install qtbindings -v 4.8.3.0"
exit
end
else
ruby_version = '2.0'
end

if windows
# README! - Modify this path if you have QT installed somewhere else
# or if you have a different version of QT you want to link to.
qt_sdk_path = "C:\\Qt\\4.8.3"
qt_sdk_path = "C:\\Qt\\4.8.5"
begin
File::Stat.new(qt_sdk_path)
rescue
Expand All @@ -30,8 +38,8 @@
file.puts ""
file.puts "makedirs:"
file.puts "\t-mkdir ext\\build"
file.puts "\t-mkdir bin\\1.8"
file.puts "\t-mkdir bin\\1.9"
file.puts "\t-mkdir bin\\2.0"
file.puts "\t-mkdir bin\\plugins"
file.puts "\t-mkdir bin\\plugins\\accessible"
file.puts "\t-mkdir bin\\plugins\\bearer"
Expand All @@ -43,8 +51,8 @@
file.puts "\t-mkdir bin\\plugins\\phonon_backend"
file.puts "\t-mkdir bin\\plugins\\qmltooling"
file.puts "\t-mkdir bin\\plugins\\sqldrivers"
file.puts "\t-mkdir lib\\1.8"
file.puts "\t-mkdir lib\\1.9"
file.puts "\t-mkdir lib\\2.0"
file.puts ""
file.puts "clean: makedirs"
file.puts "\t-cd ext\\build && rmdir /S /Q CMakeFiles"
Expand All @@ -68,10 +76,10 @@
file.puts "\t-cd bin\\plugins\\phonon_backend && del /F /Q *"
file.puts "\t-cd bin\\plugins\\qmltooling && del /F /Q *"
file.puts "\t-cd bin\\plugins\\sqldrivers && del /F /Q *"
file.puts "\t-cd bin\\1.8 && del /F /Q *"
file.puts "\t-cd bin\\1.9 && del /F /Q *"
file.puts "\t-cd lib\\1.8 && del /F /Q *"
file.puts "\t-cd bin\\2.0 && del /F /Q *"
file.puts "\t-cd lib\\1.9 && del /F /Q *"
file.puts "\t-cd lib\\2.0 && del /F /Q *"
file.puts "\t-del /F /Q Makefile"
file.puts "\t-del /F /Q qtbindings-*.gem"
file.puts ""
Expand Down Expand Up @@ -174,8 +182,8 @@
file.puts ""
file.puts "makedirs:"
file.puts "\t-mkdir ext/build"
file.puts "\t-mkdir bin/1.8"
file.puts "\t-mkdir bin/1.9"
file.puts "\t-mkdir bin/2.0"
file.puts "\t-mkdir bin/plugins"
file.puts "\t-mkdir bin/plugins/accessible"
file.puts "\t-mkdir bin/plugins/bearer"
Expand All @@ -187,8 +195,8 @@
file.puts "\t-mkdir bin/plugins/phonon_backend"
file.puts "\t-mkdir bin/plugins/qmltooling"
file.puts "\t-mkdir bin/plugins/sqldrivers"
file.puts "\t-mkdir lib/1.8"
file.puts "\t-mkdir lib/1.9"
file.puts "\t-mkdir lib/2.0"
file.puts ""
file.puts "clean: makedirs"
file.puts "\t-cd ext/build; rm -rf CMakeFiles"
Expand All @@ -212,10 +220,10 @@
file.puts "\t-cd bin/plugins/phonon_backend && rm *"
file.puts "\t-cd bin/plugins/qmltooling && rm *"
file.puts "\t-cd bin/plugins/sqldrivers && rm *"
file.puts "\t-cd bin/1.8 && rm *"
file.puts "\t-cd bin/1.9 && rm *"
file.puts "\t-cd lib/1.8 && rm *"
file.puts "\t-cd bin/2.0 && rm *"
file.puts "\t-cd lib/1.9 && rm *"
file.puts "\t-cd lib/2.0 && rm *"
file.puts "\t-rm Makefile"
file.puts "\t-rm qtbindings-*.gem"
file.puts ""
Expand Down
504 changes: 260 additions & 244 deletions lib/Qt/qtruby4.rb
100755 → 100644

Large diffs are not rendered by default.

97 changes: 89 additions & 8 deletions lib/Qt4.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,101 @@
windows = false
platform = RUBY_PLATFORM.split("-")[1]
windows = true if platform == 'mswin32' or platform == 'mingw32'
windows = true if platform =~ /mswin32/ or platform =~ /mingw32/

module Qt
PLUGIN_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'plugins'))
end
if RUBY_VERSION.split('.')[1].to_i == 8
if windows
ENV['PATH'] = File.join(File.dirname(__FILE__), '../bin') + ';' + File.join(File.dirname(__FILE__), '../lib/1.8') + ';' + File.join(File.dirname(__FILE__), '../bin/plugins') + ';' + File.join(File.dirname(__FILE__), '../bin/1.8') + ';' + ENV['PATH']
end
$: << File.join(File.dirname(__FILE__), '../lib/1.8')
require '1.8/qtruby4'
else
if RUBY_VERSION.split('.')[0].to_i == 1
if windows
ENV['PATH'] = File.join(File.dirname(__FILE__), '../bin') + ';' + File.join(File.dirname(__FILE__), '../lib/1.9') + ';' + File.join(File.dirname(__FILE__), '../bin/plugins') + ';' + File.join(File.dirname(__FILE__), '../bin/1.9') + ';' + ENV['PATH']
end
$: << File.join(File.dirname(__FILE__), '../lib/1.9')
require '1.9/qtruby4'
else
if windows
ENV['PATH'] = File.join(File.dirname(__FILE__), '../bin') + ';' + File.join(File.dirname(__FILE__), '../lib/2.0') + ';' + File.join(File.dirname(__FILE__), '../bin/plugins') + ';' + File.join(File.dirname(__FILE__), '../bin/2.0') + ';' + ENV['PATH']
end
$: << File.join(File.dirname(__FILE__), '../lib/2.0')
require '2.0/qtruby4'
end

module Qt
class RubyThreadFix < Qt::Object
slots 'ruby_thread_timeout()'
slots 'callback_timeout()'
slots 'callback_timeout2()'
@@queue = Queue.new

def initialize
super()
# Enable threading
@ruby_thread_sleep_period = 0.01
@ruby_thread_timer = Qt::Timer.new(self)
connect(@ruby_thread_timer, SIGNAL('timeout()'), SLOT('ruby_thread_timeout()'))
@ruby_thread_timer.start(0)
@callback_timer = Qt::Timer.new(self)
connect(@callback_timer, SIGNAL('timeout()'), SLOT('callback_timeout()'))
@callback_timer.start(1)
@callback_timer2 = Qt::Timer.new(self)
connect(@callback_timer2, SIGNAL('timeout()'), SLOT('callback_timeout2()'))
@running = true
end

def ruby_thread_timeout
sleep(@ruby_thread_sleep_period)
end

def callback_timeout
if !@@queue.empty?
# Start a backup timer in case this one goes modal.
@callback_timer2.start(100)
@@queue.pop.call until @@queue.empty?
# Cancel the backup timer
@callback_timer2.stop if @callback_timer2
end
end

def callback_timeout2
@callback_timer2.interval = 10
@@queue.pop.call until @@queue.empty?
end

def self.queue
@@queue
end

def stop
if @running
@running = false
@ruby_thread_timer.stop
@callback_timer.stop
@callback_timer2.stop
@ruby_thread_timer.dispose
@callback_timer.dispose
@callback_timer2.dispose
@ruby_thread_timer = nil
@callback_timer = nil
@callback_timer2 = nil
end
end
end

def self.execute_in_main_thread (blocking = false, sleep_period = 0.001, delay_execution = false)
if Thread.current != Thread.main
complete = false
RubyThreadFix.queue << lambda {|| yield; complete = true}
if blocking
until complete
sleep(sleep_period)
end
end
else
if delay_execution
RubyThreadFix.queue << lambda {|| yield; complete = true}
else
yield
end
end
end

end # module Qt
2 changes: 1 addition & 1 deletion qtbindings.gemspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require './lib/qtbindings_version'

spec = Gem::Specification.new do |s|
s.authors = ['Richard Dale', 'Arno Rehn', 'Ryan Melton']
s.authors = ['Ryan Melton', 'Jason Thomas', 'Richard Dale', 'Arno Rehn']
s.email = 'kde-bindings@kde.org'
s.rubyforge_project = 'qtbindings'
s.summary = "Qt bindings for ruby"
Expand Down
2 changes: 1 addition & 1 deletion qtbindingsnative.gemspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require './lib/qtbindings_version'

spec = Gem::Specification.new do |s|
s.authors = ['Richard Dale', 'Arno Rehn', 'Ryan Melton']
s.authors = ['Ryan Melton', 'Jason Thomas', 'Richard Dale', 'Arno Rehn']
s.email = 'kde-bindings@kde.org'
s.rubyforge_project = 'qtbindings'
s.platform = Gem::Platform::CURRENT
Expand Down