Class: RbSDL2::EventFilter
- Inherits:
-
FFI::Function
- Object
- FFI::Function
- RbSDL2::EventFilter
- Defined in:
- lib/rb_sdl2/event/event_filter.rb
Defined Under Namespace
Classes: Releaser
Class Method Summary collapse
- .define_watch(func) ⇒ Object
-
.filter_callback_defined? ⇒ Boolean
SDL にフィルターコールバック関数が設定されている場合に true を戻す。.
- .undefine_watch(func) ⇒ Object
Instance Method Summary collapse
-
#initialize(proc) ⇒ EventFilter
constructor
コールバックにはコピーしたイベントが与えられます。 よって SDL のイベントキューにあるイベントを書き換えることはできません。.
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 を戻す。
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 |