Sha256: fb02d1c78eadc75ab53b0d4138cc63d675edf5815b263bf11b465b9eac99bfaa

Contents?: true

Size: 1.26 KB

Versions: 8

Compression:

Stored size: 1.26 KB

Contents

#From:
#http://ruby-gnome2.sourceforge.jp/hiki.cgi?tips_threads
#helps using Gtk with threads

require 'monitor.rb'

module Gtk
  GTK_PENDING_BLOCKS = []
  GTK_PENDING_BLOCKS_LOCK = Monitor.new

  def Gtk.queue &block
    if Thread.current == Thread.main
      block.call
    else
      GTK_PENDING_BLOCKS_LOCK.synchronize do
        GTK_PENDING_BLOCKS << block
      end
    end
  end

  def Gtk.main_with_queue timeout
    Gtk.timeout_add timeout do
      GTK_PENDING_BLOCKS_LOCK.synchronize do
        for block in GTK_PENDING_BLOCKS
          block.call
        end
        GTK_PENDING_BLOCKS.clear
      end
      true
    end
    Gtk.main
  end
end

##First, force all your your Ruby threads to start from within the main loop using the standard Gtk.init method. You can call Gtk.init as many times as necessary. For example:

#Gtk.init_add do
#  DBus.start_listener
#end

## Start your Gtk application by calling Gtk.main_with_queue rather than Gtk.main. The "timeout" argument is in milliseconds, and it is the maximum time that can pass until queued blocks get called: 100 should be fine.
##
## Whenever you need to queue a call, use Gtk.queue. For example:

# def my_event_callback
#   Gtk.queue do
#     @image.pixbuf = Gdk::Pixbuf.new @image_path, width, height
#   end
# end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
drain-0.7.0 lib/dr/tools/gtk.rb
drain-0.6.0 lib/dr/tools/gtk.rb
drain-0.5.1 lib/dr/tools/gtk.rb
drain-0.5 lib/dr/tools/gtk.rb
drain-0.4 lib/dr/tools/gtk.rb
drain-0.3.0 lib/dr/tools/gtk.rb
drain-0.2.0 lib/dr/tools/gtk.rb
drain-0.1.0 lib/drain/tools/gtk.rb