diff options
| author | Amir Rajan <[email protected]> | 2021-03-11 13:17:09 -0600 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-11 13:17:09 -0600 |
| commit | a2d92c2bf09bcdc494f1391af69b707cca281a16 (patch) | |
| tree | bf27b6def8bedf16174aa271a4eb26d81e278a0f | |
| parent | cd14cc76cb4e17465fcc228d69dc1ae7efca81b1 (diff) | |
| download | dragonruby-game-toolkit-contrib-a2d92c2bf09bcdc494f1391af69b707cca281a16.tar.gz dragonruby-game-toolkit-contrib-a2d92c2bf09bcdc494f1391af69b707cca281a16.zip | |
Create hotload.rb
| -rw-r--r-- | dragon/hotload.rb | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/dragon/hotload.rb b/dragon/hotload.rb new file mode 100644 index 0000000..0539ca6 --- /dev/null +++ b/dragon/hotload.rb @@ -0,0 +1,156 @@ +# coding: utf-8 +# Copyright 2019 DragonRuby LLC +# MIT License +# hotlaod.rb has been released under MIT (*only this file*). + +module GTK + class Runtime + # @visibility private + module Hotload + def hotload_init + @hotload_if_needed = 0 + @mailbox_if_needed = 0 + @file_mtimes = { } + @suppress_mailbox = true + files_to_reload.each { |f| init_mtimes f } + init_mtimes 'app/mailbox.rb' + end + + def hotload_on_write_file file_name + return unless file_name.include? 'mailbox.rb' + @mailbox_if_needed = :force + end + + def files_to_reload + if @rcb_release_mode + core_files_to_reload + @required_files + else + [ + 'dragon/docs.rb', + 'dragon/help.rb', + 'dragon/kernel_docs.rb', + 'dragon/kernel.rb', + 'dragon/easing.rb', + 'dragon/top_level.rb', + 'dragon/log.rb', + 'dragon/geometry.rb', + 'dragon/attr_gtk.rb', + 'dragon/attr_sprite.rb', + 'dragon/object.rb', + 'dragon/class.rb', + 'dragon/string.rb', + 'dragon/entity.rb', + 'dragon/strict_entity.rb', + 'dragon/open_entity.rb', + 'dragon/serialize.rb', + 'dragon/primitive.rb', + 'dragon/nil_class_false_class.rb', + 'dragon/symbol.rb', + 'dragon/numeric_deprecated.rb', + 'dragon/numeric.rb', + 'dragon/hash.rb', + 'dragon/outputs_deprecated.rb', + 'dragon/array_docs.rb', + 'dragon/array.rb', + 'dragon/outputs.rb', + 'dragon/inputs.rb', + 'dragon/mouse_docs.rb', + 'dragon/recording.rb', + 'dragon/grid.rb', + 'dragon/layout.rb', + 'dragon/args_deprecated.rb', + 'dragon/args.rb', + 'dragon/console_prompt.rb', + 'dragon/console_menu.rb', + 'dragon/console.rb', + 'dragon/assert.rb', + 'dragon/tests.rb', + 'dragon/controller_config.rb', + 'dragon/runtime/draw.rb', + 'dragon/runtime/deprecated.rb', + 'dragon/runtime/framerate.rb', + 'dragon/runtime/c_bridge.rb', + 'dragon/runtime/hotload.rb', + 'dragon/runtime/backup.rb', + 'dragon/runtime/async_require.rb', + 'dragon/runtime/autocomplete.rb', + 'dragon/runtime.rb', + 'dragon/trace.rb', + 'dragon/readme_docs.rb', + 'dragon/hotload_client.rb', + 'dragon/ios_wizard.rb', + 'dragon/itch_wizard.rb', + ] + core_files_to_reload + @required_files + end + end + + def core_files_to_reload + [ + 'repl.rb', + 'app/main.rb', + 'app/repl.rb', + 'app/tests.rb', + 'app/test.rb', + 'app/stdin.rb' + ] + end + + def init_mtimes file + current_key = "current_#{file}".to_sym + last_key = "last_#{file}".to_sym + @file_mtimes[current_key] ||= @ffi_file.mtime(file) + @file_mtimes[last_key] ||= @ffi_file.mtime(file) + end + + def hotload_source_files + @hotload_if_needed += 1 + return unless @hotload_if_needed == 60 + @hotload_if_needed = 0 + files_to_reload.each { |f| reload_if_needed f } + console.enable + end + + def mailbox_timeout + if @suppress_mailbox + 60 + else + 3 + end + end + + def check_mailbox + if @mailbox_if_needed == :force # lol + reload_if_needed 'app/mailbox.rb', true + @mailbox_if_needed = 1 + return + end + @mailbox_if_needed += 1 + return unless @mailbox_if_needed.mod_zero? mailbox_timeout + @mailbox_if_needed = 1 + reload_if_needed 'app/mailbox.rb' + end + + def hotload_if_needed + hotload_source_files + check_mailbox + end + + def on_load_succeeded file + @rcb_sender.files_reloaded << file + @rcb_sender.reloaded_files << file + Trace.untrace_classes! + end + + def reload_if_needed file, force = false + current_key = "current_#{file}".to_sym + last_key = "last_#{file}".to_sym + @file_mtimes[current_key] ||= nil + @file_mtimes[last_key] ||= nil + @file_mtimes[current_key] = @ffi_file.mtime(file) + return if !force && @file_mtimes[last_key] == @file_mtimes[current_key] + on_load_succeeded file if reload_ruby_file file + @file_mtimes[last_key] = @file_mtimes[current_key] + end + end + end +end |
