Class: RbSDL2::EventFilter

Inherits:
FFI::Function
  • Object
show all
Defined in:
lib/rb_sdl2/event/event_filter.rb

Defined Under Namespace

Classes: Releaser

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(proc) ⇒ EventFilter

コールバックにはコピーしたイベントが与えられます。 よって SDL のイベントキューにあるイベントを書き換えることはできません。



37
38
39
40
41
42
43
44
45
# File 'lib/rb_sdl2/event/event_filter.rb', line 37

def initialize(proc)
  # int EventFilter(void* userdata, SDL_Event* event);
  super(:int, [:pointer, :pointer]) do |_userdata, ptr|
    # SDL のイベントキューへの参照ポインターを受け取る場合は必ずコピーを取る必要がある。
    # キューの状態は変化するため、次にアクセスする際にポインター先が存在する保証はない。
    # SDL のイベントキューを参照している間は SDL がキューをロックしているためコピーは安全にできる。
    proc.call( Event.to_ptr(EventPointer.copy(ptr)) ) ? 1 : 0
  end
end

Class Method Details

.define_watch(func) ⇒ Object



13
14
15
16
17
18
# File 'lib/rb_sdl2/event/event_filter.rb', line 13

def define_watch(func)
  ::SDL.AddEventWatch(func, nil)
  @watches << func.__id__
  ptr = ::FFI::Pointer.new(func.address)
  ObjectSpace.define_finalizer(func, Releaser.new(ptr))
end

.filter_callback_defined?Boolean

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

Returns:

  • (Boolean)


27
28
29
# File 'lib/rb_sdl2/event/event_filter.rb', line 27

def filter_callback_defined?
  ::SDL.GetEventFilter(nil, nil) == ::SDL::TRUE
end

.undefine_watch(func) ⇒ Object



20
21
22
23
24
# File 'lib/rb_sdl2/event/event_filter.rb', line 20

def undefine_watch(func)
  func_id = func.__id__
  @watches.delete_if { |id| (id == func_id).tap { ::SDL.DelEventWatch(func, nil) } }
  ObjectSpace.undefine_finalizer(func)
end