mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-06-07 15:37:14 +02:00
Merge pull request #731 from ychin/guioptions-k-2
Support guioptions 'k' flag in MacVim (2nd attempt)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
- (void)viewWillStartLiveResize;
|
||||
- (void)viewDidEndLiveResize;
|
||||
- (void)setFrameSize:(NSSize)size;
|
||||
- (void)setFrameSizeKeepGUISize:(NSSize)size;
|
||||
- (void)setFrame:(NSRect)frame;
|
||||
|
||||
@end
|
||||
|
||||
+16
-5
@@ -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],
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -179,8 +179,10 @@ enum {
|
||||
SetTextRowsMsgID,
|
||||
SetTextColumnsMsgID,
|
||||
SetTextDimensionsMsgID,
|
||||
SetTextDimensionsNoResizeWindowMsgID,
|
||||
LiveResizeMsgID,
|
||||
SetTextDimensionsReplyMsgID,
|
||||
ResizeViewMsgID,
|
||||
SetWindowTitleMsgID,
|
||||
ScrollWheelMsgID,
|
||||
MouseDownMsgID,
|
||||
|
||||
@@ -30,8 +30,10 @@ char *MessageStrings[] =
|
||||
"SetTextRowsMsgID",
|
||||
"SetTextColumnsMsgID",
|
||||
"SetTextDimensionsMsgID",
|
||||
"SetTextDimensionsNoResizeWindowMsgID",
|
||||
"LiveResizeMsgID",
|
||||
"SetTextDimensionsReplyMsgID",
|
||||
"ResizeViewMsgID",
|
||||
"SetWindowTitleMsgID",
|
||||
"ScrollWheelMsgID",
|
||||
"MouseDownMsgID",
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user