changeset 2309:543ea69d037f vim73

Add clipboard support in Mac console. (Bjorn Winckler)
author Bram Moolenaar <bram@vim.org>
date Wed, 14 Jul 2010 13:58:07 +0200
parents cb025511f6b6
children 3e4574a4b627
files Filelist runtime/doc/debug.txt runtime/doc/todo.txt src/Make_cyg.mak src/Makefile src/auto/configure src/configure.in src/os_mac.h src/os_mac_conv.c src/os_macosx.c src/os_macosx.m src/vim.h
diffstat 12 files changed, 841 insertions(+), 655 deletions(-) [+]
line wrap: on
line diff
--- a/Filelist
+++ b/Filelist
@@ -373,7 +373,7 @@ SRC_MAC =	\
 		src/os_mac.h \
 		src/os_mac.rsr.hqx \
 		src/os_mac_conv.c \
-		src/os_macosx.c \
+		src/os_macosx.m \
 		src/proto/gui_mac.pro \
 		src/proto/os_mac_conv.pro \
 
--- a/runtime/doc/debug.txt
+++ b/runtime/doc/debug.txt
@@ -39,7 +39,7 @@ 4. Get a stack trace from gdb with this 
 
 ==============================================================================
 
-2. Locating memory leaks				*debug-leaks*
+2. Locating memory leaks			*debug-leaks* *valgrind*
 
 If you suspect Vim is leaking memory and you are using Linux, the valgrind
 tool is very useful to pinpoint memory leaks.
@@ -47,14 +47,18 @@ tool is very useful to pinpoint memory l
 First of all, build Vim with EXITFREE defined.  Search for this in MAKEFILE
 and uncomment the line.
 
-Use this command to start Vim:				*valgrind*
+Use this command to start Vim:
 >
-	valgrind --log-file=valgrind.log ./vim
+	valgrind --log-file=valgrind.log --leak-check=full ./vim
 
 Note: Vim will run much slower.  If your .vimrc is big or you have several
 plugins you need to be patient for startup, or run with the "-u NONE"
 argument.
 
+There are often a few leaks from libraries, such as getpwuid() and
+XtVaAppCreateShell().  Those are unavoidable.  The number of bytes should be
+very small a Kbyte or less.
+
 ==============================================================================
 
 3. Windows Bug Reporting				*debug-win32*
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1098,7 +1098,7 @@ Vim 7.3:
 - Conceal feature: no update when moving to another window. (Dominique Pelle,
   2010 Jul 5)  Vince will look into it.
 Patches to possibly include:
-- Mac: console clipboard support. (Bjoren Winckler, 2010 Jul 12)
+- Mac: console clipboard support. (Bjorn Winckler, 2010 Jul 12)
 - Win32: patch for better font scaling. (George Reilly, 2009 Mar 26) 
 - Patch for completion of ":find" arguments. (Nazri Ramliy, 2009 Feb 22, 26)
   8   For ":find" and ":sfind" expand files found in 'path'.
@@ -1106,8 +1106,9 @@ Patches to possibly include:
 - Patch for vertical line at certain column position, 'guidecolumn' option.
   (Pankaj Garg, 2009 Apr 14, aka Lone, Apr 15)
   Update 2009 May 2, 'margincolumn'
-  Alternative patch. (2010 Feb 2, Gregor Uhlenheuer, update Apr 18 2010)
+  Alternative patch. (2010 Feb 2, Gregor Uhlenheuer, update 2010 Jul 12)
   Fix by Lech Lorens, Apr 19
+  When there are multiple columns it makes sense to call it 'guidecolumn'
 - Another patch for Javascript indenting. (Hari Kumar, 2010 Jul 11)
   Needs a few tests.
 - Add different highlighting for a fold line depending on the fold level.
@@ -1124,7 +1125,6 @@ 6   In the quickfix window statusline ad
     Docs patch by Dominique Pelle, Mar 25
     Update 2009 Mar 28.
     Fix for invalid memory access. (Lech Lorens, 2009 Apr 17)
