Sha256: f09faa683ec32b274e499f502c65122234653a7708a4141dd699ef84287d475d

Contents?: true

Size: 1.42 KB

Versions: 10

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

10 entries across 10 versions & 1 rubygems

Version Path
gir_ffi-0.15.9 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.8 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.7 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.6 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.5 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.4 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.3 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.2 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.1 lib/ffi-glib/main_loop.rb
gir_ffi-0.15.0 lib/ffi-glib/main_loop.rb