Refactor MRU code

Only add to MRU in GUI mode and limit number of files added to the
maximum that Cocoa will display.
This commit is contained in:
Bjorn Winckler
2011-01-23 12:52:59 +01:00
parent 7bcc5932e0
commit f19b66ea39
6 changed files with 73 additions and 53 deletions
+1 -1
View File
@@ -162,7 +162,7 @@ extern NSTimeInterval MMBalloonEvalInternalDelay;
- (void)setLastToolTip:(NSString *)toolTip;
#endif
- (void)addToMRU:(NSString *)filename;
- (void)addToMRU:(NSArray *)filenames;
@end
+2 -2
View File
@@ -1712,10 +1712,10 @@ static void netbeansReadCallback(CFSocketRef s,
}
#endif
- (void)addToMRU:(NSString *)filename
- (void)addToMRU:(NSArray *)filenames
{
[self queueMessage:AddToMRUMsgID properties:
[NSDictionary dictionaryWithObject:filename forKey:@"filename"]];
[NSDictionary dictionaryWithObject:filenames forKey:@"filenames"]];
}
@end // MMBackend
+3 -3
View File
@@ -867,10 +867,10 @@ static BOOL isUnsafeMessage(int msgid);
[self setToolTipDelay:[delay floatValue]];
} else if (AddToMRUMsgID == msgid) {
NSDictionary *dict = [NSDictionary dictionaryWithData:data];
NSString *filename = dict ? [dict objectForKey:@"filename"] : nil;
if (filename)
NSArray *filenames = dict ? [dict objectForKey:@"filenames"] : nil;
if (filenames)
[[NSDocumentController sharedDocumentController]
noteNewRecentFilePath:filename];
noteNewRecentFilePaths:filenames];
// IMPORTANT: When adding a new message, make sure to update
// isUnsafeMessage() if necessary!
+58 -29
View File
@@ -24,6 +24,13 @@ int use_gui_macvim_draw_string = 1;
static int use_graphical_sign = 0;
// Max number of files to add to MRU in one go (this matches the maximum that
// Cocoa displays in the MRU -- if this changes in Cocoa then update this
// number as well).
static int MMMaxMRU = 10;
// Enabled when files passed on command line should not be added to MRU.
static BOOL MMNoMRU = NO;
static NSString *MMDefaultFontName = @"Menlo Regular";
static int MMDefaultFontSize = 11;
static int MMMinFontSize = 6;
@@ -87,28 +94,45 @@ macvim_early_init()
void
gui_mch_prepare(int *argc, char **argv)
{
int i;
for (i = 0; i < *argc; ++i) {
if (strncmp(argv[i], "--mmwaitforack", 14) == 0) {
[[MMBackend sharedInstance] setWaitForAck:YES];
--*argc;
if (*argc > i)
mch_memmove(&argv[i], &argv[i+1], (*argc-i) * sizeof(char*));
break;
}
}
// NOTE! Vim expects this method to remove args that it handles from the
// arg list but if the process then forks then these arguments will not
// reach the child process due to the way forking is handled on Mac OS X.
//
// Thus, only delete arguments that imply that no forking is done.
//
// If you add an argument that does not imply no forking, then do not
// delete it from the arg list. Such arguments must be ignored in main.c
// command_line_scan() or Vim will issue an error on startup when that
// argument is used.
int i = 0;
while (i < *argc) {
BOOL delarg = NO;
if (strncmp(argv[i], "--mmwaitforack", 14) == 0) {
// Implies -f (only called from front end)
[[MMBackend sharedInstance] setWaitForAck:YES];
delarg = YES;
}
#ifdef FEAT_NETBEANS_INTG
for (i = 0; i < *argc; ++i) {
if (strncmp(argv[i], "-nb", 3) == 0) {
else if (strncmp(argv[i], "-nb", 3) == 0) {
// TODO: Can this be used without -f? If so, should not del arg.
netbeansArg = argv[i];
delarg = YES;
}
#endif
else if (strncmp(argv[i], "--nomru", 7) == 0) {
// Can be used without -f, do not delete from arg list!
MMNoMRU = YES;
}
if (delarg) {
// NOTE: See comment above about when to delete arguments!
--*argc;
if (*argc > i)
mch_memmove(&argv[i], &argv[i+1], (*argc-i) * sizeof(char*));
break;
}
} else
++i;
}
#endif
}
@@ -208,6 +232,25 @@ gui_mch_init(void)
// in [g]vimrc.
gui_mch_adjust_charheight();
if (!MMNoMRU && GARGCOUNT > 0) {
// Add files passed on command line to MRU.
NSMutableArray *filenames = [NSMutableArray array];
int i, count = GARGCOUNT > MMMaxMRU ? MMMaxMRU : GARGCOUNT;
for (i = 0; i < count; ++i) {
char_u *fname = GARGLIST[i].ae_fname;
if (!fname) continue;
// Expand to a full file name (including the full path).
char_u *ffname = fix_fname(fname);
if (!ffname) continue;
[filenames addObject:[NSString stringWithVimString:ffname]];
vim_free(ffname);
}
[[MMBackend sharedInstance] addToMRU:filenames];
}
return OK;
}
@@ -2267,17 +2310,3 @@ gui_mch_post_balloon(beval, mesg)
}
#endif // FEAT_BEVAL
void
gui_macvim_add_to_mru(char_u *fname)
{
// Expand to a full file name (including the full path).
char_u *ffname = fix_fname(fname);
if (!ffname)
return;
NSString *s = [NSString stringWithVimString:ffname];
[[MMBackend sharedInstance] addToMRU:s];
vim_free(ffname);
}
+9 -16
View File
@@ -23,7 +23,7 @@
# include <limits.h>
#endif
#if FEAT_GUI_MACVIM
#ifdef FEAT_GUI_MACVIM
#include <objc/objc-runtime.h> /* for objc_*() and sel_*() */
#endif
@@ -173,7 +173,7 @@ main
int i;
#endif
#if FEAT_GUI_MACVIM
#ifdef FEAT_GUI_MACVIM
// Cocoa needs an NSAutoreleasePool in place or it will leak memory.
// This particular pool will hold autorelease objects created during
// initialization.
@@ -1001,7 +1001,7 @@ main
TIME_MSG("before starting main loop");
#if FEAT_GUI_MACVIM
#ifdef FEAT_GUI_MACVIM
// The autorelease pool might have filled up quite a bit during
// initialization, so purge it before entering the main loop.
objc_msgSend(autoreleasePool, sel_getUid("release"));
@@ -1024,7 +1024,7 @@ main
mzscheme_main();
#endif
#if FEAT_GUI_MACVIM
#ifdef FEAT_GUI_MACVIM
objc_msgSend(autoreleasePool, sel_getUid("release"));
#endif
@@ -1091,7 +1091,7 @@ main_loop(cmdwin, noexmode)
#endif
)
{
#if FEAT_GUI_MACVIM
#ifdef FEAT_GUI_MACVIM
// Cocoa needs an NSAutoreleasePool in place or it will leak memory.
// This particular pool gets released once every loop.
id autoreleasePool = objc_msgSend(objc_msgSend(
@@ -1328,7 +1328,7 @@ main_loop(cmdwin, noexmode)
else
normal_cmd(&oa, TRUE);
#if FEAT_GUI_MACVIM
#ifdef FEAT_GUI_MACVIM
// TODO! Make sure there are no continue statements that will cause
// this not to be called or MacVim will leak memory!
objc_msgSend(autoreleasePool, sel_getUid("release"));
@@ -1783,9 +1783,6 @@ command_line_scan(parmp)
int c;
char_u *p = NULL;
long n;
#ifdef FEAT_GUI_MACVIM
int nomru = FALSE;
#endif
--argc;
++argv;
@@ -1921,7 +1918,9 @@ command_line_scan(parmp)
#endif
#ifdef FEAT_GUI_MACVIM
else if (STRNICMP(argv[0] + argv_idx, "nomru", 5) == 0)
nomru = TRUE;
{
/* processed in gui_macvim.m, skip */
}
#endif
else
{
@@ -2449,12 +2448,6 @@ scripterror:
2 /* add buffer number now and use curbuf */
#endif
);
#ifdef FEAT_GUI_MACVIM
/* Add files opened from command line to the MRU (most recently
* used) files. */
if (!nomru)
gui_macvim_add_to_mru(p);
#endif
#if defined(FEAT_MBYTE) && defined(WIN32)
{
-2
View File
@@ -233,5 +233,3 @@ gui_mch_register_sign(char_u *signfile);
void
gui_mch_destroy_sign(void *sign);
void gui_macvim_add_to_mru(char_u *fname);