-- Fix for test29. (Milan Vancura, 2010 May 16)
 - Disable setting 'encoding' from a modeline?  It usually causes problems,
   can't do any good.  (Patch from Patrick Texier, 2008 Dec 9)
 - Redraw problem when appending digraph causes line to wrap. (James Vega, 2007
--- a/src/Make_cyg.mak
+++ b/src/Make_cyg.mak
@@ -37,7 +37,8 @@
 # USEDLL	no or yes: set to yes to use the Runtime library DLL (no)
 #		For USEDLL=yes the cygwin1.dll is required to run Vim.
 #		"no" does not work with latest version of Cygwin, use
-#		Make_ming.mak instead.  Or set CC to gcc-3.
+#		Make_ming.mak instead.  Or set CC to gcc-3 and add
+#		-L/lib/w32api to EXTRA_LIBS.
 # POSTSCRIPT	no or yes: set to yes for PostScript printing (no)
 # FEATURES	TINY, SMALL, NORMAL, BIG or HUGE (BIG)
 # WINVER	Lowest Win32 version to support.  (0x0400)
--- a/src/Makefile
+++ b/src/Makefile
@@ -2511,8 +2511,8 @@ objects/os_beos.o: os_beos.c
 objects/os_qnx.o: os_qnx.c
 	$(CCC) -o $@ os_qnx.c
 
-objects/os_macosx.o: os_macosx.c
-	$(CCC) -o $@ os_macosx.c
+objects/os_macosx.o: os_macosx.m
+	$(CCC) -o $@ os_macosx.m
 
 objects/os_mac_conv.o: os_mac_conv.c
 	$(CCC) -o $@ os_mac_conv.c
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -4004,7 +4004,7 @@ fi
 $as_echo "no" >&6; }
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Darwin files are there" >&5
 $as_echo_n "checking if Darwin files are there... " >&6; }
-    if test -f os_macosx.c; then
+    if test -f os_macosx.m; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
     else
@@ -4160,14 +4160,9 @@ rm -f core conftest.err conftest.$ac_obj
 
   if test "$enable_darwin" = "yes"; then
     MACOSX=yes
-    OS_EXTRA_SRC="os_macosx.c os_mac_conv.c";
+    OS_EXTRA_SRC="os_macosx.m os_mac_conv.c";
     OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
         CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
-    if test "x$MACARCH" = "xboth"; then
-      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
-    else
-      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
-    fi
 
                 # On IRIX 5.3, sys/types and inttypes.h are conflicting.
 for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
@@ -7025,8 +7020,9 @@ elif test "x$MACOSX" = "xyes" -a "x$with
 		SKIP_CARBON=YES ;;
     yes|"")	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - automatic GUI support" >&5
 $as_echo "yes - automatic GUI support" >&6; } ;;
-    auto)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: auto - automatic GUI support" >&5
-$as_echo "auto - automatic GUI support" >&6; } ;;
+    auto)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: auto - Carbon GUI is outdated - disable GUI support" >&5
+$as_echo "auto - Carbon GUI is outdated - disable GUI support" >&6; }
+		SKIP_CARBON=YES ;;
     carbon)	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Carbon GUI support" >&5
 $as_echo "Carbon GUI support" >&6; } ;;
     *)		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Sorry, $enable_gui GUI is not supported" >&5
@@ -7184,6 +7180,12 @@ if test "x$MACOSX" = "xyes" -a -z "$SKIP
     VIMNAME=Vim
   fi
 
+  if test "x$MACARCH" = "xboth"; then
+    CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
+  else
+    CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
+  fi
+
     if test x$prefix = xNONE; then
     prefix=/Applications
   fi
@@ -11774,13 +11776,11 @@ if test "x$MACOSX" = "xyes" -a -n "$PERL
   fi
 fi
 
