aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-01-17 18:11:24 +0100
committerLoïc Hoguin <[email protected]>2018-01-17 18:12:23 +0100
commitd6de0fce0b46be3b382ba3c30fb7c9559f3fcb8e (patch)
tree9171aab855f013fd4cabe9e6838e76f92af8c8cf /src
parent13d8ea6917d584e44888d5202dd28ac5602b2836 (diff)
downloadesdl2-d6de0fce0b46be3b382ba3c30fb7c9559f3fcb8e.tar.gz
esdl2-d6de0fce0b46be3b382ba3c30fb7c9559f3fcb8e.tar.bz2
esdl2-d6de0fce0b46be3b382ba3c30fb7c9559f3fcb8e.zip
Add the SDL_SetWindowHitTest callback
Diffstat (limited to 'src')
-rw-r--r--src/esdl2.erl12
-rw-r--r--src/esdl2_callbacks.erl14
-rw-r--r--src/sdl_window.erl12
3 files changed, 37 insertions, 1 deletions
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.