aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/esdl2.erl24
-rw-r--r--src/sdl_events.erl98
-rw-r--r--src/sdl_keycode.erl19
-rw-r--r--src/sdl_mouse.erl15
-rw-r--r--src/sdl_window.erl5
5 files changed, 136 insertions, 25 deletions
diff --git a/src/esdl2.erl b/src/esdl2.erl
index 1020849..5fa9a16 100644
--- a/src/esdl2.erl
+++ b/src/esdl2.erl
@@ -60,7 +60,13 @@
-export([show_cursor/1]).
%% sdl_events
+-export([flush_event/1]).
+-export([flush_events/2]).
+-export([has_event/1]).
+-export([has_events/2]).
+-export([peep_events/4]).
-export([poll_event/0]).
+-export([pump_events/0]).
%% sdl_filesystem
-export([get_base_path/0]).
@@ -293,9 +299,27 @@ show_cursor(_) ->
%% sdl_events
+flush_event(_) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
+flush_events(_, _) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
+has_event(_) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
+has_events(_, _) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
+peep_events(_, _, _, _) ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
poll_event() ->
erlang:nif_error({not_loaded, ?MODULE}).
+pump_events() ->
+ erlang:nif_error({not_loaded, ?MODULE}).
+
%% sdl_filesystem
get_base_path() ->
diff --git a/src/sdl_events.erl b/src/sdl_events.erl
index 366edeb..034ca3d 100644
--- a/src/sdl_events.erl
+++ b/src/sdl_events.erl
@@ -14,40 +14,100 @@
-module(sdl_events).
+-export([flush/1]).
+-export([flush/2]).
+-export([get/3]).
+-export([has/1]).
+-export([has/2]).
+-export([peek/3]).
-export([poll/0]).
+-export([pump/0]).
+
+-type event_type() :: first
+ | quit
+ | app_terminating | app_low_memory | app_will_enter_background
+ | app_did_enter_background | app_will_enter_foreground | app_did_enter_foreground
+ | window | syswm
+ | key_down | key_up | text_editing | text_input | keymap_changed
+ | mouse_motion | mouse_down | mouse_up | mouse_wheel
+ | joy_axis_motion | joy_ball_motion | joy_hat_motion
+ | joy_button_down | joy_button_up | joy_device_added | joy_device_removed
+ | controller_axis_motion | controller_button_down | controller_button_up
+ | controller_device_added | controller_device_removed | controller_device_remapped
+ | finger_down | finger_up | finger_motion
+ | dollar_gesture | dollar_record | multi_gesture
+ | clipboard_update
+ | drop_file | drop_text | drop_begin | drop_complete
+ | audio_device_added | audio_device_removed
+ | render_targets_reset | render_device_reset
+ | last.
--type window_event_type() :: shown | hidden | exposed | moved | resized
- | size_changed | minimized | maximized | restored | enter | leave
- | focus_gained | focus_lost | close.
-type window_event() :: #{type=>window, timestamp=>non_neg_integer(),
- window_id=>non_neg_integer(), event=>window_event_type(),
- data=>{integer(), integer()}}.
+ window_id=>non_neg_integer(), event=>sdl_window:window_event_type(),
+ data1=>integer(), data2=>integer()}.
--type keymod() :: left_shift | right_shift | left_ctrl | right_ctrl
- | left_alt | right_alt | left_gui | right_gui | num | caps | mode.
--type key_event() :: #{type=>key_down | key_up, timestamp=>non_neg_integer(),
- window_id=>non_neg_integer(), repeat=>boolean(), scancode=>non_neg_integer(),
- sym=>non_neg_integer(), mod=>[keymod()]}.
-
--type mouse_button() :: left | middle | right | x1 | x2 | non_neg_integer().
--type mouse_button_event() :: #{type=>mouse_down | mouse_up, timestamp=>non_neg_integer(),
- window_id=>non_neg_integer(), which=>touch | non_neg_integer(),
- button=>mouse_button(), clicks=>non_neg_integer(), x=>integer(), y=>integer()}.
+-type keyboard_event() :: #{type=>key_down | key_up, timestamp=>non_neg_integer(),
+ window_id=>non_neg_integer(), state=>released | pressed, repeat=>boolean(),
+ scancode=>non_neg_integer(), sym=>non_neg_integer(), mod=>[sdl_keycode:keymod()]}.
-type mouse_motion_event() :: #{type=>mouse_motion, timestamp=>non_neg_integer(),
window_id=>non_neg_integer(), which=>touch | non_neg_integer(),
x=>integer(), y=>integer(), xrel=>integer(), yrel=>integer()}.
+-type mouse_button_event() :: #{type=>mouse_down | mouse_up, timestamp=>non_neg_integer(),
+ window_id=>non_neg_integer(), which=>touch | non_neg_integer(),
+ button=>sdl_mouse:button(), state=>released | pressed,
+ clicks=>non_neg_integer(), x=>integer(), y=>integer()}.
+
-type mouse_wheel_event() :: #{type=>mouse_wheel, timestamp=>non_neg_integer(),
window_id=>non_neg_integer(), which=>touch | non_neg_integer(),
- x=>integer(), y=>integer()}.
+ x=>integer(), y=>integer(), direction=>sdl_mouse:wheel_direction()}.
+
+-type generic_event() :: #{
+ type=> quit | app_terminating | app_low_memory | app_will_enter_background
+ | app_did_enter_background | app_will_enter_foreground | app_did_enter_foreground
+ | keymap_changed | clipboard_update | render_targets_reset | render_device_reset,
+ timestamp=>non_neg_integer()}.
+
+-type event() :: window_event() | keyboard_event()
+ | mouse_motion_event() | mouse_button_event() | mouse_wheel_event()
+ | generic_event().
--type quit_event() :: #{type=>quit, timestamp=>non_neg_integer()}.
+-spec flush(event_type()) -> ok.
+flush(Type) ->
+ esdl2:flush_event(Type).
--type event() :: window_event() | key_event() | mouse_button_event()
- | mouse_motion_event() | mouse_wheel_event() | quit_event().
+-spec flush(event_type(), event_type()) -> ok.
+flush(MinType, MaxType) ->
+ esdl2:flush_events(MinType, MaxType).
+
+-spec get(non_neg_integer(), event_type(), event_type())
+ -> {ok, [event()]} | sdl:error().
+get(NumEvents, MinType, MaxType) ->
+ esdl2:peep_events(get, NumEvents, MinType, MaxType),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
+-spec has(event_type()) -> boolean().
+has(Type) ->
+ esdl2:has_event(Type),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
+-spec has(event_type(), event_type()) -> boolean().
+has(MinType, MaxType) ->
+ esdl2:has_events(MinType, MaxType),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
+
+-spec peek(non_neg_integer(), event_type(), event_type())
+ -> {ok, [event()]} | sdl:error().
+peek(NumEvents, MinType, MaxType) ->
+ esdl2:peep_events(peek, NumEvents, MinType, MaxType),
+ receive {'_nif_thread_ret_', Ret} -> Ret end.
-spec poll() -> event() | false.
poll() ->
esdl2:poll_event(),
receive {'_nif_thread_ret_', Ret} -> Ret end.
+
+-spec pump() -> ok.
+pump() ->
+ esdl2:pump_events().
diff --git a/src/sdl_keycode.erl b/src/sdl_keycode.erl
new file mode 100644
index 0000000..6ab1cf4
--- /dev/null
+++ b/src/sdl_keycode.erl
@@ -0,0 +1,19 @@
+%% Copyright (c) 2014-2017, Loïc Hoguin <[email protected]>
+%%
+%% Permission to use, copy, modify, and/or distribute this software for any
+%% purpose with or without fee is hereby granted, provided that the above
+%% copyright notice and this permission notice appear in all copies.
+%%
+%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-module(sdl_keycode).
+
+-type keymod() :: left_shift | right_shift | left_ctrl | right_ctrl
+ | left_alt | right_alt | left_gui | right_gui | num | caps | mode.
+-export_type([keymod/0]).
diff --git a/src/sdl_mouse.erl b/src/sdl_mouse.erl
index d6c3815..6d34b8d 100644
--- a/src/sdl_mouse.erl
+++ b/src/sdl_mouse.erl
@@ -24,6 +24,12 @@
-export([warp/2]).
-export([warp/3]).
+-type wheel_direction() :: normal | flipped.
+-export_type([wheel_direction/0]).
+
+-type button() :: left | middle | right | x1 | x2.
+-export_type([button/0]).
+
-spec capture(boolean()) -> ok | sdl:error().
capture(Bool) ->
esdl2:capture_mouse(Bool),
@@ -34,8 +40,7 @@ get_focused_window() ->
esdl2:get_mouse_focus(),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec get_global_state()
- -> {integer(), integer(), [left | middle | right | x1 | x2]}.
+-spec get_global_state() -> {integer(), integer(), [button()]}.
get_global_state() ->
esdl2:get_global_mouse_state(),
receive {'_nif_thread_ret_', Ret} -> Ret end.
@@ -45,14 +50,12 @@ get_relative_mode() ->
esdl2:get_relative_mouse_mode(),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec get_relative_state()
- -> {integer(), integer(), [left | middle | right | x1 | x2]}.
+-spec get_relative_state() -> {integer(), integer(), [button()]}.
get_relative_state() ->
esdl2:get_relative_mouse_state(),
receive {'_nif_thread_ret_', Ret} -> Ret end.
--spec get_state()
- -> {integer(), integer(), [left | middle | right | x1 | x2]}.
+-spec get_state() -> {integer(), integer(), [button()]}.
get_state() ->
esdl2:get_mouse_state(),
receive {'_nif_thread_ret_', Ret} -> Ret end.
diff --git a/src/sdl_window.erl b/src/sdl_window.erl
index 5d31392..ea757bf 100644
--- a/src/sdl_window.erl
+++ b/src/sdl_window.erl
@@ -51,6 +51,11 @@
| hidden | borderless | resizable | minimized | maximized
| input_grabbed | input_focus | mouse_focus | foreign | allow_high_dpi.
+-type window_event_type() :: shown | hidden | exposed | moved | resized
+ | size_changed | minimized | maximized | restored | enter | leave
+ | focus_gained | focus_lost | close | take_focus | hit_test.
+-export_type([window_event_type/0]).
+
-spec create(string(), window_pos(), window_pos(), integer(), integer(), [window_flag()])
-> {ok, window()} | sdl:error().
create(Title, X, Y, W, H, Flags) ->