-if test "x$MACOSX" = "xyes" && test "x$CARBON" = "xyes" \
-	&& test "x$GUITYPE" != "xCARBONGUI"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need -framework Carbon" >&5
-$as_echo_n "checking whether we need -framework Carbon... " >&6; }
-    if test "x$enable_multibyte" = "xyes" || test "x$features" = "xbig" \
-	|| test "x$features" = "xhuge"; then
-    LIBS="$LIBS -framework Carbon"
+if test "x$MACOSX" = "xyes"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need -framework Cocoa" >&5
+$as_echo_n "checking whether we need -framework Cocoa... " >&6; }
+      if test "x$features" != "xtiny" || test "x$enable_multibyte" = "xyes"; then
+    LIBS=$"$LIBS -framework Cocoa"
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
   else
@@ -11788,7 +11788,7 @@ if test "x$MACOSX" = "xyes" && test "x$C
 $as_echo "no" >&6; }
   fi
 fi
-if test "x$MACARCH" = "xboth"; then
+if test "x$MACARCH" = "xboth" && test "x$GUITYPE" = "xCARBONGUI"; then
   LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
 fi
 
--- a/src/configure.in
+++ b/src/configure.in
@@ -101,7 +101,7 @@ if test "`(uname) 2>/dev/null`" = Darwin
   if test "$enable_darwin" = "yes"; then
     AC_MSG_RESULT(no)
     AC_MSG_CHECKING(if Darwin files are there)
-    if test -f os_macosx.c; then
+    if test -f os_macosx.m; then
       AC_MSG_RESULT(yes)
     else
       AC_MSG_RESULT([no, Darwin support disabled])
@@ -168,15 +168,10 @@ if test "`(uname) 2>/dev/null`" = Darwin
 
   if test "$enable_darwin" = "yes"; then
     MACOSX=yes
-    OS_EXTRA_SRC="os_macosx.c os_mac_conv.c";
+    OS_EXTRA_SRC="os_macosx.m os_mac_conv.c";
     OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
     dnl TODO: use -arch i386 on Intel machines
     CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp"
-    if test "x$MACARCH" = "xboth"; then
-      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
-    else
-      CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
-    fi
 
     dnl If Carbon is found, assume we don't want X11
     dnl unless it was specifically asked for (--with-x)
@@ -1325,7 +1320,8 @@ elif test "x$MACOSX" = "xyes" -a "x$with
     no)		AC_MSG_RESULT(no GUI support)
 		SKIP_CARBON=YES ;;
     yes|"")	AC_MSG_RESULT(yes - automatic GUI support) ;;
-    auto)	AC_MSG_RESULT(auto - automatic GUI support) ;;
+    auto)	AC_MSG_RESULT(auto - Carbon GUI is outdated - disable GUI support)
+		SKIP_CARBON=YES ;;
     carbon)	AC_MSG_RESULT(Carbon GUI support) ;;
     *)		AC_MSG_RESULT([Sorry, $enable_gui GUI is not supported])
 		SKIP_CARBON=YES ;;
@@ -1436,6 +1432,12 @@ if test "x$MACOSX" = "xyes" -a -z "$SKIP
     VIMNAME=Vim
   fi
 
+  if test "x$MACARCH" = "xboth"; then
+    CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon"
+  else
+    CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon"
+  fi
+
   dnl Default install directory is not /usr/local
   if test x$prefix = xNONE; then
     prefix=/Applications
@@ -3109,19 +3111,18 @@ if test "x$MACOSX" = "xyes" -a -n "$PERL
   fi
 fi
 
-if test "x$MACOSX" = "xyes" && test "x$CARBON" = "xyes" \
-	&& test "x$GUITYPE" != "xCARBONGUI"; then
-  AC_MSG_CHECKING(whether we need -framework Carbon)
-  dnl check for MACOSX without Carbon GUI, but with FEAT_MBYTE
-  if test "x$enable_multibyte" = "xyes" || test "x$features" = "xbig" \
-	|| test "x$features" = "xhuge"; then
-    LIBS="$LIBS -framework Carbon"
+if test "x$MACOSX" = "xyes"; then
+  AC_MSG_CHECKING(whether we need -framework Cocoa)
+  dnl Cocoa is needed with FEAT_CLIPBOARD or FEAT_MBYTE (the former is
+  dnl disabled during tiny build)
+  if test "x$features" != "xtiny" || test "x$enable_multibyte" = "xyes"; then
+    LIBS=$"$LIBS -framework Cocoa"
     AC_MSG_RESULT(yes)
   else
     AC_MSG_RESULT(no)
   fi
 fi
