Class: RbSDL2::EventQueue

Inherits:
Object
  • Object
show all
Defined in:
lib/rb_sdl2/event/event_queue.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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_typeObject (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_typeObject (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

.clearObject



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

.countObject

Raises:



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

Returns:

  • (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

.pollObject



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

.pumpObject

メインスレッドから呼び出した方が良い。



41
# File 'lib/rb_sdl2/event/event_queue.rb', line 41

def pump = ::SDL.PumpEvents

.push!(event) ⇒ Object

イベントをキューに入れる。enq との違いは push ではイベントコールバックを起動する。 成功した場合は引数のイベントを戻す。フィルターされた場合は nil を戻す。 キューに入れることが失敗したら例外が発生する。

Raises:



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

Returns:

  • (Boolean)


83
# File 'lib/rb_sdl2/event/event_queue.rb', line 83

def empty? = length == 0

#lengthObject Also known as: size

Raises:



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