core :: union_find
union–find algorithm using an efficient disjoint-set data structuregamnit :: camera_control_linux
Mouse wheel and middle mouse button to control cameraegl
, sdl
and x11
glesv2 :: opengles2_hello_triangle
Basic example of OpenGL ES 2.0 usage using SDL 2
# SDL 2 events and related services
module events is pkgconfig "sdl2"
import sdl2_base
in "C Header" `{
#include <SDL2/SDL_events.h>
`}
# Temporary buffer for an SDL 2 event exposing the pseudo-class hierarchy metadata
#
# An instance of this class should be used to call `poll_event` and `to_event`.
extern class SDLEventBuffer `{SDL_Event *`}
# Allocate memory for a new `SDLEventBuffer`
new malloc `{ return malloc(sizeof(SDL_Event)); `}
# Poll and event into `self`
#
# Returns `true` if an event was available.
fun poll_event: Bool `{ return SDL_PollEvent(self); `}
# Get a reference to the data at `self` as a precise `SDLEvent`
#
# Returns `null` if the event is unknown.
#
# Note: The returned `SDLEvent` is just a different Nit instance pointing to the same data.
# A call to `poll_event` will invalidate any instances returned previously by `to_event`.
fun to_event: SDLEvent
do
if is_quit then return to_quit
if is_mouse_motion then return to_mouse_motion
if is_mouse_button_down then return to_mouse_button_down
if is_mouse_button_up then return to_mouse_button_up
if is_mouse_wheel then return to_mouse_wheel
if is_keydown then return to_keydown
if is_keyup then return to_keyup
if is_window then return to_window
return to_event_direct
end
private fun to_event_direct: SDLEvent `{ return self; `}
# Is this a quit event?
fun is_quit: Bool `{ return self->type == SDL_QUIT; `}
# Get a reference to data at `self` as a `SDLQuitEvent`
#
# Require: `is_quit`
fun to_quit: SDLQuitEvent `{ return self; `}
# Is this a mouse motion event?
fun is_mouse_motion: Bool `{ return self->type == SDL_MOUSEMOTION; `}
# Get a reference to data at `self` as a `SDLMouseMotionEvent`
#
# Require: `is_mouse_motion`
fun to_mouse_motion: SDLMouseMotionEvent `{ return self; `}
# Is this a mouse button down event?
fun is_mouse_button_down: Bool `{ return self->type == SDL_MOUSEBUTTONDOWN; `}
# Get a reference to data at `self` as a `SDLMouseButtonDownEvent`
#
# Require: `is_mouse_button_down`
fun to_mouse_button_down: SDLMouseButtonDownEvent `{ return self; `}
# Is this a mouse button up event?
fun is_mouse_button_up: Bool `{ return self->type == SDL_MOUSEBUTTONUP; `}
# Get a reference to data at `self` as a `SDLMouseButtonUpEvent`
#
# Require: `is_mouse_button_up`
fun to_mouse_button_up: SDLMouseButtonUpEvent `{ return self; `}
# Is this a mouse wheel event?
fun is_mouse_wheel: Bool `{ return self->type == SDL_MOUSEWHEEL; `}
# Get a reference to data at `self` as a `SDLMouseWheelEvent`
#
# Require: `is_mouse_wheel`
fun to_mouse_wheel: SDLMouseWheelEvent `{ return self; `}
# Is this a key presse event?
fun is_keydown: Bool `{ return self->type == SDL_KEYDOWN; `}
# Get a reference to data at `self` as a `SDLKeyboardDownEvent`
#
# Require: `is_keydown`
fun to_keydown: SDLKeyboardDownEvent `{ return self; `}
# Is this a key release event?
fun is_keyup: Bool `{ return self->type == SDL_KEYUP; `}
# Get a reference to data at `self` as a `SDLKeyboardUpEvent`
#
# Require: `is_keyup`
fun to_keyup: SDLKeyboardUpEvent `{ return self; `}
# Is this a window event?
fun is_window: Bool `{ return self->type == SDL_WINDOWEVENT; `}
# Get a reference to data at `self` as a `SDLWindowEvent`
#
# Require: `is_window`
fun to_window: SDLWindowEvent `{ return self; `}
# TODO other SDL events:
#
# SDL_CommonEvent common
# SDL_WindowEvent window
# SDL_TextEditingEvent edit
# SDL_TextInputEvent text
# SDL_JoyAxisEvent jaxis
# SDL_JoyBallEvent jball
# SDL_JoyHatEvent jhat;
# SDL_JoyButtonEvent jbutton
# SDL_JoyDeviceEvent jdevice
# SDL_ControllerAxisEvent caxis
# SDL_ControllerButtonEvent cbutton
# SDL_ControllerDeviceEvent cdevice
# SDL_UserEvent user
# SDL_SysWMEvent syswm
# SDL_TouchFingerEvent tfinger
# SDL_MultiGestureEvent mgesture
# SDL_DollarGestureEvent dgesture
# SDL_DropEvent drop
end
# SDL 2 event, only the data and no metadata
extern class SDLEvent `{SDL_Event *`}
end
# Quit event, usually from the close window button
extern class SDLQuitEvent
super SDLEvent
end
# Mouse event
extern class SDLMouseEvent
super SDLEvent
# Implementation note
#
# Even if the structures are different between the mouse events, the first
# four fields of each events are common to all of them.
# Which mouse, pointer or finger raised this event
fun which: Int `{ return self->motion.which; `}
# X coordinate on screen of this event
fun x: Int is abstract
# Y coordinate on screen of this event
fun y: Int is abstract
end
# Mouse motion event
extern class SDLMouseMotionEvent
super SDLMouseEvent
redef fun x `{ return self->motion.x; `}
redef fun y `{ return self->motion.y; `}
# State of the buttons
#
# ~~~raw
# state & 1 == 1 -> left button down
# state & 2 == 2 -> middle button down
# state & 4 == 4 -> right button down
# ~~~
fun state: Int `{ return self->motion.state; `}
# Difference on the X axis between this event and the previous one
fun xrel: Int `{ return self->motion.xrel; `}
# Difference on the Y axis between this event and the previous one
fun yrel: Int `{ return self->motion.yrel; `}
end
# Mouse button event
#
# This could as well be an abstract class. All instances of `SDLMouseButtonEvent`
# is either a `SDLMouseButtonUpEvent` or a `SDLMouseButtonDownEvent`.
extern class SDLMouseButtonEvent
super SDLMouseEvent
# Index of the button
#
# ~~~raw
# 1 -> left button
# 2 -> center button
# 3 -> right button
# ~~~
fun button: Int `{ return self->button.button; `}
# Is the button currently pressed down?
fun pressed: Bool `{ return self->button.state == SDL_PRESSED; `}
# Number of clicks (1 or 2)
fun clicks: Int `{ return self->button.clicks; `}
redef fun x `{ return self->button.x; `}
redef fun y `{ return self->button.y; `}
end
# Mouse button release event
extern class SDLMouseButtonUpEvent
super SDLMouseButtonEvent
end
# Mouse button click event
extern class SDLMouseButtonDownEvent
super SDLMouseButtonEvent
end
# Mouse wheel event
extern class SDLMouseWheelEvent
super SDLEvent
# Horizontal scroll amount
fun x: Int `{ return self->wheel.x; `}
# Vertical scroll amount
fun y: Int `{ return self->wheel.y; `}
end
# Keyboard button event
extern class SDLKeyboardEvent
super SDLEvent
# Is this is a key repeat?
fun repeat: Bool `{ return self->key.repeat; `}
# The key that was pressed or released
fun keysym: SDLKeysym `{ return &self->key.keysym; `}
redef fun to_s do return native_to_s.to_s
private fun native_to_s: CString `{
return (char*)SDL_GetKeyName(self->key.keysym.sym);
`}
end
# Keyboard button release event
extern class SDLKeyboardUpEvent
super SDLKeyboardEvent
end
# Keyboard button click event
extern class SDLKeyboardDownEvent
super SDLKeyboardEvent
end
# Key information
extern class SDLKeysym `{ SDL_Keysym * `}
# Is this the arrow right key?
fun is_right: Bool `{ return self->sym == SDLK_RIGHT; `}
# Is this the arrow left key?
fun is_left: Bool `{ return self->sym == SDLK_LEFT; `}
# Is this the arrow down key?
fun is_down: Bool `{ return self->sym == SDLK_DOWN; `}
# Is this the arrow up key?
fun is_up: Bool `{ return self->sym == SDLK_UP; `}
# Modification keys
fun mod: Int `{ return self->mod; `}
# TODO related masks
end
# Window event
extern class SDLWindowEvent
super SDLEvent
# Window identifier
fun id: Int `{ return self->window.windowID; `}
# Is `self` a resized event?
fun is_resized: Bool `{ return self->window.event == SDL_WINDOWEVENT_RESIZED; `}
# Is `self` a size changed event?
fun is_size_changed: Bool `{ return self->window.event == SDL_WINDOWEVENT_SIZE_CHANGED; `}
# `data1` field, depends on the event kind
fun data1: Int `{ return self->window.data1; `}
# `data2` field, depends on the event kind
fun data2: Int `{ return self->window.data2; `}
end
lib/sdl2/events.nit:17,1--308,3