-if test "x$MACARCH" = "xboth"; then
+if test "x$MACARCH" = "xboth" && test "x$GUITYPE" = "xCARBONGUI"; then
   LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
 fi
 
--- a/src/os_mac.h
+++ b/src/os_mac.h
@@ -22,7 +22,7 @@
  * Include the Mac header files, unless also compiling with X11 (the header
  * files have many conflicts).
  */
-#ifndef FEAT_X11
+#ifdef FEAT_GUI_MAC
 # include <Quickdraw.h>	    /* Apple calls it QuickDraw.h... */
 # include <ToolUtils.h>
 # include <LowMem.h>
--- a/src/os_mac_conv.c
+++ b/src/os_mac_conv.c
@@ -15,8 +15,13 @@
 
 #define NO_X11_INCLUDES
 #include "vim.h"
+#ifndef FEAT_GUI_MAC
+# include <CoreServices/CoreServices.h>
+#endif
+
 
 #if defined(MACOS_CONVERT) || defined(PROTO)
+
 # ifdef PROTO
 /* A few dummy types to be able to generate function prototypes. */
 typedef int UniChar;
rename from src/os_macosx.c
rename to src/os_macosx.m
--- a/src/os_macosx.c
+++ b/src/os_macosx.m
@@ -8,19 +8,20 @@
  */
 
 /*
- * os_macosx.c -- Mac specific things for Mac OS/X.
+ * os_macosx.m -- Mac specific things for Mac OS/X.
  */
 
-#ifdef MACOS_X_UNIX
-# ifdef HAVE_CONFIG_H	    /* Using Makefile. */
-#  include "vim.h"
-# else
-#  include "os_unix.c"	    /* Using Project Builder */
-# endif
-#else
+#ifndef MACOS_X_UNIX
     Error: MACOS 9 is no longer supported in Vim 7
 #endif
 
+#include "vim.h"
+#import <Cocoa/Cocoa.h>
+
+
+NSString *VimPboardType = @"VimPboardType";
+
+
 #ifdef _DEBUG
     void
 Trace(char* fmt, ...)
@@ -609,3 +610,174 @@ mch_textdomain(const char *domain)
     return (char*)domain;
 }
 #endif
