Compare commits

...

45 Commits

Author SHA1 Message Date
Bjorn Winckler ab9df03d0d Snapshot 32 2008-06-22 14:30:09 +02:00
Bjorn Winckler e7b9c11089 Delay display of popup menu
The popup menu enters a modal loop so it is not displayed immediately to
avoid blocking inside processCommandQueue:.
2008-06-21 21:23:30 +02:00
Bjorn Winckler d98996d31c Code cleanup 2008-06-21 21:18:17 +02:00
Bjorn Winckler 40056b05c3 Delay processing unsafe command queue items
Unsafe messages are defined in isUnsafeMessage().  If a message is
unsafe it should only be handled in the default run loop mode.  This is
e.g. to avoid deleting Cocoa objects when a Cocoa message may be busy
processing it (which may happen due to the nature of distributed objects
and the fact that we process DO message in 'event tracking' mode).
2008-06-21 20:32:37 +02:00
Bjorn Winckler a4e3a7370b Search for toolbar icons in 'runtimepath' 2008-06-21 18:14:36 +02:00
Bjorn Winckler 7ad0084f3f Merge upstream 2008-06-21 16:31:00 +02:00
vimboss d165ccb4bc updated for version 7.1-330 2008-06-21 14:30:28 +00:00
vimboss b53ee76b5e updated for version 7.1-329 2008-06-21 12:14:30 +00:00
vimboss 6255f52fc5 updated for version 7.1-328 2008-06-21 11:12:49 +00:00
vimboss f63e3834b4 updated for version 7.1-327 2008-06-20 19:29:35 +00:00
Bjorn Winckler 9338c9c55c Fall back on latin-1 if Vim strings are not valid utf-8 2008-06-20 19:50:22 +02:00
Bjorn Winckler 11a1c2cb92 Never delete toolbar 2008-06-20 19:36:34 +02:00
Bjorn Winckler 59ad683558 Ensure vim controllers are released in default run loop mode
Vim controllers are released when NSConnectionDidDieNotification is
received.  This notification can arrive in pretty much any run loop mode
so we take care not to act on it until the run loop mode is back to
default.  Otherwise we run the risk of releasing objects which Cocoa is
currently using (e.g. view items) and this leads to crashes.
2008-06-20 19:33:34 +02:00
vimboss 95fb95ebcc updated for version 7.1-326 2008-06-20 16:51:41 +00:00
vimboss bc9688ffdc updated for version 7.1-325 2008-06-20 16:31:07 +00:00
vimboss bafdc2c3e1 updated for version 7.1-324 2008-06-20 16:07:02 +00:00
vimboss 279b3f843c updated for version 7.1-323 2008-06-20 15:53:31 +00:00
vimboss 603f746178 updated for version 7.1-322 2008-06-20 15:31:51 +00:00
vimboss 255571d05e updated for version 7.1-321 2008-06-20 14:52:32 +00:00
vimboss 82038bc905 updated for version 7.1-320 2008-06-20 14:32:41 +00:00
vimboss bca5b2086e updated for version 7.1-319 2008-06-20 10:56:16 +00:00
vimboss 67d03b985b updated for version 7.1-318 2008-06-20 09:59:25 +00:00
vimboss 2d36c33fd5 updated for version 7.1-317 2008-06-20 09:40:11 +00:00
vimboss ee9959e56c updated for version 7.1-316 2008-06-20 09:11:34 +00:00
Bjorn Winckler 9ca5f6bcdb Guard against reentrant calls to processCommandQueue:
If processCommandQueue: is called when inProcessCommandQueue is set we
add the input to a receive queue and return.  This is to ensure that
processCommandQueue: can only be called "once at a time".  Reentrant
calls can be caused by calling a synchronous DO message or by entering a
modal loop in the frontend.
2008-06-15 16:11:38 +02:00
vimboss 626995c3e8 updated for version 7.1-315 2008-06-15 12:21:50 +00:00
Bjorn Winckler 634ef3b803 Never translate Ctrl-click if Alt, Shift, or Cmd are pressed 2008-06-13 19:27:56 +02:00
Bjorn Winckler aed4648a3d Make background processes work 2008-06-13 19:12:55 +02:00
Bjorn Winckler cd2f7e9eb1 Flush output queue even when 'exiting' flag is set
There are legitimate instances when the queue should flush even though
Vim is exiting, e.g. to display a 'confirm quit' dialog with 'go+=c'.

