diff --git a/src/MacVim/English.lproj/Preferences.nib/designable.nib b/src/MacVim/English.lproj/Preferences.nib/designable.nib index 83fcd54b7d..efa14e92cb 100644 --- a/src/MacVim/English.lproj/Preferences.nib/designable.nib +++ b/src/MacVim/English.lproj/Preferences.nib/designable.nib @@ -1,8 +1,9 @@ - + - + + @@ -13,7 +14,7 @@ - + @@ -24,7 +25,7 @@ - + @@ -51,7 +52,7 @@ - + @@ -180,12 +181,12 @@ - - + + - + @@ -195,7 +196,7 @@ - + @@ -217,7 +218,7 @@ - - - - - - This option causes marked text to be rendered like normal text which is very convenient when using a complex input method (e.g. Kotoeri). However, it has some known limitations which may be circumvented by disabling this option (e.g. mapping to "dead keys" may not work). Note that without this option the Core Text renderer will not draw marked text at all. - - - - - - + @@ -259,7 +239,7 @@ - + diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib index cd0271eebc..0dfb7537da 100644 Binary files a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib and b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib differ diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index cf00cdfb67..158d7b3880 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -227,9 +227,6 @@ + (void)initialize [NSNumber numberWithBool:NO], MMVerticalSplitKey, [NSNumber numberWithInt:0], MMPreloadCacheSizeKey, [NSNumber numberWithInt:0], MMLastWindowClosedBehaviorKey, -#ifdef INCLUDE_OLD_IM_CODE - [NSNumber numberWithBool:YES], MMUseInlineImKey, -#endif // INCLUDE_OLD_IM_CODE [NSNumber numberWithBool:NO], MMSuppressTerminationAlertKey, [NSNumber numberWithBool:YES], MMNativeFullScreenKey, [NSNumber numberWithDouble:0.25], MMFullScreenFadeTimeKey, diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 92e7e67f81..9e3acd917d 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -2092,6 +2092,8 @@ - (void)handleInputEvent:(int)msgid data:(NSData *)data [self setImState:NO]; } else if (BackingPropertiesChangedMsgID == msgid) { [self redrawScreen]; + } else if (RedrawBlockMsgID == msgid) { + [self handleRedrawBlock:data]; } else { ASLogWarn(@"Unknown message received (msgid=%d)", msgid); } @@ -3008,6 +3010,17 @@ - (void)handleGesture:(NSData *)data } } +- (void)handleRedrawBlock:(NSData *)data +{ + const void *bytes = [data bytes]; + int row1 = *((int*)bytes); bytes += sizeof(int); + int col1 = *((int*)bytes); bytes += sizeof(int); + int row2 = *((int*)bytes); bytes += sizeof(int); + int col2 = *((int*)bytes); + + gui_redraw_block(row1, col1, row2, col2, GUI_MON_NOCLEAR); +} + #ifdef FEAT_BEVAL - (void)bevalCallback:(id)sender { diff --git a/src/MacVim/MMCoreTextView.h b/src/MacVim/MMCoreTextView.h index a085013057..975cb324e0 100644 --- a/src/MacVim/MMCoreTextView.h +++ b/src/MacVim/MMCoreTextView.h @@ -18,6 +18,8 @@ int maxRows, maxColumns; NSColor *defaultBackgroundColor; NSColor *defaultForegroundColor; + int defaultBackgroundHexColor; + int defaultForegroundHexColor; NSSize cellSize; NSFont *font; NSFont *fontWide; @@ -51,6 +53,12 @@ void *trackingRectUserData_; NSTrackingRectTag lastToolTipTag_; NSString* toolTip_; + + NSUInteger markedRangeLength; + int markedTextStartRow; + int markedTextStartColumn; + int markedTextEndRow; + int markedTextEndColumn; } - (id)initWithFrame:(NSRect)frame; @@ -87,8 +95,10 @@ - (void)setLigatures:(BOOL)state; - (void)setThinStrokes:(BOOL)state; - (void)setImControl:(BOOL)enable; +- (void)setInlineIm:(BOOL)enable; - (void)activateIm:(BOOL)enable; - (void)checkImState; +- (void)clearMarkedText; - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; - (NSRect)rectForRow:(int)row column:(int)column numRows:(int)nr numColumns:(int)nc; diff --git a/src/MacVim/MMCoreTextView.m b/src/MacVim/MMCoreTextView.m index 9ee0f654e1..f5fc320564 100644 --- a/src/MacVim/MMCoreTextView.m +++ b/src/MacVim/MMCoreTextView.m @@ -205,6 +205,13 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor if (defaultBackgroundColor != bgColor) { [defaultBackgroundColor release]; defaultBackgroundColor = bgColor ? [bgColor retain] : nil; + if (bgColor) { + defaultBackgroundHexColor = + (int)(bgColor.blueComponent * 0xff) | + ((int)(bgColor.greenComponent * 0xff) << 8) | + ((int)(bgColor.redComponent * 0xff) << 16) | + (0xff << 24); + } } // NOTE: The default foreground color isn't actually used for anything, but @@ -213,6 +220,13 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor if (defaultForegroundColor != fgColor) { [defaultForegroundColor release]; defaultForegroundColor = fgColor ? [fgColor retain] : nil; + if (fgColor) { + defaultForegroundHexColor = + (int)(fgColor.blueComponent * 0xff) | + ((int)(fgColor.greenComponent * 0xff) << 8) | + ((int)(fgColor.redComponent * 0xff) << 16) | + (0xff << 24); + } } } @@ -425,6 +439,11 @@ - (void)setImControl:(BOOL)enable [helper setImControl:enable]; } +- (void)setInlineIm:(BOOL)enable +{ + [helper setInlineIm:enable]; +} + - (void)activateIm:(BOOL)enable { [helper activateIm:enable]; @@ -494,6 +513,23 @@ - (void)setMarkedText:(id)text selectedRange:(NSRange)range [helper setMarkedText:text selectedRange:range]; } +- (void)clearMarkedText +{ + if (![helper inlineIm]) { + [self redrawMarkedTextBlock]; + } +} + +- (void)redrawMarkedTextBlock +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&markedTextStartRow length:sizeof(int)]; + [data appendBytes:&markedTextStartColumn length:sizeof(int)]; + [data appendBytes:&markedTextEndRow length:sizeof(int)]; + [data appendBytes:&markedTextEndColumn length:sizeof(int)]; + [[self vimController] sendMessage:RedrawBlockMsgID data:data]; +} + - (void)unmarkText { [helper unmarkText]; @@ -647,6 +683,40 @@ - (void)drawRect:(NSRect)rect [drawData removeAllObjects]; } + + if ([helper hasMarkedText] && ![helper inlineIm]) { + NSString *text = [[helper markedText] string]; + // Draw marked text + CFStringRef sref = (__bridge CFStringRef)text; + CFIndex unilength = CFStringGetLength(sref); + const UniChar *unichars = CFStringGetCharactersPtr(sref); + UniChar *buffer = NULL; + if (unichars == NULL) { + buffer = malloc(unilength * sizeof(UniChar)); + CFStringGetCharacters(sref, CFRangeMake(0, unilength), buffer); + unichars = buffer; + } + + int row = [helper preEditRow]; + int col = [helper preEditColumn]; + + markedTextStartRow = row; + markedTextEndRow = row; + markedTextStartColumn = col; + markedTextEndColumn = col + unilength * 2; + + [self drawString:unichars length:unilength + atRow:row column:col cells:(unilength * 2) + withFlags:(DRAW_WIDE|DRAW_UNDERL) + foregroundColor:defaultForegroundHexColor + backgroundColor:defaultBackgroundHexColor + specialColor:defaultForegroundHexColor]; + + if (buffer) { + free(buffer); + buffer = NULL; + } + } } - (void)performBatchDrawWithData:(NSData *)data diff --git a/src/MacVim/MMTextView.h b/src/MacVim/MMTextView.h index 6938dc97fa..5f4d019836 100644 --- a/src/MacVim/MMTextView.h +++ b/src/MacVim/MMTextView.h @@ -37,6 +37,7 @@ - (void)setLigatures:(BOOL)ligatures; - (void)setThinStrokes:(BOOL)thinStrokes; - (void)setImControl:(BOOL)enable; +- (void)setInlineIm:(BOOL)enable; - (void)activateIm:(BOOL)enable; - (void)checkImState; @@ -74,4 +75,5 @@ - (void)deleteSign:(NSString *)signName; - (void)setToolTipAtMousePoint:(NSString *)string; - (void)setCGLayerEnabled:(BOOL)enabled; +- (void)clearMarkedText; @end diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index aa16b5f1ff..021253c1cd 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -322,6 +322,11 @@ - (void)setImControl:(BOOL)enable [helper setImControl:enable]; } +- (void)setInlineIm:(BOOL)enable +{ + [helper setInlineIm:enable]; +} + - (void)activateIm:(BOOL)enable { [helper activateIm:enable]; @@ -557,8 +562,7 @@ - (void)drawRect:(NSRect)rect numInvertRects = 0; } -#ifdef INCLUDE_OLD_IM_CODE - if ([self hasMarkedText] && ![helper useInlineIm]) { + if ([self hasMarkedText] && ![helper inlineIm]) { shouldDrawInsertionPoint = YES; MMTextStorage *ts = (MMTextStorage*)[self textStorage]; NSSize inset = [self textContainerInset]; @@ -616,7 +620,6 @@ - (void)drawRect:(NSRect)rect } } } -#endif // INCLUDE_OLD_IM_CODE if (shouldDrawInsertionPoint) { MMTextStorage *ts = (MMTextStorage*)[self textStorage]; @@ -626,9 +629,8 @@ - (void)drawRect:(NSRect)rect ipRect.origin.x += [self textContainerOrigin].x; ipRect.origin.y += [self textContainerOrigin].y; -#ifdef INCLUDE_OLD_IM_CODE // Draw insertion point inside marked text. - if ([self hasMarkedText] && ![helper useInlineIm]) { + if ([self hasMarkedText] && ![helper inlineIm]) { NSFont *theFont = [[self markedTextAttributes] valueForKey:NSFontAttributeName]; if (theFont == [ts font]) @@ -640,7 +642,6 @@ - (void)drawRect:(NSRect)rect ([helper imRange].location + [helper imRange].length); } -#endif // INCLUDE_OLD_IM_CODE if (MMInsertionPointHorizontal == insertionPointShape) { int frac = ([ts cellSize].height * insertionPointFraction + 99)/100; @@ -730,6 +731,10 @@ - (void)unmarkText [helper unmarkText]; } +- (void)clearMarkedText +{ +} + - (NSRect)firstRectForCharacterRange:(NSRange)range { return [helper firstRectForCharacterRange:range]; diff --git a/src/MacVim/MMTextViewHelper.h b/src/MacVim/MMTextViewHelper.h index bb3d3dd5b5..8ba49540e9 100644 --- a/src/MacVim/MMTextViewHelper.h +++ b/src/MacVim/MMTextViewHelper.h @@ -45,6 +45,7 @@ NSMutableAttributedString *markedText; int preEditRow; int preEditColumn; + BOOL inlineIm; BOOL imControl; BOOL imState; TISInputSourceRef lastImSource; @@ -90,7 +91,8 @@ - (NSRect)firstRectForCharacterRange:(NSRange)range; - (void)setImControl:(BOOL)enable; - (void)activateIm:(BOOL)enable; -- (BOOL)useInlineIm; +- (void)setInlineIm:(BOOL)enable; +- (BOOL)inlineIm; - (void)checkImState; @end diff --git a/src/MacVim/MMTextViewHelper.m b/src/MacVim/MMTextViewHelper.m index 838bbeb059..37eca81b45 100644 --- a/src/MacVim/MMTextViewHelper.m +++ b/src/MacVim/MMTextViewHelper.m @@ -213,6 +213,7 @@ - (void)insertText:(id)string // called the input manager expects the marked text to be unmarked // automatically, hence the explicit unmarkText: call here. [self unmarkText]; + [textView clearMarkedText]; } // NOTE: 'string' is either an NSString or an NSAttributedString. Since we @@ -317,6 +318,7 @@ - (void)scrollWheel:(NSEvent *)event // marked text moves outside the view as a result of scrolling. [self sendMarkedText:nil position:0]; [self unmarkText]; + [textView clearMarkedText]; [[NSTextInputContext currentInputContext] discardMarkedText]; } @@ -616,7 +618,7 @@ - (void)setMarkedText:(id)text selectedRange:(NSRange)range ASLogDebug(@"text='%@' range=%@", text, NSStringFromRange(range)); [self unmarkText]; - if ([self useInlineIm]) { + if (inlineIm) { if ([text isKindOfClass:[NSAttributedString class]]) text = [text string]; @@ -629,7 +631,6 @@ - (void)setMarkedText:(id)text selectedRange:(NSRange)range return; } -#ifdef INCLUDE_OLD_IM_CODE if (!(text && [text length] > 0)) return; @@ -669,7 +670,6 @@ - (void)setMarkedText:(id)text selectedRange:(NSRange)range } [textView setNeedsDisplay:YES]; -#endif // INCLUDE_OLD_IM_CODE } - (void)unmarkText @@ -813,14 +813,14 @@ - (void)activateIm:(BOOL)enable } } -- (BOOL)useInlineIm +- (void)setInlineIm:(BOOL)enable { -#ifdef INCLUDE_OLD_IM_CODE - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - return [ud boolForKey:MMUseInlineImKey]; -#else - return YES; -#endif // INCLUDE_OLD_IM_CODE + inlineIm = enable; +} + +- (BOOL)inlineIm +{ + return inlineIm; } - (void)checkImState @@ -1064,7 +1064,7 @@ - (BOOL)inputManagerHandleMouseEvent:(NSEvent *)event - (void)sendMarkedText:(NSString *)text position:(int32_t)pos { - if (![self useInlineIm]) + if (!inlineIm) return; NSMutableData *data = [NSMutableData data]; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 66d4b4b556..c61c521f8c 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -833,6 +833,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [[[windowController vimView] textView] activateIm:YES]; } else if (DeactivateKeyScriptMsgID == msgid) { [[[windowController vimView] textView] activateIm:NO]; + } else if (EnableInlineImMsgID == msgid) { + [[[windowController vimView] textView] setInlineIm:YES]; + } else if (DisableInlineImMsgID == msgid) { + [[[windowController vimView] textView] setInlineIm:NO]; } else if (EnableImControlMsgID == msgid) { [[[windowController vimView] textView] setImControl:YES]; } else if (DisableImControlMsgID == msgid) { diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 2a8a53f588..a9b1b825c6 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -251,6 +251,9 @@ enum { DisableLigaturesMsgID, EnableThinStrokesMsgID, DisableThinStrokesMsgID, + EnableInlineImMsgID, + DisableInlineImMsgID, + RedrawBlockMsgID, LastMsgID // NOTE: MUST BE LAST MESSAGE IN ENUM! }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index b9fdeb43c9..3d59c02eec 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -105,6 +105,9 @@ "DisableLigaturesMsgID", "EnableThinStrokesMsgID", "DisableThinStrokesMsgID", + "EnableInlineImMsgID", + "DisableInlineImMsgID", + "RedrawBlockMsgID", "END OF MESSAGE IDs" // NOTE: Must be last! }; diff --git a/src/MacVim/Miscellaneous.h b/src/MacVim/Miscellaneous.h index 68380bb99a..73d74abcf0 100644 --- a/src/MacVim/Miscellaneous.h +++ b/src/MacVim/Miscellaneous.h @@ -13,10 +13,6 @@ #import "MacVim.h" -// TODO: Remove this when the inline IM code has been tested -#define INCLUDE_OLD_IM_CODE - - // NSUserDefaults keys extern NSString *MMTabMinWidthKey; extern NSString *MMTabMaxWidthKey; @@ -45,9 +41,6 @@ extern NSString *MMOpenLayoutKey; extern NSString *MMVerticalSplitKey; extern NSString *MMPreloadCacheSizeKey; extern NSString *MMLastWindowClosedBehaviorKey; -#ifdef INCLUDE_OLD_IM_CODE -extern NSString *MMUseInlineImKey; -#endif // INCLUDE_OLD_IM_CODE extern NSString *MMSuppressTerminationAlertKey; extern NSString *MMNativeFullScreenKey; extern NSString *MMUseMouseTimeKey; diff --git a/src/MacVim/Miscellaneous.m b/src/MacVim/Miscellaneous.m index 5351e43d25..52deb0119e 100644 --- a/src/MacVim/Miscellaneous.m +++ b/src/MacVim/Miscellaneous.m @@ -41,9 +41,6 @@ NSString *MMVerticalSplitKey = @"MMVerticalSplit"; NSString *MMPreloadCacheSizeKey = @"MMPreloadCacheSize"; NSString *MMLastWindowClosedBehaviorKey = @"MMLastWindowClosedBehavior"; -#ifdef INCLUDE_OLD_IM_CODE -NSString *MMUseInlineImKey = @"MMUseInlineIm"; -#endif // INCLUDE_OLD_IM_CODE NSString *MMSuppressTerminationAlertKey = @"MMSuppressTerminationAlert"; NSString *MMNativeFullScreenKey = @"MMNativeFullScreen"; NSString *MMUseMouseTimeKey = @"MMUseMouseTime"; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index f2e4a8330e..a79ec6d4cc 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -264,6 +264,8 @@ gui_mch_adjust_charheight(); gui_mch_adjust_charwidth(); + gui_macvim_set_imstyle(p_imst); + if (!MMNoMRU && GARGCOUNT > 0) { // Add files passed on command line to MRU. NSMutableArray *filenames = [NSMutableArray array]; @@ -1331,6 +1333,15 @@ + void +gui_macvim_set_imstyle(long imstyle) +{ + int msgid = imstyle == IM_ON_THE_SPOT ? + EnableInlineImMsgID : DisableInlineImMsgID; + [[MMBackend sharedInstance] queueMessage:msgid properties:nil]; +} + + // -- Find & Replace dialog ------------------------------------------------- diff --git a/src/option.c b/src/option.c index 950c68615f..621ef0544c 100644 --- a/src/option.c +++ b/src/option.c @@ -9085,6 +9085,9 @@ set_num_option( { if (p_imst != IM_ON_THE_SPOT && p_imst != IM_OVER_THE_SPOT) errmsg = e_invarg; +# ifdef FEAT_GUI_MACVIM + gui_macvim_set_imstyle(p_imst); +# endif } #endif diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro index b2d2f2e49d..62b94c3cd1 100644 --- a/src/proto/gui_macvim.pro +++ b/src/proto/gui_macvim.pro @@ -235,6 +235,8 @@ gui_mch_find_dialog(exarg_T *eap); gui_mch_replace_dialog(exarg_T *eap); void im_set_control(int enable); + void +gui_macvim_set_imstyle(long imstyle); void * gui_macvim_add_channel(channel_T *channel, ch_part_T part);