+
+
+
+#ifdef FEAT_CLIPBOARD
+
+    void
+clip_mch_lose_selection(VimClipboard *cbd)
+{
+}
+
+
+    int
+clip_mch_own_selection(VimClipboard *cbd)
+{
+    /* This is called whenever there is a new selection and 'guioptions'
+     * contains the "a" flag (automatically copy selection).  Return TRUE, else
+     * the "a" flag does nothing.  Note that there is no concept of "ownership"
+     * of the clipboard in Mac OS X.
+     */
+    return TRUE;
+}
+
+
+    void
+clip_mch_request_selection(VimClipboard *cbd)
+{
+    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+    NSPasteboard *pb = [NSPasteboard generalPasteboard];
+    NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType,
+	    NSStringPboardType, nil];
+    NSString *bestType = [pb availableTypeFromArray:supportedTypes];
+    if (!bestType) goto releasepool;
+
+    int motion_type = MCHAR;
+    NSString *string = nil;
+
+    if ([bestType isEqual:VimPboardType])
+    {
+	/* This type should consist of an array with two objects:
+	 *   1. motion type (NSNumber)
+	 *   2. text (NSString)
+	 * If this is not the case we fall back on using NSStringPboardType.
+	 */
+	id plist = [pb propertyListForType:VimPboardType];
+	if ([plist isKindOfClass:[NSArray class]] && [plist count] == 2)
+	{
+	    id obj = [plist objectAtIndex:1];
+	    if ([obj isKindOfClass:[NSString class]])
+	    {
+		motion_type = [[plist objectAtIndex:0] intValue];
+		string = obj;
+	    }
+	}
+    }
+
+    if (!string)
+    {
+	/* Use NSStringPboardType.  The motion type is set to line-wise if the
+	 * string contains at least one EOL character, otherwise it is set to
+	 * character-wise (block-wise is never used).
+	 */
+	NSMutableString *mstring =
+		[[pb stringForType:NSStringPboardType] mutableCopy];
+	if (!mstring) goto releasepool;
+
+	/* Replace unrecognized end-of-line sequences with \x0a (line feed). */
+	NSRange range = { 0, [mstring length] };
+	unsigned n = [mstring replaceOccurrencesOfString:@"\x0d\x0a"
+					     withString:@"\x0a" options:0
+						  range:range];
+	if (0 == n)
+	{
+	    n = [mstring replaceOccurrencesOfString:@"\x0d" withString:@"\x0a"
+					   options:0 range:range];
+	}
+	
+	/* Scan for newline character to decide whether the string should be
+	 * pasted line-wise or character-wise.
+	 */
+	motion_type = MCHAR;
+	if (0 < n || NSNotFound != [mstring rangeOfString:@"\n"].location)
+	    motion_type = MLINE;
+
+	string = mstring;
+    }
+
+    if (!(MCHAR == motion_type || MLINE == motion_type || MBLOCK == motion_type
+	    || MAUTO == motion_type))
+	motion_type = MCHAR;
+
+    char_u *str = (char_u*)[string UTF8String];
+    int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+
+#ifdef FEAT_MBYTE
+    if (input_conv.vc_type != CONV_NONE)
+	str = string_convert(&input_conv, str, &len);
+#endif
+
+    if (str)
+	clip_yank_selection(motion_type, str, len, cbd);
+
+#ifdef FEAT_MBYTE
+    if (input_conv.vc_type != CONV_NONE)
+	vim_free(str);
+#endif
+
+releasepool:
+    [pool release];
+}
+
+
+/*
+ * Send the current selection to the clipboard.
+ */
+    void
+clip_mch_set_selection(VimClipboard *cbd)
+{
+    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+    /* If the '*' register isn't already filled in, fill it in now. */
+    cbd->owned = TRUE;
+    clip_get_selection(cbd);
+    cbd->owned = FALSE;
+    
+    /* Get the text to put on the pasteboard. */
+    long_u llen = 0; char_u *str = 0;
+    int motion_type = clip_convert_selection(&str, &llen, cbd);
+    if (motion_type < 0)
+	goto releasepool;
+
+    /* TODO: Avoid overflow. */
+    int len = (int)llen;
+#ifdef FEAT_MBYTE
+    if (output_conv.vc_type != CONV_NONE)
+    {
+	char_u *conv_str = string_convert(&output_conv, str, &len);
+	if (conv_str)
+	{
+	    vim_free(str);
+	    str = conv_str;
+	}
+    }
+#endif
+
+    if (len > 0)
+    {
+	NSString *string = [[NSString alloc]
+	    initWithBytes:str length:len encoding:NSUTF8StringEncoding];
+
+	/* See clip_mch_request_selection() for info on pasteboard types. */
+	NSPasteboard *pb = [NSPasteboard generalPasteboard];
+	NSArray *supportedTypes = [NSArray arrayWithObjects:VimPboardType,
+		NSStringPboardType, nil];
+	[pb declareTypes:supportedTypes owner:nil];
+
+	NSNumber *motion = [NSNumber numberWithInt:motion_type];
+	NSArray *plist = [NSArray arrayWithObjects:motion, string, nil];
+	[pb setPropertyList:plist forType:VimPboardType];
+
+	[pb setString:string forType:NSStringPboardType];
+	
+	[string release];
+    }
+
+    vim_free(str);
+releasepool:
+    [pool release];
+}
+
+#endif /* FEAT_CLIPBOARD */
--- a/src/vim.h
+++ b/src/vim.h
@@ -93,6 +93,9 @@
 # ifndef HAVE_CONFIG_H
 #  define UNIX
 # endif
+# ifndef FEAT_CLIPBOARD
+#  define FEAT_CLIPBOARD
+# endif
 #endif
 #if defined(MACOS_X) || defined(MACOS_CLASSIC)
 #  define MACOS