diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/esdl2.erl | 24 | ||||
-rw-r--r-- | src/sdl_events.erl | 98 | ||||
-rw-r--r-- | src/sdl_keycode.erl | 19 | ||||
-rw-r--r-- | src/sdl_mouse.erl | 15 | ||||
-rw-r--r-- | src/sdl_window.erl | 5 |
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) -> |