From 3e4656c5bf718aff7f5604442f99ddc749bdabd1 Mon Sep 17 00:00:00 2001 From: Yanrishatum Date: Mon, 31 Jan 2022 12:55:02 +0300 Subject: [PATCH 1/4] Implement drag&drop support for SDL --- libs/sdl/sdl.c | 27 +++++++++++++++++++++++++++ libs/sdl/sdl/Event.hx | 5 +++++ libs/sdl/sdl/Sdl.hx | 3 +++ 3 files changed, 35 insertions(+) diff --git a/libs/sdl/sdl.c b/libs/sdl/sdl.c index cf65fbe5f..3cd15c312 100644 --- a/libs/sdl/sdl.c +++ b/libs/sdl/sdl.c @@ -58,6 +58,10 @@ typedef enum { JoystickButtonUp, JoystickAdded, JoystickRemoved, + DropStart = 400, + DropFile, + DropText, + DropEnd, } event_type; typedef enum { @@ -93,6 +97,7 @@ typedef struct { int value; int fingerId; int joystick; + vbyte* dropFile; } event_data; HL_PRIM bool HL_NAME(init_once)() { @@ -331,6 +336,18 @@ HL_PRIM bool HL_NAME(event_loop)( event_data *event ) { event->type = JoystickRemoved; event->joystick = e.jdevice.which; break; + case SDL_DROPBEGIN: + event->type = DropStart; + break; + case SDL_DROPFILE: case SDL_DROPTEXT: + vbyte* bytes = hl_copy_bytes(e.drop.file, (int) strlen(e.drop.file) + 1); + SDL_free(e.drop.file); + event->type = e.type == SDL_DROPFILE ? DropFile : DropText; + event->dropFile = bytes; + break; + case SDL_DROPCOMPLETE: + event->type = DropEnd; + break; default: //printf("Unknown event type 0x%X\\n", e.type); continue; @@ -811,6 +828,14 @@ HL_PRIM char* HL_NAME(get_clipboard_text)() { return bytes; } +HL_PRIM void HL_NAME(set_drag_and_drop_enabled)( bool enabled ) { + return SDL_EventState(SDL_DROPFILE, enabled ? SDL_ENABLE : SDL_DISABLE); +} + +HL_PRIM bool HL_NAME(get_drag_and_drop_enabled)() { + return SDL_EventState(SDL_DROPFILE, SDL_QUERY); +} + HL_PRIM varray* HL_NAME(get_displays)() { int n = SDL_GetNumVideoDisplays(); varray* arr = hl_alloc_array(&hlt_dynobj, n); @@ -887,6 +912,8 @@ DEFINE_PRIM(_VOID, free_cursor, _CURSOR); DEFINE_PRIM(_VOID, set_cursor, _CURSOR); DEFINE_PRIM(_BOOL, set_clipboard_text, _BYTES); DEFINE_PRIM(_BYTES, get_clipboard_text, _NO_ARG); +DEFINE_PRIM(_VOID, set_drag_and_drop_enabled, _BOOL); +DEFINE_PRIM(_BOOL, get_drag_and_drop_enabled, _NO_ARG); DEFINE_PRIM(_ARR, get_displays, _NO_ARG); DEFINE_PRIM(_ARR, get_display_modes, _I32); DEFINE_PRIM(_DYN, get_current_display_mode, _I32 _BOOL); diff --git a/libs/sdl/sdl/Event.hx b/libs/sdl/sdl/Event.hx index 31f86bf55..0a662110e 100644 --- a/libs/sdl/sdl/Event.hx +++ b/libs/sdl/sdl/Event.hx @@ -16,6 +16,7 @@ package sdl; public var value : Int; public var fingerId : Int; public var joystick : Int; + public var dropFile: hl.Bytes; public function new() { } } @@ -46,6 +47,10 @@ package sdl; var JoystickButtonUp = 304; var JoystickAdded = 305; var JoystickRemoved = 306; + var DropStart = 400; + var DropFile = 401; + var DropText = 402; + var DropEnd = 403; } @:enum abstract WindowStateChange(Int) { diff --git a/libs/sdl/sdl/Sdl.hx b/libs/sdl/sdl/Sdl.hx index e67a6f078..ef43f6114 100644 --- a/libs/sdl/sdl/Sdl.hx +++ b/libs/sdl/sdl/Sdl.hx @@ -225,6 +225,9 @@ class Sdl { private static function _getClipboardText() : hl.Bytes { return null; } + + public static function setDragAndDropEnabled( v : Bool ): Void {} + public static function getDragAndDropEnabled(): Bool { return false; } } @:enum From e0028a907d92dad663e3cf458dbe2d80e2e3998b Mon Sep 17 00:00:00 2001 From: Yanrishatum Date: Mon, 31 Jan 2022 13:10:24 +0300 Subject: [PATCH 2/4] Fix declaration after label error --- libs/sdl/sdl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/sdl/sdl.c b/libs/sdl/sdl.c index 3cd15c312..8772cd8b8 100644 --- a/libs/sdl/sdl.c +++ b/libs/sdl/sdl.c @@ -339,12 +339,13 @@ HL_PRIM bool HL_NAME(event_loop)( event_data *event ) { case SDL_DROPBEGIN: event->type = DropStart; break; - case SDL_DROPFILE: case SDL_DROPTEXT: - vbyte* bytes = hl_copy_bytes(e.drop.file, (int) strlen(e.drop.file) + 1); + case SDL_DROPFILE: case SDL_DROPTEXT: { + vbyte* bytes = hl_copy_bytes(e.drop.file, (int)strlen(e.drop.file) + 1); SDL_free(e.drop.file); event->type = e.type == SDL_DROPFILE ? DropFile : DropText; event->dropFile = bytes; break; + } case SDL_DROPCOMPLETE: event->type = DropEnd; break; From 6d0858e71be33aefcb32af721c16c8e59becf417 Mon Sep 17 00:00:00 2001 From: Yanrishatum Date: Mon, 31 Jan 2022 14:05:15 +0300 Subject: [PATCH 3/4] Fix redundant return (make mac compiler happy) --- libs/sdl/sdl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/sdl/sdl.c b/libs/sdl/sdl.c index 8772cd8b8..1ba80eee1 100644 --- a/libs/sdl/sdl.c +++ b/libs/sdl/sdl.c @@ -830,7 +830,7 @@ HL_PRIM char* HL_NAME(get_clipboard_text)() { } HL_PRIM void HL_NAME(set_drag_and_drop_enabled)( bool enabled ) { - return SDL_EventState(SDL_DROPFILE, enabled ? SDL_ENABLE : SDL_DISABLE); + SDL_EventState(SDL_DROPFILE, enabled ? SDL_ENABLE : SDL_DISABLE); } HL_PRIM bool HL_NAME(get_drag_and_drop_enabled)() { From 418018f77383fc73f1342f0395fe8725152c2000 Mon Sep 17 00:00:00 2001 From: Yanrishatum Date: Mon, 30 Oct 2023 16:01:58 +0300 Subject: [PATCH 4/4] Mark SDL drag&drop API as optional dependency Match code formatting --- libs/sdl/sdl/Sdl.hx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libs/sdl/sdl/Sdl.hx b/libs/sdl/sdl/Sdl.hx index 3adf486cc..55e5fdfa3 100644 --- a/libs/sdl/sdl/Sdl.hx +++ b/libs/sdl/sdl/Sdl.hx @@ -234,8 +234,14 @@ class Sdl { return null; } - public static function setDragAndDropEnabled( v : Bool ): Void {} - public static function getDragAndDropEnabled(): Bool { return false; } + @:hlNative("?sdl", "set_drag_and_drop_enabled") + public static function setDragAndDropEnabled( v : Bool ): Void { + } + + @:hlNative("?sdl", "get_drag_and_drop_enabled") + public static function getDragAndDropEnabled(): Bool { + return false; + } } enum abstract SDLHint(String) from String to String {