class RbSDL2::Event

Public Class Methods

new(type: 0, **members) click to toggle source
Calls superclass method
# File lib/rb_sdl2/event.rb, line 36
def new(type: 0, **members)
  ptr = EventPointer.malloc
  num = Numeric === type ? type : EventType.to_num(type)
  ptr.write_uint32(num)
  obj = super(ptr)
  if obj.typed?
    members.each_pair { |sym, val| obj[sym] = val }
  end
  obj
end
new(ptr) click to toggle source

UserEvent の data1, data2 メンバー、SysWMEvent の msg メンバーはポインターである。 ポインターとしての読み書きの対応はしている。しかしポインターが指し示すメモリーの管理は行わない。

# File lib/rb_sdl2/event.rb, line 56
def initialize(ptr)
  @ptr = ptr
end
to_ptr(ptr) click to toggle source
# File lib/rb_sdl2/event.rb, line 47
def to_ptr(ptr)
  obj = allocate
  obj.__send__(:initialize, ptr)
  obj
end

Public Instance Methods

[](sym) click to toggle source
# File lib/rb_sdl2/event.rb, line 60
def [](sym)
  raise ArgumentError unless member?(sym)

  case sym
  when :data
    member[:data].to_a
  when :file
    member[:file].then { |ptr| ptr.null? ? nil : ptr.read_string }
  when :keysym
    member[:keysym].then { |st| {scancode: st[:scancode], sym: st[:sym], mod: st[:mod]} }
  when :text
    member[:text].to_s
  else
    member[sym]
  end
end
[]=(sym, val) click to toggle source

DropEvent の file メンバーのポインターの管理は行われる。 UserEvent の data1, data2 メンバーと SysWMEvent の msg メンバーはポインターである。 これらのポインターの管理は行ない。アプリケーション側で実装を行うこと。

# File lib/rb_sdl2/event.rb, line 80
def []=(sym, val)
  raise FrozenError if frozen?
  raise ArgumentError unless member?(sym)

  case sym
  when :data
    val.each.with_index { |v, i| member[:data][i] = v }
  when :file
    if drop_file? || drop_text?
      _ptr = member[:file]

      member[:file] = if val.nil?
                        nil
                      else
                        c_str = "#{val}\x00"
                        ptr = ::SDL2.SDL_malloc(c_str.size)
                        raise NoMemoryError if ptr.null?
                        ptr.write_bytes(c_str)
                      end

      ::SDL2.SDL_free(_ptr)
    else
      raise ArgumentError
    end
  when :keysym
    val.each { |k, v| member[:keysym][k] = v }
  when :msg
    if val.nil? || val.respond_to?(:null?) && val.null? || val.respond_to?(:zero?) && val.zero?
      raise ArgumentError
    end
    member[:msg] = val
  when :type
    raise ArgumentError
  else
    member[sym] = val
  end
end
clear() click to toggle source
# File lib/rb_sdl2/event.rb, line 118
def clear
  raise FrozenError if frozen?
  if drop_file? || drop_text?
    self[:file] = nil
  end
  member.clear
  @st = nil
  self
end
initialize_copy(obj) click to toggle source

deep copy を行う。 これは @ptr が イベントキューの一部(SDL の管理領域)を指している場合があるためである。

Calls superclass method
# File lib/rb_sdl2/event.rb, line 130
def initialize_copy(obj)
  super
  @ptr = EventPointer.malloc.write_bytes(obj.to_ptr.read_bytes(::SDL2::SDL_Event.size))
  if drop_file? || drop_text?
    self[:file] = obj[:file]
  end
end
inspect() click to toggle source
# File lib/rb_sdl2/event.rb, line 138
def inspect
  "#<#{self.class.name} ptr=#{@ptr.inspect} name=#{name.inspect} #{to_h}>"
end
member?(name) click to toggle source
# File lib/rb_sdl2/event.rb, line 144
def member?(name) = members.include?(name)

def members = member.members.grep_v(/\Apadding/)

def name = EventType.to_name(type)
alias to_s name

def to_h = members.map { |sym| [sym, self[sym]] }.to_h

def to_ptr = @ptr

def type = to_ptr.read_uint32

include EventType

def typed? = 
members(= member.members.grep_v(/\Apadding/)) click to toggle source
# File lib/rb_sdl2/event.rb, line 146
def members = member.members.grep_v(/\Apadding/)

def name = EventType.to_name(type)
alias to_s name

def to_h = members.map { |sym| [sym, self[sym]] }.to_h

def to_ptr = @ptr

def type = to_ptr.read_uint32

include EventType

def typed? = type 
name(= EventType.to_name(type)) click to toggle source
# File lib/rb_sdl2/event.rb, line 148
def name = EventType.to_name(type)
alias to_s name

def to_h = members.map { |sym| [sym, self[sym]] }.to_h

def to_ptr = @ptr

def type = to_ptr.read_uint32

include EventType

def typed? = type != 
to_h(= members.map { |sym| [sym, self[sym]] }) click to toggle source
# File lib/rb_sdl2/event.rb, line 151
def to_h = members.map { |sym| [sym, self[sym]] }.to_h

def to_ptr = @ptr

def type = to_ptr.read_uint32

include EventType

def typed? = type != 0
to_ptr(= @ptr) click to toggle source
# File lib/rb_sdl2/event.rb, line 153
  def to_ptr = @ptr

  def type = to_ptr.read_uint32

  include EventType

  def typed? = type != 0
end
type(= to_ptr.read_uint32) click to toggle source
# File lib/rb_sdl2/event.rb, line 155
    def type = to_ptr.read_uint32

    include EventType

    def typed? = type != 0
  end
end
typed?(= type != 0) click to toggle source
# File lib/rb_sdl2/event.rb, line 159
  def typed? = type != 0
end

Protected Instance Methods

member(= @st ||= ::SDL2::SDL_Event.new(@ptr)[EventType.to_type(type)]) click to toggle source
# File lib/rb_sdl2/event.rb, line 142
          def member = @st ||= ::SDL2::SDL_Event.new(@ptr)[EventType.to_type(type)]

def member?(name) = members.include?(name)

def members = member.members.grep_v(/\Apadding/)

def name = EventType.to_name(type)
alias to_s name

def to_h = members.map { |sym| [sym, self[sym]] }.to_h

def to_ptr = @ptr

def type = to_ptr.read_uint32

include EventType

def typed?