summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2010-07-14 13:58:07 +0200
committerBram Moolenaar <Bram@vim.org>2010-07-14 13:58:07 +0200
commit164fca39bdacc36b7d9f2d1b28ab5abe03ce4004 (patch)
tree0280e2098fc47966b5bb419f63d3c655a75d1e25
parent7abcaab78da25f07190a114a84a9000f91cf044f (diff)
downloadvim-git-164fca39bdacc36b7d9f2d1b28ab5abe03ce4004.tar.gz
Add clipboard support in Mac console. (Bjorn Winckler)
-rw-r--r--Filelist2
-rw-r--r--runtime/doc/debug.txt10
-rw-r--r--runtime/doc/todo.txt6
-rw-r--r--src/Make_cyg.mak3
-rw-r--r--src/Makefile4
-rwxr-xr-xsrc/auto/configure34
-rw-r--r--src/configure.in33
-rw-r--r--src/os_mac.h2
-rw-r--r--src/os_mac_conv.c5
-rw-r--r--src/os_macosx.m (renamed from src/os_macosx.c)188
-rw-r--r--src/vim.h3
11 files changed, 238 insertions, 52 deletions
diff --git a/Filelist b/Filelist
index 8e80e4473..d41af0a22 100644
--- 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 \
diff --git a/runtime/doc/debug.txt b/runtime/doc/debug.txt
index 55939022b..eb5a30593 100644
--- a/runtime/doc/debug.txt
+++ b/runtime/doc/debug.txt
@@ -39,7 +39,7 @@ This also applies when using the MingW tools.
==============================================================================
-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 leaks.
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*
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 6077c2cc5..6a7d9ad66 100644
--- 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 @@ Patches to possibly include:
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
diff --git a/src/Make_cyg.mak b/src/Make_cyg.mak
index b80c258e3..9091d0946 100644
--- 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)
diff --git a/src/Makefile b/src/Makefile
index 0b86b46c8..592162557 100644
--- 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
diff --git a/src/auto/configure b/src/auto/configure
index 20f723b9b..380491f36 100755
--- 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_objext \
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 @@ $as_echo "no GUI support" >&6; }
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 @@ $as_echo "yes" >&6; };
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"; then
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 @@ $as_echo "yes" >&6; }
$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
diff --git a/src/configure.in b/src/configure.in
index 567c7a218..0e0e6469b 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -101,7 +101,7 @@ if test "`(uname) 2>/dev/null`" = Darwin; then
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; then
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_x" = "xno" ; then
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_CARBON" -a "x$CARBON" = "xyes"; then
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"; then
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
diff --git a/src/os_mac.h b/src/os_mac.h
index f1ed96541..05b572dea 100644
--- 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>
diff --git a/src/os_mac_conv.c b/src/os_mac_conv.c
index 793018998..3ede6480d 100644
--- 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;
diff --git a/src/os_macosx.c b/src/os_macosx.m
index 0868ef047..7067df4b7 100644
--- 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 */
diff --git a/src/vim.h b/src/vim.h
index cb2bc7da1..b231f1987 100644
--- 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