Browse Source

Added SDL and win32 bindings to get/set system clipboard (#458)

Maurice Doison 4 years ago
parent
commit
e31db78d8e
4 changed files with 92 additions and 0 deletions
  1. 15 0
      libs/sdl/sdl.c
  2. 23 0
      libs/sdl/sdl/Sdl.hx
  3. 11 0
      libs/ui/ui_stub.c
  4. 43 0
      libs/ui/ui_win.c

+ 15 - 0
libs/sdl/sdl.c

@@ -761,6 +761,19 @@ HL_PRIM void HL_NAME(set_cursor)( SDL_Cursor *c ) {
 	SDL_SetCursor(c);
 }
 
+HL_PRIM bool HL_NAME(set_clipboard_text)(char* text) {
+	return SDL_SetClipboardText(text) == 0;
+}
+
+HL_PRIM char* HL_NAME(get_clipboard_text)() {
+	char* chr = SDL_GetClipboardText();
+	if (chr == NULL)
+		return NULL;
+	vbyte* bytes = hl_copy_bytes(chr, (int) strlen(chr) + 1);
+	SDL_free(chr);
+	return bytes;
+}
+
 #define MAX_DEVICES 16
 HL_PRIM varray *HL_NAME(get_devices)() {
 	varray *a = hl_alloc_array(&hlt_bytes, MAX_DEVICES);
@@ -783,4 +796,6 @@ DEFINE_PRIM(_CURSOR, cursor_create, _SURF _I32 _I32);
 DEFINE_PRIM(_CURSOR, cursor_create_system, _I32);
 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(_ARR, get_devices, _NO_ARG);

+ 23 - 0
libs/sdl/sdl/Sdl.hx

@@ -120,6 +120,29 @@ class Sdl {
 		return @:privateAccess String.fromUTF8(detect_keyboard_layout());
 	}
 
+	@:hlNative("?sdl", "set_clipboard_text")
+	private static function _setClipboardText( text : hl.Bytes ) : Bool {
+		return false;
+	}
+
+	public static function setClipboardText( text : String ) : Bool {
+		if( text == null )
+			return false;
+		return @:privateAccess _setClipboardText( text.toUtf8() );
+	}
+
+	@:hlNative("?sdl", "get_clipboard_text")
+	private static function _getClipboardText() : hl.Bytes {
+		return null;
+	}
+
+	public static function getClipboardText() : String {
+		var t = _getClipboardText();
+		if( t == null )
+			return null;
+		else
+			return @:privateAccess String.fromUTF8(t);
+	}
 }
 
 @:enum

+ 11 - 0
libs/ui/ui_stub.c

@@ -65,6 +65,14 @@ HL_PRIM vbyte *HL_NAME(ui_choose_file)( bool forSave, vdynamic *options ) {
 	return NULL;
 }
 
+HL_PRIM bool HL_NAME(ui_set_clipboard_text)(char* text) {
+	return false;
+}
+
+HL_PRIM vbyte* HL_NAME(ui_get_clipboard_text)() {
+	return NULL;
+}
+
 #define _WIN _ABSTRACT(ui_window)
 #define _SENTINEL _ABSTRACT(ui_sentinel)
 
@@ -86,3 +94,6 @@ DEFINE_PRIM(_VOID, ui_sentinel_pause, _SENTINEL _BOOL);
 DEFINE_PRIM(_BOOL, ui_sentinel_is_paused, _SENTINEL);
 
 DEFINE_PRIM(_BYTES, ui_choose_file, _BOOL _DYN);
+
+DEFINE_PRIM(_BOOL, ui_set_clipboard_text, _BYTES);
+DEFINE_PRIM(_BYTES, ui_get_clipboard_text, _NO_ARG);

+ 43 - 0
libs/ui/ui_win.c

@@ -319,6 +319,46 @@ HL_PRIM vbyte *HL_NAME(ui_choose_file)( bool forSave, vdynamic *options ) {
 	return hl_copy_bytes((vbyte*)outputFile, (int)(wcslen(outputFile)+1)*2);
 }
 
+HL_PRIM bool HL_NAME(ui_set_clipboard_text)(char* text) {
+	if (!OpenClipboard(NULL))
+		return false;
+	if (!EmptyClipboard()) {
+		CloseClipboard();
+		return false;
+	}
+	int len = (int) strlen(text);
+	HGLOBAL g = GlobalAlloc(0, (len + 1) * sizeof(TCHAR));
+	if (g == NULL) {
+		CloseClipboard();
+		return false;
+	}
+	char* chr = GlobalLock(g);
+	memcpy(chr, text, len);
+	chr[len] = '\0';
+	GlobalUnlock(g);
+	HANDLE h = SetClipboardData(CF_TEXT, g);
+	CloseClipboard();
+	return h != NULL;
+}
+
+HL_PRIM byte* HL_NAME(ui_get_clipboard_text)() {
+	if (!OpenClipboard(NULL))
+		return NULL;
+	HANDLE d = GetClipboardData(CF_TEXT);
+	if (d == NULL) {
+		CloseClipboard();
+		return NULL;
+	}
+	char* chr = (char*) GlobalLock(d);
+	if (chr == NULL) {
+		CloseClipboard();
+		return NULL;
+	}
+	vbyte* b = hl_copy_bytes(chr, (int) strlen(chr) + 1);
+	GlobalUnlock(d);
+	CloseClipboard();
+	return b;
+}
 
 #define _WIN _ABSTRACT(ui_window)
 #define _SENTINEL _ABSTRACT(ui_sentinel)
@@ -341,3 +381,6 @@ DEFINE_PRIM(_VOID, ui_sentinel_pause, _SENTINEL _BOOL);
 DEFINE_PRIM(_BOOL, ui_sentinel_is_paused, _SENTINEL);
 
 DEFINE_PRIM(_BYTES, ui_choose_file, _BOOL _DYN);
+
+DEFINE_PRIM(_BOOL, ui_set_clipboard_text, _BYTES);
+DEFINE_PRIM(_BYTES, ui_get_clipboard_text, _NO_ARG);