Sha256: 8a6d8bd399eaa44f389ae12923d7b1329dd391f6dad13d00ecc23787c9c90b24
Contents?: true
Size: 1.42 KB
Versions: 3
Compression:
Stored size: 1.42 KB
Contents
# frozen_string_literal: true require 'singleton' GLib.load_class :MainLoop module GLib # Overrides for GMainLoop, GLib's event loop class MainLoop # Class encapsulationg logic for running an idle handler to make Ruby code # run during GLib's event loop. class ThreadEnabler include Singleton FRAMERATE = 25 DEFAULT_TIMEOUT = 1000 / FRAMERATE def initialize(timeout = DEFAULT_TIMEOUT) @timeout = timeout end def setup_idle_handler @handler_id ||= GLib.timeout_add(GLib::PRIORITY_DEFAULT, @timeout, &handler_proc) end private def handler_proc proc do ::Thread.pass true end end end EXCEPTIONS = [] RUNNING_LOOPS = [] setup_instance_method! :run def run_with_thread_enabler ThreadEnabler.instance.setup_idle_handler if RUBY_ENGINE == 'ruby' RUNNING_LOOPS << self result = run_without_thread_enabler exception = EXCEPTIONS.shift RUNNING_LOOPS.pop raise exception if exception result end def self.handle_exception(exception) current_loop = RUNNING_LOOPS.last raise exception unless current_loop EXCEPTIONS << exception current_loop.quit end alias run_without_thread_enabler run alias run run_with_thread_enabler end end Signal.trap 'INT' do GLib::MainLoop.handle_exception(Interrupt.new) end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
gir_ffi-0.14.1 | lib/ffi-glib/main_loop.rb |
gir_ffi-0.14.0 | lib/ffi-glib/main_loop.rb |
gir_ffi-0.13.1 | lib/ffi-glib/main_loop.rb |