aboutsummaryrefslogtreecommitdiffstats
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
parentc3b951f0e15a49d3ac4f6b5c5a5d7ae06e887ec1 (diff)
downloadesdl2-c7af14020953fd7187af7d93f64cf94ff2e4d6f3.tar.gz
esdl2-c7af14020953fd7187af7d93f64cf94ff2e4d6f3.tar.bz2
esdl2-c7af14020953fd7187af7d93f64cf94ff2e4d6f3.zip
Add more window functions
-rw-r--r--README.asciidoc7
-rw-r--r--c_src/esdl2.h5
-rw-r--r--c_src/sdl_video.c2
-rw-r--r--c_src/sdl_window.c107
-rw-r--r--src/esdl2.erl16
-rw-r--r--src/sdl_video.erl1
-rw-r--r--src/sdl_window.erl27
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) ->