Support services for Gamnit on GNU/Linux

Introduced classes

class GamnitInputEvent

gamnit :: GamnitInputEvent

SDL2 event wrapper implementing the mnit::input API
class GamnitKeyEvent

gamnit :: GamnitKeyEvent

Event on keyboard input
class GamnitMouseWheelEvent

gamnit :: GamnitMouseWheelEvent

Event on mouse wheel input
class GamnitOtherEvent

gamnit :: GamnitOtherEvent

SDL2 event not handled by gamnit
class GamnitPointerEvent

gamnit :: GamnitPointerEvent

Event on pointer, mouse and finger input
class GamnitQuitEvent

gamnit :: GamnitQuitEvent

Event on user requested quit

Redefined classes

redef class App

gamnit :: gamnit_linux $ App

App subclasses are cross-platform applications
redef class GamnitDisplay

gamnit :: gamnit_linux $ GamnitDisplay

General display class, is sized and drawable
redef extern class SDLEvent

gamnit :: gamnit_linux $ SDLEvent

SDL 2 event, only the data and no metadata
redef extern class SDLKeyboardEvent

gamnit :: gamnit_linux $ SDLKeyboardEvent

Keyboard button event
redef extern class SDLMouseEvent

gamnit :: gamnit_linux $ SDLMouseEvent

Mouse event
redef extern class SDLMouseWheelEvent

gamnit :: gamnit_linux $ SDLMouseWheelEvent

Mouse wheel event
redef extern class SDLQuitEvent

gamnit :: gamnit_linux $ SDLQuitEvent

Quit event, usually from the close window button

All class definitions

redef class App

gamnit :: gamnit_linux $ App

App subclasses are cross-platform applications
redef class GamnitDisplay

gamnit :: gamnit_linux $ GamnitDisplay

General display class, is sized and drawable
class GamnitInputEvent

gamnit $ GamnitInputEvent

SDL2 event wrapper implementing the mnit::input API
class GamnitKeyEvent

gamnit $ GamnitKeyEvent

Event on keyboard input
class GamnitMouseWheelEvent

gamnit $ GamnitMouseWheelEvent

Event on mouse wheel input
class GamnitOtherEvent

gamnit $ GamnitOtherEvent

SDL2 event not handled by gamnit
class GamnitPointerEvent

gamnit $ GamnitPointerEvent

Event on pointer, mouse and finger input
class GamnitQuitEvent

gamnit $ GamnitQuitEvent

Event on user requested quit
redef extern class SDLEvent

gamnit :: gamnit_linux $ SDLEvent

SDL 2 event, only the data and no metadata
redef extern class SDLKeyboardEvent

gamnit :: gamnit_linux $ SDLKeyboardEvent

Keyboard button event
redef extern class SDLMouseEvent

gamnit :: gamnit_linux $ SDLMouseEvent

Mouse event
redef extern class SDLMouseWheelEvent

gamnit :: gamnit_linux $ SDLMouseWheelEvent

Mouse wheel event
redef extern class SDLQuitEvent

gamnit :: gamnit_linux $ SDLQuitEvent

Quit event, usually from the close window button
package_diagram gamnit::gamnit_linux gamnit_linux gamnit gamnit gamnit::gamnit_linux->gamnit gamnit::display_linux display_linux gamnit::gamnit_linux->gamnit::display_linux sdl2::image image gamnit::display_linux->sdl2::image sdl2::mixer mixer gamnit::display_linux->sdl2::mixer gamnit::egl egl gamnit::display_linux->gamnit::egl gamnit::textures textures gamnit::display_linux->gamnit::textures ...gamnit ... ...gamnit->gamnit ...sdl2::image ... ...sdl2::image->sdl2::image ...sdl2::mixer ... ...sdl2::mixer->sdl2::mixer ...gamnit::egl ... ...gamnit::egl->gamnit::egl ...gamnit::textures ... ...gamnit::textures->gamnit::textures gamnit::camera_control_linux camera_control_linux gamnit::camera_control_linux->gamnit::gamnit_linux a_star-m a_star-m a_star-m->gamnit::camera_control_linux a_star-m... ... a_star-m...->a_star-m

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module app

app :: app

app.nit is a framework to create cross-platform applications
module app_base

app :: app_base

Base of the app.nit framework, defines App
module array

core :: array

This module introduces the standard array structure.
module assets

app :: assets

Portable services to load resources from the assets folder
module aware

android :: aware

Android compatibility module
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module c

c :: c

Structures and services for compatibility with the C language
module caching

serialization :: caching

Services for caching serialization engines
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module display

gamnit :: display

Abstract display services
module egl

egl :: egl

Interface between rendering APIs (OpenGL, OpenGL ES, etc.) and the native windowing system.
module egl

gamnit :: egl

Use of EGL to implement Gamnit on GNU/Linux and Android
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module events

sdl2 :: events

SDL 2 events and related services
module exec

core :: exec

Invocation and management of operating system sub-processes.
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module glesv2

glesv2 :: glesv2

OpenGL graphics rendering library for embedded systems, version 2.0
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module image

sdl2 :: image

Services of the SDL_image 2.0 library
module input

mnit :: input

Defines abstract classes for user and general inputs to the application.
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module kernel

core :: kernel

Most basic classes and methods.
module list

core :: list

This module handle double linked lists
module math

core :: math

Mathematical operations
module matrix

matrix :: matrix

Services for matrices of Float values
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module mixer

sdl2 :: mixer

