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 --- c_src/esdl2.h | 5 +++ c_src/sdl_video.c | 2 +- c_src/sdl_window.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) (limited to 'c_src') 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) -- cgit v1.2.3