File: gtk_pseudo_signal_handler.rb

package info (click to toggle)
mikutter 3.8.6%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 10,544 kB
  • sloc: ruby: 20,548; sh: 99; makefile: 19
file content (33 lines) | stat: -rw-r--r-- 1,084 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# -*- coding: utf-8 -*-

=begin rdoc
  どんなオブジェクトでも、GLib::Objectのように、signalを発生させたり設定したりできるようにするモジュール。
=end
module PseudoSignalHandler

  # シグナル _signal_ に、ハンドラを登録する。シグナルIDを返す。
  def signal_connect(signal, proc=Proc.new)
    __signals[signal.to_sym] << proc
    proc.__id__ end

  # シグナルID _sid_ の登録を解除する
  def signal_handler_disconnect(sid)
    __signals.each{ |pair|
      break if pair.last.reject!{ |handler| handler.__id__ == sid } }
    self end

  # シグナル _signal_ を発生させる。
  # シグナルには、第一引数に _self_ 、第二引数以降に _args_ が渡される。
  def signal_emit(signal, *args)
    __signals[signal.to_sym].each{ |handler|
      Delayer.new{
        if not destroyed?
          handler.call(*[self, *args][0, (handler.arity <= -1 ? (args.size + 1) : handler.arity)]) end } }
    self end

  private

  def __signals
    @__signals ||= Hash.new{ |h, k| h[k] = [] } end

end