Merge pull request #731 from ychin/guioptions-k-2

Support guioptions 'k' flag in MacVim (2nd attempt)
This commit is contained in:
Josh Petrie
2018-09-14 07:13:02 -07:00
committed by GitHub
12 changed files with 136 additions and 27 deletions
+1
View File
@@ -105,6 +105,7 @@ extern NSTimeInterval MMBalloonEvalInternalDelay;
- (BOOL)tabBarVisible;
- (void)showTabBar:(BOOL)enable;
- (void)setRows:(int)rows columns:(int)cols;
- (void)resizeView;
- (void)setWindowTitle:(char *)title;
- (void)setDocumentFilename:(char *)filename;
- (char *)browseForFileWithAttributes:(NSDictionary *)attr;
+8
View File
@@ -836,6 +836,11 @@ extern GuiFont gui_mch_retain_font(GuiFont font);
[self queueMessage:SetTextDimensionsMsgID data:data];
}
- (void)resizeView
{
[self queueMessage:ResizeViewMsgID data:nil];
}
- (void)setWindowTitle:(char *)title
{
NSMutableData *data = [NSMutableData data];
@@ -1997,6 +2002,7 @@ extern GuiFont gui_mch_retain_font(GuiFont font);
tabpage_move(idx);
} else if (SetTextDimensionsMsgID == msgid || LiveResizeMsgID == msgid
|| SetTextDimensionsNoResizeWindowMsgID == msgid
|| SetTextRowsMsgID == msgid || SetTextColumnsMsgID == msgid) {
if (!data) return;
const void *bytes = [data bytes];
@@ -2028,6 +2034,8 @@ extern GuiFont gui_mch_retain_font(GuiFont font);
[self queueMessage:msgid data:d];
gui_resize_shell(cols, rows);
} else if (ResizeViewMsgID == msgid) {
[self queueMessage:msgid data:data];
} else if (ExecuteMenuMsgID == msgid) {
NSDictionary *attrs = [NSDictionary dictionaryWithData:data];
if (attrs) {
+6
View File
@@ -629,6 +629,7 @@ static BOOL isUnsafeMessage(int msgid);
[windowController showTabBar:NO];
[self sendMessage:BackingPropertiesChangedMsgID data:nil];
} else if (SetTextDimensionsMsgID == msgid || LiveResizeMsgID == msgid ||
SetTextDimensionsNoResizeWindowMsgID == msgid ||
SetTextDimensionsReplyMsgID == msgid) {
const void *bytes = [data bytes];
int rows = *((int*)bytes); bytes += sizeof(int);
@@ -638,11 +639,16 @@ static BOOL isUnsafeMessage(int msgid);
// acknowledges it with a reply message. When this happens the window
// should not move (the frontend would already have moved the window).
BOOL onScreen = SetTextDimensionsReplyMsgID!=msgid;
BOOL keepGUISize = SetTextDimensionsNoResizeWindowMsgID == msgid;
[windowController setTextDimensionsWithRows:rows
columns:cols
isLive:(LiveResizeMsgID==msgid)
keepGUISize:keepGUISize
keepOnScreen:onScreen];
} else if (ResizeViewMsgID == msgid) {
[windowController resizeView];
} else if (SetWindowTitleMsgID == msgid) {
const void *bytes = [data bytes];
int len = *((int*)bytes); bytes += sizeof(int);
+1
View File
@@ -55,6 +55,7 @@
- (void)viewWillStartLiveResize;
- (void)viewDidEndLiveResize;
- (void)setFrameSize:(NSSize)size;
- (void)setFrameSizeKeepGUISize:(NSSize)size;
- (void)setFrame:(NSRect)frame;
@end
+16 -5
View File
@@ -60,7 +60,7 @@ enum {
- (NSSize)vimViewSizeForTextViewSize:(NSSize)textViewSize;
- (NSRect)textViewRectForVimViewSize:(NSSize)contentSize;
- (NSTabView *)tabView;
- (void)frameSizeMayHaveChanged;
- (void)frameSizeMayHaveChanged:(BOOL)keepGUISize;
@end
@@ -610,14 +610,25 @@ enum {
// row will result in the vim view holding more rows than the can fit
// inside the window.)
[super setFrameSize:size];
[self frameSizeMayHaveChanged];
[self frameSizeMayHaveChanged:NO];
}
- (void)setFrameSizeKeepGUISize:(NSSize)size
{
// NOTE: Instead of only acting when a frame was resized, we do some
// updating each time a frame may be resized. (At the moment, if we only
// respond to actual frame changes then typing ":set lines=1000" twice in a
// row will result in the vim view holding more rows than the can fit
// inside the window.)
[super setFrameSize:size];
[self frameSizeMayHaveChanged:YES];
}
- (void)setFrame:(NSRect)frame
{
// See comment in setFrameSize: above.
[super setFrame:frame];
[self frameSizeMayHaveChanged];
[self frameSizeMayHaveChanged:NO];
}
@end // MMVimView
@@ -867,7 +878,7 @@ enum {
return tabView;
}
- (void)frameSizeMayHaveChanged
- (void)frameSizeMayHaveChanged:(BOOL)keepGUISize
{
// NOTE: Whenever a call is made that may have changed the frame size we
// take the opportunity to make sure all subviews are in place and that the
@@ -903,7 +914,7 @@ enum {
if (constrained[0] != rows || constrained[1] != cols) {
NSData *data = [NSData dataWithBytes:constrained length:2*sizeof(int)];
int msgid = [self inLiveResize] ? LiveResizeMsgID
: SetTextDimensionsMsgID;
: (keepGUISize ? SetTextDimensionsNoResizeWindowMsgID : SetTextDimensionsMsgID);
ASLogDebug(@"Notify Vim that text dimensions changed from %dx%d to "
"%dx%d (%s)", cols, rows, constrained[1], constrained[0],
+3
View File
@@ -24,6 +24,7 @@
BOOL setupDone;
BOOL windowPresented;
BOOL shouldResizeVimView;
BOOL shouldKeepGUISize;
BOOL shouldRestoreUserTopLeft;
BOOL shouldMaximizeWindow;
int updateToolbarFlag;
@@ -59,7 +60,9 @@
- (void)updateTabsWithData:(NSData *)data;
- (void)selectTabWithIndex:(int)idx;
- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols isLive:(BOOL)live
keepGUISize:(BOOL)keepGUISize
keepOnScreen:(BOOL)onScreen;
- (void)resizeView;
- (void)zoomWithRows:(int)rows columns:(int)cols state:(int)state;
- (void)setTitle:(NSString *)title;
- (void)setDocumentFilename:(NSString *)filename;
+73 -22
View File
@@ -174,7 +174,7 @@
[win setDelegate:self];
[win setInitialFirstResponder:[vimView textView]];
if ([win styleMask] & NSWindowStyleMaskTexturedBackground) {
// On Leopard, we want to have a textured window to have nice
// looking tabs. But the textured window look implies rounded
@@ -363,11 +363,9 @@
// HACK! This method moves a window to a new origin and to a different
// screen. This is primarily useful to avoid a scenario where such a move
// will trigger a resize, even though the frame didn't actually change size.
// This method should not be called unless the new origin is definitely on
// a different screen, otherwise the next legitimate resize message will
// be skipped.
resizingDueToMove = YES;
[[self window] setFrameTopLeftPoint:topLeft];
resizingDueToMove = NO;
}
- (void)updateTabsWithData:(NSData *)data
@@ -381,10 +379,12 @@
}
- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols isLive:(BOOL)live
keepGUISize:(BOOL)keepGUISize
keepOnScreen:(BOOL)onScreen
{
ASLogDebug(@"setTextDimensionsWithRows:%d columns:%d isLive:%d "
"keepOnScreen:%d", rows, cols, live, onScreen);
"keepGUISize:%d "
"keepOnScreen:%d", rows, cols, live, keepGUISize, onScreen);
// NOTE: The only place where the (rows,columns) of the vim view are
// modified is here and when entering/leaving full-screen. Setting these
@@ -399,7 +399,7 @@
[vimView setDesiredRows:rows columns:cols];
if (setupDone && !live) {
if (setupDone && !live && !keepGUISize) {
shouldResizeVimView = YES;
keepOnScreen = onScreen;
}
@@ -428,11 +428,21 @@
}
}
- (void)resizeView
{
if (setupDone)
{
shouldResizeVimView = YES;
shouldKeepGUISize = YES;
}
}
- (void)zoomWithRows:(int)rows columns:(int)cols state:(int)state
{
[self setTextDimensionsWithRows:rows
columns:cols
isLive:NO
keepGUISize:NO
keepOnScreen:YES];
// NOTE: If state==0 then the window should be put in the non-zoomed
@@ -503,9 +513,6 @@
- (BOOL)destroyScrollbarWithIdentifier:(int32_t)ident
{
BOOL scrollbarHidden = [vimView destroyScrollbarWithIdentifier:ident];
shouldResizeVimView = shouldResizeVimView || scrollbarHidden;
shouldMaximizeWindow = shouldMaximizeWindow || scrollbarHidden;
return scrollbarHidden;
}
@@ -513,9 +520,6 @@
{
BOOL scrollbarToggled = [vimView showScrollbarWithIdentifier:ident
state:visible];
shouldResizeVimView = shouldResizeVimView || scrollbarToggled;
shouldMaximizeWindow = shouldMaximizeWindow || scrollbarToggled;
return scrollbarToggled;
}
@@ -600,7 +604,18 @@
fullScreenWindow ? [fullScreenWindow frame].size :
fullScreenEnabled ? desiredWindowSize :
[self constrainContentSizeToScreenSize:[vimView desiredSize]]];
[vimView setFrameSize:contentSize];
// Setting 'guioptions+=k' will make shouldKeepGUISize true, which
// means avoid resizing the window. Instead, resize the view instead
// to keep the GUI window's size consistent.
bool avoidWindowResize = shouldKeepGUISize && !fullScreenEnabled;
if (!avoidWindowResize) {
[vimView setFrameSize:contentSize];
}
else {
[vimView setFrameSizeKeepGUISize:originalSize];
}
if (fullScreenWindow) {
// NOTE! Don't mark the full-screen content view as needing an
@@ -613,12 +628,15 @@
[fullScreenWindow centerView];
}
} else {
[self resizeWindowToFitContentSize:contentSize
keepOnScreen:keepOnScreen];
if (!avoidWindowResize) {
[self resizeWindowToFitContentSize:contentSize
keepOnScreen:keepOnScreen];
}
}
}
keepOnScreen = NO;
shouldKeepGUISize = NO;
}
}
@@ -644,6 +662,10 @@
// showing its hide animation every time a new window is opened. (See
// processInputQueueDidFinish for the reason why we need to delay toggling
// the toolbar when the window is visible.)
//
// Also, the delayed updateToolbar will have the correct shouldKeepGUISize
// set when it's called, which is important for that function to respect
// guioptions 'k'.
if (![decoratedWindow isVisible])
[self updateToolbar];
}
@@ -657,7 +679,6 @@
{
if (vimView && [vimView textView]) {
[[vimView textView] setLinespace:(float)linespace];
shouldMaximizeWindow = shouldResizeVimView = YES;
}
}
@@ -665,7 +686,6 @@
{
if (vimView && [vimView textView]) {
[[vimView textView] setColumnspace:(float)columnspace];
shouldMaximizeWindow = shouldResizeVimView = YES;
}
}
@@ -1039,7 +1059,14 @@
// may resize automatically) we simply set the view to fill the entire
// window. The vim view takes care of notifying Vim if the number of
// (rows,columns) changed.
[vimView setFrameSize:[self contentSize]];
if (shouldKeepGUISize) {
// This happens when code manually call setFrame: when we are performing
// an operation that wants to preserve GUI size (e.g. in updateToolbar:).
// Respect the wish, and pass that along.
[vimView setFrameSizeKeepGUISize:[self contentSize]];
} else {
[vimView setFrameSize:[self contentSize]];
}
}
- (void)windowDidChangeBackingProperties:(NSNotification *)notification
@@ -1187,7 +1214,7 @@
[[window animator] setAlphaValue:0];
} completionHandler:^{
[self maximizeWindow:fullScreenOptions];
// Fade in
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setDuration:0.5*duration];
@@ -1206,7 +1233,7 @@
// The separator should never be visible in fullscreen or split-screen.
[decoratedWindow hideTablineSeparator:YES];
// ASSUMPTION: fullScreenEnabled always reflects the state of Vim's 'fu'.
if (!fullScreenEnabled) {
ASLogDebug(@"Full-screen out of sync, tell Vim to set 'fu'");
@@ -1308,7 +1335,7 @@
// full-screen by moving the window out from Split View.
[vimController sendMessage:BackingPropertiesChangedMsgID data:nil];
}
[self updateTablineSeparator];
}
@@ -1536,7 +1563,6 @@
// The tabline separator was toggled so the content view must change
// size.
[self updateResizeConstraints];
shouldResizeVimView = YES;
}
}
@@ -1592,7 +1618,32 @@
// Positive flag shows toolbar, negative hides it.
BOOL on = updateToolbarFlag > 0 ? YES : NO;
NSRect origWindowFrame = [decoratedWindow frame];
BOOL origHasToolbar = decoratedWindow.toolbar != nil;
[decoratedWindow setToolbar:(on ? toolbar : nil)];
if (shouldKeepGUISize && !fullScreenEnabled && origHasToolbar != on) {
// "shouldKeepGUISize" means guioptions has 'k' in it, indicating that user doesn't
// want the window to resize itself. In non-fullscreen when we call setToolbar:
// Cocoa automatically resizes the window so we need to un-resize it back to
// original.
NSRect newWindowFrame = [decoratedWindow frame];
if (newWindowFrame.size.height == origWindowFrame.size.height) {
// This is an odd case here, where the window has not changed size at all.
// The addition/removal of toolbar should have changed its size. This means that
// there isn't enough space to grow the window on the screen. Usually we rely
// on windowDidResize: to call setFrameSizeKeepGUISize for us but now we have
// to do it manually in this special case.
[vimView setFrameSizeKeepGUISize:[self contentSize]];
}
else {
[decoratedWindow setFrame:origWindowFrame display:YES];
}
}
[self updateTablineSeparator];
updateToolbarFlag = 0;
+2
View File
@@ -179,8 +179,10 @@ enum {
SetTextRowsMsgID,
SetTextColumnsMsgID,
SetTextDimensionsMsgID,
SetTextDimensionsNoResizeWindowMsgID,
LiveResizeMsgID,
SetTextDimensionsReplyMsgID,
ResizeViewMsgID,
SetWindowTitleMsgID,
ScrollWheelMsgID,
MouseDownMsgID,
+2
View File
@@ -30,8 +30,10 @@ char *MessageStrings[] =
"SetTextRowsMsgID",
"SetTextColumnsMsgID",
"SetTextDimensionsMsgID",
"SetTextDimensionsNoResizeWindowMsgID",
"LiveResizeMsgID",
"SetTextDimensionsReplyMsgID",
"ResizeViewMsgID",
"SetWindowTitleMsgID",
"ScrollWheelMsgID",
"MouseDownMsgID",
+12
View File
@@ -1739,6 +1739,18 @@ gui_mch_set_shellsize(
}
/*
* Re-calculates size of the Vim view to fit within the window without having
* to resize the window. Usually happens after UI elements have changed (e.g.
* adding / removing a toolbar) when guioptions 'k' is set.
*/
void
gui_mch_resize_view()
{
[[MMBackend sharedInstance] resizeView];
}
/*
* Set the position of the top left corner of the window to the given
* coordinates.
+10
View File
@@ -1621,6 +1621,16 @@ gui_set_shellsize(
}
#endif
#ifdef FEAT_GUI_MACVIM
if (!mustset && (vim_strchr(p_go, GO_KEEPWINSIZE) != NULL))
{
/* We don't want to resize the window, so instruct the GUI to resize
* the view to be within the constraints of the current window's size */
gui_mch_resize_view();
return;
}
#endif
base_width = gui_get_base_width();
base_height = gui_get_base_height();
if (fit_to_display)
+2
View File
@@ -174,6 +174,8 @@ gui_mch_set_shellsize(
int base_height,
int direction);
void
gui_mch_resize_view();
void
gui_mch_set_sp_color(guicolor_T color);
void
gui_mch_set_text_area_pos(int x, int y, int w, int h);