From fc698b39feb41f55cf53228c6ecb8310444c07c6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 15 Nov 2009 22:33:13 +0100 Subject: [PATCH] Add MMRenderer user default Set to 0 for Cocoa renderer, 1 for ATSUI, 2 for Core Text. The default is 0. --- src/MacVim/MMAppController.m | 22 ++++++++++++++++++++++ src/MacVim/MMVimView.m | 19 +++++++++++-------- src/MacVim/MacVim.h | 7 +++++++ src/MacVim/MacVim.m | 1 + src/MacVim/gui_macvim.m | 18 ++++++++++++++++-- src/gui.c | 11 ++++++++--- src/proto/gui_macvim.pro | 1 + 7 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index dd523aa947..e0895dd112 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -207,6 +207,7 @@ fsEventCallback(ConstFSEventStreamRef streamRef, [NSNumber numberWithBool:NO], MMNoFontSubstitutionKey, [NSNumber numberWithBool:YES], MMLoginShellKey, [NSNumber numberWithBool:NO], MMAtsuiRendererKey, + [NSNumber numberWithInt:0], MMRendererKey, [NSNumber numberWithInt:MMUntitledWindowAlways], MMUntitledWindowKey, [NSNumber numberWithBool:NO], MMTexturedWindowKey, @@ -1179,6 +1180,27 @@ fsEventCallback(ConstFSEventStreamRef streamRef, - (IBAction)atsuiButtonClicked:(id)sender { ASLogDebug(@"Toggle ATSUI renderer"); + NSInteger renderer = MMRendererDefault; + BOOL enable = ([sender state] == NSOnState); + + if (enable) { +#if MM_ENABLE_ATSUI + renderer = MMRendererATSUI; +#else + renderer = MMRendererCoreText; +#endif + } + + // Update the user default MMRenderer and synchronize the change so that + // any new Vim process will pick up on the changed setting. + CFPreferencesSetAppValue( + (CFStringRef)MMRendererKey, + (CFPropertyListRef)[NSNumber numberWithInt:renderer], + kCFPreferencesCurrentApplication); + CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); + + ASLogInfo(@"Use renderer=%d", renderer); + // This action is called when the user clicks the "use ATSUI renderer" // button in the advanced preferences pane. [self rebuildPreloadCache]; diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index 3a3643e483..429240a5b3 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -93,15 +93,18 @@ enum { [self setAutoresizesSubviews:YES]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - if ([ud boolForKey:MMAtsuiRendererKey]) { - // Use ATSUI or CoreText for text rendering. - // - // HACK! 'textView' has type MMTextView, but MM[Atsui|Core]TextView - // is not derived from MMTextView. -#if MM_ENABLE_ATSUI - textView = [[MMAtsuiTextView alloc] initWithFrame:frame]; -#else + NSInteger renderer = [ud integerForKey:MMRendererKey]; + ASLogInfo(@"Use renderer=%d", renderer); + + if (MMRendererCoreText == renderer) { + // HACK! 'textView' has type MMTextView, but MMCoreTextView is not + // derived from MMTextView. textView = [[MMCoreTextView alloc] initWithFrame:frame]; +#if MM_ENABLE_ATSUI + } else if (MMRendererATSUI == renderer) { + // HACK! 'textView' has type MMTextView, but MMAtsuiTextView is not + // derived from MMTextView. + textView = [[MMAtsuiTextView alloc] initWithFrame:frame]; #endif } else { // Use Cocoa text system for text rendering. diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 0c8762bccb..6448719098 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -247,6 +247,13 @@ extern NSString *MMNoWindowKey; extern NSString *MMAutosaveRowsKey; extern NSString *MMAutosaveColumnsKey; +extern NSString *MMRendererKey; + +enum { + MMRendererDefault = 0, + MMRendererATSUI, + MMRendererCoreText +}; // Vim pasteboard type (holds motion type + string) diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 4dc9646684..6adbd558ee 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -108,6 +108,7 @@ NSString *MMNoWindowKey = @"MMNoWindow"; NSString *MMAutosaveRowsKey = @"MMAutosaveRows"; NSString *MMAutosaveColumnsKey = @"MMAutosaveColumns"; +NSString *MMRendererKey = @"MMRenderer"; // Vim pasteboard type (holds motion type + string) NSString *VimPBoardType = @"VimPBoardType"; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 085835eedb..ed658206a8 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -19,6 +19,9 @@ #import +// HACK! Used in gui.c to determine which string drawing code to use. +int use_gui_macvim_draw_string = 1; + // NOTE: The default font is bundled with the application. static NSString *MMDefaultFontName = @"DejaVu Sans Mono"; @@ -131,6 +134,17 @@ gui_macvim_after_fork_init() gui.num_rows = rows; gui.num_cols = cols; } + + // Check which code path to take for string drawing. + CFIndex val; + Boolean keyValid; + val = CFPreferencesGetAppIntegerValue((CFStringRef)MMRendererKey, + kCFPreferencesCurrentApplication, + &keyValid); + if (keyValid) { + ASLogInfo(@"Use renderer=%d", val); + use_gui_macvim_draw_string = (val != MMRendererCoreText); + } } @@ -415,7 +429,7 @@ gui_macvim_draw_string(int row, int col, char_u *s, int len, int flags) if (!utf_iscomposing(c)) { if ((cn > 1 && !wide) || (cn <= 1 && wide)) { // Changed from normal to wide or vice versa. - [backend drawString:(char*)(s+start) length:i-start + [backend drawString:(s+start) length:i-start row:row column:startcol cells:endcol-startcol flags:(wide ? flags|DRAW_WIDE : flags)]; @@ -430,7 +444,7 @@ gui_macvim_draw_string(int row, int col, char_u *s, int len, int flags) } // Output remaining characters. - [backend drawString:(char*)(s+start) length:len-start + [backend drawString:(s+start) length:len-start row:row column:startcol cells:endcol-startcol flags:(wide ? flags|DRAW_WIDE : flags)]; diff --git a/src/gui.c b/src/gui.c index 7313d92a35..c79350f8f0 100644 --- a/src/gui.c +++ b/src/gui.c @@ -2237,11 +2237,16 @@ gui_outstr_nowrap(s, len, flags, fg, bg, back) #ifdef HAVE_GTK2 /* The value returned is the length in display cells */ len = gui_gtk2_draw_string(gui.row, col, s, len, draw_flags); -#elif 0 /* defined(FEAT_GUI_MACVIM) && defined(FEAT_MBYTE) */ - /* The value returned is the length in display cells */ - len = gui_macvim_draw_string(gui.row, col, s, len, draw_flags); #else # ifdef FEAT_MBYTE +# ifdef FEAT_GUI_MACVIM + if (use_gui_macvim_draw_string) + { + /* The value returned is the length in display cells */ + len = gui_macvim_draw_string(gui.row, col, s, len, draw_flags); + } + else +# endif if (enc_utf8) { int start; /* index of bytes to be drawn */ diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro index 4179c6e6ad..a8947ae103 100644 --- a/src/proto/gui_macvim.pro +++ b/src/proto/gui_macvim.pro @@ -1,3 +1,4 @@ +extern int use_gui_macvim_draw_string; void macvim_early_init();