Project

glfw-ruby

0.0
No release in over 3 years
Pure Ruby FFI bindings for the GLFW library, providing both low-level C API access and high-level Ruby OOP interface for OpenGL/Vulkan window, context, and input management.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Runtime

~> 1.15
 Project Readme

glfw-ruby

Pure Ruby FFI bindings for GLFW 3.3/3.4.

This gem exposes:

  • GLFW::API for low-level access that stays close to the C API
  • Ruby-friendly wrappers such as GLFW::Window, GLFW::Monitor, GLFW::Cursor, GLFW::Joystick, and GLFW::Gamepad
  • GLFW 3.4 additions including platform queries, allocator support, and Vulkan loader hooks

The gem does not bundle GLFW itself. You need a native GLFW shared library installed on the machine.

Requirements

  • Ruby >= 3.1
  • A native GLFW 3.3 or 3.4 shared library available to the dynamic linker

If the loader cannot find the library automatically, set GLFW_LIB_PATH to the full path of the shared library.

Installation

Add the gem:

bundle add glfw

Or install it directly:

gem install glfw

Install the native GLFW library separately:

macOS

brew install glfw

Ubuntu / Debian

sudo apt-get install libglfw3

Windows

Install a GLFW DLL and make sure it is on PATH, or point GLFW_LIB_PATH at the DLL file.

Quick Start

require "glfw"

GLFW.on_error do |code, description|
  warn "[GLFW #{code}] #{description}"
end

GLFW.init

begin
  window = GLFW::Window.new(
    800,
    600,
    "Hello GLFW",
    visible: false,
    context_version_major: 3,
    context_version_minor: 3
  )

  window.make_context_current
  window.show

  until window.should_close?
    # draw here
    window.swap_buffers
    GLFW.poll_events
  end
ensure
  window&.destroy
  GLFW.terminate
end

Examples

Example scripts live in examples/ and can be run from a source checkout.

bundle exec ruby examples/01_minimal_window.rb

Available examples:

  • examples/01_minimal_window.rb - smallest window + event loop example
  • examples/02_input_callbacks.rb - keyboard, mouse, cursor, scroll, and drop callbacks
  • examples/03_window_attributes.rb - window title, size, position, opacity, and attribute changes
  • examples/04_monitor_info.rb - monitor enumeration and video mode inspection
  • examples/05_custom_cursor_and_icon.rb - generated cursor and window icon data
  • examples/06_gamepad_inspector.rb - joystick and gamepad state inspector
  • examples/07_glfw_34_features.rb - platform queries and other GLFW 3.4 runtime-only features

On headless Linux, run windowed examples under Xvfb.

High-Level API

The high-level layer wraps common GLFW concepts in plain Ruby objects.

GLFW

  • GLFW.init / GLFW.terminate
  • GLFW.version
  • GLFW.version_at_least?(major, minor)
  • GLFW.poll_events
  • GLFW.wait_events(timeout: nil)
  • GLFW.post_empty_event
  • GLFW.time / GLFW.time=
  • GLFW.clipboard / GLFW.clipboard=
  • GLFW.platform (GLFW 3.4+ runtime only)
  • GLFW.platform_supported?(platform_constant) (GLFW 3.4+ runtime only)
  • GLFW.on_error { |code, description| ... }

GLFW::Window

Supports window creation, context management, input polling, attributes, and callbacks.

Examples of supported operations:

  • title, size, position, framebuffer size, frame size, content scale, opacity
  • show / hide / focus / maximize / restore / iconify
  • fullscreen and windowed transitions
  • icon updates via set_icon / clear_icon
  • cursor assignment and cursor position access
  • keyboard and mouse input queries
  • callbacks such as on_key, on_char, on_mouse_button, on_cursor_pos, on_scroll, on_drop, on_resize, on_close, and more

Window hints are passed as keyword arguments:

window = GLFW::Window.new(
  1280,
  720,
  "Example",
  visible: false,
  resizable: true,
  opengl_profile: :core,
  context_version_major: 4,
  context_version_minor: 1
)

GLFW::Monitor

  • GLFW::Monitor.all
  • GLFW::Monitor.primary
  • monitor name, position, workarea, physical size, content scale
  • video modes and current video mode
  • gamma and gamma ramps
  • hotplug callback via GLFW::Monitor.on_connect

GLFW::Cursor and GLFW::Image

  • create standard cursors with GLFW::Cursor.standard
  • create custom cursors from RGBA image data with GLFW::Cursor.create
  • build image payloads with GLFW::Image.from_rgba

GLFW::Joystick and GLFW::Gamepad

  • joystick presence, name, GUID, axes, buttons, hats
  • gamepad detection and state access
  • gamepad mapping updates
  • joystick connection callback via GLFW::Joystick.on_connect

Low-Level API

GLFW::API mirrors the native C API through FFI attach_function declarations. Use it when you want direct access to GLFW without the object wrappers.

require "glfw"

puts GLFW::API.glfwGetVersionString
puts GLFW::API.glfwPlatformSupported(GLFW::GLFW_PLATFORM_X11)

Low-level types live under GLFW::API, including:

  • GLFWvidmode
  • GLFWgammaramp
  • GLFWimage
  • GLFWgamepadstate
  • GLFWallocator

The binding also exposes the usual GLFW constants, error codes, window hints, platform constants, input constants, and cursor shapes.

Errors

Base error classes:

  • GLFW::Error
  • GLFW::LibraryNotFoundError
  • GLFW::InitError
  • GLFW::NotSupportedError
  • GLFW::APIError

If no custom error callback is registered, GLFW.init installs a default callback that prints GLFW error messages to stderr.

Development

Install dependencies:

bundle install

Run the test suite:

bundle exec rspec

Or run the default task:

bundle exec rake

On headless Linux, run specs under Xvfb:

xvfb-run -a bundle exec rspec

Contributing

Issues and pull requests are welcome at:

License

Released under the MIT License.