summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmir Rajan <[email protected]>2021-03-11 13:17:09 -0600
committerGitHub <[email protected]>2021-03-11 13:17:09 -0600
commita2d92c2bf09bcdc494f1391af69b707cca281a16 (patch)
treebf27b6def8bedf16174aa271a4eb26d81e278a0f
parentcd14cc76cb4e17465fcc228d69dc1ae7efca81b1 (diff)
downloaddragonruby-game-toolkit-contrib-a2d92c2bf09bcdc494f1391af69b707cca281a16.tar.gz
dragonruby-game-toolkit-contrib-a2d92c2bf09bcdc494f1391af69b707cca281a16.zip
Create hotload.rb
-rw-r--r--dragon/hotload.rb156
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