Module: Doom::Platform::SDLKeyboardGrab

Defined in:
lib/doom/platform/sdl.rb

Overview

SDL2 keyboard grab via Gosu's bundled SDL -- prevents OS key interception.

Class Method Summary collapse

Class Method Details

.grab!Object



26
27
28
29
30
# File 'lib/doom/platform/sdl.rb', line 26

def self.grab!
  return unless @ready

  @set_kb_grab.call(@shared_window.call, 1)
end

.release!Object



32
33
34
35
36
# File 'lib/doom/platform/sdl.rb', line 32

def self.release!
  return unless @ready

  @set_kb_grab.call(@shared_window.call, 0)
end

.setupObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/doom/platform/sdl.rb', line 7

def self.setup
  require 'fiddle'
  gosu_spec = Gem.loaded_specs['gosu']
  lib_ext = RbConfig::CONFIG['DLEXT'] || 'so'
  bundle = File.join(gosu_spec.full_gem_path, 'lib', "gosu.#{lib_ext}")
  @lib = Fiddle.dlopen(bundle)
  @shared_window = Fiddle::Function.new(
    @lib['_ZN4Gosu13shared_windowEv'], [], Fiddle::TYPE_VOIDP
  )
  @set_kb_grab = Fiddle::Function.new(
    @lib['SDL_SetWindowKeyboardGrab'],
    [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT], Fiddle::TYPE_VOID
  )
  @ready = true
rescue StandardError, LoadError => e
  warn "SDLKeyboardGrab.setup failed: #{e.class}: #{e.message}"
  @ready = false
end