diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c
index 5d6c131bf24d71b09f427408d441afc2b13ecce1..c6cc48687bd0e6e0c70e0f68a9f466d82da65266 100644
--- a/src/conio/sdl_con.c
+++ b/src/conio/sdl_con.c
@@ -1,3 +1,7 @@
+#if (defined(__MACH__) && defined(__APPLE__))
+#include <Carbon/Carbon.h>
+#endif
+
 #include <stdarg.h>
 #include <stdio.h>		/* NULL */
 #include <stdlib.h>
@@ -174,6 +178,15 @@ const struct sdl_keyvals sdl_keyval[] =
 };
 const int sdl_tabs[10]={9,17,25,33,41,49,57,65,73,80};
 
+#ifndef _WIN32
+/* *nix copy/paste stuff */
+SDL_sem	*sdl_pastebuf_set;
+SDL_sem	*sdl_pastebuf_copied;
+SDL_mutex	*sdl_copybuf_mutex;
+char *sdl_copybuf=NULL;
+char *sdl_pastebuf=NULL;
+#endif
+
 #if !defined(NO_X) && defined(__unix__)
 #include "SDL_syswm.h"
 
@@ -197,14 +210,6 @@ struct x11 {
 	int		(*XSetSelectionOwner)	(Display*, Atom, Window, Time);
 };
 struct x11 sdl_x11;
-
-/* X11 copy/paste stuff */
-SDL_sem	*sdl_pastebuf_set;
-SDL_sem	*sdl_pastebuf_copied;
-SDL_mutex	*sdl_copybuf_mutex;
-
-char *sdl_copybuf=NULL;
-char *sdl_pastebuf=NULL;
 #endif
 
 /* Called from all threads */
@@ -262,6 +267,10 @@ void sdl_user_func(int func, ...)
 	va_end(argptr);
 }
 