This patch has the negative side-effect that the "dropping DO message"
warning may occur more frequently.  Another fix for this problem has to
be devised.
2008-06-13 19:01:56 +02:00
Bjorn Winckler 3b966f9e01 Snapshot 31 2008-06-13 16:35:31 +02:00
Bjorn Winckler 8009a9912d Update DejaVu font to version 2.25 2008-06-13 14:27:02 +02:00
Bjorn Winckler cdf043f0f9 Draw modeless selection 2008-06-12 22:22:16 +02:00
Bjorn Winckler 757e8b4359 Toolbar buttons respond to mouse clicks again
Toolbar items send vimToolbarItemAction: instead of vimMenuItemAction:.
This enables us to separate toolbar items from menu items and can build
proper descriptors (starting with "ToolBar").
2008-06-12 13:23:26 +02:00
Bjorn Winckler 7b68b0b56d Disable default main menu key equivalent hack
In performKeyEquivalent: do not pass the key equivalent to
defaultMainMenu since this breaks the menus on OS X 10.4.  Also, this
hack is not strictly needed now that window cycling is hardcoded (and a
"New Window" menu is always available on the dock menu) so it is just as
well that it is removed.
2008-06-12 12:58:52 +02:00
Bjorn Winckler 21b029712f Set mouse cursor on mouseMoved:
This seems to be the only way to get the mouse cursor not to be changed
to an I-beam cursor all the time.
2008-06-09 22:18:36 +02:00
Bjorn Winckler 80b4c97a2c Add Dock menu 2008-06-09 21:52:32 +02:00
Bjorn Winckler 404077032e Dialog box handling updated
Keep waiting for dialog reply until it is received.  Any input received
during this wait is discarded unless it is a 'set text dimensions'
message (or keyboard/mouse input).  Also, make setDialogReturn: a
synchronous call so that it is less likely to get dropped.
2008-06-09 21:34:54 +02:00
Bjorn Winckler 04cd1420c1 Force flush output queue before presenting any dialog
The previous commit did not ensure the output queue was flushed before
"browse" dialogs were shown.
2008-06-09 19:13:43 +02:00
Bjorn Winckler 46ae2ec9cb Force flush output queue before showing dialog
This ensures that the swap file information is displayed when the 'swap
file exists' dialog is shown.
2008-06-09 18:48:10 +02:00
Bjorn Winckler 85cc2265e8 Merge upstream 2008-06-09 17:08:00 +02:00
vimboss 4c3907a8ff updated for version 7.1-314 2008-06-09 15:07:54 +00:00
vimboss f4fef46de2 updated for version 7.1-313 2008-06-09 13:10:45 +00:00
vimboss 28c76af675 updated for version 7.1-312 2008-06-09 12:46:00 +00:00
Bjorn Winckler 9716d0b66f Snapshot 30 2008-06-08 16:54:26 +02:00
Bjorn Winckler 428d1b4412 Window cycling hardcoded to keycode 50
Window cycling is hardcoded to happen when the Cmd key is pressed with
the key whose keycode = 50.  Having window cycling in the "Window" menu
means that window cycling stops working when the keyboard layout is
changed.  Thus revert back to the old way of dealing with this since it
seems to work better.
2008-06-08 16:35:43 +02:00
57 changed files with 7158 additions and 449 deletions
+4
View File
@@ -3515,6 +3515,10 @@ line({expr}) The result is a Number, which is the line number of the file
returned)
w0 first line visible in current window
w$ last line visible in current window
v In Visual mode: the start of the Visual area (the
cursor is the end). When not in Visual mode
returns the cursor position. Differs from |'<| in
that it's updated right away.
Note that a mark in another file can be used. The line number
then applies to another buffer.
To get the column number use |col()|. To get both use
+10 -2
View File
@@ -36,7 +36,7 @@ The currently preferred method is using the free Visual C++ Toolkit 2003.
Visual Studio
-------------
Building with Visual Studio (VS 98, VS .NET, VS .NET 2003, and VS .NET 2005)
Building with Visual Studio (VS 98, VS .NET, VS .NET 2003, VS 2005, and VS 2008)
is straightforward. (These instructions should also work for VS 4 and VS 5.)
To build Vim from the command line with MSVC, use Make_mvc.mak.
@@ -139,7 +139,7 @@ to debug Vim itself. An earlier version of the Debugging Tools
is also available through the Platform SDK, |ms-platform-sdk|.
Visual C++ 2005 Express Edition
Visual C++ 2005 Express Edition *msvc-2005-express*
-------------------------------
Visual C++ 2005 Express Edition can be downloaded for free from:
@@ -159,6 +159,14 @@ Visual C++ 2008 Express Edition can be downloaded for free from:
This includes the IDE and the debugger. You can build Vim with Make_mvc.mak.
Visual C++ 2008 Express Edition *msvc-2008-express*
-------------------------------
Visual C++ 2008 Express Edition can be downloaded for free from:
http://msdn2.microsoft.com/en-us/express/default.aspx
This includes the IDE and the debugger. You can build Vim with Make_mvc.mak.
2. MinGW
========
+1 -3
View File
@@ -9,9 +9,7 @@
<key>IBOldestOS</key>
<integer>5</integer>
<key>IBOpenObjects</key>
<array>
<integer>310</integer>
</array>
<array/>
<key>IBSystem Version</key>
<string>9D34</string>
<key>targetFramework</key>
Binary file not shown.
+1 -1
View File
@@ -574,7 +574,7 @@
<key>CFBundleSignature</key>
<string>VIMM</string>
<key>CFBundleVersion</key>
<string>29</string>
<string>32</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
+1
View File
@@ -570,6 +570,7 @@ static int executeInLoginShell(NSString *path, NSArray *args);
{
//NSLog(@"%s%@", _cmd, controller);
[controller cleanup];
[[controller windowController] close];
[vimControllers removeObject:controller];
+37 -8
View File
@@ -96,6 +96,8 @@ enum {
- (void)clearAll;
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
fraction:(int)percent color:(NSColor *)color;
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
numColumns:(int)ncols;
@end
@@ -406,20 +408,18 @@ enum {
&& !(116 == [event keyCode] || 121 == [event keyCode]))
return NO;
// HACK! KeyCode 50 represent the key which switches between windows
// within an application (like Cmd+Tab is used to switch between
// applications). Return NO here, else the window switching does not work.
if ([event keyCode] == 50)
return NO;
// HACK! Let the main menu try to handle any key down event, before
// passing it on to vim, otherwise key equivalents for menus will
// effectively be disabled.
if ([[NSApp mainMenu] performKeyEquivalent:event])
return YES;
// HACK! Give the default main menu a chance to handle the key down event.
// This is to ensure that the standard mappings (which are in the default
// main menu) are always available, also when the default Vim menus are
// used (these do not set any key equivalents!).
if ([[[MMAppController sharedInstance] defaultMainMenu]
performKeyEquivalent:event])
return YES;
// HACK! On Leopard Ctrl-key events end up here instead of keyDown:.
if (flags & NSControlKeyMask) {
[self keyDown:event];
@@ -601,6 +601,19 @@ enum {
[self drawInsertionPointAtRow:row column:col shape:shape
fraction:percent
color:[NSColor colorWithRgbInt:color]];
} else if (DrawInvertedRectDrawType == type) {
int row = *((int*)bytes); bytes += sizeof(int);
int col = *((int*)bytes); bytes += sizeof(int);
int nr = *((int*)bytes); bytes += sizeof(int);
int nc = *((int*)bytes); bytes += sizeof(int);
/*int invert = *((int*)bytes);*/ bytes += sizeof(int);
#if MM_DEBUG_DRAWING
NSLog(@" Draw inverted rect: row=%d col=%d nrows=%d ncols=%d",
row, col, nr, nc);
#endif
[self drawInvertedRectAtRow:row column:col numRows:nr
numColumns:nc];
} else if (SetCursorPosDrawType == type) {
// TODO: This is used for Voice Over support in MMTextView,
// MMAtsuiTextView currently does not support Voice Over.
@@ -1135,4 +1148,20 @@ enum {
}
}
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
numColumns:(int)ncols
{
// TODO: THIS CODE HAS NOT BEEN TESTED!
CGContextRef cgctx = [[NSGraphicsContext currentContext] graphicsPort];
CGContextSaveGState(cgctx);
CGContextSetBlendMode(cgctx, kCGBlendModeDifference);
CGContextSetRGBFillColor(cgctx, 1.0, 1.0, 1.0, 1.0);
CGRect rect = { col * cellSize.width, row * cellSize.height,
ncols * cellSize.width, nrows * cellSize.height };
CGContextFillRect(cgctx, rect);
CGContextRestoreGState(cgctx);
}
@end // MMAtsuiTextView (Drawing)
+2
View File
@@ -71,6 +71,8 @@
scrollBottom:(int)bottom left:(int)left right:(int)right;
- (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape
fraction:(int)percent color:(int)color;
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nr
numColumns:(int)nc invert:(int)invert;
- (void)update;
- (void)flushQueue:(BOOL)force;
- (BOOL)waitForInput:(int)milliseconds;
+73 -11
View File
@@ -80,6 +80,7 @@ static NSString *MMSymlinkWarningString =
@interface MMBackend (Private)
- (void)waitForDialogReturn;
- (void)queueVimStateMessage;
- (void)processInputQueue;
- (void)handleInputEvent:(int)msgid data:(NSData *)data;
@@ -428,6 +429,19 @@ static NSString *MMSymlinkWarningString =
[drawData appendBytes:&percent length:sizeof(int)];
}
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nr
numColumns:(int)nc invert:(int)invert
{
int type = DrawInvertedRectDrawType;
[drawData appendBytes:&type length:sizeof(int)];
[drawData appendBytes:&row length:sizeof(int)];
[drawData appendBytes:&col length:sizeof(int)];
[drawData appendBytes:&nr length:sizeof(int)];
[drawData appendBytes:&nc length:sizeof(int)];
[drawData appendBytes:&invert length:sizeof(int)];
}
- (void)update
{
// Tend to the run loop, returning immediately if there are no events
@@ -448,10 +462,9 @@ static NSString *MMSymlinkWarningString =
// NOTE! This method gets called a lot; if we were to flush every time it
// got called MacVim would feel unresponsive. So there is a time out which
// ensures that the queue isn't flushed too often.
if (exiting ||
(!force && lastFlushDate &&
-[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval &&
[drawData length] < MMFlushQueueLenHint))
if (!force && lastFlushDate
&& -[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval
&& [drawData length] < MMFlushQueueLenHint)
return;
if ([drawData length] > 0) {
@@ -640,9 +653,7 @@ static NSString *MMSymlinkWarningString =
@try {
[frontendProxy showSavePanelForDirectory:ds title:ts saving:saving];
// Wait until a reply is sent from MMVimController.
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
[self waitForDialogReturn];
if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) {
char_u *ret = (char_u*)[dialogReturn UTF8String];
@@ -664,13 +675,18 @@ static NSString *MMSymlinkWarningString =
return (char *)s;
}
- (oneway void)setDialogReturn:(in bycopy id)obj
- (void)setDialogReturn:(in bycopy id)obj
{
// NOTE: This is called by
// - [MMVimController panelDidEnd:::], and
// - [MMVimController alertDidEnd:::],
// to indicate that a save/open panel or alert has finished.
// We want to distinguish between "no dialog return yet" and "dialog
// returned nothing". The former can be tested with dialogReturn == nil,
// the latter with dialogReturn == [NSNull null].
if (!obj) obj = [NSNull null];
if (obj != dialogReturn) {
[dialogReturn release];
dialogReturn = [obj retain];
@@ -719,9 +735,7 @@ static NSString *MMSymlinkWarningString =
informativeText:text buttonTitles:buttons
textFieldString:textFieldString];
// Wait until a reply is sent from MMVimController.
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
[self waitForDialogReturn];
if (dialogReturn && [dialogReturn isKindOfClass:[NSArray class]]
&& [dialogReturn count]) {
@@ -1475,6 +1489,49 @@ static NSString *MMSymlinkWarningString =
@implementation MMBackend (Private)
- (void)waitForDialogReturn
{
// Keep processing the run loop until a dialog returns. To avoid getting
// stuck in an endless loop (could happen if the setDialogReturn: message
// was lost) we also do some paranoia checks.
//
// Note that in Cocoa the user can still resize windows and select menu
// items while a sheet is being displayed, so we can't just wait for the
// first message to arrive and assume that is the setDialogReturn: call.
while (nil == dialogReturn && !got_int && [connection isValid]
&& !isTerminating)
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
// Search for any resize messages on the input queue. All other messages
// on the input queue are dropped. The reason why we single out resize
// messages is because the user may have resized the window while a sheet
// was open.
int i, count = [inputQueue count];
if (count > 0) {
id textDimData = nil;
if (count%2 == 0) {
for (i = count-2; i >= 0; i -= 2) {
int msgid = [[inputQueue objectAtIndex:i] intValue];
if (SetTextDimensionsMsgID == msgid) {
textDimData = [[inputQueue objectAtIndex:i+1] retain];
break;
}
}
}
[inputQueue removeAllObjects];
if (textDimData) {
[inputQueue addObject:
[NSNumber numberWithInt:SetTextDimensionsMsgID]];
[inputQueue addObject:textDimData];
[textDimData release];
}
}
}
- (void)queueVimStateMessage
{
// NOTE: This is the place to add Vim state that needs to be accessed from
@@ -1494,6 +1551,8 @@ static NSString *MMSymlinkWarningString =
- (void)processInputQueue
{
if ([inputQueue count] == 0) return;
// NOTE: One of the input events may cause this method to be called
// recursively, so copy the input queue to a local variable and clear it
// before starting to process input events (otherwise we could get stuck in
@@ -1787,6 +1846,9 @@ static NSString *MMSymlinkWarningString =
- (void)queueMessage:(int)msgid data:(NSData *)data
{
//if (msgid != EnableMenuItemMsgID)
// NSLog(@"queueMessage:%s", MessageStrings[msgid]);
[outputQueue addObject:[NSData dataWithBytes:&msgid length:sizeof(int)]];
if (data)
[outputQueue addObject:data];
+2 -2
View File
@@ -29,14 +29,14 @@
int preEditColumn;
int mouseShape;
BOOL antialias;
NSRect *invertRects;
int numInvertRects;
}
- (id)initWithFrame:(NSRect)frame;
- (void)setShouldDrawInsertionPoint:(BOOL)on;
- (void)setPreEditRow:(int)row column:(int)col;
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
fraction:(int)percent color:(NSColor *)color;
- (void)hideMarkedTextField;
- (void)performBatchDrawWithData:(NSData *)data;
- (void)setMouseShape:(int)shape;
+119 -33
View File
@@ -50,6 +50,8 @@ enum {
- (void)setCursor;
- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column;
- (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point;
- (BOOL)convertRow:(int)row column:(int)column numRows:(int)nr
numColumns:(int)nc toRect:(NSRect *)rect;
- (NSRect)trackingRect;
- (void)dispatchKeyEvent:(NSEvent *)event;
- (MMWindowController *)windowController;
@@ -58,6 +60,10 @@ enum {
- (void)dragTimerFired:(NSTimer *)timer;
- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags;
- (void)hideMouseCursor;
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
fraction:(int)percent color:(NSColor *)color;
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
numColumns:(int)ncols invert:(int)invert;
@end
@@ -130,6 +136,12 @@ enum {
markedTextField = nil;
}
if (invertRects) {
free(invertRects);
invertRects = NULL;
numInvertRects = 0;
}
[super dealloc];
}
@@ -153,23 +165,6 @@ enum {
preEditColumn = col;
}
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
fraction:(int)percent color:(NSColor *)color
{
//NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@",
// row, col, shape, color);
// This only stores where to draw the insertion point, the actual drawing
// is done in drawRect:.
shouldDrawInsertionPoint = YES;
insertionPointRow = row;
insertionPointColumn = col;
insertionPointShape = shape;
insertionPointFraction = percent;
[self setInsertionPointColor:color];
}
- (void)hideMarkedTextField
{
if (markedTextField) {
@@ -300,6 +295,19 @@ enum {
[self drawInsertionPointAtRow:row column:col shape:shape
fraction:percent
color:[NSColor colorWithRgbInt:color]];
} else if (DrawInvertedRectDrawType == type) {
int row = *((int*)bytes); bytes += sizeof(int);
int col = *((int*)bytes); bytes += sizeof(int);
int nr = *((int*)bytes); bytes += sizeof(int);
int nc = *((int*)bytes); bytes += sizeof(int);
int invert = *((int*)bytes); bytes += sizeof(int);
#if MM_DEBUG_DRAWING
NSLog(@" Draw inverted rect: row=%d col=%d nrows=%d ncols=%d",
row, col, nr, nc);
#endif
[self drawInvertedRectAtRow:row column:col numRows:nr numColumns:nc
invert:invert];
} else if (SetCursorPosDrawType == type) {
cursorRow = *((int*)bytes); bytes += sizeof(int);
cursorCol = *((int*)bytes); bytes += sizeof(int);
@@ -452,6 +460,24 @@ enum {
[super drawRect:rect];
if (invertRects) {
CGContextRef cgctx = (CGContextRef)[context graphicsPort];
CGContextSaveGState(cgctx);
CGContextSetBlendMode(cgctx, kCGBlendModeDifference);
CGContextSetRGBFillColor(cgctx, 1.0, 1.0, 1.0, 1.0);
int i;
CGRect *rect = (CGRect*)invertRects;
for (i = 0; i < numInvertRects; ++i)
CGContextFillRect(cgctx, rect[i]);
CGContextRestoreGState(cgctx);
free(invertRects);
invertRects = NULL;
numInvertRects = 0;
}
if (shouldDrawInsertionPoint) {
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
@@ -640,20 +666,18 @@ enum {
&& !(116 == [event keyCode] || 121 == [event keyCode]))
return NO;
// HACK! KeyCode 50 represent the key which switches between windows
// within an application (like Cmd+Tab is used to switch between
// applications). Return NO here, else the window switching does not work.
if ([event keyCode] == 50)
return NO;
// HACK! Let the main menu try to handle any key down event, before
// passing it on to vim, otherwise key equivalents for menus will
// effectively be disabled.
if ([[NSApp mainMenu] performKeyEquivalent:event])
return YES;
// HACK! Give the default main menu a chance to handle the key down event.
// This is to ensure that the standard mappings (which are in the default
// main menu) are always available, also when the default Vim menus are
// used (these do not set any key equivalents!).
if ([[[MMAppController sharedInstance] defaultMainMenu]
performKeyEquivalent:event])
return YES;
// HACK! On Leopard Ctrl-key events end up here instead of keyDown:.
if (flags & NSControlKeyMask) {
[self keyDown:event];
@@ -829,9 +853,12 @@ enum {
NSMutableData *data = [NSMutableData data];
// If desired, intepret Ctrl-Click as a right mouse click.
if ([[NSUserDefaults standardUserDefaults]
boolForKey:MMTranslateCtrlClickKey]
&& button == 0 && flags & NSControlKeyMask) {
BOOL translateCtrlClick = [[NSUserDefaults standardUserDefaults]
boolForKey:MMTranslateCtrlClickKey];
flags = flags & NSDeviceIndependentModifierFlagsMask;
if (translateCtrlClick && button == 0 &&
(flags == NSControlKeyMask ||
flags == (NSControlKeyMask|NSAlphaShiftKeyMask))) {
button = 1;
flags &= ~NSControlKeyMask;
}
@@ -926,6 +953,11 @@ enum {
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
if (!ts) return;
// HACK! NSTextView has a nasty habit of resetting the cursor to the
// default I-beam cursor at random moments. The only reliable way we know
// of to work around this is to set the cursor each time the mouse moves.
[self setCursor];
NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil];
int row, col;
if (![self convertPoint:pt toRow:&row column:&col])
@@ -958,11 +990,6 @@ enum {
// key.
if ([[self window] isKeyWindow]) {
[[self window] setAcceptsMouseMovedEvents:YES];
// Ensure Vim gets to choose the mouse cursor when it enters over the
// text view, otherwise NSTextView will automatically set its I-Beam
// cursor.
[self setCursor];
}
}
@@ -1244,6 +1271,23 @@ enum {
return YES;
}
- (BOOL)convertRow:(int)row column:(int)column numRows:(int)nr
numColumns:(int)nc toRect:(NSRect *)rect
{
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
NSSize cellSize = [ts cellSize];
if (!(rect && cellSize.width > 0 && cellSize.height > 0))
return NO;
rect->origin = [self textContainerOrigin];
rect->origin.x += column * cellSize.width;
rect->origin.y += row * cellSize.height;
rect->size.width = cellSize.width * nc;
rect->size.height = cellSize.height * nr;
return YES;
}
- (NSRect)trackingRect
{
NSRect rect = [self frame];
@@ -1394,4 +1438,46 @@ enum {
[NSCursor setHiddenUntilMouseMoves:YES];
}
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
fraction:(int)percent color:(NSColor *)color
{
//NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@",
// row, col, shape, color);
// This only stores where to draw the insertion point, the actual drawing
// is done in drawRect:.
shouldDrawInsertionPoint = YES;
insertionPointRow = row;
insertionPointColumn = col;
insertionPointShape = shape;
insertionPointFraction = percent;
[self setInsertionPointColor:color];
}
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
numColumns:(int)ncols invert:(int)invert
{
if (invert) {
// The result should be inverted.
int n = numInvertRects++;
invertRects = reallocf(invertRects,
numInvertRects*sizeof(NSRect));
if (NULL != invertRects) {
[self convertRow:row column:col numRows:nrows numColumns:ncols
toRect:&invertRects[n]];
[self setNeedsDisplayInRect:invertRects[n]];
} else {
n = numInvertRects = 0;
}
} else {
// The result should look normal; all we need to do is to mark
// the rect for redrawing and Cocoa will redraw the text.
NSRect rect;
[self convertRow:row column:col numRows:nrows numColumns:ncols
toRect:&rect];
[self setNeedsDisplayInRect:rect];
}
}
@end // MMTextView (Private)
+1 -9
View File
@@ -12,10 +12,6 @@
#import "MacVim.h"
// If sendMessage: fails, store the message and resend after a delay.
#define MM_RESEND_LAST_FAILURE 0
@class MMWindowController;
@@ -27,17 +23,13 @@
id backendProxy;
BOOL inProcessCommandQueue;
NSMutableArray *sendQueue;
NSMutableArray *receiveQueue;
NSMenu *mainMenu;
NSMutableArray *popupMenuItems;
NSToolbar *toolbar;
NSMutableDictionary *toolbarItemDict;
int pid;
NSString *serverName;
#ifdef MM_RESEND_LAST_FAILURE
NSTimer *resendTimer;
int resendMsgid;
NSData *resendData;
#endif
NSDictionary *vimState;
}
+201 -103
View File
@@ -41,11 +41,14 @@ static int MMAlertTextFieldHeight = 22;
// sendMessage: to actually reach Vim.
static NSTimeInterval MMBackendProxyRequestTimeout = 0;
#if MM_RESEND_LAST_FAILURE
// If a message send fails, the message will be resent after this many seconds
// have passed. (No queue is kept, only the very last message is resent.)
static NSTimeInterval MMResendInterval = 0.5;
#endif
// Timeout used for setDialogReturn:.
static NSTimeInterval MMSetDialogReturnTimeout = 1.0;
// Maximum number of items in the receiveQueue. (It is hard to predict what
// consequences changing this number will have.)
static int MMReceiveQueueCap = 100;
static BOOL isUnsafeMessage(int msgid);
@interface MMAlert : NSAlert {
@@ -57,6 +60,7 @@ static NSTimeInterval MMResendInterval = 0.5;
@interface MMVimController (Private)
- (void)doProcessCommandQueue:(NSArray *)queue;
- (void)handleMessage:(int)msgid data:(NSData *)data;
- (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code
context:(void *)context;
@@ -83,10 +87,8 @@ static NSTimeInterval MMResendInterval = 0.5;
- (void)popupMenuWithDescriptor:(NSArray *)desc
atRow:(NSNumber *)row
column:(NSNumber *)col;
- (void)popupMenuWithAttributes:(NSDictionary *)attrs;
- (void)connectionDidDie:(NSNotification *)notification;
#if MM_RESEND_LAST_FAILURE
- (void)resendTimerFired:(NSTimer *)timer;
#endif
@end
@@ -108,6 +110,7 @@ static NSTimeInterval MMResendInterval = 0.5;
[[MMWindowController alloc] initWithVimController:self];
backendProxy = [backend retain];
sendQueue = [NSMutableArray new];
receiveQueue = [NSMutableArray new];
popupMenuItems = [[NSMutableArray alloc] init];
toolbarItemDict = [[NSMutableDictionary alloc] init];
pid = processIdentifier;
@@ -152,13 +155,10 @@ static NSTimeInterval MMResendInterval = 0.5;
//NSLog(@"%@ %s", [self className], _cmd);
isInitialized = NO;
#if MM_RESEND_LAST_FAILURE
[resendData release]; resendData = nil;
#endif
[serverName release]; serverName = nil;
[backendProxy release]; backendProxy = nil;
[sendQueue release]; sendQueue = nil;
[receiveQueue release]; receiveQueue = nil;
[toolbarItemDict release]; toolbarItemDict = nil;
[toolbar release]; toolbar = nil;
@@ -309,42 +309,12 @@ static NSTimeInterval MMResendInterval = 0.5;
return;
}
#if MM_RESEND_LAST_FAILURE
if (resendTimer) {
//NSLog(@"cancelling scheduled resend of %s",
// MessageStrings[resendMsgid]);
[resendTimer invalidate];
[resendTimer release];
resendTimer = nil;
}
if (resendData) {
[resendData release];
resendData = nil;
}
#endif
@try {
[backendProxy processInput:msgid data:data];
}
@catch (NSException *e) {
//NSLog(@"%@ %s Exception caught during DO call: %@",
// [self className], _cmd, e);
#if MM_RESEND_LAST_FAILURE
//NSLog(@"%s failed, scheduling message %s for resend", _cmd,
// MessageStrings[msgid]);
resendMsgid = msgid;
resendData = [data retain];
resendTimer = [NSTimer
scheduledTimerWithTimeInterval:MMResendInterval
target:self
selector:@selector(resendTimerFired:)
userInfo:nil
repeats:NO];
[resendTimer retain];
#endif
}
}
@@ -423,6 +393,7 @@ static NSTimeInterval MMResendInterval = 0.5;
title:(in bycopy NSString *)title
saving:(int)saving
{
// TODO: Delay call until run loop is in default mode.
if (!isInitialized) return;
if (!dir) {
@@ -457,6 +428,7 @@ static NSTimeInterval MMResendInterval = 0.5;
buttonTitles:(in bycopy NSArray *)buttonTitles
textFieldString:(in bycopy NSString *)textFieldString
{
// TODO: Delay call until run loop is in default mode.
if (!(windowController && buttonTitles && [buttonTitles count])) return;
MMAlert *alert = [[MMAlert alloc] init];
@@ -526,34 +498,43 @@ static NSTimeInterval MMResendInterval = 0.5;
{
if (!isInitialized) return;
@try {
unsigned i, count = [queue count];
if (count % 2) {
NSLog(@"WARNING: Uneven number of components (%d) in flush queue "
"message; ignoring this message.", count);
return;
}
if (inProcessCommandQueue) {
// NOTE! If a synchronous DO call is made during
// doProcessCommandQueue: below it may happen that this method is
// called a second time while the synchronous message is waiting for a
// reply (could also happen if doProcessCommandQueue: enters a modal
// loop, see comment below). Since this method cannot be considered
// reentrant, we queue the input and return immediately.
//
// If doProcessCommandQueue: enters a modal loop (happens e.g. on
// ShowPopupMenuMsgID) then the receiveQueue could grow to become
// arbitrarily large because DO calls still get processed. To avoid
// this we set a cap on the size of the queue and simply clear it if it
// becomes too large. (That is messages will be dropped and hence Vim
// and MacVim will at least temporarily be out of sync.)
if ([receiveQueue count] >= MMReceiveQueueCap)
[receiveQueue removeAllObjects];
inProcessCommandQueue = YES;
//NSLog(@"======== %s BEGIN ========", _cmd);
for (i = 0; i < count; i += 2) {
NSData *value = [queue objectAtIndex:i];
NSData *data = [queue objectAtIndex:i+1];
int msgid = *((int*)[value bytes]);
//NSLog(@"%s%s", _cmd, MessageStrings[msgid]);
[self handleMessage:msgid data:data];
}
//NSLog(@"======== %s END ========", _cmd);
}
@catch (NSException *e) {
NSLog(@"Exception caught whilst processing command queue: %@", e);
[receiveQueue addObject:queue];
return;
}
[windowController processCommandQueueDidFinish];
inProcessCommandQueue = NO;
inProcessCommandQueue = YES;
[self doProcessCommandQueue:queue];
int i;
for (i = 0; i < [receiveQueue count]; ++i) {
// Note that doProcessCommandQueue: may cause the receiveQueue to grow
// or get cleared (due to cap being hit). Make sure to retain the item
// to process or it may get released from under us.
NSArray *q = [[receiveQueue objectAtIndex:i] retain];
[self doProcessCommandQueue:q];
[q release];
}
// We assume that the remaining calls make no synchronous DO calls. If
// that did happen anyway, the command queue could get processed out of
// order.
if ([sendQueue count] > 0) {
@try {
@@ -566,6 +547,10 @@ static NSTimeInterval MMResendInterval = 0.5;
[sendQueue removeAllObjects];
}
[windowController processCommandQueueDidFinish];
[receiveQueue removeAllObjects];
inProcessCommandQueue = NO;
}
- (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar
@@ -596,9 +581,74 @@ static NSTimeInterval MMResendInterval = 0.5;
@implementation MMVimController (Private)
- (void)doProcessCommandQueue:(NSArray *)queue
{
NSMutableArray *delayQueue = nil;
@try {
unsigned i, count = [queue count];
if (count % 2) {
NSLog(@"WARNING: Uneven number of components (%d) in command "
"queue. Skipping...", count);
return;
}
//NSLog(@"======== %s BEGIN ========", _cmd);
for (i = 0; i < count; i += 2) {
NSData *value = [queue objectAtIndex:i];
NSData *data = [queue objectAtIndex:i+1];
int msgid = *((int*)[value bytes]);
//NSLog(@"%s%s", _cmd, MessageStrings[msgid]);
BOOL inDefaultMode = [[[NSRunLoop currentRunLoop] currentMode]
isEqual:NSDefaultRunLoopMode];
if (!inDefaultMode && isUnsafeMessage(msgid)) {
// NOTE: Because we listen to DO messages in 'event tracking'
// mode we have to take extra care when doing things like
// releasing view items (and other Cocoa objects). Messages
// that may be potentially "unsafe" are delayed until the run
// loop is back to default mode at which time they are safe to
// call again.
// A problem with this approach is that it is hard to
// classify which messages are unsafe. As a rule of thumb, if
// a message may release an object used by the Cocoa framework
// (e.g. views) then the message should be considered unsafe.
// Delaying messages may have undesired side-effects since it
// means that messages may not be processed in the order Vim
// sent them, so beware.
if (!delayQueue)
delayQueue = [NSMutableArray array];
//NSLog(@"Adding unsafe message '%s' to delay queue (mode=%@)",
// MessageStrings[msgid],
// [[NSRunLoop currentRunLoop] currentMode]);
[delayQueue addObject:value];
[delayQueue addObject:data];
} else {
[self handleMessage:msgid data:data];
}
}
//NSLog(@"======== %s END ========", _cmd);
}
@catch (NSException *e) {
NSLog(@"Exception caught whilst processing command queue: %@", e);
}
if (delayQueue) {
//NSLog(@" Flushing delay queue (%d items)", [delayQueue count]/2);
[self performSelectorOnMainThread:@selector(processCommandQueue:)
withObject:delayQueue
waitUntilDone:NO
modes:[NSArray arrayWithObject:
NSDefaultRunLoopMode]];
}
}
- (void)handleMessage:(int)msgid data:(NSData *)data
{
//if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID)
//if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID &&
// msgid != EnableMenuItemMsgID)
// NSLog(@"%@ %s%s", [self className], _cmd, MessageStrings[msgid]);
if (OpenVimWindowMsgID == msgid) {
@@ -755,9 +805,14 @@ static NSTimeInterval MMResendInterval = 0.5;
[actionName release];
} else if (ShowPopupMenuMsgID == msgid) {
NSDictionary *attrs = [NSDictionary dictionaryWithData:data];
[self popupMenuWithDescriptor:[attrs objectForKey:@"descriptor"]
atRow:[attrs objectForKey:@"row"]
column:[attrs objectForKey:@"column"]];
// The popup menu enters a modal loop so delay this call so that we
// don't block inside processCommandQueue:.
[self performSelectorOnMainThread:@selector(popupMenuWithAttributes:)
withObject:attrs
waitUntilDone:NO
modes:[NSArray arrayWithObject:
NSDefaultRunLoopMode]];
} else if (SetMouseShapeMsgID == msgid) {
const void *bytes = [data bytes];
int shape = *((int*)bytes); bytes += sizeof(int);
@@ -804,6 +859,8 @@ static NSTimeInterval MMResendInterval = 0.5;
[vimState release];
vimState = [dict retain];
}
// IMPORTANT: When adding a new message, make sure to update
// isUnsafeMessage() if necessary!
} else {
NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid);
}
@@ -813,6 +870,15 @@ static NSTimeInterval MMResendInterval = 0.5;
context:(void *)context
{
NSString *path = (code == NSOKButton) ? [panel filename] : nil;
// NOTE! setDialogReturn: is a synchronous call so set a proper timeout to
// avoid waiting forever for it to finish. We make this a synchronous call
// so that we can be fairly certain that Vim doesn't think the dialog box
// is still showing when MacVim has in fact already dismissed it.
NSConnection *conn = [backendProxy connectionForProxy];
NSTimeInterval oldTimeout = [conn requestTimeout];
[conn setRequestTimeout:MMSetDialogReturnTimeout];
@try {
[backendProxy setDialogReturn:path];
@@ -825,6 +891,9 @@ static NSTimeInterval MMResendInterval = 0.5;
@catch (NSException *e) {
NSLog(@"Exception caught in %s %@", _cmd, e);
}
@finally {
[conn setRequestTimeout:oldTimeout];
}
}
- (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context
@@ -1054,10 +1123,9 @@ static NSTimeInterval MMResendInterval = 0.5;
NSString *rootName = [desc objectAtIndex:0];
if ([rootName isEqual:@"ToolBar"]) {
if (toolbar) {
if ([desc count] == 1) {
[windowController setToolbar:nil];
[toolbar release]; toolbar = nil;
} else if ([desc count] == 2) {
// Only remove toolbar items, never actually remove the toolbar
// itself or strange things may happen.
if ([desc count] == 2) {
int idx = [toolbar indexOfItemWithItemIdentifier:title];
if (idx != NSNotFound)
[toolbar removeItemAtIndex:idx];
@@ -1111,7 +1179,8 @@ static NSTimeInterval MMResendInterval = 0.5;
}
- (void)addToolbarItemToDictionaryWithLabel:(NSString *)title
toolTip:(NSString *)tip icon:(NSString *)icon
toolTip:(NSString *)tip
icon:(NSString *)icon
{
// If the item corresponds to a separator then do nothing, since it is
// already defined by Cocoa.
@@ -1123,10 +1192,12 @@ static NSTimeInterval MMResendInterval = 0.5;
NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:title];
[item setLabel:title];
[item setToolTip:tip];
[item setAction:@selector(vimMenuItemAction:)];
[item setAction:@selector(vimToolbarItemAction:)];
[item setAutovalidates:NO];
NSImage *img = [NSImage imageNamed:icon];
if (!img)
img = [[[NSImage alloc] initByReferencingFile:icon] autorelease];
if (!img) {
NSLog(@"WARNING: Could not find image with name '%@' to use as toolbar"
" image for identifier '%@';"
@@ -1143,8 +1214,10 @@ static NSTimeInterval MMResendInterval = 0.5;
[item release];
}
- (void)addToolbarItemWithLabel:(NSString *)label tip:(NSString
*)tip icon:(NSString *)icon atIndex:(int)idx
- (void)addToolbarItemWithLabel:(NSString *)label
tip:(NSString *)tip
icon:(NSString *)icon
atIndex:(int)idx
{
if (!toolbar) return;
@@ -1205,16 +1278,32 @@ static NSTimeInterval MMResendInterval = 0.5;
[NSMenu popUpContextMenu:menu withEvent:event forView:textView];
}
- (void)popupMenuWithAttributes:(NSDictionary *)attrs
{
if (!attrs) return;
[self popupMenuWithDescriptor:[attrs objectForKey:@"descriptor"]
atRow:[attrs objectForKey:@"row"]
column:[attrs objectForKey:@"column"]];
}
- (void)connectionDidDie:(NSNotification *)notification
{
//NSLog(@"%@ %s%@", [self className], _cmd, notification);
[self cleanup];
// NOTE! This causes the call to removeVimController: to be delayed.
// NOTE! This notification can arrive at pretty much anytime, e.g. while
// the run loop is the 'event tracking' mode. This means that Cocoa may
// well be in the middle of processing some message while this message is
// received. If we were to remove the vim controller straight away we may
// free objects that Cocoa is currently using (e.g. view objects). The
// following call ensures that the vim controller is not released until the
// run loop is back in the 'default' mode.
[[MMAppController sharedInstance]
performSelectorOnMainThread:@selector(removeVimController:)
withObject:self waitUntilDone:NO];
withObject:self
waitUntilDone:NO
modes:[NSArray arrayWithObject:
NSDefaultRunLoopMode]];
}
- (NSString *)description
@@ -1222,26 +1311,6 @@ static NSTimeInterval MMResendInterval = 0.5;
return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenu=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenu, popupMenuItems, toolbar];
}
#if MM_RESEND_LAST_FAILURE
- (void)resendTimerFired:(NSTimer *)timer
{
int msgid = resendMsgid;
NSData *data = nil;
[resendTimer release];
resendTimer = nil;
if (!isInitialized)
return;
if (resendData)
data = [resendData copy];
//NSLog(@"Resending message: %s", MessageStrings[msgid]);
[self sendMessage:msgid data:data];
}
#endif
@end // MMVimController (Private)
@@ -1346,3 +1415,32 @@ static NSTimeInterval MMResendInterval = 0.5;
}
@end // MMAlert
static BOOL
isUnsafeMessage(int msgid)
{
// Messages that may release Cocoa objects must be added to this list. For
// example, UpdateTabBarMsgID may delete NSTabViewItem objects so it goes
// on this list.
static int unsafeMessages[] = { // REASON MESSAGE IS ON THIS LIST:
OpenVimWindowMsgID, // Changes lots of state
UpdateTabBarMsgID, // May delete NSTabViewItem
RemoveMenuItemMsgID, // Deletes NSMenuItem
DestroyScrollbarMsgID, // Deletes NSScroller
ExecuteActionMsgID, // Impossible to predict
ShowPopupMenuMsgID, // Enters modal loop
ActivateMsgID, // ?
EnterFullscreenMsgID, // Modifies delegate of window controller
LeaveFullscreenMsgID, // Modifies delegate of window controller
};
int i, count = sizeof(unsafeMessages)/sizeof(unsafeMessages[0]);
for (i = 0; i < count; ++i)
if (msgid == unsafeMessages[i])
return YES;
return NO;
}
-1
View File
@@ -30,7 +30,6 @@
- (MMVimView *)initWithFrame:(NSRect)frame vimController:(MMVimController *)c;
- (MMTextView *)textView;
- (NSMutableArray *)scrollbars;
- (void)cleanup;
- (NSSize)desiredSize;
+4 -9
View File
@@ -208,11 +208,6 @@ enum {
return textView;
}
- (NSMutableArray *)scrollbars
{
return scrollbars;
}
- (PSMTabBarControl *)tabBarControl
{
return tabBarControl;
@@ -374,7 +369,7 @@ enum {
[scroller setAction:@selector(scroll:)];
[self addSubview:scroller];
[[self scrollbars] addObject:scroller];
[scrollbars addObject:scroller];
[scroller release];
}
@@ -387,7 +382,7 @@ enum {
if (!scroller) return NO;
[scroller removeFromSuperview];
[[self scrollbars] removeObjectAtIndex:idx];
[scrollbars removeObjectAtIndex:idx];
// If a visible scroller was removed then the vim view must resize. This
// is handled by the window controller (the vim view never resizes itself).
@@ -719,9 +714,9 @@ enum {
- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx
{
unsigned i, count = [[self scrollbars] count];
unsigned i, count = [scrollbars count];
for (i = 0; i < count; ++i) {
MMScroller *scroller = [[self scrollbars] objectAtIndex:i];
MMScroller *scroller = [scrollbars objectAtIndex:i];
if ([scroller identifier] == ident) {
if (idx) *idx = i;
return scroller;
+1
View File
@@ -68,6 +68,7 @@
- (IBAction)findNext:(id)sender;
- (IBAction)findPrevious:(id)sender;
- (IBAction)vimMenuItemAction:(id)sender;
- (IBAction)vimToolbarItemAction:(id)sender;
- (IBAction)fontSizeUp:(id)sender;
- (IBAction)fontSizeDown:(id)sender;
+15 -3
View File
@@ -289,9 +289,10 @@
//NSLog(@"setTextDimensionsWithRows:%d columns:%d live:%s", rows, cols,
// live ? "YES" : "NO");
// NOTE: This is the only place where the (rows,columns) of the vim view
// are modified. Setting these values have no immediate effect, the actual
// resizing of the view is done in processCommandQueueDidFinish.
// NOTE: The only place where the (rows,columns) of the vim view are
// modified is here and when entering/leaving full-screen. Setting these
// values have no immediate effect, the actual resizing of the view is done
// in processCommandQueueDidFinish.
//
// The 'live' flag indicates that this resize originated from a live
// resize; it may very well happen that the view is no longer in live
@@ -387,6 +388,9 @@
- (void)processCommandQueueDidFinish
{
// IMPORTANT! No synchronous DO calls are allowed in this method. They
// may cause the command queue to get processed out of order.
// NOTE: Resizing is delayed until after all commands have been processed
// since it often happens that more than one command will cause a resize.
// If we were to immediately resize then the vim view size would jitter
@@ -609,6 +613,14 @@
[vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]];
}
- (IBAction)vimToolbarItemAction:(id)sender
{
NSArray *desc = [NSArray arrayWithObjects:@"ToolBar", [sender label], nil];
NSDictionary *attrs = [NSDictionary dictionaryWithObject:desc
forKey:@"descriptor"];
[vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]];
}
- (IBAction)fontSizeUp:(id)sender
{
[[NSFontManager sharedFontManager] modifyFont:
+7 -1
View File
@@ -29,7 +29,7 @@
@protocol MMBackendProtocol
- (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data;
- (oneway void)processInputAndData:(in bycopy NSArray *)messages;
- (oneway void)setDialogReturn:(in bycopy id)obj;
- (void)setDialogReturn:(in bycopy id)obj;
- (NSString *)evaluateExpression:(in bycopy NSString *)expr;
- (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard;
@end
@@ -38,6 +38,11 @@
//
// This is the protocol MMVimController implements.
//
// Be very careful if you want to add methods to this protocol. Since DO
// messages may arrive while Cocoa is in the middle of processing some other
// message be sure to consider reentrancy issues. Look at processCommandQueue:
// to see an example of how to deal with this.
//
@protocol MMFrontendProtocol
- (oneway void)processCommandQueue:(in bycopy NSArray *)queue;
- (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir
@@ -176,6 +181,7 @@ enum {
InsertLinesDrawType,
DrawCursorDrawType,
SetCursorPosDrawType,
DrawInvertedRectDrawType,
};
enum {
+7 -7
View File
@@ -193,10 +193,10 @@
1D1474B40C56796D0038FA2B /* MMVimController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMVimController.m; sourceTree = "<group>"; };
1D1474B90C567A910038FA2B /* MMWindowController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMWindowController.h; sourceTree = "<group>"; };
1D1474BA0C567A910038FA2B /* MMWindowController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMWindowController.m; sourceTree = "<group>"; };
1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Bold.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf"; sourceTree = "<group>"; };
1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-BoldOblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf"; sourceTree = "<group>"; };
1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Oblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf"; sourceTree = "<group>"; };
1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSansMono.ttf; path = "dejavu-ttf-2.20/DejaVuSansMono.ttf"; sourceTree = "<group>"; };
1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Bold.ttf"; path = "dejavu-ttf/DejaVuSansMono-Bold.ttf"; sourceTree = "<group>"; };
1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-BoldOblique.ttf"; path = "dejavu-ttf/DejaVuSansMono-BoldOblique.ttf"; sourceTree = "<group>"; };
1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Oblique.ttf"; path = "dejavu-ttf/DejaVuSansMono-Oblique.ttf"; sourceTree = "<group>"; };
1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSansMono.ttf; path = "dejavu-ttf/DejaVuSansMono.ttf"; sourceTree = "<group>"; };
1D493D570C5247BF00AB718C /* Vim */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = Vim; path = ../Vim; sourceTree = SOURCE_ROOT; };
1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PSMTabBarControl.xcodeproj; path = PSMTabBarControl/PSMTabBarControl.xcodeproj; sourceTree = "<group>"; };
1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-c.icns"; sourceTree = "<group>"; };
@@ -698,7 +698,7 @@
i386,
);
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 29;
CURRENT_PROJECT_VERSION = 32;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
@@ -739,7 +739,7 @@
buildSettings = {
ARCHS = "$(NATIVE_ARCH)";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 29;
CURRENT_PROJECT_VERSION = 32;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
@@ -770,7 +770,7 @@
buildSettings = {
ARCHS = "$(NATIVE_ARCH)";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 29;
CURRENT_PROJECT_VERSION = 32;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
@@ -20,21 +20,25 @@ John Karp
Keenan Pepper
Lars Naesbye Christensen
Mashrab Kuvatov
Max Berger
Mederic Boquien
Michael Everson
Misu Moldovan
Nguyen Thai Ngoc Duy
Nicolas Mailhot
Ognyan Kulev
Ondrej Koala Vacha
Peter Cernak
Remy Oudompheng
Roozbeh Pournader
Sahak Petrosyan
Sander Vesik
Stepan Roh
Stephen Hartke
Tavmjong Bah
Tim May
Valentin Stoykov
Vasek Stodulka
Wesley Transue
$Id: AUTHORS 1910 2007-06-25 19:10:14Z ben_laenen $
$Id: AUTHORS 2162 2007-12-27 12:39:07Z ben_laenen $
@@ -1,4 +1,5 @@
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below)
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
Bitstream Vera Fonts Copyright
------------------------------
@@ -95,4 +96,4 @@ dealings in this Font Software without prior written authorization
from Tavmjong Bah. For further information, contact: tavmjong @ free
. fr.
$Id: LICENSE 778 2006-04-20 18:14:24Z moyogo $
$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $
@@ -1,3 +1,124 @@
Changes from 2.24 to 2.25
- moved/added U+2E18 (by Gee Fung Sit)
- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit)
- added U+22CE-U+22CF to Sans (by Gee Fung Sit)
- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye)
- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit)
- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen)
- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov)
- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit)
- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen)
- added U+2E2E to Sans (by Gee Fung Sit)
- replaced U+2699 with simpler version in Sans (by Gee Fung Sit)
- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue)
- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit)
- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye)
- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue)
- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit)
- added several glyphs to Sans ExtraLight (by Gee Fung Sit)
- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue)
- corrected width of U+027E in Sans Book (by Gee Fung Sit)
- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit)
- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit)
- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov)
- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov)
- further improvements in extended Cyrillic (by Andrey V. Panov)
Changes from 2.23 to 2.24
- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu
Sans. (by Wesley Transue)
- instructions for U+2116 in Sans (by Andrey V. Panov)
- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added
U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by
Denis Jacquerye)
- updated and instructed U+0401 in Sans (by Andrey V. Panov)
- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction.
Also, added a few more glyph instructions. (by Wesley Transue)
- removed OS2Sub and OS2Strike that weren't intentional in Sans
ExtraLight. (by Denis Jacquerye)
- updated instructions for U+401, U+44F in Serif Book. (by Andrey V.
Panov)
- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and
U+0495 ҕ in Sans Book. (by Wesley Transue)
- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆
in Sans Book. (by Wesley Transue)
- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and
U+451 using code generated with xgridfit (by Andrey V. Panov)
- instructions for a few glyphs in the Latin Extended-B Block, Greek
Block, Cyrillic Block, and N'Ko block. (by Wesley Transue)
- updated sfdnormalize.pl, and SFD files to new SFD format with empty
lines. (by Denis Jacquerye)
Changes from 2.22 to 2.23
- fixed bug which made Condensed fonts appear instead of normal width ones
- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader)
- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF,
U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF,
U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by
Wesley Transue)
- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue)
- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by
Wesley Transue)
- added mathematical alphanumeric symbols to all styles (by Max Berger)
- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh
Pournader)
- dereferenced all glyphs with mixed references and outlines (by Denis
Jacquerye)
- removed non-zero width from U+0344 in Sans (by Denis Jacquerye)
Changes from 2.21 to 2.22
- directory structure has changed, we now use the Makefile
- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան)
- added double struck letters and numbers U+2102, U+210D, U+2115,
U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539,
U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B,
U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke)
- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to
Serif (by Ben Laenen)
- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen)
- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1;
supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975,
U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen)
- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09,
U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye)
- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye)
- added Ogham in Sans (by Wesley Transue)
- added Yijing Hexagram Symbols in Sans (by Wesley Transue)
- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD,
U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by
Wesley Transue)
- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462,
U+048C-U+048D in Serif (by Andrey V. Panov)
- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue)
- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben
Laenen)
- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen)
- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214,
U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben
Laenen)
- modified bullet symbol U+2219 in Serif (by Ben Laenen)
Changes from 2.20 to 2.21
- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye)
- added anchor "half" to position right half of double marks, U+FE21 or U+FE23
to Sans (by Denis Jacquerye)
- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis
Jacquerye)
- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by
Denis Jacquerye)
- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy
Meshcheryakov)
- added instructions to some N'Ko glyphs (by Wesley Transue)
- added instructions to some Lao glyphs (by Wesley Transue)
- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by
Denis Jacquerye)
- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov)
- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen)
- added Makefile to improve font and packages generating (by Nicolas Mailhot)
Changes from 2.19 to 2.20
- removed TeX and TeXData tags from all sfd files (by Eugeniy Meshcheryakov)
@@ -931,4 +1052,4 @@ Changes from 0.9 to 0.9.1:
- proper caron shape for dcaron and tcaron
- minor visual changes
$Id: NEWS 1998 2007-09-16 14:23:46Z ben_laenen $
$Id: NEWS 2227 2008-05-19 06:41:46Z moyogo $
@@ -1,4 +1,4 @@
DejaVu fonts 2.20 (c)2004-2007 DejaVu fonts team
DejaVu fonts 2.24 (c)2004-2008 DejaVu fonts team
------------------------------------------------
The DejaVu fonts are a font family based on the Bitstream Vera Fonts
@@ -46,14 +46,14 @@ For more information go to http://dejavu.sourceforge.net/.
Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah:
---------------------------
U+01ba, U+01bf, U+01f7, U+021c, U+021d, U+0220, U+0222, U+0223,
U+02b9, U+02ba, U+02bd, U+02c2, U+02c3, U+02c4, U+02c5, U+02d4,
U+02d5, U+02d7, U+02ec, U+02ed, U+02ee, U+0346-034e, U+0360, U+0362,
U+03e2-03ef, U+0460-0463, U+0466-0486, U+0488-0489, U+04a8-04a9,
U+0500-050f, U+2055-205e, U+20B0, U+20B2-20B3, U+2102, U+210D, U+210f,
U+2111, U+2113, U+2115, U+2118-U+211A, U+211c-211d, U+2124,U+2135,
U+213C-U+2140, U+2295-2298, U+2308-230b, U+26A2-U+26B1, U+2701-2704,
U+2706-2709, U+270c-274b, U+2758-275a, U+2761-2775, U+2780-2794,
U+2798-27af, U+27b1-27be, U+fb05-fb06
U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223,
U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5,
U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362,
U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9,
U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F,
U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135,
U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704,
U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794,
U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06
$Id: README 1998 2007-09-16 14:23:46Z ben_laenen $
$Id: README 2192 2008-03-09 21:25:29Z moyogo $
@@ -7,6 +7,7 @@ ab Abkhazia 100% (90/90) 93% (84/90)
af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69)
am Amharic (0/264) (0/264) (0/264)
ar Arabic 100% (125/125) (0/125) 100% (125/125)
as (0/89) (0/89) (0/89)
ast Asturian 100% (72/72) 100% (72/72) 100% (72/72)
ava Avaric 100% (67/67) 100% (67/67) 100% (67/67)
ay Aymara 100% (60/60) 100% (60/60) 100% (60/60)
@@ -30,25 +31,25 @@ ce Chechen 100% (67/67) 100% (67/67)
ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58)
chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76)
chr Cherokee (0/85) (0/85) (0/85)
co Corsican 100% (84/84) 100% (84/84) 100% (84/84)
co Corsican 100% (85/85) 100% (85/85) 100% (85/85)
cs Czech 100% (82/82) 100% (82/82) 100% (82/82)
cu Old Church Slavonic 100% (103/103) 82% (85/103) 74% (77/103)
cu Old Church Slavonic 100% (103/103) 84% (87/103) 74% (77/103)
cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74)
cy Welsh 100% (78/78) 100% (78/78) 100% (78/78)
da Danish 100% (70/70) 100% (70/70) 100% (70/70)
de German 100% (59/59) 100% (59/59) 100% (59/59)
de German 100% (60/60) 100% (60/60) 100% (60/60)
dz Dzongkha (0/95) (0/95) (0/95)
el Greek 100% (69/69) 100% (69/69) 100% (69/69)
en English 100% (72/72) 100% (72/72) 100% (72/72)
el Greek 100% (70/70) 100% (70/70) 100% (70/70)
en English 100% (73/73) 100% (73/73) 100% (73/73)
eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64)
es Spanish 100% (66/66) 100% (66/66) 100% (66/66)
es Spanish 100% (67/67) 100% (67/67) 100% (67/67)
et Estonian 100% (64/64) 100% (64/64) 100% (64/64)
eu Basque 100% (56/56) 100% (56/56) 100% (56/56)
fa Persian 100% (129/129) (0/129) 100% (129/129)
fi Finnish 100% (62/62) 100% (62/62) 100% (62/62)
fi Finnish 100% (63/63) 100% (63/63) 100% (63/63)
fj Fijian 100% (52/52) 100% (52/52) 100% (52/52)
fo Faroese 100% (68/68) 100% (68/68) 100% (68/68)
fr French 100% (84/84) 100% (84/84) 100% (84/84)
fr French 100% (85/85) 100% (85/85) 100% (85/85)
ful Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62)
fur Friulian 100% (66/66) 100% (66/66) 100% (66/66)
fy Frisian 100% (75/75) 100% (75/75) 100% (75/75)
@@ -74,10 +75,10 @@ ie Interlingue 100% (52/52) 100% (52/52)
ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68)
io Ido 100% (52/52) 100% (52/52) 100% (52/52)
is Icelandic 100% (70/70) 100% (70/70) 100% (70/70)
it Italian 100% (72/72) 100% (72/72) 100% (72/72)
it Italian 100% (73/73) 100% (73/73) 100% (73/73)
iu Inuktitut 100% (161/161) (0/161) (0/161)
ja Japanese (0/6538) (0/6538) (0/6538)
ka Georgian 100% (34/34) 100% (34/34) 100% (34/34)
ka Georgian 100% (33/33) 100% (33/33) 100% (33/33)
kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78)
ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56)
kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77)
@@ -96,6 +97,7 @@ ky Kirgiz 100% (70/70) 100% (70/70)
la Latin 100% (68/68) 100% (68/68) 100% (68/68)
lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75)
lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67)
ln Lingala 100% (81/81) 100% (81/81) 100% (81/81)
lo Lao 100% (65/65) (0/65) 70% (46/65)
lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70)
lv Latvian 100% (78/78) 100% (78/78) 100% (78/78)
@@ -112,9 +114,11 @@ my Burmese (Myanmar) (0/48) (0/48)
nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70)
nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59)
ne Nepali (Devanagari script) (0/68) (0/68) (0/68)
nl Dutch 100% (82/82) 100% (82/82) 100% (82/82)
nl Dutch 100% (83/83) 100% (83/83) 100% (83/83)
nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76)
no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70)
nr Ndebele, South 100% (52/52) 100% (52/52) 100% (52/52)
nso Northern Sotho 100% (58/58) 100% (58/58) 100% (58/58)
ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54)
oc Occitan 100% (70/70) 100% (70/70) 100% (70/70)
om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52)
@@ -124,7 +128,7 @@ pa Punjabi (Gurumukhi script) (0/63) (0/63)
pl Polish 100% (70/70) 100% (70/70) 100% (70/70)
ps-af Pashto in Afghanistan 83% (41/49) (0/49) 83% (41/49)
ps-pk Pashto in Pakistan 81% (40/49) (0/49) 81% (40/49)
pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82)
pt Portuguese 100% (83/83) 100% (83/83) 100% (83/83)
rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66)
ro Romanian 100% (62/62) 100% (62/62) 100% (62/62)
ru Russian 100% (66/66) 100% (66/66) 100% (66/66)
@@ -145,6 +149,8 @@ sms Skolt Sami 100% (80/80) 100% (80/80)
so Somali 100% (52/52) 100% (52/52) 100% (52/52)
sq Albanian 100% (56/56) 100% (56/56) 100% (56/56)
sr Serbian 100% (76/76) 100% (76/76) 100% (76/76)
ss Swati 100% (52/52) 100% (52/52) 100% (52/52)
st Sotho, Southern 100% (52/52) 100% (52/52) 100% (52/52)
sv Swedish 100% (68/68) 100% (68/68) 100% (68/68)
sw Swahili 100% (52/52) 100% (52/52) 100% (52/52)
syr Syriac (0/45) (0/45) (0/45)
@@ -152,16 +158,16 @@ ta Tamil (0/48) (0/48)
te Telugu (0/80) (0/80) (0/80)
tg Tajik 100% (78/78) 100% (78/78) 97% (76/78)
th Thai 1% (1/87) (0/87) (0/87)
ti-er Eritrean Tigrinya (0/256) (0/256) (0/256)
ti-et Ethiopian Tigrinya (0/282) (0/282) (0/282)
ti-er Eritrean Tigrinya (0/255) (0/255) (0/255)
ti-et Ethiopian Tigrinya (0/281) (0/281) (0/281)
tig Tigre (0/221) (0/221) (0/221)
tk Turkmen 100% (74/74) 100% (74/74) 97% (72/74)
tk Turkmen 100% (74/74) 100% (74/74) 100% (74/74)
tl Tagalog (0/19) (0/19) (0/19)
tn Tswana 100% (56/56) 100% (56/56) 100% (56/56)
tn Tswana 100% (58/58) 100% (58/58) 100% (58/58)
to Tonga 100% (53/53) 100% (53/53) 100% (53/53)
tr Turkish 100% (70/70) 100% (70/70) 100% (70/70)
ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52)
tt Tatar 100% (76/76) 100% (76/76) 97% (74/76)
tt Tatar 100% (76/76) 100% (76/76) 100% (76/76)
tw Twi 100% (73/73) 100% (73/73) 100% (73/73)
tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70)
ug Uighur 100% (125/125) (0/125) 100% (125/125)
@@ -169,7 +175,7 @@ uk Ukrainian 100% (72/72) 100% (72/72)
ur Urdu 94% (137/145) (0/145) 97% (141/145)
uz Uzbek 100% (68/68) 100% (68/68) 100% (68/68)
ven Venda 100% (62/62) 100% (62/62) 100% (62/62)
vi Vietnamese 100% (194/194) 77% (150/194) 62% (122/194)
vi Vietnamese 100% (194/194) 77% (150/194) 63% (124/194)
vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54)
vot Votic 100% (62/62) 100% (62/62) 100% (62/62)
wa Walloon 100% (70/70) 100% (70/70) 100% (70/70)
@@ -181,7 +187,7 @@ yi Yiddish 100% (27/27) (0/27)
yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119)
zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765)
zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213)
zh-mo Chinese in Macau (0/13063) (0/13063) (0/13063)
zh-mo Chinese in Macau (0/2213) (0/2213) (0/2213)
zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765)
zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063)
zu Zulu 100% (52/52) 100% (52/52) 100% (52/52)
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
This is the Unicode coverage file for DejaVu fonts
($Id: unicover.txt 2000 2007-09-16 14:34:23Z ben_laenen $)
($Id$)
Control and similar characters are discounted from totals.
@@ -7,12 +7,12 @@ Control and similar characters are discounted from totals.
U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95)
U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96)
U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128)
U+0180 Latin Extended-B 100% (208/208) 90% (189/208) 78% (164/208)
U+0180 Latin Extended-B 100% (208/208) 90% (189/208) 82% (172/208)
U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96)
U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 57% (46/80)
U+0300 Combining Diacritical Marks 82% (92/112) 60% (68/112) 59% (67/112)
U+0370 Greek and Coptic 100% (127/127) 86% (110/127) 86% (110/127)
U+0400 Cyrillic 100% (255/255) 76% (194/255) 66% (170/255)
U+0400 Cyrillic 100% (255/255) 77% (198/255) 68% (174/255)
U+0500 Cyrillic Supplement 100% (20/20) (0/20) (0/20)
U+0530 Armenian 100% (86/86) (0/86) (0/86)
U+0590 Hebrew 62% (54/87) (0/87) (0/87)
@@ -41,7 +41,7 @@ U+1200 Ethiopic (0/356) (0/356)
U+1380 Ethiopic Supplement (0/26) (0/26) (0/26)
U+13a0 Cherokee (0/85) (0/85) (0/85)
U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630)
U+1680 Ogham (0/29) (0/29) (0/29)
U+1680 Ogham 100% (29/29) (0/29) (0/29)
U+16a0 Runic (0/81) (0/81) (0/81)
U+1700 Tagalog (0/20) (0/20) (0/20)
U+1720 Hanunoo (0/23) (0/23) (0/23)
@@ -58,32 +58,32 @@ U+1b00 Balinese (0/121) (0/121)
U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128)
U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64)
U+1dc0 Combining Diacritical Marks Supplement 46% (6/13) (0/13) (0/13)
U+1e00 Latin Extended Additional 100% (246/246) 78% (192/246) 54% (134/246)
U+1e00 Latin Extended Additional 100% (246/246) 78% (192/246) 56% (140/246)
U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233)
U+2000 General Punctuation 98% (104/106) 61% (65/106) 42% (45/106)
U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34)
U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 22% (5/22)
U+20d0 Combining Diacritical Marks for Symbols 12% (4/32) (0/32) (0/32)
U+2100 Letterlike Symbols 94% (75/79) 7% (6/79) 8% (7/79)
U+2150 Number Forms 100% (50/50) 26% (13/50) 26% (13/50)
U+2190 Arrows 100% (112/112) 3% (4/112) 100% (112/112)
U+2200 Mathematical Operators 95% (245/256) 11% (30/256) 56% (145/256)
U+20d0 Combining Diacritical Marks for Symbols 21% (7/32) (0/32) (0/32)
U+2100 Letterlike Symbols 94% (75/79) 39% (31/79) 8% (7/79)
U+2150 Number Forms 100% (50/50) 100% (50/50) 26% (13/50)
U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112)
U+2200 Mathematical Operators 96% (247/256) 39% (100/256) 56% (145/256)
U+2300 Miscellaneous Technical 27% (64/232) 6% (16/232) 50% (117/232)
U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39)
U+2440 Optical Character Recognition (0/11) (0/11) (0/11)
U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160)
U+2500 Box Drawing (0/128) (0/128) 100% (128/128)
U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128)
U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32)
U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96)
U+2600 Miscellaneous Symbols 100% (176/176) 17% (30/176) 84% (149/176)
U+2700 Dingbats 100% (174/174) (0/174) 82% (144/174)
U+2700 Dingbats 100% (174/174) 0% (1/174) 82% (144/174)
U+27c0 Miscellaneous Mathematical Symbols-A 17% (7/39) 7% (3/39) 7% (3/39)
U+27f0 Supplemental Arrows-A 100% (16/16) (0/16) (0/16)
U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16)
U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256)
U+2900 Supplemental Arrows-B 4% (6/128) (0/128) (0/128)
U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128)
U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) 2% (3/128)
U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256)
U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 29% (9/31) 29% (9/31)
U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 87% (27/31) 29% (9/31)
U+2c00 Glagolitic (0/94) (0/94) (0/94)
U+2c60 Latin Extended-C 100% (17/17) 52% (9/17) 17% (3/17)
U+2c80 Coptic (0/114) (0/114) (0/114)
@@ -106,11 +106,11 @@ U+31f0 Katakana Phonetic Extensions (0/16) (0/16)
U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242)
U+3300 CJK Compatibility (0/256) (0/256) (0/256)
U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0)
U+4dc0 Yijing Hexagram Symbols (0/64) (0/64) (0/64)
U+4dc0 Yijing Hexagram Symbols 100% (64/64) (0/64) (0/64)
U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0)
U+a000 Yi Syllables (0/1165) (0/1165) (0/1165)
U+a490 Yi Radicals (0/55) (0/55) (0/55)
U+a700 Modifier Tone Letters (0/27) (0/27) (0/27)
U+a700 Modifier Tone Letters 18% (5/27) (0/27) (0/27)
U+a720 Latin Extended-D (0/2) (0/2) (0/2)
U+a800 Syloti Nagri (0/44) (0/44) (0/44)
U+a840 Phags-pa (0/56) (0/56) (0/56)
@@ -124,12 +124,12 @@ U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58)
U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) 12% (72/595)
U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16)
U+fe10 Vertical Forms (0/10) (0/10) (0/10)
U+fe20 Combining Half Marks (0/4) (0/4) (0/4)
U+fe20 Combining Half Marks 100% (4/4) (0/4) (0/4)
U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32)
U+fe50 Small Form Variants (0/26) (0/26) (0/26)
U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) 100% (141/141)
U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225)
U+fff0 Specials 20% (1/5) 20% (1/5) 20% (1/5)
U+fff0 Specials 100% (5/5) 100% (5/5) 100% (5/5)
U+10000 Linear B Syllabary (0/88) (0/88) (0/88)
U+10080 Linear B Ideograms (0/123) (0/123) (0/123)
U+10100 Aegean Numbers (0/57) (0/57) (0/57)
@@ -151,7 +151,7 @@ U+1d100 Musical Symbols (0/219) (0/219)
U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70)
U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) (0/87)
U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18)
U+1d400 Mathematical Alphanumeric Symbols 4% (45/996) (0/996) (0/996)
U+1d400 Mathematical Alphanumeric Symbols 10% (107/996) 5% (55/996) 6% (62/996)
U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0)
U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542)
U+e0000 Tags (0/98) (0/98) (0/98)
+41 -17
View File
@@ -426,6 +426,17 @@ gui_mch_new_colors(void)
foreground:gui.def_norm_pixel];
}
/*
* Invert a rectangle from row r, column c, for nr rows and nc columns.
*/
void
gui_mch_invert_rectangle(int r, int c, int nr, int nc, int invert)
{
[[MMBackend sharedInstance] drawInvertedRectAtRow:r column:c numRows:nr
numColumns:nc invert:invert];
}
// -- Tabline ---------------------------------------------------------------
@@ -680,11 +691,6 @@ gui_mch_add_menu(vimmenu_T *menu, int idx)
void
gui_mch_add_menu_item(vimmenu_T *menu, int idx)
{
// NOTE! If 'iconfile' is not set but 'iconidx' is, use the name of the
// menu item. (Should correspond to a stock item.)
char_u *icon = menu->iconfile ? menu->iconfile :
menu->iconidx >= 0 ? menu->dname :
NULL;
char_u *tip = menu->strings[MENU_INDEX_TIP]
? menu->strings[MENU_INDEX_TIP] : menu->actext;
NSArray *desc = descriptor_for_menu(menu);
@@ -692,6 +698,18 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
? [NSString stringWithFormat:@"%C", specialKeyToNSKey(menu->mac_key)]
: [NSString string];
int modifierMask = vimModMaskToEventModifierFlags(menu->mac_mods);
char_u *icon = NULL;
if (menu_is_toolbar(menu->parent->name)) {
char_u fname[MAXPATHL];
// TODO: Ensure menu->iconfile exists (if != NULL)
icon = menu->iconfile;
if (!icon && gui_find_bitmap(menu->name, fname, "bmp") == OK)
icon = fname;
if (!icon && menu->iconidx >= 0)
icon = menu->dname;
}
[[MMBackend sharedInstance] queueMessage:AddMenuItemMsgID properties:
[NSDictionary dictionaryWithObjectsAndKeys:
@@ -1286,6 +1304,9 @@ gui_mch_browse(
//NSLog(@"gui_mch_browse(saving=%d, title=%s, dflt=%s, ext=%s, initdir=%s,"
// " filter=%s", saving, title, dflt, ext, initdir, filter);
// Ensure no data is on the output queue before presenting the dialog.
gui_macvim_force_flush();
#ifdef FEAT_MBYTE
title = CONVERT_TO_UTF8(title);
initdir = CONVERT_TO_UTF8(initdir);
@@ -1319,6 +1340,9 @@ gui_mch_dialog(
// "dfltbutton=%d textfield=%s)", type, title, message, buttons,
// dfltbutton, textfield);
// Ensure no data is on the output queue before presenting the dialog.
gui_macvim_force_flush();
#ifdef FEAT_MBYTE
title = CONVERT_TO_UTF8(title);
message = CONVERT_TO_UTF8(message);
@@ -1448,15 +1472,6 @@ gui_mch_iconify(void)
}
/*
* Invert a rectangle from row r, column c, for nr rows and nc columns.
*/
void
gui_mch_invert_rectangle(int r, int c, int nr, int nc)
{
}
#if defined(FEAT_EVAL) || defined(PROTO)
/*
* Bring the Vim window to the foreground.
@@ -2009,17 +2024,26 @@ static int vimModMaskToEventModifierFlags(int mods)
@implementation NSString (VimStrings)
+ (id)stringWithVimString:(char_u *)s
{
// This method ensures a non-nil string is returned. If 's' cannot be
// converted to a utf-8 string it is assumed to be latin-1. If conversion
// still fails an empty NSString is returned.
NSString *string = nil;
if (s) {
#ifdef FEAT_MBYTE
s = CONVERT_TO_UTF8(s);
#endif
NSString *string = [NSString stringWithUTF8String:(char*)s];
string = [NSString stringWithUTF8String:(char*)s];
if (!string) {
// HACK! Apparently 's' is not a valid utf-8 string, maybe it is
// latin-1?
string = [NSString stringWithCString:(char*)s
encoding:NSISOLatin1StringEncoding];
}
#ifdef FEAT_MBYTE
CONVERT_TO_UTF8_FREE(s);
#endif
return string;
}
return [NSString string];
return string != nil ? string : [NSString string];
}
@end
-4
View File
@@ -83,8 +83,6 @@ an <silent> 9900.301 Window.Minimize\ All <Nop>
an <silent> 9900.310 Window.Zoom <Nop>
an <silent> 9900.311 Window.Zoom\ All <Nop>
an <silent> 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen<CR>
an <silent> 9900.325 Window.Cycle\ Through\ Windows <Nop>
an <silent> 9900.326 Window.Cycle\ Backwards\ Through\ Windows <Nop>
an 9900.330 Window.-SEP1- <Nop>
" TODO! Grey out if no tabs are visible.
an <silent> 9900.340 Window.Previous\ Tab :tabprevious<CR>
@@ -244,8 +242,6 @@ macm Window.Minimize\ All key=<D-M-m> action=miniaturizeAll: alt=YES
macm Window.Zoom key=<D-C-z> action=performZoom:
macm Window.Zoom\ All key=<D-M-C-z> action=zoomAll: alt=YES
macm Window.Toggle\ Full\ Screen\ Mode key=<D-F>
macm Window.Cycle\ Through\ Windows key=<D-`> action=_cycleWindows:
macm Window.Cycle\ Backwards\ Through\ Windows key=<D-S-`> action=_cycleWindowsBackwards: alt=YES
macm Window.Previous\ Tab key=<D-{>
macm Window.Next\ Tab key=<D-}>
macm Window.Bring\ All\ To\ Front action=arrangeInFront:
+77 -8
View File
@@ -41,17 +41,84 @@
-->
<item>
<title>Snapshot 29 released</title>
<title>Snapshot 32 released</title>
<description><![CDATA[
<h1>MacVim snapshot 29 released</h1>
<h1>MacVim snapshot 32 released</h1>
<p><em> This snapshot contains fixes for several severe bugs; I strongly suggest
that you update now! </em></p>
<p> Changes since snapshot 31:
<ul>
<li> Fix several bugs that caused MacVim to crash </li>
<li> Console dialogs work once again (set go+=c) </li>
<li> Background processes work (:sh ... &) </li>
<li> Ctrl-Shift can be used for modeless selection </li>
<li> No crashes with HTML plugin </li>
<li> Toolbar is a bit better at finding icons (this still needs some work)
</li>
<li> Latest Vim source code and runtime files merged </li>
</ul>
</p>
]]></description>
<pubDate>Fri, 22 Jun 2008 13:13 CET</pubDate>
<enclosure type="application/octet-stream"
url="http://macvim.googlecode.com/files/MacVim-snapshot-32.tbz"
length="8194915"
sparkle:version="32"
sparkle:shortVersionString="7.1"
/>
</item>
<item>
<title>Snapshot 31 released</title>
<description><![CDATA[
<h1>MacVim snapshot 31 released</h1>
<p> Changes since snapshot 30:
<ul>
<li> Fixed problems with menus on OS X 10.4 and a related crash. </li>
<li> Dialog box handling has been updated. This fixes a problem where the
"swap file warning" dialog would pop up before the informational text in
the editor window updated. Hopefully this will also cure various other
problems with dialogs (e.g. nothing happening when opening files from a
dialog box). </li>
<li> Added dock menu with "New Window" item. This is useful with "Spaces" on
OS X 10.5 since you can use this menu to open a new MacVim window on any
"space" when another editor window is already open. (Also, now there is
always a way to open a new window, even if the menus are customized,
or if "-u NONE" is used.) </li>
<li> I have started trying to fix "modeless selection" and it sort of works
on my machine, but I've had one report stating that its not quite
working so you mileage may vary. Make sure to let me know what works
and doesn't so that I can fix this properly. (Try selecting text from
the command line.) </li>
<li> The default font (DejaVu Sans Mono) has been updated to version 2.25.
</li>
<li> Latest Vim source code merged </li>
</ul>
</p>
]]></description>
<pubDate>Fri, 13 Jun 2008 16:00 CET</pubDate>
<enclosure type="application/octet-stream"
url="http://macvim.googlecode.com/files/MacVim-snapshot-31.tbz"
length="8182620"
sparkle:version="31"
sparkle:shortVersionString="7.1"
/>
</item>
<item>
<title>Snapshot 30 released</title>
<description><![CDATA[
<h1>MacVim snapshot 30 released</h1>
<p> Changes since snapshot 28:
<ul>
<li> copy&paste and other "Edit" menu items now work as expected with dialogs
(such as open/save). </li>
<li> some menus (such as the "Window" menu) has got some new items </li>
<li> general menu improvements when no editor window is open </li>
<li> window-cycling key Cmd-` is no longer hard-coded and can be changed with
:macmenu command </li>
<li> ability to access some OS X default Cmd-keys even if menus are
completely altered (e.g. when starting with "-u NONE") </li>
<li> QuickLook works with .vim files (patch by Nico Weber) </li>
@@ -65,12 +132,14 @@
<li> latest vim patches and runtime files </li>
</ul>
</p>
<p> The only difference between snapshot 29 and 30 is that the former did not
handle window cycling very well with international keyboard layouts. </p>
]]></description>
<pubDate>Sun, 7 Jun 2008 12:57 CET</pubDate>
<pubDate>Sun, 8 Jun 2008 16:43 CET</pubDate>
<enclosure type="application/octet-stream"
url="http://macvim.googlecode.com/files/MacVim-snapshot-29.tbz"
length="8137324"
sparkle:version="29"
url="http://macvim.googlecode.com/files/MacVim-snapshot-30.tbz"
length="8137308"
sparkle:version="30"
sparkle:shortVersionString="7.1"
/>
</item>
+17 -13
View File
@@ -1113,7 +1113,7 @@ GTK_IPATH = $(GUI_INC_LOC)
GTK_LIBS_DIR = $(GUI_LIB_LOC)
GTK_LIBS1 =
GTK_LIBS2 = $(GTK_LIBNAME)
GTK_INSTALL = install_normal
GTK_INSTALL = install_normal install_gui_extra
GTK_TARGETS = installglinks
GTK_MAN_TARGETS = yes
GTK_TESTTARGET = gui
@@ -1130,7 +1130,7 @@ MOTIF_IPATH = $(GUI_INC_LOC)
MOTIF_LIBS_DIR = $(GUI_LIB_LOC)
MOTIF_LIBS1 =
MOTIF_LIBS2 = $(MOTIF_LIBNAME) -lXt
MOTIF_INSTALL = install_normal
MOTIF_INSTALL = install_normal install_gui_extra
MOTIF_TARGETS = installglinks
MOTIF_MAN_TARGETS = yes
MOTIF_TESTTARGET = gui
@@ -1160,7 +1160,7 @@ ATHENA_IPATH = $(GUI_INC_LOC)
ATHENA_LIBS_DIR = $(GUI_LIB_LOC)
ATHENA_LIBS1 = $(XAW_LIB)
ATHENA_LIBS2 = -lXt
ATHENA_INSTALL = install_normal
ATHENA_INSTALL = install_normal install_gui_extra
ATHENA_TARGETS = installglinks
ATHENA_MAN_TARGETS = yes
ATHENA_TESTTARGET = gui
@@ -1178,7 +1178,7 @@ NEXTAW_IPATH = $(GUI_INC_LOC)
NEXTAW_LIBS_DIR = $(GUI_LIB_LOC)
NEXTAW_LIBS1 = $(NEXTAW_LIB)
NEXTAW_LIBS2 = -lXt
NEXTAW_INSTALL = install_normal
NEXTAW_INSTALL = install_normal install_gui_extra
NEXTAW_TARGETS = installglinks
NEXTAW_MAN_TARGETS = yes
NEXTAW_TESTTARGET = gui
@@ -1203,7 +1203,7 @@ PHOTONGUI_IPATH =
PHOTONGUI_LIBS_DIR =
PHOTONGUI_LIBS1 = -lph -lphexlib
PHOTONGUI_LIBS2 =
PHOTONGUI_INSTALL = install_normal
PHOTONGUI_INSTALL = install_normal install_gui_extra
PHOTONGUI_TARGETS = installglinks
PHOTONGUI_MAN_TARGETS = yes
PHOTONGUI_TESTTARGET = gui
@@ -1219,7 +1219,7 @@ CARBONGUI_IPATH = -I. -Iproto
CARBONGUI_LIBS_DIR =
CARBONGUI_LIBS1 = -framework Carbon
CARBONGUI_LIBS2 =
CARBONGUI_INSTALL = install_macosx
CARBONGUI_INSTALL = install_macosx install_gui_extra
CARBONGUI_TARGETS =
CARBONGUI_MAN_TARGETS =
CARBONGUI_TESTTARGET = gui
@@ -1757,6 +1757,15 @@ testclean:
cd $(PODIR); $(MAKE) checkclean; \
fi
install: $(GUI_INSTALL)
install_normal: installvim installtools $(INSTALL_LANGS) install-icons
install_gui_extra: installgtutorbin
installvim: installvimbin installtutorbin \
installruntime installlinks installmanlinks
#
# Avoid overwriting an existing executable, somebody might be running it and
# overwriting it could cause it to crash. Deleting it is OK, it won't be
@@ -1766,13 +1775,6 @@ testclean:
# If you want to keep an older version, rename it before running "make
# install".
#
install: $(GUI_INSTALL)
install_normal: installvim installtools $(INSTALL_LANGS) install-icons
installvim: installvimbin installtutorbin \
installruntime installlinks installmanlinks
installvimbin: $(VIMTARGET) $(DESTDIR)$(exec_prefix) $(DEST_BIN)
-if test -f $(DEST_BIN)/$(VIMTARGET); then \
mv -f $(DEST_BIN)/$(VIMTARGET) $(DEST_BIN)/$(VIMNAME).rm; \
@@ -1888,6 +1890,8 @@ installmacros: $(DEST_VIM) $(DEST_RT) $(DEST_MACRO)
installtutorbin: $(DEST_VIM)
$(INSTALL_DATA) vimtutor $(DEST_BIN)/$(VIMNAME)tutor
chmod $(SCRIPTMOD) $(DEST_BIN)/$(VIMNAME)tutor
installgtutorbin: $(DEST_VIM)
$(INSTALL_DATA) gvimtutor $(DEST_BIN)/$(GVIMNAME)tutor
chmod $(SCRIPTMOD) $(DEST_BIN)/$(GVIMNAME)tutor
+10 -2
View File
@@ -16927,9 +16927,17 @@ var2fpos(varp, dollar_lnum, fnum)
name = get_tv_string_chk(varp);
if (name == NULL)
return NULL;
if (name[0] == '.') /* cursor */
if (name[0] == '.') /* cursor */
return &curwin->w_cursor;
if (name[0] == '\'') /* mark */
#ifdef FEAT_VISUAL
if (name[0] == 'v' && name[1] == NUL) /* Visual start */
{
if (VIsual_active)
return &VIsual;
return &curwin->w_cursor;
}
#endif
if (name[0] == '\'') /* mark */
{
pp = getmark_fnum(name[1], FALSE, fnum);
if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
+4 -2
View File
@@ -2148,7 +2148,9 @@ do_one_cmd(cmdlinep, sourcing,
#endif
if (*p == '!' && ea.cmdidx != CMD_substitute) /* forced commands */
/* forced commands */
if (*p == '!' && ea.cmdidx != CMD_substitute
&& ea.cmdidx != CMD_smagic && ea.cmdidx != CMD_snomagic)
{
++p;
ea.forceit = TRUE;
@@ -9319,7 +9321,7 @@ ex_tag_cmd(eap, name)
break;
default: /* ":tag" */
#ifdef FEAT_CSCOPE
if (p_cst)
if (p_cst && *eap->arg != NUL)
{
do_cstag(eap);
return;
+10 -12
View File
@@ -2053,10 +2053,10 @@ set_cmdspos_cursor()
if (has_mbyte)
correct_cmdspos(i, c);
#endif
/* If the cmdline doesn't fit, put cursor on last visible char. */
/* If the cmdline doesn't fit, show cursor on last visible char.
* Don't move the cursor itself, so we can still append. */
if ((ccline.cmdspos += c) >= m)
{
ccline.cmdpos = i - 1;
ccline.cmdspos -= c;
break;
}
@@ -2829,10 +2829,11 @@ put_on_cmdline(str, len, redraw)
if (has_mbyte)
correct_cmdspos(ccline.cmdpos, c);
#endif
/* Stop cursor at the end of the screen */
if (ccline.cmdspos + c >= m)
break;
ccline.cmdspos += c;
/* Stop cursor at the end of the screen, but do increment the
* insert position, so that entering a very long command
* works, even though you can't see it. */
if (ccline.cmdspos + c < m)
ccline.cmdspos += c;
#ifdef FEAT_MBYTE
if (has_mbyte)
{
@@ -3032,10 +3033,7 @@ cmdline_paste_str(s, literally)
++s;
#ifdef FEAT_MBYTE
if (has_mbyte)
{
c = mb_ptr2char(s);
s += mb_char2len(c);
}
c = mb_cptr2char_adv(&s);
else
#endif
c = *s++;
@@ -3335,7 +3333,7 @@ nextwild(xp, type, options)
/*
* Do wildcard expansion on the string 'str'.
* Chars that should not be expanded must be preceded with a backslash.
* Return a pointer to alloced memory containing the new string.
* Return a pointer to allocated memory containing the new string.
* Return NULL for failure.
*
* "orig" is the originally expanded string, copied to allocated memory. It
@@ -6117,7 +6115,7 @@ ex_window()
exmode_active = save_exmode;
/* Safety check: The old window or buffer was deleted: It's a a bug when
/* Safety check: The old window or buffer was deleted: It's a bug when
* this happens! */
if (!win_valid(old_curwin) || !buf_valid(old_curbuf))
{
+2 -1
View File
@@ -4836,7 +4836,8 @@ ex_gui(eap)
}
#if ((defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) \
|| defined(FEAT_GUI_PHOTON)) && defined(FEAT_TOOLBAR)) || defined(PROTO)
|| defined(FEAT_GUI_PHOTON)) && defined(FEAT_TOOLBAR) \
|| defined(FEAT_GUI_MACVIM)) || defined(PROTO)
/*
* This is shared between Athena, Motif and GTK.
*/
+10 -10
View File
@@ -686,8 +686,8 @@ manage_centered(dialog_child)
/* Temporarily set value of XmNmappedWhenManaged
to stop the dialog from popping up right away */
XtVaGetValues(shell, XmNmappedWhenManaged, &mappedWhenManaged, 0);
XtVaSetValues(shell, XmNmappedWhenManaged, False, 0);
XtVaGetValues(shell, XmNmappedWhenManaged, &mappedWhenManaged, NULL);
XtVaSetValues(shell, XmNmappedWhenManaged, False, NULL);
XtManageChild(dialog_child);
@@ -723,7 +723,7 @@ manage_centered(dialog_child)
XtMapWidget(shell);
/* Restore the value of XmNmappedWhenManaged */
XtVaSetValues(shell, XmNmappedWhenManaged, mappedWhenManaged, 0);
XtVaSetValues(shell, XmNmappedWhenManaged, mappedWhenManaged, NULL);
}
#if defined(FEAT_MENU) || defined(FEAT_SUN_WORKSHOP) \
@@ -1993,7 +1993,7 @@ do_mnemonic(Widget w, unsigned int keycode)
{
if (XtClass(w) == xmRowColumnWidgetClass)
{
XtVaGetValues(w, XmNrowColumnType, &rowColType, 0);
XtVaGetValues(w, XmNrowColumnType, &rowColType, NULL);
isMenu = (rowColType != (unsigned char)XmWORK_AREA);
}
else
@@ -2001,14 +2001,14 @@ do_mnemonic(Widget w, unsigned int keycode)
if (!isMenu)
{
XtVaGetValues(w, XmNchildren, &children, XmNnumChildren,
&numChildren, 0);
&numChildren, NULL);
for (i = 0; i < numChildren; i++)
do_mnemonic(children[i], keycode);
}
}
else
{
XtVaGetValues(w, XmNmnemonic, &mnemonic, 0);
XtVaGetValues(w, XmNmnemonic, &mnemonic, NULL);
if (mnemonic != '\0')
{
mneString[0] = mnemonic;
@@ -2019,7 +2019,7 @@ do_mnemonic(Widget w, unsigned int keycode)
if (XtClass(w) == xmLabelWidgetClass
|| XtClass(w) == xmLabelGadgetClass)
{
XtVaGetValues(w, XmNuserData, &userData, 0);
XtVaGetValues(w, XmNuserData, &userData, NULL);
if (userData != NULL && XtIsWidget(userData))
XmProcessTraversal(userData, XmTRAVERSE_CURRENT);
}
@@ -2073,7 +2073,7 @@ add_mnemonic_grabs(Widget dialog, Widget w)
{
if (XtClass(w) == xmRowColumnWidgetClass)
{
XtVaGetValues(w, XmNrowColumnType, &rowColType, 0);
XtVaGetValues(w, XmNrowColumnType, &rowColType, NULL);
isMenu = (rowColType != (unsigned char)XmWORK_AREA);
}
else
@@ -2081,14 +2081,14 @@ add_mnemonic_grabs(Widget dialog, Widget w)
if (!isMenu)
{
XtVaGetValues(w, XmNchildren, &children, XmNnumChildren,
&numChildren, 0);
&numChildren, NULL);
for (i = 0; i < numChildren; i++)
add_mnemonic_grabs(dialog, children[i]);
}
}
else
{
XtVaGetValues(w, XmNmnemonic, &mnemonic, 0);
XtVaGetValues(w, XmNmnemonic, &mnemonic, NULL);
if (mnemonic != '\0')
{
mneString[0] = mnemonic;
+3
View File
@@ -1538,8 +1538,11 @@ gui_mch_init()
attr.depth = DefaultDepthOfScreen(scr);
if (!icon)
{
XpmCreatePixmapFromData(dsp, root_window, magick, &icon,
&icon_mask, &attr);
XpmFreeAttributes(&attr);
}
# ifdef FEAT_GUI_ATHENA
XtVaSetValues(vimShell, XtNiconPixmap, icon, XtNiconMask, icon_mask, NULL);
+93 -81
View File
@@ -50,11 +50,11 @@
#if !defined(FEAT_PYTHON) && defined(PROTO)
/* Use this to be able to generate prototypes without python being used. */
# define PyObject int
# define PyThreadState int
# define PyTypeObject int
struct PyMethodDef { int a; };
# define PySequenceMethods int
# define PyObject Py_ssize_t
# define PyThreadState Py_ssize_t
# define PyTypeObject Py_ssize_t
struct PyMethodDef { Py_ssize_t a; };
# define PySequenceMethods Py_ssize_t
#endif
#if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000
@@ -64,6 +64,7 @@ struct PyMethodDef { int a; };
# define PyIntIntArgFunc ssizessizeargfunc
# define PyIntObjArgProc ssizeobjargproc
# define PyIntIntObjArgProc ssizessizeobjargproc
# define Py_ssize_t_fmt "n"
#else
# define PyInt int
# define PyInquiry inquiry
@@ -71,6 +72,7 @@ struct PyMethodDef { int a; };
# define PyIntIntArgFunc intintargfunc
# define PyIntObjArgProc intobjargproc
# define PyIntIntObjArgProc intintobjargproc
# define Py_ssize_t_fmt "i"
#endif
/* Parser flags */
@@ -85,9 +87,18 @@ struct PyMethodDef { int a; };
#if defined(DYNAMIC_PYTHON) || defined(PROTO)
# ifndef DYNAMIC_PYTHON
# define HINSTANCE int /* for generating prototypes */
# define HINSTANCE long_u /* for generating prototypes */
# endif
/* This makes if_python.c compile without warnings against Python 2.5
* on Win32 and Win64. */
#undef PyRun_SimpleString
#undef PyArg_Parse
#undef PyArg_ParseTuple
#undef Py_BuildValue
#undef Py_InitModule4
#undef Py_InitModule4_64
/*
* Wrapper defines
*/
@@ -269,7 +280,11 @@ static struct
{"PyType_Type", (PYTHON_PROC*)&dll_PyType_Type},
{"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue},
{"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod},
# if (PY_VERSION_HEX >= 0x02050000) && SIZEOF_SIZE_T != SIZEOF_INT
{"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4},
# else
{"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4},
# endif
{"Py_Initialize", (PYTHON_PROC*)&dll_Py_Initialize},
{"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize},
{"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized},
@@ -339,8 +354,7 @@ python_runtime_link_init(char *libname, int verbose)
* TRUE, else FALSE.
*/
int
python_enabled(verbose)
int verbose;
python_enabled(int verbose)
{
return python_runtime_link_init(DYNAMIC_PYTHON_DLL, verbose) == OK;
}
@@ -374,8 +388,8 @@ get_exceptions()
*/
static void DoPythonCommand(exarg_T *, const char *);
static int RangeStart;
static int RangeEnd;
static PyInt RangeStart;
static PyInt RangeEnd;
static void PythonIO_Flush(void);
static int PythonIO_Init(void);
@@ -384,12 +398,12 @@ static int PythonMod_Init(void);
/* Utility functions for the vim/python interface
* ----------------------------------------------
*/
static PyObject *GetBufferLine(buf_T *, int);
static PyObject *GetBufferLine(buf_T *, PyInt);
static PyObject *GetBufferLineList(buf_T *, PyInt, PyInt);
static int SetBufferLine(buf_T *, int, PyObject *, int *);
static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, int *);
static int InsertBufferLines(buf_T *, int, PyObject *, int *);
static int SetBufferLine(buf_T *, PyInt, PyObject *, PyInt *);
static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, PyInt *);
static int InsertBufferLines(buf_T *, PyInt, PyObject *, PyInt *);
static PyObject *LineToString(const char *);
static char *StringToLine(PyObject *);
@@ -690,7 +704,7 @@ static PyObject *OutputWrite(PyObject *, PyObject *);
static PyObject *OutputWritelines(PyObject *, PyObject *);
typedef void (*writefn)(char_u *);
static void writer(writefn fn, char_u *str, int n);
static void writer(writefn fn, char_u *str, PyInt n);
/* Output object definition
*/
@@ -812,7 +826,7 @@ OutputWritelines(PyObject *self, PyObject *args)
{
PyObject *line = PyList_GetItem(list, i);
char *str;
int len;
PyInt len;
if (!PyArg_Parse(line, "s#", &str, &len)) {
PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
@@ -836,15 +850,15 @@ OutputWritelines(PyObject *self, PyObject *args)
*/
static char_u *buffer = NULL;
static int buffer_len = 0;
static int buffer_size = 0;
static PyInt buffer_len = 0;
static PyInt buffer_size = 0;
static writefn old_fn = NULL;
static void
buffer_ensure(int n)
buffer_ensure(PyInt n)
{
int new_size;
PyInt new_size;
char_u *new_buffer;
if (n < buffer_size)
@@ -884,7 +898,7 @@ PythonIO_Flush(void)
}
static void
writer(writefn fn, char_u *str, int n)
writer(writefn fn, char_u *str, PyInt n)
{
char_u *ptr;
@@ -895,7 +909,7 @@ writer(writefn fn, char_u *str, int n)
while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL)
{
int len = ptr - str;
PyInt len = ptr - str;
buffer_ensure(buffer_len + len + 1);
@@ -1022,14 +1036,14 @@ typedef struct
{
PyObject_HEAD
BufferObject *buf;
int start;
int end;
PyInt start;
PyInt end;
}
RangeObject;
#define RangeType_Check(obj) ((obj)->ob_type == &RangeType)
static PyObject *RangeNew(buf_T *, int, int);
static PyObject *RangeNew(buf_T *, PyInt, PyInt);
static void RangeDestructor(PyObject *);
static PyObject *RangeGetattr(PyObject *, char *);
@@ -1069,8 +1083,8 @@ static int CurrentSetattr(PyObject *, char *, PyObject *);
static struct PyMethodDef VimMethods[] = {
/* name, function, calling, documentation */
{"command", VimCommand, 1, "" },
{"eval", VimEval, 1, "" },
{"command", VimCommand, 1, "Execute a Vim ex-mode command" },
{"eval", VimEval, 1, "Evaluate an expression using Vim evaluator" },
{ NULL, NULL, 0, NULL }
};
@@ -1110,7 +1124,7 @@ VimCommand(PyObject *self, PyObject *args)
* Function to translate a typval_T into a PyObject; this will recursively
* translate lists/dictionaries into their Python equivalents.
*
* The depth parameter is too avoid infinite recursion, set it to 1 when
* The depth parameter is to avoid infinite recursion, set it to 1 when
* you call VimToPython.
*/
static PyObject *
@@ -1130,7 +1144,7 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookupDict)
/* Check if we run into a recursive loop. The item must be in lookupDict
* then and we can use it again. */
sprintf(ptrBuf, "%ld", (long)our_tv);
sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, (long_u)our_tv);
result = PyDict_GetItemString(lookupDict, ptrBuf);
if (result != NULL)
Py_INCREF(result);
@@ -1184,7 +1198,7 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookupDict)
if (our_tv->vval.v_dict != NULL)
{
hashtab_T *ht = &our_tv->vval.v_dict->dv_hashtab;
int todo = ht->ht_used;
long_u todo = ht->ht_used;
hashitem_T *hi;
dictitem_T *di;
@@ -1273,7 +1287,7 @@ CheckBuffer(BufferObject *this)
}
static PyObject *
RBItem(BufferObject *self, PyInt n, int start, int end)
RBItem(BufferObject *self, PyInt n, PyInt start, PyInt end)
{
if (CheckBuffer(self))
return NULL;
@@ -1288,7 +1302,7 @@ RBItem(BufferObject *self, PyInt n, int start, int end)
}
static PyObject *
RBSlice(BufferObject *self, PyInt lo, PyInt hi, int start, int end)
RBSlice(BufferObject *self, PyInt lo, PyInt hi, PyInt start, PyInt end)
{
PyInt size;
@@ -1312,9 +1326,9 @@ RBSlice(BufferObject *self, PyInt lo, PyInt hi, int start, int end)
}
static PyInt
RBAssItem(BufferObject *self, PyInt n, PyObject *val, int start, int end, int *new_end)
RBAssItem(BufferObject *self, PyInt n, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
{
int len_change;
PyInt len_change;
if (CheckBuffer(self))
return -1;
@@ -1335,10 +1349,10 @@ RBAssItem(BufferObject *self, PyInt n, PyObject *val, int start, int end, int *n
}
static PyInt
RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, int start, int end, int *new_end)
RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
{
int size;
int len_change;
PyInt size;
PyInt len_change;
/* Self must be a valid buffer */
if (CheckBuffer(self))
@@ -1368,19 +1382,19 @@ RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, int start, int
}
static PyObject *
RBAppend(BufferObject *self, PyObject *args, int start, int end, int *new_end)
RBAppend(BufferObject *self, PyObject *args, PyInt start, PyInt end, PyInt *new_end)
{
PyObject *lines;
int len_change;
int max;
int n;
PyInt len_change;
PyInt max;
PyInt n;
if (CheckBuffer(self))
return NULL;
max = n = end - start + 1;
if (!PyArg_ParseTuple(args, "O|i", &lines, &n))
if (!PyArg_ParseTuple(args, "O|" Py_ssize_t_fmt, &lines, &n))
return NULL;
if (n < 0 || n > max)
@@ -1405,9 +1419,9 @@ RBAppend(BufferObject *self, PyObject *args, int start, int end, int *new_end)
static struct PyMethodDef BufferMethods[] = {
/* name, function, calling, documentation */
{"append", BufferAppend, 1, "" },
{"mark", BufferMark, 1, "" },
{"range", BufferRange, 1, "" },
{"append", BufferAppend, 1, "Append data to Vim buffer" },
{"mark", BufferMark, 1, "Return (row,col) representing position of named mark" },
{"range", BufferRange, 1, "Return a range object which represents the part of the given buffer between line numbers s and e" },
{ NULL, NULL, 0, NULL }
};
@@ -1503,9 +1517,9 @@ BufferGetattr(PyObject *self, char *name)
return NULL;
if (strcmp(name, "name") == 0)
return Py_BuildValue("s",this->buf->b_ffname);
return Py_BuildValue("s", this->buf->b_ffname);
else if (strcmp(name, "number") == 0)
return Py_BuildValue("i",this->buf->b_fnum);
return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
else if (strcmp(name,"__members__") == 0)
return Py_BuildValue("[ss]", "name", "number");
else
@@ -1520,14 +1534,13 @@ BufferRepr(PyObject *self)
if (this->buf == INVALID_BUFFER_VALUE)
{
vim_snprintf(repr, 100, _("<buffer object (deleted) at %8lX>"),
(long)(self));
vim_snprintf(repr, 100, _("<buffer object (deleted) at %p>"), (self));
return PyString_FromString(repr);
}
else
{
char *name = (char *)this->buf->b_fname;
int len;
PyInt len;
if (name == NULL)
name = "";
@@ -1572,7 +1585,7 @@ BufferSlice(PyObject *self, PyInt lo, PyInt hi)
BufferAssItem(PyObject *self, PyInt n, PyObject *val)
{
return RBAssItem((BufferObject *)(self), n, val, 1,
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count,
(PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
NULL);
}
@@ -1580,7 +1593,7 @@ BufferAssItem(PyObject *self, PyInt n, PyObject *val)
BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
{
return RBAssSlice((BufferObject *)(self), lo, hi, val, 1,
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count,
(PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
NULL);
}
@@ -1588,7 +1601,7 @@ BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
BufferAppend(PyObject *self, PyObject *args)
{
return RBAppend((BufferObject *)(self), args, 1,
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count,
(PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
NULL);
}
@@ -1633,13 +1646,13 @@ BufferMark(PyObject *self, PyObject *args)
static PyObject *
BufferRange(PyObject *self, PyObject *args)
{
int start;
int end;
PyInt start;
PyInt end;
if (CheckBuffer((BufferObject *)(self)))
return NULL;
if (!PyArg_ParseTuple(args, "ii", &start, &end))
if (!PyArg_ParseTuple(args, Py_ssize_t_fmt Py_ssize_t_fmt, &start, &end))
return NULL;
return RangeNew(((BufferObject *)(self))->buf, start, end);
@@ -1650,7 +1663,7 @@ BufferRange(PyObject *self, PyObject *args)
static struct PyMethodDef RangeMethods[] = {
/* name, function, calling, documentation */
{"append", RangeAppend, 1, "" },
{"append", RangeAppend, 1, "Append data to the Vim range" },
{ NULL, NULL, 0, NULL }
};
@@ -1691,7 +1704,7 @@ static PyTypeObject RangeType = {
*/
static PyObject *
RangeNew(buf_T *buf, int start, int end)
RangeNew(buf_T *buf, PyInt start, PyInt end)
{
BufferObject *bufr;
RangeObject *self;
@@ -1725,9 +1738,9 @@ RangeDestructor(PyObject *self)
RangeGetattr(PyObject *self, char *name)
{
if (strcmp(name, "start") == 0)
return Py_BuildValue("i",((RangeObject *)(self))->start - 1);
return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->start - 1);
else if (strcmp(name, "end") == 0)
return Py_BuildValue("i",((RangeObject *)(self))->end - 1);
return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->end - 1);
else
return Py_FindMethod(RangeMethods, self, name);
}
@@ -1740,8 +1753,8 @@ RangeRepr(PyObject *self)
if (this->buf->buf == INVALID_BUFFER_VALUE)
{
vim_snprintf(repr, 100, "<range object (for deleted buffer) at %8lX>",
(long)(self));
vim_snprintf(repr, 100, "<range object (for deleted buffer) at %p>",
(self));
return PyString_FromString(repr);
}
else
@@ -1869,7 +1882,7 @@ static PyTypeObject BufListType = {
BufListLength(PyObject *self)
{
buf_T *b = firstbuf;
int n = 0;
PyInt n = 0;
while (b)
{
@@ -2115,8 +2128,7 @@ WindowRepr(PyObject *self)
if (this->win == INVALID_WINDOW_VALUE)
{
vim_snprintf(repr, 100, _("<window object (deleted) at %.8lX>"),
(long)(self));
vim_snprintf(repr, 100, _("<window object (deleted) at %p>"), (self));
return PyString_FromString(repr);
}
else
@@ -2128,8 +2140,8 @@ WindowRepr(PyObject *self)
++i;
if (w == NULL)
vim_snprintf(repr, 100, _("<window object (unknown) at %.8lX>"),
(long)(self));
vim_snprintf(repr, 100, _("<window object (unknown) at %p>"),
(self));
else
vim_snprintf(repr, 100, _("<window %d>"), i);
@@ -2186,7 +2198,7 @@ static PyTypeObject WinListType = {
WinListLength(PyObject *self)
{
win_T *w = firstwin;
int n = 0;
PyInt n = 0;
while (w != NULL)
{
@@ -2254,7 +2266,7 @@ CurrentGetattr(PyObject *self, char *name)
else if (strcmp(name, "window") == 0)
return (PyObject *)WindowNew(curwin);
else if (strcmp(name, "line") == 0)
return GetBufferLine(curbuf, (int)curwin->w_cursor.lnum);
return GetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum);
else if (strcmp(name, "range") == 0)
return RangeNew(curbuf, RangeStart, RangeEnd);
else if (strcmp(name,"__members__") == 0)
@@ -2272,7 +2284,7 @@ CurrentSetattr(PyObject *self, char *name, PyObject *value)
{
if (strcmp(name, "line") == 0)
{
if (SetBufferLine(curbuf, (int)curwin->w_cursor.lnum, value, NULL) == FAIL)
if (SetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum, value, NULL) == FAIL)
return -1;
return 0;
@@ -2344,7 +2356,7 @@ PythonMod_Init(void)
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
mod = Py_InitModule("vim", VimMethods);
mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
dict = PyModule_GetDict(mod);
VimError = Py_BuildValue("s", "vim.error");
@@ -2369,7 +2381,7 @@ PythonMod_Init(void)
* string object.
*/
static PyObject *
GetBufferLine(buf_T *buf, int n)
GetBufferLine(buf_T *buf, PyInt n)
{
return LineToString((char *)ml_get_buf(buf, (linenr_T)n, FALSE));
}
@@ -2422,7 +2434,7 @@ GetBufferLineList(buf_T *buf, PyInt lo, PyInt hi)
* deleted).
*/
static void
py_fix_cursor(int lo, int hi, int extra)
py_fix_cursor(linenr_T lo, linenr_T hi, linenr_T extra)
{
if (curwin->w_cursor.lnum >= lo)
{
@@ -2454,7 +2466,7 @@ py_fix_cursor(int lo, int hi, int extra)
* is set to the change in the buffer length.
*/
static int
SetBufferLine(buf_T *buf, int n, PyObject *line, int *len_change)
SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
{
/* First of all, we check the thpe of the supplied Python object.
* There are three cases:
@@ -2477,7 +2489,7 @@ SetBufferLine(buf_T *buf, int n, PyObject *line, int *len_change)
{
deleted_lines_mark((linenr_T)n, 1L);
if (buf == curwin->w_buffer)
py_fix_cursor(n, n + 1, -1);
py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1);
}
curbuf = savebuf;
@@ -2545,7 +2557,7 @@ SetBufferLine(buf_T *buf, int n, PyObject *line, int *len_change)
* is set to the change in the buffer length.
*/
static int
SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_change)
SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_change)
{
/* First of all, we check the thpe of the supplied Python object.
* There are three cases:
@@ -2556,7 +2568,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
if (list == Py_None || list == NULL)
{
PyInt i;
PyInt n = hi - lo;
PyInt n = (int)(hi - lo);
buf_T *savebuf = curbuf;
PyErr_Clear();
@@ -2577,7 +2589,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
deleted_lines_mark((linenr_T)lo, (long)i);
if (buf == curwin->w_buffer)
py_fix_cursor(lo, hi, -n);
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n);
}
curbuf = savebuf;
@@ -2595,7 +2607,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
PyInt i;
PyInt new_len = PyList_Size(list);
PyInt old_len = hi - lo;
int extra = 0; /* lines added to text, can be negative */
PyInt extra = 0; /* lines added to text, can be negative */
char **array;
buf_T *savebuf;
@@ -2706,7 +2718,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
if (buf == curwin->w_buffer)
py_fix_cursor(lo, hi, extra);
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra);
curbuf = savebuf;
@@ -2734,7 +2746,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
* is set to the change in the buffer length.
*/
static int
InsertBufferLines(buf_T *buf, int n, PyObject *lines, int *len_change)
InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
{
/* First of all, we check the type of the supplied Python object.
* It must be a string or a list, or the call is in error.
+13 -8
View File
@@ -1880,15 +1880,20 @@ ins_bytes_len(p, len)
# ifdef FEAT_MBYTE
int n;
for (i = 0; i < len; i += n)
{
n = (*mb_ptr2len)(p + i);
ins_char_bytes(p + i, n);
}
# else
for (i = 0; i < len; ++i)
ins_char(p[i]);
if (has_mbyte)
for (i = 0; i < len; i += n)
{
if (enc_utf8)
/* avoid reading past p[len] */
n = utfc_ptr2len_len(p + i, len - i);
else
n = (*mb_ptr2len)(p + i);
ins_char_bytes(p + i, n);
}
else
# endif
for (i = 0; i < len; ++i)
ins_char(p[i]);
}
#endif
+20 -2
View File
@@ -16,6 +16,10 @@
* See ":help netbeans-protocol" for explanation.
*/
#if defined(MSDOS) || defined(MSWIN)
# include "vimio.h" /* for mch_open(), must be before vim.h */
#endif
#include "vim.h"
#if defined(FEAT_NETBEANS_INTG) || defined(PROTO)
@@ -1974,13 +1978,16 @@ nb_do_cmd(
}
else if (streq((char *)cmd, "setModified"))
{
int prev_b_changed;
if (buf == NULL || buf->bufp == NULL)
{
/* EMSG("E646: null bufp in setModified"); */
return FAIL;
}
prev_b_changed = buf->bufp->b_changed;
if (streq((char *)args, "T"))
buf->bufp->b_changed = 1;
buf->bufp->b_changed = TRUE;
else
{
struct stat st;
@@ -1990,9 +1997,20 @@ nb_do_cmd(
if (buf->bufp->b_ffname != NULL
&& mch_stat((char *)buf->bufp->b_ffname, &st) >= 0)
buf_store_time(buf->bufp, &st, buf->bufp->b_ffname);
buf->bufp->b_changed = 0;
buf->bufp->b_changed = FALSE;
}
buf->modified = buf->bufp->b_changed;
if (prev_b_changed != buf->bufp->b_changed)
{
#ifdef FEAT_WINDOWS
check_status(buf->bufp);
redraw_tabline = TRUE;
#endif
#ifdef FEAT_TITLE
maketitle();
#endif
update_screen(0);
}
/* =====================================================================*/
}
else if (streq((char *)cmd, "setModtime"))
+3 -2
View File
@@ -243,7 +243,8 @@
/* WV_ and BV_ values get typecasted to this for the "indir" field */
typedef enum
{
PV_NONE = 0
PV_NONE = 0,
PV_MAXVAL = 0xffff /* to avoid warnings for value out of range */
} idopt_T;
/*
@@ -8828,7 +8829,7 @@ put_setstring(fd, cmd, name, valuep, expand)
{
s = *valuep;
while (*s != NUL)
if (fputs((char *)str2special(&s, FALSE), fd) < 0)
if (put_escstr(fd, str2special(&s, FALSE), 2) == FAIL)
return FAIL;
}
else if (expand)
+29 -10
View File
@@ -209,6 +209,7 @@ typedef struct
{
SmcConn smcconn; /* The SM connection ID */
IceConn iceconn; /* The ICE connection ID */
char *clientid; /* The client ID for the current smc session */
Bool save_yourself; /* If we're in the middle of a save_yourself */
Bool shutdown; /* If we're in shutdown mode */
} xsmp_config_T;
@@ -2279,6 +2280,10 @@ mch_FullName(fname, buf, len, force)
char_u olddir[MAXPATHL];
char_u *p;
int retval = OK;
#ifdef __CYGWIN__
char_u posix_fname[MAX_PATH];
#endif
#ifdef VMS
fname = vms_fixfilename(fname);
@@ -2288,7 +2293,8 @@ mch_FullName(fname, buf, len, force)
/*
* This helps for when "/etc/hosts" is a symlink to "c:/something/hosts".
*/
cygwin_conv_to_posix_path(fname, fname);
cygwin_conv_to_posix_path(fname, posix_fname);
fname = posix_fname;
#endif
/* expand it if forced or not an absolute path */
@@ -2889,16 +2895,28 @@ mch_free_mem()
if (clip_plus.owned)
clip_lose_selection(&clip_plus);
# endif
# if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)) || defined(PROTO)
# if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)
if (xterm_Shell != (Widget)0)
XtDestroyWidget(xterm_Shell);
# ifndef LESSTIF_VERSION
/* Lesstif crashes here, lose some memory */
if (xterm_dpy != NULL)
XtCloseDisplay(xterm_dpy);
if (app_context != (XtAppContext)NULL)
{
XtDestroyApplicationContext(app_context);
# ifdef FEAT_X11
x11_display = NULL; /* freed by XtDestroyApplicationContext() */
# endif
}
# endif
# endif
# ifdef FEAT_X11
if (x11_display != NULL && x11_display != xterm_dpy)
if (x11_display != NULL
# ifdef FEAT_XCLIPBOARD
&& x11_display != xterm_dpy
# endif
)
XCloseDisplay(x11_display);
# endif
# if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
@@ -3886,7 +3904,7 @@ mch_call_shell(cmd, options)
/* push stream discipline modules */
if (options & SHELL_COOKED)
SetupSlavePTY(pty_slave_fd);
# ifdef TIOCSCTTY
# if defined(TIOCSCTTY) && !defined(FEAT_GUI_MACVIM)
/* Try to become controlling tty (probably doesn't work,
* unless run by root) */
ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
@@ -6292,22 +6310,22 @@ clear_xterm_clip()
}
if (xterm_dpy != NULL)
{
#if 0
# if 0
/* Lesstif and Solaris crash here, lose some memory */
XtCloseDisplay(xterm_dpy);
#endif
# endif
if (x11_display == xterm_dpy)
x11_display = NULL;
xterm_dpy = NULL;
}
#if 0
# if 0
if (app_context != (XtAppContext)NULL)
{
/* Lesstif and Solaris crash here, lose some memory */
XtDestroyApplicationContext(app_context);
app_context = (XtAppContext)NULL;
}
#endif
# endif
}
# endif
@@ -6559,7 +6577,6 @@ static int dummy;
xsmp_init(void)
{
char errorstring[80];
char *clientid;
SmcCallbacks smcallbacks;
#if 0
SmPropValue smname;
@@ -6601,7 +6618,7 @@ xsmp_init(void)
| SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask,
&smcallbacks,
NULL,
&clientid,
&xsmp.clientid,
sizeof(errorstring),
errorstring);
if (xsmp.smcconn == NULL)
@@ -6640,6 +6657,8 @@ xsmp_close()
if (xsmp_icefd != -1)
{
SmcCloseConnection(xsmp.smcconn, 0, NULL);
vim_free(xsmp.clientid);
xsmp.clientid = NULL;
xsmp_icefd = -1;
}
}
+7 -1
View File
@@ -432,7 +432,13 @@ typedef struct dsc$descriptor DESC;
* Unix has plenty of memory, use large buffers
*/
#define CMDBUFFSIZE 1024 /* size of the command processing buffer */
#define MAXPATHL 1024 /* Unix has long paths and plenty of memory */
/* Use the system path length if it makes sense. */
#if defined(PATH_MAX) && (PATH_MAX > 1000)
# define MAXPATHL PATH_MAX
#else
# define MAXPATHL 1024
#endif
#define CHECK_INODE /* used when checking if a swap file already
exists for a file */
+17 -2
View File
@@ -1,7 +1,8 @@
" Vim script for checking .po files.
"
" Go through the file and verify that all %...s items in "msgid" are identical
" to the ones in "msgstr".
" Go through the file and verify that:
" - All %...s items in "msgid" are identical to the ones in "msgstr".
" - An error or warning code in "msgid" matches the one in "msgstr".
if 1 " Only execute this if the eval feature is available.
@@ -56,6 +57,20 @@ while 1
endif
endwhile
" Check that error code in msgid matches the one in msgstr.
"
" Examples of mismatches found with msgid "E123: ..."
" - msgstr "E321: ..." error code mismatch
" - msgstr "W123: ..." warning instead of error
" - msgstr "E123 ..." missing colon
" - msgstr "..." missing error code
"
1
if search('msgid "\("\n"\)\?\([EW][0-9]\+:\).*\nmsgstr "\("\n"\)\?[^"]\@=\2\@!') > 0
echo 'Mismatching error/warning code in line ' . line('.')
let error = 1
endif
if error == 0
echo "OK"
endif
+1 -1
View File
@@ -124,7 +124,7 @@ gui_mch_haskey(char_u *name);
void
gui_mch_iconify(void);
void
gui_mch_invert_rectangle(int r, int c, int nr, int nc);
gui_mch_invert_rectangle(int r, int c, int nr, int nc, int invert);
void
gui_mch_new_colors(void);
void
+30 -18
View File
@@ -3044,6 +3044,7 @@ typedef struct regbehind_S
{
regsave_T save_after;
regsave_T save_behind;
int save_need_clear_subexpr;
save_se_T save_start[NSUBEXP];
save_se_T save_end[NSUBEXP];
} regbehind_T;
@@ -5858,17 +5859,23 @@ save_subexpr(bp)
{
int i;
for (i = 0; i < NSUBEXP; ++i)
/* When "need_clear_subexpr" is set we don't need to save the values, only
* remember that this flag needs to be set again when restoring. */
bp->save_need_clear_subexpr = need_clear_subexpr;
if (!need_clear_subexpr)
{
if (REG_MULTI)
for (i = 0; i < NSUBEXP; ++i)
{
bp->save_start[i].se_u.pos = reg_startpos[i];
bp->save_end[i].se_u.pos = reg_endpos[i];
}
else
{
bp->save_start[i].se_u.ptr = reg_startp[i];
bp->save_end[i].se_u.ptr = reg_endp[i];
if (REG_MULTI)
{
bp->save_start[i].se_u.pos = reg_startpos[i];
bp->save_end[i].se_u.pos = reg_endpos[i];
}
else
{
bp->save_start[i].se_u.ptr = reg_startp[i];
bp->save_end[i].se_u.ptr = reg_endp[i];
}
}
}
}
@@ -5882,17 +5889,22 @@ restore_subexpr(bp)
{
int i;
for (i = 0; i < NSUBEXP; ++i)
/* Only need to restore saved values when they are not to be cleared. */
need_clear_subexpr = bp->save_need_clear_subexpr;
if (!need_clear_subexpr)
{
if (REG_MULTI)
for (i = 0; i < NSUBEXP; ++i)
{
reg_startpos[i] = bp->save_start[i].se_u.pos;
reg_endpos[i] = bp->save_end[i].se_u.pos;
}
else
{
reg_startp[i] = bp->save_start[i].se_u.ptr;
reg_endp[i] = bp->save_end[i].se_u.ptr;
if (REG_MULTI)
{
reg_startpos[i] = bp->save_start[i].se_u.pos;
reg_endpos[i] = bp->save_end[i].se_u.pos;
}
else
{
reg_startp[i] = bp->save_start[i].se_u.ptr;
reg_endp[i] = bp->save_end[i].se_u.ptr;
}
}
}
}
+4 -1
View File
@@ -4863,6 +4863,7 @@ comp_char_differs(off_from, off_to)
* - the (first byte of the) character is different
* - the attributes are different
* - the character is multi-byte and the next byte is different
* - the character is two cells wide and the second cell differs.
*/
static int
char_needs_redraw(off_from, off_to, cols)
@@ -4884,7 +4885,9 @@ char_needs_redraw(off_from, off_to, cols)
|| (enc_utf8
&& (ScreenLinesUC[off_from] != ScreenLinesUC[off_to]
|| (ScreenLinesUC[off_from] != 0
&& comp_char_differs(off_from, off_to))))
&& comp_char_differs(off_from, off_to))
|| (cols > 1 && ScreenLines[off_from + 1]
!= ScreenLines[off_to + 1])))
#endif
))
return TRUE;
+2
View File
@@ -2,6 +2,8 @@ Tests for "r<Tab>" with 'smarttab' and 'expandtab' set/not set.
STARTTEST
:set smarttab expandtab ts=8 sw=4
:" make sure that backspace works, no matter what termcap is used
:set t_kD=x7f t_kb=x08
/some
r :set noexpandtab
/other
+2
View File
@@ -3,6 +3,8 @@ Test Virtual replace mode.
STARTTEST
:so small.vim
:" make sure that backspace works, no matter what termcap is used
:set t_kD=x7f t_kb=x08
ggdGa
abcdefghi
jk lmn
View File
View File
+4
View File
@@ -1126,7 +1126,11 @@ clip_invert_rectangle(row, col, height, width, invert)
{
#ifdef FEAT_GUI
if (gui.in_use)
# ifdef FEAT_GUI_MACVIM
gui_mch_invert_rectangle(row, col, height, width, invert);
# else
gui_mch_invert_rectangle(row, col, height, width);
#endif
else
#endif
screen_draw_rectangle(row, col, height, width, invert);
+49 -7
View File
@@ -681,6 +681,44 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
330,
/**/
329,
/**/
328,
/**/
327,
/**/
326,
/**/
325,
/**/
324,
/**/
323,
/**/
322,
/**/
321,
/**/
320,
/**/
319,
/**/
318,
/**/
317,
/**/
316,
/**/
315,
/**/
314,
/**/
313,
/**/
312,
/**/
311,
/**/
@@ -1366,12 +1404,12 @@ list_version()
# ifdef FEAT_GUI_W32
# if defined(_MSC_VER) && (_MSC_VER <= 1010)
/* Only MS VC 4.1 and earlier can do Win32s */
MSG_PUTS(_("\nMS-Windows 16/32 bit GUI version"));
MSG_PUTS(_("\nMS-Windows 16/32-bit GUI version"));
# else
# ifdef _WIN64
MSG_PUTS(_("\nMS-Windows 64 bit GUI version"));
MSG_PUTS(_("\nMS-Windows 64-bit GUI version"));
# else
MSG_PUTS(_("\nMS-Windows 32 bit GUI version"));
MSG_PUTS(_("\nMS-Windows 32-bit GUI version"));
# endif
# endif
if (gui_is_win32s())
@@ -1380,17 +1418,21 @@ list_version()
MSG_PUTS(_(" with OLE support"));
# endif
# else
MSG_PUTS(_("\nMS-Windows 32 bit console version"));
# ifdef _WIN64
MSG_PUTS(_("\nMS-Windows 64-bit console version"));
# else
MSG_PUTS(_("\nMS-Windows 32-bit console version"));
# endif
# endif
#endif
#ifdef WIN16
MSG_PUTS(_("\nMS-Windows 16 bit version"));
MSG_PUTS(_("\nMS-Windows 16-bit version"));
#endif
#ifdef MSDOS
# ifdef DJGPP
MSG_PUTS(_("\n32 bit MS-DOS version"));
MSG_PUTS(_("\n32-bit MS-DOS version"));
# else
MSG_PUTS(_("\n16 bit MS-DOS version"));
MSG_PUTS(_("\n16-bit MS-DOS version"));
# endif
#endif
#ifdef MACOS