class RbSDL2::Event::EventFilter

Public Class Methods

add_watch_callback(obj, userdata = nil) click to toggle source
# File lib/rb_sdl2/event/event_filter.rb, line 36
def add_watch_callback(obj, userdata = nil)
  func = if Proc === obj
           new(&obj)
         else
           obj
         end
  obj_userdata = [obj, userdata]
  @watch_mutex.synchronize do
    ::SDL2.SDL_AddEventWatch(func, userdata)
    @watch_callbacks << [obj_userdata, func]
  end
  obj_userdata
end
filter_callback_defined?() click to toggle source

SDL にフィルターコールバック関数が設定されている場合に true を戻す。

# File lib/rb_sdl2/event/event_filter.rb, line 24
def filter_callback_defined?
  _func_userdata = Array.new(2) { ::FFI::MemoryPointer.new(:pointer) }
  # SDL_GetEventFilter はコールバックのポインター関数が NULL の場合に SDL_FALSE となる。
  # userdata ポインターが設定されていても SDL_GetEventFilter の戻り値に関与しない。
  ::SDL2.SDL_GetEventFilter(*_func_userdata) == ::SDL2::SDL_TRUE
end
filter_callback_set(obj, userdata = nil) click to toggle source
# File lib/rb_sdl2/event/event_filter.rb, line 8
def filter_callback_set(obj, userdata = nil)
  func = if Proc === obj
           # イベントを削除する時にイベントメンバーのポインターを開放(Event#clear)する。
           new { |event| obj.call(event) || (event.clear; nil) }
         else
           obj
         end
  # func, userdata の対の関係を保つ。
  @filter_mutex.synchronize do
    ::SDL2.SDL_SetEventFilter(func, userdata)
    @filter_callback = [func, userdata]
  end
  [obj, userdata]
end
new() { |obj| ... } click to toggle source

引数ブロックへはコールバック実行時に Event のインスタンス(のデリゲーター)が与えられる。 与えられた Event インスタンスは引数ブロック終了後に nil に変化する(デリゲート先を変更している)。 SDL がイベントコールバックへ与えるイベントへのポインターがイベントキューの一部を直接指しているため コールバックを抜けた後にイベント内容の永続性が保証ができない(たぶん別のイベント内容になるだろう)。 引数ブロックに与えられたオブジェクトをスコープ外に持ち出しても安全である。 オブジェクトではなくイベントの内容をスコープ外に持ち出したい場合は 与えられたオブジェクトをコピー(clone, dup)すればよい。

Calls superclass method
# File lib/rb_sdl2/event/event_filter.rb, line 72
def initialize
  # typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
  super(:int, [:pointer, :pointer]) do |_userdata, ptr|
    obj = SimpleDelegator.new(Event.to_ptr(ptr))
    yield(obj) ? 1 : 0
  ensure
    obj.__setobj__(nil)
  end
end
remove_watch_callback(obj, userdata = nil) click to toggle source
# File lib/rb_sdl2/event/event_filter.rb, line 50
def remove_watch_callback(obj, userdata = nil)
  obj_userdata = [obj, userdata]
  @watch_mutex.synchronize do
    idx = @watch_callbacks.index { |obj| obj.first == obj_userdata }
    if idx
      _, func = @watch_callbacks.delete_at(idx)
      ::SDL2.SDL_DelEventWatch(func, userdata)
    end
  end
  obj_userdata
end