+#if (defined(__MACH__) && defined(__APPLE__))
+int sdl_using_quartz=0;
+#endif
+
 #if !defined(NO_X) && defined(__unix__)
 int sdl_using_x11()
 {
@@ -279,6 +288,20 @@ int sdl_using_x11()
 
 void sdl_copytext(const char *text, size_t buflen)
 {
+#if (defined(__MACH__) && defined(__APPLE__))
+	if(sdl_using_quartz) {
+		ScrapRef	scrap;
+		if(!ClearCurrentScrap()) {		/* purge the current contents of the scrap. */
+fprintf(stderr,"Cleared Scrap\n");
+			if(!GetCurrentScrap(&scrap)) {		/* obtain a reference to the current scrap. */
+fprintf(stderr,"Got scrap\n");
+				PutScrapFlavor(scrap, kScrapFlavorTypeText, kScrapFlavorMaskTranslated /* kScrapFlavorMaskNone */, buflen, text); 		/* write the data to the scrap */
+			}
+		}
+		return;
+	}
+#endif
+
 #if !defined(NO_X) && defined(__unix__)
 	if(sdl_x11available && sdl_using_x11()) {
 		SDL_mutexP(sdl_copybuf_mutex);
@@ -290,19 +313,17 @@ void sdl_copytext(const char *text, size_t buflen)
 			sdl_user_func(SDL_USEREVENT_COPY,0,0,0,0);
 		}
 		SDL_mutexV(sdl_copybuf_mutex);
+		return;
 	}
-	else {
-#else
-	{
 #endif
-		SDL_mutexP(sdl_copybuf_mutex);
-		FREE_AND_NULL(sdl_copybuf);
 
-		sdl_copybuf=(char *)malloc(buflen+1);
-		if(sdl_copybuf!=NULL)
-			strcpy(sdl_copybuf, text);
-		SDL_mutexV(sdl_copybuf_mutex);
-	}
+	SDL_mutexP(sdl_copybuf_mutex);
+	FREE_AND_NULL(sdl_copybuf);
+
+	sdl_copybuf=(char *)malloc(buflen+1);
+	if(sdl_copybuf!=NULL)
+		strcpy(sdl_copybuf, text);
+	SDL_mutexV(sdl_copybuf_mutex);
 	return;
 }
 
@@ -310,6 +331,29 @@ char *sdl_getcliptext(void)
 {
 	char *ret=NULL;
 
+#if (defined(__MACH__) && defined(__APPLE__))
+	if(sdl_using_quartz) {
+		ScrapRef	scrap;
+		UInt32	fl;
+		Size		scraplen;
+
+		if(!GetCurrentScrap(&scrap)) {		/* obtain a reference to the current scrap. */
+			if(!GetScrapFlavorFlags(scrap, kScrapFlavorTypeText, &fl) && (fl & kScrapFlavorMaskTranslated)) {
+				if(!GetScrapFlavorSize(scrap, kScrapFlavorTypeText, &scraplen)) {
+					if(sdl_pastebuf!=NULL) {
+						ret=(char *)malloc(scraplen+1);
+						if(ret!=NULL) {
+							if(GetScrapFlavorData(scrap, kScrapFlavorTypeText, &scraplen, ret))
+								FREE_AND_NULL(ret);
+						}
+					}
+				}
+			}
+		}
+		return(ret);
+	}
+#endif
+
 #if !defined(NO_X) && defined(__unix__)
 	if(sdl_x11available && sdl_using_x11()) {
 		sdl_user_func(SDL_USEREVENT_PASTE,0,0,0,0);
@@ -320,17 +364,14 @@ char *sdl_getcliptext(void)
 				strcpy(ret,sdl_pastebuf);
 			SDL_SemPost(sdl_pastebuf_copied);
 		}
+		return(ret);
 	}
-	else {
-#else
-	{
 #endif
-		SDL_mutexP(sdl_copybuf_mutex);
-		ret=(char *)malloc(strlen(sdl_pastebuf)+1);
-		if(ret!=NULL)
-			strcpy(ret,sdl_copybuf);
-		SDL_mutexV(sdl_copybuf_mutex);
-	}
+	SDL_mutexP(sdl_copybuf_mutex);
+	ret=(char *)malloc(strlen(sdl_pastebuf)+1);
+	if(ret!=NULL)
+		strcpy(ret,sdl_copybuf);
+	SDL_mutexV(sdl_copybuf_mutex);
 	return(ret);
 }
 
@@ -1175,6 +1216,14 @@ int main(int argc, char **argv)
 								,SDL_HWSURFACE|SDL_HWPALETTE|SDL_RESIZABLE
 							);
 						if(win!=NULL) {
+#if (defined(__MACH__) && defined(__APPLE__))
+							char	driver[16];
+							if(SDL_VideoDriverName(driver, sizeof(driver))==NULL) {
+								if(!strcmp(driver,"Quartz"))
+									sdl_using_quartz=TRUE;
+							}
+#endif
+
 							if(sdl_cursor!=NULL)
 								SDL_FreeSurface(sdl_cursor);
 							sdl_cursor=SDL_CreateRGBSurface(SDL_SWSURFACE|SDL_SRCCOLORKEY, vstat.charwidth, vstat.charheight, 8, 0, 0, 0, 0);
@@ -1223,6 +1272,13 @@ int main(int argc, char **argv)
 									,SDL_HWSURFACE|SDL_HWPALETTE|SDL_RESIZABLE
 								);
 							if(win!=NULL) {
+#if (defined(__MACH__) && defined(__APPLE__))
+								char	driver[16];
+								if(SDL_VideoDriverName(driver, sizeof(driver))==NULL) {
+									if(!strcmp(driver,"Quartz"))
+										sdl_using_quartz=TRUE;
+								}
+#endif
 								vstat.scaling=(int)(win->w/(vstat.charwidth*vstat.cols));
 								if(vstat.scaling < 1)
 									vstat.scaling=1;
@@ -1309,6 +1365,8 @@ int main(int argc, char **argv)
 									SDL_SemWait(sdl_pastebuf_copied);
 								}
 							}
+#else
+							break;
 #endif
 					}
 					break;