Pārlūkot izejas kodu

Fixed a potencial crash when SDL found no display or screen modes (#573)

Maurice Doison 2 gadi atpakaļ
vecāks
revīzija
c03751745e
2 mainītis faili ar 11 papildinājumiem un 1 dzēšanām
  1. 4 0
      libs/sdl/sdl.c
  2. 7 1
      libs/sdl/sdl/Sdl.hx

+ 4 - 0
libs/sdl/sdl.c

@@ -838,6 +838,8 @@ HL_PRIM char* HL_NAME(get_clipboard_text)() {
 
 HL_PRIM varray* HL_NAME(get_displays)() {
 	int n = SDL_GetNumVideoDisplays();
+	if (n < 0)
+		return NULL;
 	varray* arr = hl_alloc_array(&hlt_dynobj, n);
 	for (int i = 0; i < n; i++) {
 		vdynamic *obj = (vdynamic*) hl_alloc_dynobj();
@@ -857,6 +859,8 @@ HL_PRIM varray* HL_NAME(get_displays)() {
 
 HL_PRIM varray* HL_NAME(get_display_modes)(int display_id) {
 	int n = SDL_GetNumDisplayModes(display_id);
+	if (n < 0)
+		return NULL;
 	varray* arr = hl_alloc_array(&hlt_dynobj, n);
 	for (int i = 0; i < n; i++) {
 		SDL_DisplayMode mode;

+ 7 - 1
libs/sdl/sdl/Sdl.hx

@@ -112,7 +112,10 @@ class Sdl {
 	}
 	
 	public static function getDisplayModes(display : Window.DisplayHandle) : Array<ScreenMode> {
-		return [ for(m in get_display_modes(display)) m ];
+		var modes = get_display_modes(display);
+		if(modes == null)
+			return [];
+		return [ for(m in modes) m ];
 	}
 
 	public static function getCurrentDisplayMode(display : Window.DisplayHandle, registry : Bool = false) : ScreenMode {
@@ -120,6 +123,9 @@ class Sdl {
 	}
 
 	public static function getDisplays() : Array<Display> {
+		var displays = get_displays();
+		if(displays == null)
+			return [];
 		var i = 0;
 		return [ for(d in get_displays() ) @:privateAccess { handle: d.handle, name: '${String.fromUTF8(d.name)} (${++i})', left: d.left, top: d.top, right: d.right, bottom: d.bottom } ];
 	}