SDL2 mixer with sample/sounds and music
module more_collections

more_collections :: more_collections

Highly specific, but useful, collections-related classes.
module native

core :: native

Native structures for text and bytes
module numeric

core :: numeric

Advanced services for Numeric types
module poset

poset :: poset

Pre order sets and partial order set (ie hierarchies)
module programs

gamnit :: programs

Services for graphical programs with shaders, attributes and uniforms
module protocol

core :: protocol

module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module sdl2

sdl2 :: sdl2

Simple DirectMedia Layer (SDL) 2.0 services for easy window creation and 2D drawing
module sdl2_base

sdl2 :: sdl2_base

Basic SDL 2 features
module serialization

serialization :: serialization

General serialization services
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module syswm

sdl2 :: syswm

Window manager related SDL 2 services
module text

core :: text

All the classes and methods related to the manipulation of text entities
module textures

gamnit :: textures

Load textures, create subtextures and manage their life-cycle
module time

core :: time

Management of time and dates
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O

Parents

module display_linux

gamnit :: display_linux

Gamnit display implementation for GNU/Linux using egl, sdl and x11
module gamnit

gamnit :: gamnit

Game and multimedia framework for Nit

Children

module camera_control_linux

gamnit :: camera_control_linux

Mouse wheel and middle mouse button to control camera

Descendants

module a_star-m

a_star-m

# Support services for Gamnit on GNU/Linux
module gamnit_linux

import sdl2::events

intrude import gamnit
intrude import display_linux

redef class App
	private var sdl_event_buffer = new SDLEventBuffer.malloc

	redef fun feed_events
	do
		var display = display
		if display == null then return

		loop
			var avail = sdl_event_buffer.poll_event
			if not avail then break

			# Convert to an SDL event with data
			var sdl_event = sdl_event_buffer.to_event
			if sdl_event isa SDLWindowEvent and sdl_event.is_resized then
				display.width = sdl_event.data1
				display.height = sdl_event.data2
				display.aspect_ratio = sdl_event.data1.to_f / sdl_event.data2.to_f
				on_resize display
			end

			# Convert to `mnit::inputs` conforming objects
			var gamnit_event = sdl_event.to_gamnit_event(sdl_event_buffer)
			accept_event gamnit_event
		end
	end

	redef fun on_create
	do
		super
		create_display
		create_gamnit
		create_scene
	end
end

redef class GamnitDisplay
	redef var aspect_ratio = super is lazy
end

# ---
# Redef services from `sdl2::events`

redef class SDLEvent
	private fun to_gamnit_event(buffer: SDLEventBuffer): GamnitInputEvent
	do return new GamnitOtherEvent(buffer, self)
end

redef class SDLQuitEvent
	redef fun to_gamnit_event(buffer) do return new GamnitQuitEvent(buffer, self)
end

redef class SDLMouseEvent
	redef fun to_gamnit_event(buffer) do return new GamnitPointerEvent(buffer, self)
end

redef class SDLMouseWheelEvent
	redef fun to_gamnit_event(buffer) do return new GamnitMouseWheelEvent(buffer, self)
end

redef class SDLKeyboardEvent
	redef fun to_gamnit_event(buffer) do return new GamnitKeyEvent(buffer, self)
end

# ---
# Implement `mnit::inputs` interfaces

# SDL2 event wrapper implementing the `mnit::input` API
#
# There is two views to the underlying native object: `buffer` and `native`.
class GamnitInputEvent
	super InputEvent

	# Native SDL 2 event buffer with the pseudo class hierarchy metadata
	var buffer: SDLEventBuffer

	# Native SDL 2 event
	var native: NATIVE

	# Type of the `native` underlying SDL 2 event
	type NATIVE: SDLEvent
end

# Event on user requested quit
class GamnitQuitEvent
	super GamnitInputEvent
	super QuitEvent

	redef type NATIVE: SDLQuitEvent
end

# Event on keyboard input
class GamnitKeyEvent
	super GamnitInputEvent
	super KeyEvent

	redef type NATIVE: SDLKeyboardEvent

	redef fun is_down do return buffer.is_keydown
	redef fun is_up do return buffer.is_keyup
	redef fun is_arrow_up do return native.keysym.is_up
	redef fun is_arrow_left do return native.keysym.is_left
	redef fun is_arrow_down do return native.keysym.is_down
	redef fun is_arrow_right do return native.keysym.is_right
	redef fun to_c do return native.to_s.chars.first
	redef fun name do return native.to_s.to_lower
end

# Event on pointer, mouse and finger input
class GamnitPointerEvent
	super GamnitInputEvent
	super PointerEvent

	redef type NATIVE: SDLMouseEvent

	redef fun x do return native.x.to_f
	redef fun y do return native.y.to_f
	redef fun is_move do return buffer.is_mouse_motion

	redef fun pressed
	do
		var native = native
		if native isa SDLMouseButtonEvent then
			return native.pressed and native.button == 1
		else if native isa SDLMouseMotionEvent then
			return native.state & 1 == 1
		else abort
	end
end

# Event on mouse wheel input
class GamnitMouseWheelEvent
	super GamnitInputEvent

	redef type NATIVE: SDLMouseWheelEvent

	# Horizontal scroll amount
	fun x: Float do return native.x.to_f

	# Vertical scroll amount
	fun y: Float do return native.y.to_f
end

# SDL2 event not handled by gamnit
class GamnitOtherEvent
	super GamnitInputEvent
end
lib/gamnit/gamnit_linux.nit:15,1--169,3