aboutsummaryrefslogtreecommitdiffstats
path: root/c_src
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-01-07 19:25:42 +0100
committerLoïc Hoguin <[email protected]>2018-01-07 19:25:42 +0100
commitc7af14020953fd7187af7d93f64cf94ff2e4d6f3 (patch)
tree60ab3b7084e337c139b51a6efcf4e632b66d031f /c_src
parentc3b951f0e15a49d3ac4f6b5c5a5d7ae06e887ec1 (diff)
downloadesdl2-c7af14020953fd7187af7d93f64cf94ff2e4d6f3.tar.gz
esdl2-c7af14020953fd7187af7d93f64cf94ff2e4d6f3.tar.bz2
esdl2-c7af14020953fd7187af7d93f64cf94ff2e4d6f3.zip
Add more window functions
Diffstat (limited to 'c_src')
-rw-r--r--c_src/esdl2.h5
-rw-r--r--c_src/sdl_video.c2
-rw-r--r--c_src/sdl_window.c107
3 files changed, 113 insertions, 1 deletions
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)