From c72b3ce5b7d2c419c59a5e7180bdf62608924d29 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Wed, 4 Jul 2018 17:21:40 +0200 Subject: [PATCH] Implement Pasting (with command-V) in OS X --- src/SDLMain.m | 20 ++++++++++++++++++++ src/input.h | 4 ++-- src/readline.c | 24 +++++++++++++++++++++--- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/SDLMain.m b/src/SDLMain.m index 06b858aa..82b08fa0 100644 --- a/src/SDLMain.m +++ b/src/SDLMain.m @@ -397,3 +397,23 @@ int main (int argc, char **argv) #endif return 0; } + +const char * get_paste_board(void) +{ + NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; + // only available with 10.6+ + //NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; + //NSDictionary *options = [NSDictionary dictionary]; + + //BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; + //if (ok) { + // NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; + // NSString * string = [objectsToPaste objectAtIndex:0]; + // NSLog(@"%@", string); + //} + + //NSLog(@"types : %@", [pasteboard types]); + NSString * string = [pasteboard stringForType:NSStringPboardType]; + NSLog(@"pasteboard content : %@", string); + return [string UTF8String]; +} diff --git a/src/input.h b/src/input.h index e8b754f8..20d0cc85 100644 --- a/src/input.h +++ b/src/input.h @@ -78,7 +78,7 @@ extern char * Drop_file_name; #if defined __HAIKU__ #define SHORTCUT_COPY (KEY_c|MOD_ALT) -#elif defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__) +#elif defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__) || defined(__macosx__) #define SHORTCUT_COPY (KEY_c|MOD_META) #else #define SHORTCUT_COPY (KEY_c|MOD_CTRL) @@ -86,7 +86,7 @@ extern char * Drop_file_name; #if defined __HAIKU__ #define SHORTCUT_PASTE (KEY_v|MOD_ALT) -#elif defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__) +#elif defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__) || defined(__macosx__) #define SHORTCUT_PASTE (KEY_v|MOD_META) #else #define SHORTCUT_PASTE (KEY_v|MOD_CTRL) diff --git a/src/readline.c b/src/readline.c index 2d034357..31a5e2ef 100644 --- a/src/readline.c +++ b/src/readline.c @@ -71,6 +71,8 @@ extern Display * X11_display; extern Window X11_window; extern char * X11_clipboard; +#elif defined(__macosx__) +const char * get_paste_board(void); #endif // Virtual keyboard is ON by default on these platforms: @@ -405,7 +407,8 @@ bye: if (unicode) *unicode = NULL; return haiku_get_clipboard(); - #elif defined(USE_X11) + #elif defined(USE_X11) || defined(__macosx__) + #if defined(USE_X11) Atom selection = XInternAtom(X11_display, "CLIPBOARD", False); Window selection_owner = XGetSelectionOwner(X11_display, selection); @@ -430,11 +433,18 @@ bye: { char * utf8_str = X11_clipboard; X11_clipboard = NULL; + #else + { + // mac OS without X11 + const char * utf8_str = get_paste_board(); + if (utf8_str != NULL) + { + #endif // UTF8 -> UTF16 and UTF8 -> ANSI conversions #if defined(ENABLE_FILENAMES_ICONV) if (unicode != NULL) { - char * input = utf8_str; + char * input = (char *)utf8_str; size_t inbytesleft = strlen(utf8_str); char * output; size_t outbytesleft; @@ -459,7 +469,7 @@ bye: } { char * ansi_str; - char * input = utf8_str; + char * input = (char *)utf8_str; size_t inbytesleft = strlen(utf8_str); char * output; size_t outbytesleft; @@ -473,7 +483,9 @@ bye: if (r != (size_t)-1) { *output = '\0'; +#if defined(USE_X11) free(utf8_str); +#endif return ansi_str; } else @@ -484,7 +496,13 @@ bye: } } #endif + // we can get there if the charset conversions failed + // return the uf8_string, that's better than nothing +#if defined(USE_X11) return utf8_str; +#else + return strdup(utf8_str); +#endif } } return NULL;