Class: RbSDL2::EventQueue
- Inherits:
-
Object
- Object
- RbSDL2::EventQueue
- Defined in:
- lib/rb_sdl2/event/event_queue.rb
Instance Attribute Summary collapse
-
#max_type ⇒ Object
readonly
Returns the value of attribute max_type.
-
#min_type ⇒ Object
readonly
Returns the value of attribute min_type.
Class Method Summary collapse
- .clear ⇒ Object
- .count ⇒ Object
- .exist?(type = nil) ⇒ Boolean
- .poll ⇒ Object
-
.pump ⇒ Object
メインスレッドから呼び出した方が良い。.
-
.push!(event) ⇒ Object
イベントをキューに入れる。enq との違いは push ではイベントコールバックを起動する。 成功した場合は引数のイベントを戻す。フィルターされた場合は nil を戻す。 キューに入れることが失敗したら例外が発生する。.
- .wait(sec = nil) ⇒ Object
Instance Method Summary collapse
- #empty? ⇒ Boolean
-
#initialize(type = nil) ⇒ EventQueue
constructor
Thread::SizedQueue のように振る舞う。.
- #length ⇒ Object (also: #size)
- #pop(non_block = false) ⇒ Object (also: #deq, #shift)
-
#push(event, non_block = false) ⇒ Object
(also: #<<, #enq)
戻り値は不定(定義なし).
Constructor Details
#initialize(type = nil) ⇒ EventQueue
Thread::SizedQueue のように振る舞う。
67 68 69 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 67 def initialize(type = nil) @min_type, @max_type = EventType.to_types(type) end |
Instance Attribute Details
#max_type ⇒ Object (readonly)
Returns the value of attribute max_type.
71 72 73 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 71 def max_type @max_type end |
#min_type ⇒ Object (readonly)
Returns the value of attribute min_type.
71 72 73 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 71 def min_type @min_type end |
Class Method Details
.clear ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 8 def clear # SDL_FlushEvents() は SDL_DROPFILE, SDL_DROPTEXT の場合に file メンバーのポインターは開放しない。 # そのため Ruby 側でポインターの開放を行う。 ptr = EventPointer.malloc ref_ptr = ptr + ::SDL::DropEvent.offset_of(:file) while ::SDL.PeepEvents(ptr, 1, ::SDL::GETEVENT, ::SDL::DROPFILE, ::SDL::DROPTEXT) > 0 ::SDL.free(ref_ptr) end # SDL_FlushEvents() は SDL_TEXTEDITING_EXT の場合に text メンバーのポインターは開放しない。 # そのため Ruby 側でポインターの開放を行う。 ref_ptr = ptr + ::SDL::TextEditingExtEvent.offset_of(:text) while ::SDL.PeepEvents(ptr, 1, ::SDL::GETEVENT, ::SDL::TEXTEDITING_EXT, ::SDL::TEXTEDITING_EXT) > 0 ::SDL.free(ref_ptr) end ::SDL.FlushEvents(::SDL::FIRSTEVENT, ::SDL::LASTEVENT) end |
.count ⇒ Object
25 26 27 28 29 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 25 def count num = ::SDL.PeepEvents(nil, 0, ::SDL::PEEKEVENT, ::SDL::FIRSTEVENT, ::SDL::LASTEVENT) raise RbSDL2Error if num < 0 num end |
.exist?(type = nil) ⇒ Boolean
31 32 33 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 31 def exist?(type = nil) ::SDL.HasEvents(*EventType.to_types(type)) == ::SDL::TRUE end |
.poll ⇒ Object
35 36 37 38 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 35 def poll ptr = EventPointer.malloc ::SDL.PollEvent(ptr).nonzero? && Event.to_ptr(ptr) end |
.pump ⇒ Object
メインスレッドから呼び出した方が良い。
41 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 41 def pump = ::SDL.PumpEvents |
.push!(event) ⇒ Object
イベントをキューに入れる。enq との違いは push ではイベントコールバックを起動する。 成功した場合は引数のイベントを戻す。フィルターされた場合は nil を戻す。 キューに入れることが失敗したら例外が発生する。
46 47 48 49 50 51 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 46 def push!(event) ptr = EventPointer.copy(event.to_ptr) num = ::SDL.PushEvent(ptr) raise RbSDL2Error if num < 0 num > 0 ? event : nil end |
.wait(sec = nil) ⇒ Object
53 54 55 56 57 58 59 60 61 62 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 53 def wait(sec = nil) ptr = EventPointer.malloc if sec.nil? ::SDL.WaitEvent(ptr).nonzero? && Event.to_ptr(ptr) elsif sec >= 0 ::SDL.WaitEventTimeout(ptr, sec * 1000).nonzero? && Event.to_ptr(ptr) else raise ArgumentError end end |
Instance Method Details
#empty? ⇒ Boolean
83 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 83 def empty? = length == 0 |
#length ⇒ Object Also known as: size
73 74 75 76 77 78 79 80 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 73 def length # SDL_PeepEvents に SDL_PEEKEVENT を与えた時のエラー条件 # - イベントシステムがシャットダウンしている場合。 # - イベントキューのロックが取得できない場合。 num = ::SDL.PeepEvents(nil, 0, ::SDL::PEEKEVENT, min_type, max_type) raise RbSDL2Error if num < 0 num end |
#pop(non_block = false) ⇒ Object Also known as: deq, shift
101 102 103 104 105 106 107 108 109 110 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 101 def pop(non_block = false) ptr = EventPointer.malloc # SDL_PeepEvents に SDL_GETEVENT を与えた時ののエラー条件 # - イベントシステムがシャットダウンしている場合。 # - イベントキューのロックが取得できない場合。 while ::SDL.PeepEvents(ptr, 1, ::SDL::GETEVENT, min_type, max_type) <= 0 raise RbSDL2Error if non_block end Event.to_ptr(ptr) end |
#push(event, non_block = false) ⇒ Object Also known as: <<, enq
戻り値は不定(定義なし)
86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/rb_sdl2/event/event_queue.rb', line 86 def push(event, non_block = false) # SDL_PeepEvents に SDL_ADDEVENT を与えた時ののエラー条件 # - イベントシステムがシャットダウンしている場合。 # - イベントキューのロックが取得できない場合。 # 以下の条件の場合はエラーではなく 0 が戻る。 # - イベントキューのイベント数が上限に達した場合。 # - イベントキューが追加のメモリーが確保できない場合。 ptr = EventPointer.copy(event.to_ptr) while ::SDL.PeepEvents(ptr, 1, ::SDL::ADDEVENT, min_type, max_type) <= 0 raise RbSDL2Error if non_block end end |