From d6de0fce0b46be3b382ba3c30fb7c9559f3fcb8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 17 Jan 2018 18:11:24 +0100 Subject: Add the SDL_SetWindowHitTest callback --- src/esdl2.erl | 12 ++++++++++++ src/esdl2_callbacks.erl | 14 +++++++++++++- src/sdl_window.erl | 12 ++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/esdl2.erl b/src/esdl2.erl index 69885c6..edbb3b1 100644 --- a/src/esdl2.erl +++ b/src/esdl2.erl @@ -213,6 +213,9 @@ -export([set_window_fullscreen/2]). -export([set_window_gamma_ramp/4]). -export([set_window_grab/2]). +-export([set_window_hit_test/3]). +-export([set_window_hit_test_remove/1]). +-export([set_window_hit_test_result/2]). -export([set_window_icon/2]). -export([set_window_input_focus/1]). -export([set_window_maximum_size/3]). @@ -757,6 +760,15 @@ set_window_gamma_ramp(_, _, _, _) -> set_window_grab(_, _) -> erlang:nif_error({not_loaded, ?MODULE}). +set_window_hit_test(_, _, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + +set_window_hit_test_remove(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + +set_window_hit_test_result(_, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + set_window_icon(_, _) -> erlang:nif_error({not_loaded, ?MODULE}). diff --git a/src/esdl2_callbacks.erl b/src/esdl2_callbacks.erl index ccbe858..ecbc4a2 100644 --- a/src/esdl2_callbacks.erl +++ b/src/esdl2_callbacks.erl @@ -51,7 +51,19 @@ handle_info({callback, M, F, A}, State) -> try apply(M, F, A) catch Class:Reason -> - error_logger:error_msg("Exception ~p:~p with callback:~n{~p,~p,~p}~n", [Class, Reason, M, F, A]) + error_logger:error_msg("Exception ~p:~p with callback:~n{~p,~p,~p}~n", + [Class, Reason, M, F, A]) + end, + {noreply, State}; +handle_info({callback, M, F, A, ResF, ResA}, State) -> + try apply(M, F, A) of + Res -> + apply(esdl2, ResF, ResA ++ [Res]) + catch Class:Reason -> + %% We need to inform the NIF that an error occurred. + apply(esdl2, ResF, ResA ++ [error]), + error_logger:error_msg("Exception ~p:~p with callback:~n{~p,~p,~p}~n", + [Class, Reason, M, F, A]) end, {noreply, State}; handle_info(_Info, State) -> diff --git a/src/sdl_window.erl b/src/sdl_window.erl index 802e20c..24a4622 100644 --- a/src/sdl_window.erl +++ b/src/sdl_window.erl @@ -45,6 +45,7 @@ -export([set_display_mode/2]). -export([set_fullscreen/2]). -export([set_gamma_ramp/4]). +-export([set_hit_test_callback/3]). -export([set_icon/2]). -export([set_max_size/3]). -export([set_min_size/3]). @@ -55,6 +56,7 @@ -export([set_size/3]). -export([set_title/2]). -export([show/1]). +-export([unset_hit_test_callback/1]). -opaque window() :: <<>>. -export_type([window/0]). @@ -237,6 +239,11 @@ set_gamma_ramp(Window, Red, Green, Blue) -> esdl2:set_window_gamma_ramp(Window, Red, Green, Blue), receive {'_nif_thread_ret_', Ret} -> Ret end. +-spec set_hit_test_callback(window(), module(), atom()) -> ok | sdl:error(). +set_hit_test_callback(Window, Module, Function) -> + esdl2:set_window_hit_test(Window, Module, Function), + receive {'_nif_thread_ret_', Ret} -> Ret end. + -spec set_icon(window(), sdl_surface:surface()) -> ok. set_icon(Window, Surface) -> esdl2:set_window_icon(Window, Surface), @@ -279,3 +286,8 @@ set_title(Window, Title) -> -spec show(window()) -> ok. show(Window) -> esdl2:show_window(Window). + +-spec unset_hit_test_callback(window()) -> ok | sdl:error(). +unset_hit_test_callback(Window) -> + esdl2:set_window_hit_test_remove(Window), + receive {'_nif_thread_ret_', Ret} -> Ret end. -- cgit v1.2.3