From c7af14020953fd7187af7d93f64cf94ff2e4d6f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Sun, 7 Jan 2018 19:25:42 +0100 Subject: Add more window functions --- README.asciidoc | 7 +--- c_src/esdl2.h | 5 +++ c_src/sdl_video.c | 2 +- c_src/sdl_window.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/esdl2.erl | 16 ++++++++ src/sdl_video.erl | 1 + src/sdl_window.erl | 27 ++++++++++++++ 7 files changed, 158 insertions(+), 7 deletions(-) diff --git a/README.asciidoc b/README.asciidoc index c6f3434..c522841 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -85,12 +85,7 @@ corresponding to the public headers. * 'SDL_version.h': `SDL_GetRevisionNumber` must be implemented. The macros may also be useful. * 'SDL_video.h': The following elements are missing: ** `SDL_WINDOWPOS_*` values for different displays -** `SDL_GetWindowDisplayIndex` (window) -** `SDL_SetWindowDisplayMode` (window) -** `SDL_GetWindowDisplayMode` (window) -** `SDL_GetWindowPixelFormat` (window) -** `SDL_CreateWindowFrom` (window) -** `SDL_GetWindowFromID` (window) +** `SDL_CreateWindowFrom` (unclear if we need it) ** We currently do not support UTF-8. We should probably switch to binaries as input/output to support it for `SDL_SetWindowTitle` and `SDL_GetWindowTitle` ** `SDL_SetWindowData` (window) ** `SDL_GetWindowData` (window) diff --git a/c_src/esdl2.h b/c_src/esdl2.h index 1b87b1f..0740ab4 100644 --- a/c_src/esdl2.h +++ b/c_src/esdl2.h @@ -422,11 +422,14 @@ F(create_window_and_renderer, 3) \ F(get_window_brightness, 1) \ F(get_window_display_index, 1) \ + F(get_window_display_mode, 1) \ F(get_window_flags, 1) \ + F(get_window_from_id, 1) \ F(get_window_grab, 1) \ F(get_window_id, 1) \ F(get_window_maximum_size, 1) \ F(get_window_minimum_size, 1) \ + F(get_window_pixel_format, 1) \ F(get_window_position, 1) \ F(get_window_size, 1) \ F(get_window_title, 1) \ @@ -437,6 +440,7 @@ F(restore_window, 1) \ F(set_window_bordered, 2) \ F(set_window_brightness, 2) \ + F(set_window_display_mode, 2) \ F(set_window_fullscreen, 2) \ F(set_window_grab, 2) \ F(set_window_icon, 2) \ @@ -473,6 +477,7 @@ int map_to_point(ErlNifEnv*, ERL_NIF_TERM, SDL_Point*); int map_to_rect(ErlNifEnv*, ERL_NIF_TERM, SDL_Rect*); ERL_NIF_TERM rect_to_map(ErlNifEnv*, SDL_Rect*); +ERL_NIF_TERM display_mode_to_map(ErlNifEnv*, SDL_DisplayMode*); ERL_NIF_TERM mouse_state_to_list(ErlNifEnv*, Uint32); // -- diff --git a/c_src/sdl_video.c b/c_src/sdl_video.c index 3287e6e..49dbe7f 100644 --- a/c_src/sdl_video.c +++ b/c_src/sdl_video.c @@ -14,7 +14,7 @@ #include "esdl2.h" -static ERL_NIF_TERM display_mode_to_map(ErlNifEnv* env, SDL_DisplayMode* mode) +ERL_NIF_TERM display_mode_to_map(ErlNifEnv* env, SDL_DisplayMode* mode) { ERL_NIF_TERM map; diff --git a/c_src/sdl_window.c b/c_src/sdl_window.c index 2e0c1bb..28b769e 100644 --- a/c_src/sdl_window.c +++ b/c_src/sdl_window.c @@ -220,6 +220,31 @@ NIF_FUNCTION(get_window_display_index) NIF_RES_GET(Window, window_res)); } +// get_window_display_mode + +NIF_CALL_HANDLER(thread_get_window_display_mode) +{ + SDL_DisplayMode mode; + + if (SDL_GetWindowDisplayMode(args[0], &mode)) + return sdl_error_tuple(env); + + return enif_make_tuple2(env, + atom_ok, + display_mode_to_map(env, &mode) + ); +} + +NIF_FUNCTION(get_window_display_mode) +{ + void* window_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res)); + + return nif_thread_call(env, thread_get_window_display_mode, 1, + NIF_RES_GET(Window, window_res)); +} + // get_window_flags NIF_CALL_HANDLER(thread_get_window_flags) @@ -237,6 +262,29 @@ NIF_FUNCTION(get_window_flags) NIF_RES_GET(Window, window_res)); } +// get_window_from_id + +NIF_CALL_HANDLER(thread_get_window_from_id) +{ + SDL_Window* window; + + window = SDL_GetWindowFromID((long)args[0]); + + if (!window) + return atom_undefined; + + return esdl2_windows_find(env, window); +} + +NIF_FUNCTION(get_window_from_id) +{ + Uint32 windowID; + + BADARG_IF(!enif_get_uint(env, argv[0], &windowID)); + + return nif_thread_call(env, thread_get_window_from_id, 1, windowID); +} + // get_window_grab NIF_CALL_HANDLER(thread_get_window_grab) @@ -322,6 +370,27 @@ NIF_FUNCTION(get_window_minimum_size) NIF_RES_GET(Window, window_res)); } +// get_window_pixel_format + +NIF_CALL_HANDLER(thread_get_window_pixel_format) +{ + Uint32 format; + + format = SDL_GetWindowPixelFormat(args[0]); + + return pixel_format_to_atom(format); +} + +NIF_FUNCTION(get_window_pixel_format) +{ + void* window_res; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res)); + + return nif_thread_call(env, thread_get_window_pixel_format, 1, + NIF_RES_GET(Window, window_res)); +} + // get_window_position NIF_CALL_HANDLER(thread_get_window_position) @@ -522,6 +591,44 @@ NIF_FUNCTION(set_window_brightness) NIF_RES_GET(Window, window_res), brightnessPtr); } +// set_window_display_mode + +NIF_CALL_HANDLER(thread_set_window_display_mode) +{ + SDL_DisplayMode mode; + + mode.format = (long)args[1]; + mode.w = (long)args[2]; + mode.h = (long)args[3]; + mode.refresh_rate = (long)args[4]; + + if (SDL_SetWindowDisplayMode(args[0], &mode)) + return sdl_error_tuple(env); + + return atom_ok; +} + +NIF_FUNCTION(set_window_display_mode) +{ + void* window_res; + ERL_NIF_TERM term; + Uint32 format; + int w, h, refresh_rate; + + BADARG_IF(!enif_get_resource(env, argv[0], res_Window, &window_res)); + BADARG_IF(!enif_get_map_value(env, argv[1], atom_format, &term)); + BADARG_IF(!atom_to_pixel_format(env, term, &format)); + BADARG_IF(!enif_get_map_value(env, argv[1], atom_w, &term)); + BADARG_IF(!enif_get_int(env, term, &w)); + BADARG_IF(!enif_get_map_value(env, argv[1], atom_h, &term)); + BADARG_IF(!enif_get_int(env, term, &h)); + BADARG_IF(!enif_get_map_value(env, argv[1], atom_refresh_rate, &term)); + BADARG_IF(!enif_get_int(env, term, &refresh_rate)); + + return nif_thread_call(env, thread_set_window_display_mode, 5, + NIF_RES_GET(Window, window_res), format, w, h, refresh_rate); +} + // set_window_fullscreen NIF_CALL_HANDLER(thread_set_window_fullscreen) diff --git a/src/esdl2.erl b/src/esdl2.erl index 8216ab1..defcebc 100644 --- a/src/esdl2.erl +++ b/src/esdl2.erl @@ -187,11 +187,14 @@ -export([create_window_and_renderer/3]). -export([get_window_brightness/1]). -export([get_window_display_index/1]). +-export([get_window_display_mode/1]). -export([get_window_flags/1]). +-export([get_window_from_id/1]). -export([get_window_grab/1]). -export([get_window_id/1]). -export([get_window_maximum_size/1]). -export([get_window_minimum_size/1]). +-export([get_window_pixel_format/1]). -export([get_window_position/1]). -export([get_window_size/1]). -export([get_window_title/1]). @@ -202,6 +205,7 @@ -export([restore_window/1]). -export([set_window_bordered/2]). -export([set_window_brightness/2]). +-export([set_window_display_mode/2]). -export([set_window_fullscreen/2]). -export([set_window_grab/2]). -export([set_window_icon/2]). @@ -666,9 +670,15 @@ get_window_brightness(_) -> get_window_display_index(_) -> erlang:nif_error({not_loaded, ?MODULE}). +get_window_display_mode(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + get_window_flags(_) -> erlang:nif_error({not_loaded, ?MODULE}). +get_window_from_id(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + get_window_grab(_) -> erlang:nif_error({not_loaded, ?MODULE}). @@ -681,6 +691,9 @@ get_window_maximum_size(_) -> get_window_minimum_size(_) -> erlang:nif_error({not_loaded, ?MODULE}). +get_window_pixel_format(_) -> + erlang:nif_error({not_loaded, ?MODULE}). + get_window_position(_) -> erlang:nif_error({not_loaded, ?MODULE}). @@ -711,6 +724,9 @@ set_window_bordered(_, _) -> set_window_brightness(_, _) -> erlang:nif_error({not_loaded, ?MODULE}). +set_window_display_mode(_, _) -> + erlang:nif_error({not_loaded, ?MODULE}). + set_window_fullscreen(_, _) -> erlang:nif_error({not_loaded, ?MODULE}). diff --git a/src/sdl_video.erl b/src/sdl_video.erl index 06849c2..958d928 100644 --- a/src/sdl_video.erl +++ b/src/sdl_video.erl @@ -36,6 +36,7 @@ h => integer(), refresh_rate => integer() }. +-export_type([display_mode/0]). -spec get_closest_display_mode(integer(), display_mode()) -> display_mode() | undefined. get_closest_display_mode(DisplayIndex, Mode) -> diff --git a/src/sdl_window.erl b/src/sdl_window.erl index 26deeda..ce74fce 100644 --- a/src/sdl_window.erl +++ b/src/sdl_window.erl @@ -18,10 +18,13 @@ -export([create_window_and_renderer/3]). -export([get_brightness/1]). -export([get_display_index/1]). +-export([get_display_mode/1]). -export([get_flags/1]). +-export([get_from_id/1]). -export([get_id/1]). -export([get_max_size/1]). -export([get_min_size/1]). +-export([get_pixel_format/1]). -export([get_pos/1]). -export([get_size/1]). -export([get_title/1]). @@ -34,6 +37,7 @@ -export([restore/1]). -export([set_bordered/2]). -export([set_brightness/2]). +-export([set_display_mode/2]). -export([set_fullscreen/2]). -export([set_icon/2]). -export([set_max_size/3]). @@ -75,6 +79,14 @@ get_brightness(Window) -> esdl2:get_window_brightness(Window), receive {'_nif_thread_ret_', Ret} -> Ret end. +-spec get_display_mode(window()) -> sdl_video:display_mode(). +get_display_mode(Window) -> + esdl2:get_window_display_mode(Window), + receive {'_nif_thread_ret_', Ret} -> + {ok, Mode} = Ret, + Mode + end. + -spec get_display_index(window()) -> integer(). get_display_index(Window) -> esdl2:get_window_display_index(Window), @@ -88,6 +100,11 @@ get_flags(Window) -> esdl2:get_window_flags(Window), receive {'_nif_thread_ret_', Ret} -> Ret end. +-spec get_from_id(non_neg_integer()) -> window(). +get_from_id(WindowID) -> + esdl2:get_window_from_id(WindowID), + receive {'_nif_thread_ret_', Ret} -> Ret end. + -spec get_id(window()) -> non_neg_integer(). get_id(Window) -> esdl2:get_window_id(Window), @@ -103,6 +120,11 @@ get_min_size(Window) -> esdl2:get_window_minimum_size(Window), receive {'_nif_thread_ret_', Ret} -> Ret end. +-spec get_pixel_format(window()) -> sdl_pixels:pixel_format(). +get_pixel_format(Window) -> + esdl2:get_window_pixel_format(Window), + receive {'_nif_thread_ret_', Ret} -> Ret end. + -spec get_pos(window()) -> {integer(), integer()}. get_pos(Window) -> esdl2:get_window_position(Window), @@ -156,6 +178,11 @@ set_brightness(Window, Brightness) -> esdl2:set_window_brightness(Window, Brightness), receive {'_nif_thread_ret_', Ret} -> Ret end. +-spec set_display_mode(window(), sdl_video:display_mode()) -> ok | sdl:error(). +set_display_mode(Window, Mode) -> + esdl2:set_window_display_mode(Window, Mode), + receive {'_nif_thread_ret_', Ret} -> Ret end. + -spec set_fullscreen(window(), fullscreen | fullscreen_desktop | windowed) -> ok | sdl:error(). set_fullscreen(Window, Flag) -> -- cgit v1.2.3