From 186c34883d82cce5cfe08565b2a37e337ab02213 Mon Sep 17 00:00:00 2001 From: Ryan Hendrickson Date: Wed, 8 Jul 2015 18:08:02 -0400 Subject: [PATCH 1/7] Add optional blur to transparent windows The actual blur code is taken from the iTerm2 project. (cherry picked from commit 9e2a5437a01f7ecce816af3c188216c8124c3e55) --- runtime/doc/gui_mac.txt | 5 +- runtime/doc/options.txt | 8 + runtime/doc/quickref.txt | 1 + runtime/doc/tags | 2 + runtime/optwin.vim | 2 + src/MacVim/CGSInternal/CGSConnection.h | 90 ++++++++++++ src/MacVim/CGSInternal/CGSRegion.h | 110 ++++++++++++++ src/MacVim/CGSInternal/CGSWindow.h | 196 +++++++++++++++++++++++++ src/MacVim/CGSInternal/Compatability.h | 21 +++ src/MacVim/CGSInternal/README.txt | 4 + src/MacVim/MMBackend.h | 4 + src/MacVim/MMBackend.m | 12 ++ src/MacVim/MMVimController.m | 4 + src/MacVim/MMWindow.h | 1 + src/MacVim/MMWindow.m | 44 ++++++ src/MacVim/MMWindowController.h | 2 + src/MacVim/MMWindowController.m | 10 ++ src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + src/MacVim/gui_macvim.m | 10 ++ src/option.c | 20 +++ src/option.h | 1 + src/proto/gui_macvim.pro | 4 + 23 files changed, 551 insertions(+), 2 deletions(-) create mode 100644 src/MacVim/CGSInternal/CGSConnection.h create mode 100644 src/MacVim/CGSInternal/CGSRegion.h create mode 100644 src/MacVim/CGSInternal/CGSWindow.h create mode 100644 src/MacVim/CGSInternal/Compatability.h create mode 100644 src/MacVim/CGSInternal/README.txt diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 769fca9766..a3d3ea729c 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -110,8 +110,9 @@ to your .gvimrc file to revert back to the default Vim tab label. *macvim-options* These are the non-standard options that MacVim supports: - 'antialias' 'fullscreen' 'fuoptions' - 'macmeta' 'toolbariconsize' 'transparency' + 'antialias' 'blurradius' 'fullscreen' + 'fuoptions' 'macmeta' 'toolbariconsize' + 'transparency' *macvim-commands* These are the non-standard commands that MacVim supports: diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 239319e424..0bb4ae61f5 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1169,6 +1169,14 @@ A jump table for the options with a short description can be found at |Q_op|. terminal over a serial port reset this option. Also see |'conskey'|. + *'blurradius'* *'blur'* +'blurradius' 'blur' number (default 0) + global + {not in Vi} + {only in MacVim GUI} + When 'transparency' is in effect, a positive value adds a blur effect + to the window background. + *'bomb'* *'nobomb'* 'bomb' boolean (default off) local to buffer diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt index 1482591dd8..74350d051b 100644 --- a/runtime/doc/quickref.txt +++ b/runtime/doc/quickref.txt @@ -622,6 +622,7 @@ Short explanation of each option: *option-list* 'balloonexpr' 'bexpr' expression to show in balloon 'binary' 'bin' read/write/edit file in binary mode 'bioskey' 'biosk' MS-DOS: use bios calls for input characters +'blurradius' 'blur' transparency blur of the GUI window (MacVim only) 'bomb' prepend a Byte Order Mark to the file 'breakat' 'brk' characters that may cause a line break 'breakindent' 'bri' wrapped line repeats indent diff --git a/runtime/doc/tags b/runtime/doc/tags index d1f42a7961..91ccf21031 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -89,6 +89,8 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME* 'bk' options.txt /*'bk'* 'bkc' options.txt /*'bkc'* 'bl' options.txt /*'bl'* +'blur' options.txt /*'blur'* +'blurradius' options.txt /*'blurradius'* 'bomb' options.txt /*'bomb'* 'breakat' options.txt /*'breakat'* 'breakindent' options.txt /*'breakindent'* diff --git a/runtime/optwin.vim b/runtime/optwin.vim index cda6bb3a54..d9f174189c 100644 --- a/runtime/optwin.vim +++ b/runtime/optwin.vim @@ -645,6 +645,8 @@ if has("gui") if has("gui_macvim") call append("$", "transparency\ttransparency of the text background as a percent") call append("$", " \tset transparency=" . &transp) + call append("$", "blurradius\tblur effect of the transparent background") + call append("$", " \tset blurradius=" . &blur) call append("$", "fullscreen\tdisplay vim in fullscreen mode") call BinOptionG("fullscreen", &fullscreen) call append("$", "fuoptions\tcontrol how fullscreen mode should behave") diff --git a/src/MacVim/CGSInternal/CGSConnection.h b/src/MacVim/CGSInternal/CGSConnection.h new file mode 100644 index 0000000000..8e30d78c21 --- /dev/null +++ b/src/MacVim/CGSInternal/CGSConnection.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2007-2008 Alacatia Labs + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Joe Ranieri joe@alacatia.com + * + */ + +#pragma once + +#include "Compatability.h" + +typedef int CGSConnectionID; +static const CGSConnectionID kCGSNullConnectionID = 0; + + +CG_EXTERN_C_BEGIN + +/*! DOCUMENTATION PENDING - verify this is Leopard only! */ +CG_EXTERN CGError CGSSetLoginwindowConnection(CGSConnectionID cid) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; +CG_EXTERN CGError CGSSetLoginwindowConnectionWithOptions(CGSConnectionID cid, CFDictionaryRef options) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; + +/*! Enables or disables updates on a connection. The WindowServer will forcibly reenable updates after 1 second. */ +CG_EXTERN CGError CGSDisableUpdate(CGSConnectionID cid); +CG_EXTERN CGError CGSReenableUpdate(CGSConnectionID cid); + +/*! Is there a menubar associated with this connection? */ +CG_EXTERN bool CGSMenuBarExists(CGSConnectionID cid); + + + +#pragma mark notifications +/*! Registers or removes a function to get notified when a connection is created. Only gets notified for connections created in the current application. */ +typedef void (*CGSNewConnectionNotificationProc)(CGSConnectionID cid); +CG_EXTERN CGError CGSRegisterForNewConnectionNotification(CGSNewConnectionNotificationProc proc); +CG_EXTERN CGError CGSRemoveNewConnectionNotification(CGSNewConnectionNotificationProc proc); + +/*! Registers or removes a function to get notified when a connection is released. Only gets notified for connections created in the current application. */ +typedef void (*CGSConnectionDeathNotificationProc)(CGSConnectionID cid); +CG_EXTERN CGError CGSRegisterForConnectionDeathNotification(CGSConnectionDeathNotificationProc proc); +CG_EXTERN CGError CGSRemoveConnectionDeathNotification(CGSConnectionDeathNotificationProc proc); + +/*! Creates a new connection to the window server. */ +CG_EXTERN CGError CGSNewConnection(int unused, CGSConnectionID *outConnection); + +/*! Releases a CGSConnection and all CGSWindows owned by it. */ +CG_EXTERN CGError CGSReleaseConnection(CGSConnectionID cid); + +/*! Gets the default connection for this process. `CGSMainConnectionID` is just a more modern name. */ +CG_EXTERN CGSConnectionID _CGSDefaultConnection(void); +CG_EXTERN CGSConnectionID CGSMainConnectionID(void); + +/*! Gets the default connection for the current thread. */ +CG_EXTERN CGSConnectionID CGSDefaultConnectionForThread(void); + +/* Gets the `pid` that owns this CGSConnection. */ +CG_EXTERN CGError CGSConnectionGetPID(CGSConnectionID cid, pid_t *outPID); + +/*! Gets the CGSConnection for the PSN. */ +CG_EXTERN CGError CGSGetConnectionIDForPSN(CGSConnectionID cid, const ProcessSerialNumber *psn, CGSConnectionID *outOwnerCID); + +/*! Gets and sets a connection's property. */ +CG_EXTERN CGError CGSGetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef *outValue); +CG_EXTERN CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value); + +/*! Closes ALL connections used by the current application. Essentially, it turns it into a console application. */ +CG_EXTERN CGError CGSShutdownServerConnections(void); + +/*! Only the owner of a window can manipulate it. So, Apple has the concept of a universal owner that owns all windows and can manipulate them all. There can only be one universal owner at a time (the Dock). */ +CG_EXTERN CGError CGSSetUniversalOwner(CGSConnectionID cid); + +/*! Sets a connection to be a universal owner. This call requires `cid` be a universal connection. */ +CG_EXTERN CGError CGSSetOtherUniversalConnection(CGSConnectionID cid, CGSConnectionID otherConnection); + +CG_EXTERN_C_END diff --git a/src/MacVim/CGSInternal/CGSRegion.h b/src/MacVim/CGSInternal/CGSRegion.h new file mode 100644 index 0000000000..b275c4da0b --- /dev/null +++ b/src/MacVim/CGSInternal/CGSRegion.h @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2007-2008 Alacatia Labs + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Joe Ranieri joe@alacatia.com + * + */ + +#pragma once + +#pragma mark types +#if MAC_OS_X_VERSION_10_5 <= MAC_OS_X_VERSION_MAX_ALLOWED + // on Leopard and up these are CFTypes + typedef CFTypeRef CGSRegionObj; + typedef CFTypeRef CGSRegionEnumeratorObj; +#else + // but opaque types under 10.4 + typedef int CGSRegionObj; + typedef int CGSRegionEnumeratorObj; +#endif + +CG_EXTERN_C_BEGIN + +/*! Creates a region from a `CGRect`. */ +CG_EXTERN CGError CGSNewRegionWithRect(const CGRect *rect, CGSRegionObj *outRegion); + +/*! Creates a region from a list of `CGRect`s. */ +CG_EXTERN CGError CGSNewRegionWithRectList(const CGRect *rects, int rectCount, CGSRegionObj *outRegion); + +/*! Creates a new region from a QuickDraw region. */ +CG_EXTERN CGError CGSNewRegionWithQDRgn(RgnHandle region, CGSRegionObj *outRegion); + +/*! Creates an empty region. */ +CG_EXTERN CGError CGSNewEmptyRegion(CGSRegionObj *outRegion); + +/*! Releases a region. */ +CG_EXTERN CGError CGSReleaseRegion(CGSRegionObj region); + +/*! Creates a `CGRect` from a region. */ +CG_EXTERN CGError CGSGetRegionBounds(CGSRegionObj region, CGRect *outRect); + +/*! Determines if two regions are equal. */ +CG_EXTERN bool CGSRegionsEqual(CGSRegionObj region1, CGSRegionObj region2); + +/* Created a new region by changing the origin an existing one. */ +CG_EXTERN CGError CGSOffsetRegion(CGSRegionObj region, float offsetLeft, float offsetTop, CGSRegionObj *outRegion); + +/*! Creates a new region by copying an existing one. */ +CG_EXTERN CGError CGSCopyRegion(CGSRegionObj region, CGSRegionObj *outRegion); + +/*! Creates a new region by combining two regions together. */ +CG_EXTERN CGError CGSUnionRegion(CGSRegionObj region1, CGSRegionObj region2, CGSRegionObj *outRegion); + +/*! Creates a new region by combining a region and a rect. */ +CG_EXTERN CGError CGSUnionRegionWithRect(CGSRegionObj region, CGRect *rect, CGSRegionObj *outRegion); + +/*! Creates a region by XORing two regions together. */ +CG_EXTERN CGError CGSXorRegion(CGSRegionObj region1, CGSRegionObj region2, CGSRegionObj *outRegion); + +/*! Determines if the region is empty. */ +CG_EXTERN bool CGSRegionIsEmpty(CGSRegionObj region); + +/*! Determines if the region is rectangular. */ +CG_EXTERN bool CGSRegionIsRectangular(CGSRegionObj region); + +/*! Determines if a point in a region. */ +CG_EXTERN bool CGSPointInRegion(CGSRegionObj region, const CGPoint *point); + +/*! Determines if a rect is in a region. */ +CG_EXTERN bool CGSRectInRegion(CGSRegionObj region, const CGRect *rect); + +/*! Determines if a region is inside of a region. */ +CG_EXTERN bool CGSRegionInRegion(CGSRegionObj region1, CGSRegionObj region2); + +/*! Determines if a rect intersects a region. */ +CG_EXTERN bool CGSRegionIntersectsRect(CGSRegionObj obj, const CGRect *rect); + +/*! Determines if a region intersects a region. */ +CG_EXTERN bool CGSRegionIntersectsRegion(CGSRegionObj region1, CGSRegionObj region2); + +/*! Creates a rect from the difference of two regions. */ +CG_EXTERN CGError CGSDiffRegion(CGSRegionObj region1, CGSRegionObj region2, CGSRegionObj *outRegion); + + +#pragma mark region enumerators +/*! Gets the enumerator for a region. */ +CG_EXTERN CGSRegionEnumeratorObj CGSRegionEnumerator(CGSRegionObj region); + +/*! Releases a region enumerator. */ +CG_EXTERN void CGSReleaseRegionEnumerator(CGSRegionEnumeratorObj enumerator); + +/*! Gets the next rect of a region. */ +CG_EXTERN CGRect* CGSNextRect(CGSRegionEnumeratorObj enumerator); + +CG_EXTERN_C_END diff --git a/src/MacVim/CGSInternal/CGSWindow.h b/src/MacVim/CGSInternal/CGSWindow.h new file mode 100644 index 0000000000..cc72e0b0ff --- /dev/null +++ b/src/MacVim/CGSInternal/CGSWindow.h @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2007-2008 Alacatia Labs + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Joe Ranieri joe@alacatia.com + * + */ + +#pragma once +#include "CGSConnection.h" +#include "CGSRegion.h" + +typedef int CGSWindowID; +typedef int CGSAnimationObj; +typedef struct { CGPoint localPoint; CGPoint globalPoint; } CGSWarpPoint; + +typedef enum { + kCGSSharingNone, + kCGSSharingReadOnly, + kCGSSharingReadWrite +} CGSSharingState; + +typedef enum { + kCGSOrderBelow = -1, + kCGSOrderOut, /* hides the window */ + kCGSOrderAbove, + kCGSOrderIn /* shows the window */ +} CGSWindowOrderingMode; + +typedef enum { + kCGSBackingNonRetianed, + kCGSBackingRetained, + kCGSBackingBuffered, +} CGSBackingType; + + +CG_EXTERN_C_BEGIN + +/*! Switches to the next (or previous) window in the global list. */ +CG_EXTERN CGError CGSCycleWindows(CGSConnectionID cid, CGSWindowOrderingMode order); + +/*! Gets and sets the desktop window. Not sure what happens if more than one process sets the desktop window. */ +CG_EXTERN CGError CGSDesktopWindow(CGSConnectionID cid, CGSWindowID *outWID); +CG_EXTERN CGError CGSSetDesktopWindow(CGSConnectionID cid, CGSWindowID wid); + +/*! Sets the window's title. Internally this simply calls `CGSSetWindowProperty(cid, wid, kCGSWindowTitle, title)`. */ +CG_EXTERN CGError CGSSetWindowTitle(CGSConnectionID cid, CGSWindowID wid, CFStringRef title); + +/*! Gets and sets a property for a window. */ +CG_EXTERN CGError CGSGetWindowProperty(CGSConnectionID cid, CGSWindowID wid, CFStringRef key, CFTypeRef *outValue); +CG_EXTERN CGError CGSSetWindowProperty(CGSConnectionID cid, CGSWindowID wid, CFStringRef key, CFTypeRef value); + +/*! Gets and sets the window's transparency. */ +CG_EXTERN CGError CGSGetWindowAlpha(CGSConnectionID cid, CGSWindowID wid, float *outAlpha); +CG_EXTERN CGError CGSSetWindowAlpha(CGSConnectionID cid, CGSWindowID wid, float alpha); + +/*! Sets the alpha of a group of windows over a period of time. Note that `duration` is in seconds. */ +CG_EXTERN CGError CGSSetWindowListAlpha(CGSConnectionID cid, const CGSWindowID *widList, int widCount, float alpha, float duration); + +/*! Gets and sets the `CGConnectionID` that owns this window. Only the owner can change most properties of the window. */ +CG_EXTERN CGError CGSGetWindowOwner(CGSConnectionID cid, CGSWindowID wid, CGSConnectionID *outOwner); +CG_EXTERN CGError CGSSetWindowOwner(CGSConnectionID cid, CGSWindowID wid, CGSConnectionID owner); + +/*! Sets the background color of the window. */ +CG_EXTERN CGError CGSSetWindowAutofillColor(CGSConnectionID cid, CGSWindowID wid, float red, float green, float blue); + +/*! Locks a window to the cursor, so that whenever the cursor moves, the window moves with it. There doesn't seem to be a way to unlock the window from the cursor. */ +CG_EXTERN CGError CGSLockWindowToCursor(CGSConnectionID cid, CGSWindowID wid, float offsetLeft, float offsetTop); + +/*! Sets the warp for the window. The mesh maps a local (window) point to a point on screen. */ +CG_EXTERN CGError CGSSetWindowWarp(CGSConnectionID cid, CGSWindowID wid, int warpWidth, int warpHeight, const CGSWarpPoint *warp); + +/*! Gets or sets whether the window server should auto-fill the window's background. */ +CG_EXTERN CGError CGSGetWindowAutofill(CGSConnectionID cid, CGSWindowID wid, bool *outShouldAutoFill); +CG_EXTERN CGError CGSSetWindowAutofill(CGSConnectionID cid, CGSWindowID wid, bool shouldAutoFill); + +/*! Gets the screen rect for a window. */ +CG_EXTERN CGError CGSGetScreenRectForWindow(CGSConnectionID cid, CGSWindowID wid, CGRect *outRect); + +/*! Gets and sets the window level for a window. */ +CG_EXTERN CGError CGSGetWindowLevel(CGSConnectionID cid, CGSWindowID wid, CGWindowLevel *outLevel); +CG_EXTERN CGError CGSSetWindowLevel(CGSConnectionID cid, CGSWindowID wid, CGWindowLevel level); + +/*! Gets and sets the sharing state. This determines the level of access other applications have over this window. */ +CG_EXTERN CGError CGSGetWindowSharingState(CGSConnectionID cid, CGSWindowID wid, CGSSharingState *outState); +CG_EXTERN CGError CGSSetWindowSharingState(CGSConnectionID cid, CGSWindowID wid, CGSSharingState state); + +/*! Sets whether this window is ignored in the global window cycle (Control-F4 by default). There is no Get version? */ +CG_EXTERN CGError CGSSetIgnoresCycle(CGSConnectionID cid, CGSWindowID wid, bool ignoresCycle); + +/*! Creates a graphics context for the window. */ +CG_EXTERN CGContextRef CGWindowContextCreate(CGSConnectionID cid, CGSWindowID wid, int unknown); + +/*! Sets the order of a window */ +CG_EXTERN CGError CGSOrderWindow(CGSConnectionID cid, CGSWindowID wid, CGSWindowOrderingMode mode, CGSWindowID relativeToWID); + +/*! Sets the origin (top-left) of a window */ +CG_EXTERN CGError CGSMoveWindow(CGSConnectionID cid, CGSWindowID wid, const CGPoint *origin); + +/*! Sets the origin (top-left) of a window relative to another window's origin. */ +CG_EXTERN CGError CGSSetWindowOriginRelativeToWindow(CGSConnectionID cid, CGSWindowID wid, CGSWindowID relativeToWID, float offsetX, float offsetY); + +/* Flushes a window's buffer to the screen. */ +CG_EXTERN CGError CGSFlushWindow(CGSConnectionID cid, CGSWindowID wid, CGSRegionObj flushRegion); + + +#pragma mark shadows +/*! Gets and sets the shadow information for a window. Values for `flags` are unknown. */ +CG_EXTERN CGError CGSSetWindowShadowAndRimParameters(CGSConnectionID cid, CGSWindowID wid, float standardDeviation, float density, int offsetX, int offsetY, int flags); +CG_EXTERN CGError CGSGetWindowShadowAndRimParameters(CGSConnectionID cid, CGSWindowID wid, float *outStandardDeviation, float *outDensity, int *outOffsetX, int *outOffsetY, int *outFlags); + +/*! Sets the shadow information for a window. Simply calls through to `CGSSetWindowShadowAndRimParameters` passing 1 for `flags`. */ +CG_EXTERN CGError CGSSetWindowShadowParameters(CGSConnectionID cid, CGSWindowID wid, float standardDeviation, float density, int offsetX, int offsetY); + +/*! Invalidates a window's shadow. */ +CG_EXTERN CGError CGSInvalidateWindowShadow(CGSConnectionID cid, CGSWindowID wid); + + +#pragma mark window lists +/*! Gets the number of windows the `targetCID` owns. */ +CG_EXTERN CGError CGSGetWindowCount(CGSConnectionID cid, CGSConnectionID targetCID, int *outCount); + +/*! Gets a list of windows owned by `targetCID`. */ +CG_EXTERN CGError CGSGetWindowList(CGSConnectionID cid, CGSConnectionID targetCID, int count, CGSWindowID *list, int *outCount); + +/*! Gets the number of windows owned by `targetCID` that are on screen. */ +CG_EXTERN CGError CGSGetOnScreenWindowCount(CGSConnectionID cid, CGSConnectionID targetCID, int *outCount); + +/*! Gets a list of windows oned by `targetCID` that are on screen. */ +CG_EXTERN CGError CGSGetOnScreenWindowList(CGSConnectionID cid, CGSConnectionID targetCID, int count, CGSWindowID *list, int *outCount); + + +#pragma mark window management +/*! Creates a new CGSWindow. The real window top/left is the sum of the region's top/left and the top/left parameters. */ +CG_EXTERN CGError CGSNewWindow(CGSConnectionID cid, CGSBackingType backingType, float left, float top, CGSRegionObj region, CGSWindowID *outWID); + +/*! Creates a new CGSWindow. The real window top/left is the sum of the region's top/left and the top/left parameters. */ +CG_EXTERN CGError CGSNewWindowWithOpaqueShape(CGSConnectionID cid, CGSBackingType backingType, float left, float top, CGSRegionObj region, CGSRegionObj opaqueShape, int unknown, const int *tags, int tagSize, CGSWindowID *outWID); + +/*! Releases a CGSWindow. */ +CG_EXTERN CGError CGSReleaseWindow(CGSConnectionID cid, CGSWindowID wid); + + +#pragma mark animations +/*! Creates a Dock-style genie animation that goes from `wid` to `destinationWID`. */ +CG_EXTERN CGError CGSCreateGenieWindowAnimation(CGSConnectionID cid, CGSWindowID wid, CGSWindowID destinationWID, CGSAnimationObj *outAnimation); + +/*! Creates a sheet animation that's used when the parent window is brushed metal. Oddly enough, seems to be the only one used, even if the parent window isn't metal. */ +CG_EXTERN CGError CGSCreateMetalSheetWindowAnimationWithParent(CGSConnectionID cid, CGSWindowID wid, CGSWindowID parentWID, CGSAnimationObj *outAnimation); + +/*! Sets the progress of an animation. */ +CG_EXTERN CGError CGSSetWindowAnimationProgress(CGSAnimationObj animation, float progress); + +/*! DOCUMENTATION PENDING */ +CG_EXTERN CGError CGSWindowAnimationChangeLevel(CGSAnimationObj animation, CGWindowLevel level); + +/*! DOCUMENTATION PENDING */ +CG_EXTERN CGError CGSWindowAnimationSetParent(CGSAnimationObj animation, CGSWindowID parent) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; + +/*! Releases a window animation. */ +CG_EXTERN CGError CGSReleaseWindowAnimation(CGSAnimationObj animation); + + +#pragma mark window accelleration +/*! Gets the state of accelleration for the window. */ +CG_EXTERN CGError CGSWindowIsAccelerated(CGSConnectionID cid, CGSWindowID wid, bool *outIsAccelerated); + +/*! Gets and sets if this window can be accellerated. I don't know if playing with this is safe. */ +CG_EXTERN CGError CGSWindowCanAccelerate(CGSConnectionID cid, CGSWindowID wid, bool *outCanAccelerate); +CG_EXTERN CGError CGSWindowSetCanAccelerate(CGSConnectionID cid, CGSWindowID wid, bool canAccelerate); + + +#pragma mark system status items +/*! Registers or unregisters a window as a global status item (see `NSStatusItem`, `NSMenuExtra`). Once a window is registered, the window server takes care of placing it in the apropriate location. */ +CG_EXTERN CGError CGSRegisterWindowWithSystemStatusBar(CGSConnectionID cid, CGSWindowID wid, int priority); +CG_EXTERN CGError CGSUnregisterWindowWithSystemStatusBar(CGSConnectionID cid, CGSWindowID wid); + +/*! Rearranges items in the system status bar. You should call this after registering or unregistering a status item or changing the window's width. */ +CG_EXTERN CGError CGSAdjustSystemStatusBarWindows(CGSConnectionID cid); + +CG_EXTERN_C_END diff --git a/src/MacVim/CGSInternal/Compatability.h b/src/MacVim/CGSInternal/Compatability.h new file mode 100644 index 0000000000..4912d5297a --- /dev/null +++ b/src/MacVim/CGSInternal/Compatability.h @@ -0,0 +1,21 @@ +/* + * Compatability.h + * iTerm + * + * Created by Marc on 10.08.10. + * Copyright 2010 Marc Haisenko. All rights reserved. + * + */ + +#pragma once + +#include + +#ifndef CG_EXTERN_C_BEGIN +#define CG_EXTERN_C_BEGIN +#define CG_EXTERN_C_END +#endif + +#ifndef CG_EXTERN +#define CG_EXTERN +#endif diff --git a/src/MacVim/CGSInternal/README.txt b/src/MacVim/CGSInternal/README.txt new file mode 100644 index 0000000000..34be3e1bab --- /dev/null +++ b/src/MacVim/CGSInternal/README.txt @@ -0,0 +1,4 @@ +These header files were originally taken from the iTerm2 project at +https://github.com/gnachman/iTerm2/tree/dff7c9faec90daa7f1974a57bb43d1c2d383892e/ThirdParty/CGSInternal + +iTerm2 is licensed under the GPL version 2. diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index ee631237d7..d1de31b424 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -137,6 +137,10 @@ extern NSTimeInterval MMBalloonEvalInternalDelay; - (void)setAntialias:(BOOL)antialias; +#ifdef FEAT_TRANSPARENCY +- (void)setBlurRadius:(int)radius; +#endif + - (void)updateModifiedFlag; - (void)registerServerWithName:(NSString *)name; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 7a4cded10f..81f0fedf8d 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1180,6 +1180,18 @@ extern GuiFont gui_mch_retain_font(GuiFont font); [self queueMessage:msgid data:nil]; } +#ifdef FEAT_TRANSPARENCY + +- (void)setBlurRadius:(int)radius +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&radius length:sizeof(int)]; + + [self queueMessage:SetBlurRadiusMsgID data:data]; +} + +#endif + - (void)updateModifiedFlag { int state = [self checkForModifiedBuffers]; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 3094e4bccb..324bab7c85 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -876,6 +876,10 @@ static BOOL isUnsafeMessage(int msgid); if (filenames) [[NSDocumentController sharedDocumentController] noteNewRecentFilePaths:filenames]; + } else if (SetBlurRadiusMsgID == msgid) { + const void *bytes = [data bytes]; + int radius = *((int*)bytes); + [windowController setBlurRadius:radius]; // IMPORTANT: When adding a new message, make sure to update // isUnsafeMessage() if necessary! diff --git a/src/MacVim/MMWindow.h b/src/MacVim/MMWindow.h index 385a40ea33..9eb7be1cba 100644 --- a/src/MacVim/MMWindow.h +++ b/src/MacVim/MMWindow.h @@ -28,6 +28,7 @@ - (void)setContentMinSize:(NSSize)size; - (void)setContentMaxSize:(NSSize)size; - (void)setContentSize:(NSSize)size; +- (void)setBlurRadius:(int)radius; - (IBAction)toggleFullScreen:(id)sender; - (IBAction)realToggleFullScreen:(id)sender; diff --git a/src/MacVim/MMWindow.m b/src/MacVim/MMWindow.m index 1440f0a8fd..7dc42cf3b5 100644 --- a/src/MacVim/MMWindow.m +++ b/src/MacVim/MMWindow.m @@ -28,9 +28,39 @@ #import "MMWindow.h" #import "Miscellaneous.h" +#import "CGSInternal/CGSWindow.h" +typedef CGError CGSSetWindowBackgroundBlurRadiusFunction(CGSConnectionID cid, CGSWindowID wid, NSUInteger blur); + +static void *GetFunctionByName(NSString *library, char *func) { + CFBundleRef bundle; + CFURLRef bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef) library, kCFURLPOSIXPathStyle, true); + CFStringRef functionName = CFStringCreateWithCString(kCFAllocatorDefault, func, kCFStringEncodingASCII); + bundle = CFBundleCreate(kCFAllocatorDefault, bundleURL); + void *f = NULL; + if (bundle) { + f = CFBundleGetFunctionPointerForName(bundle, functionName); + CFRelease(bundle); + } + CFRelease(functionName); + CFRelease(bundleURL); + return f; +} + +static CGSSetWindowBackgroundBlurRadiusFunction* GetCGSSetWindowBackgroundBlurRadiusFunction(void) { + static BOOL tried = NO; + static CGSSetWindowBackgroundBlurRadiusFunction *function = NULL; + if (!tried) { + function = GetFunctionByName(@"/System/Library/Frameworks/ApplicationServices.framework", + "CGSSetWindowBackgroundBlurRadius"); + tried = YES; + } + return function; +} + + @implementation MMWindow @@ -125,6 +155,20 @@ [super setContentSize:size]; } +- (void)setBlurRadius:(int)radius +{ + if (radius >= 0) { + CGSConnectionID con = CGSMainConnectionID(); + if (!con) { + return; + } + CGSSetWindowBackgroundBlurRadiusFunction* function = GetCGSSetWindowBackgroundBlurRadiusFunction(); + if (function) { + function(con, [self windowNumber], radius); + } + } +} + - (void)performClose:(id)sender { id wc = [self windowController]; diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index a200c16cdc..8874bb03e5 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -46,6 +46,7 @@ NSPoint defaultTopLeft; NSToolbar *toolbar; BOOL resizingDueToMove; + int blurRadius; } - (id)initWithVimController:(MMVimController *)controller; @@ -81,6 +82,7 @@ - (void)adjustLinespace:(int)linespace; - (void)liveResizeWillStart; - (void)liveResizeDidEnd; +- (void)setBlurRadius:(int)radius; - (void)enterFullScreen:(int)fuoptions backgroundColor:(NSColor *)back; - (void)leaveFullScreen; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 1c0e2939a8..f71b1ffc11 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -330,6 +330,8 @@ if (fullScreenEnabled && !fullScreenWindow) [decoratedWindow setAlphaValue:0]; + [decoratedWindow setBlurRadius:blurRadius]; + // Flag that the window is now placed on screen. From now on it is OK for // code to depend on the screen state. (Such as constraining views etc.) windowPresented = YES; @@ -719,6 +721,14 @@ } } +- (void)setBlurRadius:(int)radius +{ + blurRadius = radius; + if (windowPresented) { + [decoratedWindow setBlurRadius:radius]; + } +} + - (void)enterFullScreen:(int)fuoptions backgroundColor:(NSColor *)back { if (fullScreenEnabled) return; diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 82d83ee735..727fe36ba5 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -208,6 +208,7 @@ enum { GestureMsgID, AddToMRUMsgID, BackingPropertiesChangedMsgID, + SetBlurRadiusMsgID, LastMsgID // NOTE: MUST BE LAST MESSAGE IN ENUM! }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index f210c72ea6..61c8985b36 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -100,6 +100,7 @@ char *MessageStrings[] = "GestureMsgID", "AddToMRUMsgID", "BackingPropertiesChangedMsgID", + "SetBlurRadiusMsgID", "END OF MESSAGE IDs" // NOTE: Must be last! }; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index dc62e2eecf..0ad8492d2f 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -2359,3 +2359,13 @@ gui_mch_post_balloon(beval, mesg) } #endif // FEAT_BEVAL + +#ifdef FEAT_TRANSPARENCY + + void +gui_macvim_set_blur(int radius) +{ + [[MMBackend sharedInstance] setBlurRadius:radius]; +} + +#endif // FEAT_TRANSPARENCY diff --git a/src/option.c b/src/option.c index c69daf65ea..cc19e67519 100644 --- a/src/option.c +++ b/src/option.c @@ -646,6 +646,13 @@ static struct vimoption (char_u *)NULL, PV_NONE, #endif {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, + {"blurradius", "blur", P_NUM|P_VIM, +#ifdef FEAT_TRANSPARENCY + (char_u *)&p_blur, PV_NONE, +#else + (char_u *)NULL, PV_NONE, +#endif + {(char_u *)0L, (char_u *)0L} }, {"bomb", NULL, P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT, #ifdef FEAT_MBYTE (char_u *)&p_bomb, PV_BOMB, @@ -8706,6 +8713,19 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags) else if (gui.in_use) gui_mch_new_colors(); } + + else if (pp == &p_blur) + { + if (p_blur < 0) + { + errmsg = e_invarg; + p_blur = old_value; + } + else + { + gui_macvim_set_blur(p_blur); + } + } #endif else if (pp == &curbuf->b_p_tw) diff --git a/src/option.h b/src/option.h index 85e8dc38b6..838cdce016 100644 --- a/src/option.h +++ b/src/option.h @@ -811,6 +811,7 @@ EXTERN char_u *p_tsr; /* 'thesaurus' */ #endif #ifdef FEAT_TRANSPARENCY EXTERN long p_transp; /* 'transparency' */ +EXTERN long p_blur; /* 'blurradius' */ #endif EXTERN int p_ttimeout; /* 'ttimeout' */ EXTERN long p_ttm; /* 'ttimeoutlen' */ diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro index 427205d76f..6443a62f35 100644 --- a/src/proto/gui_macvim.pro +++ b/src/proto/gui_macvim.pro @@ -208,6 +208,10 @@ void gui_macvim_update_modified_flag(); void gui_macvim_add_to_find_pboard(char_u *pat); void gui_macvim_set_antialias(int antialias); +#ifdef FEAT_TRANSPARENCY +void gui_macvim_set_blur(int blur); +#endif + int16_t odb_buffer_close(buf_T *buf); int16_t odb_post_buffer_write(buf_T *buf); void odb_end(void); From e5adcec141609e7f39ffb5e4ed8a0c369a662dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Ko=CC=88cher?= Date: Sun, 12 Jul 2015 14:21:50 +0200 Subject: [PATCH 2/7] Add basic support for CoreText ligatures. (cherry picked from commit 1497587763d3279073d7c54614fa700b3d736d1f) --- .../Preferences.nib/designable.nib | 2040 +++-------------- .../Preferences.nib/keyedobjects.nib | Bin 27772 -> 15893 bytes src/MacVim/MMAppController.m | 25 + src/MacVim/MMCoreTextView.h | 1 + src/MacVim/MMCoreTextView.m | 72 +- src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + 7 files changed, 417 insertions(+), 1723 deletions(-) diff --git a/src/MacVim/English.lproj/Preferences.nib/designable.nib b/src/MacVim/English.lproj/Preferences.nib/designable.nib index 8a7b8adefa..61719b6784 100644 --- a/src/MacVim/English.lproj/Preferences.nib/designable.nib +++ b/src/MacVim/English.lproj/Preferences.nib/designable.nib @@ -1,1719 +1,321 @@ - - - - 1050 - 12A269 - 2549 - 1187 - 624.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2549 - - - NSButton - NSButtonCell - NSCustomObject - NSCustomView - NSMatrix - NSMenu - NSMenuItem - NSPopUpButton - NSPopUpButtonCell - NSTextField - NSTextFieldCell - NSUserDefaultsController - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - MMPreferenceController - - - FirstResponder - - - NSApplication - - - YES - - - - 268 - - - - 256 - {{17, 162}, {187, 17}} - - - - YES - - 67108864 - 71303168 - Open files from applications: - - LucidaGrande - 13 - 1044 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - NO - - - - 256 - {{17, 253}, {187, 17}} - - - - YES - - 67108864 - 71303168 - Open untitled window: - - - - - - NO - - - - 256 - {{209, 212}, {243, 58}} - - - - YES - NO - 3 - 1 - - - -2080374784 - 0 - on launch and re-activation - - - 3 - 1211912448 - 0 - - NSRadioButton - - - - - - 200 - 25 - - - 67108864 - 0 - only when MacVim launches - - - 1 - 1211912448 - 0 - - - - 200 - 25 - - - 67108864 - 0 - never - - - 1211912448 - 0 - - 549453824 - {18, 18} - - - - - - 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 -AAAAAF/MAAA2wgAACVlYWVogAAAAAAAAcKYAALKbAAAm8lhZWiAAAAAAAAAmZAAAFr0AAKLaWFlaIAAA -AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 -cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD -AQAAAgAAAQYC8AUGBgcIDAkHCw4MCw4RDwwRDRIXFBMWFhcVGRgaGBwbHRseHSAhISMjICQmJicnJigp -KiorLCwrLi8vLzAwMjMzMjQ1NjU3Njg3OTg7Ojw8PT4+Pj9AQUBCQ0NDRENFRkdGSElJSUpKS0xNTU5N -T09QUVFRUlNUUlVVVlZXV1hYWVhbXFxcXVxeXl9fYGFhYmJiY2NkZWVlZmZnZ2hoaWlqa2trbGxtbW5u -b3BwcHFxcnJzc3R0dXR2dnd4eHh5enp6e3x8fH18fn5/foCAgYGCgYODhISFhYaGh4eIiIkIiYmKiouL -jIuNjY6Oj4+QkJGRkpKTk5SUlZWWlpeXmJiZGJmZmpqbm5ycnZ2enp+foKChoaKio6OkI6SkpaWmpqen -qKipqaqqq6usrK2trq6vr7AvsLCxsbKys7O0tLW1tra3t7i4ubm6Obq6u7u8vL29vr6/v8DAwcHCQcLC -w8PExMXFxsbHx8jIyUjJycrKy8vMzM3Nzs7PTs/P0NDR0dLS09PUU9TU1dXW1tfX2NjZWNnZ2trb29zc -3Vzd3d7e39/g4OFg4eHi4uPj5OTlZOXl5ubn5+hn6Ojp6erq6+vsa+zs7e3u7u9u7+/w8PHx8nHy8vPz -9HP09PX19vb3dvf3+Pj5ePn5+vr7evv7/Pz9fP39/n3+/v//AAADBQP4BgcHBwgMCQcLDgwLDRIPCRAO -ERYTEhQUFRMWFRgUGRgbFxwbHSAfICAeISMjJCQjJSYmJygpKSgqKywsLS0uLy8uMTEyMjMyNDM1NDc2 -ODg5Ojo6Ozw9PD4/Pz9AP0FCQ0JERUVFRkZHSElJSklLS0xNTU1OTk9OUFBRUVJSU1NUU1VWVlZXVlhY -WlpbXFxdXV1eXl9gYGBhYWJiY2NkZGVmZmZoaGlpamprbGxsbW1ubm9vcHBxcHJyc3R0dHV2dnZ3eHh4 -eXh6ent6fHx9fX59f3+AgIGBgoKDg4SEhYWGhoeHiIiJiIqKi4uMjI2Njo6Pj5CQkZGSkpOTlJSVlZaW -l5eYmJmZmpqbm5ycnZ2enp+foB+goKGhoqKjo6SkpaWmpqenqKipqaqqq6usrK2trq6vr7AvsLCxsbKy -s7O0tLW1tra3t7i4ubm6urs6u7u8vL29vr6/v8DAwcHCwsPDxMTFxcbGx8fIyMnJysrLy8zMzc3Ozs/P -0NDR0dLS09PU1NVU1dXW1tfX2NjZ2dra29vc3N3d3t7f3+Dg4WDh4eLi4+Pk5OVk5eXm5ufn6Gfo6Onp -6mnq6uvr7OztbO3t7u7v7/Bv8PDx8fLy83Lz8/T09XT19fb293b39/j4+Xj5+fp5+vr7evv7/Pz9fP39 -/n3+/v9+//8AAAIEAvcEBQUFBgoHBQgLCQgKDQsIDAoNEA4NDooPDhAPEQ8SERMRE5EUFRUWFhQXGBgZ -GRgaGhqZGxwcGx0eHh4fHyAhISAiIiKhIyMkIyUkJiYnJygpKSkqKysqLC0tLS4tLy8wMDEyMjIzMzQ1 -NTU2NTc3N7c4ODk5Ojk7Ozw8PT0+Pj8+QEFBQUJBQ0NEREVFRcVGRkdHSElJSUpKS0tMTE1NTk5Ozk9P -UFBRUVJTU1NUVFTUVVVWVldWWFhZWVnZWltbW1xdXV1d3V5eX15gYGFhYeFiYmNjZGRlZWXlZmZnZ2ho -aWlqamtqbGxtbW5ub29wcHDwcXFycnNzdHR1dXZ2d3d4eHl5enp7e3x8fPx9fX5+f3+AgIGBggGCgoOD -hISFhYaGh4eIiIkIiYmKiouLjIyNjY6Oj4+QD5CQkZGSkpOTlJSVlZYVlpaXl5iYmZmampubnJydnZ6e -n5+gH6CgoaGioqOjpKSlpaamp6eoqKmpqqqrq6ysra2urq+vsLCxsbKys7O0tLW1tra3t7i4ubm6uru7 -vLy+vr+/wD/AwMHBwsLDw8TExcXGxsfHyMjJycrKy8vMzM3Nzs7Pz9DQ0dHS0tPT1NTV1dbW19fY2NnZ -2trb29zc3d3e3uDg4eHi4uTk5eXn5unp6+vt7fDw8/P29vn5/f3//wAAbmRpbgAAAAAAAAY2AACVGAAA -Vl8AAFFhAACIhgAAKTQAABaoAABQDQAAVDkAAl64AAJPXAABeFEAAwEAAAIAAAADAAYACwAQABYAJQAu -ADcATQBZAGUAgQCQAJ8AwQDSAOUBCwEgATUBSwFhAZABqAHBAfUCDwIrAmQCnwK9AtwDHAM9A18DowPG -A+oENAR/BKYEzQUdBXAFmgXEBhsGdAahBs8HLQeMB70H7ghSCLgJIAlUCYoJ9gpkCtULRwuBC7wMMgyr -DSYNog3hDiEOoQ8kD6kQLxBzELgRQxHPEl0S7hOAE8oUFRSrFUMV3RZ5FxcXZhe2GFgY/BmhGkga8Ruc -HEkc+B2oHlsfDx/FIH0hNyHyIrAjbyQwJPMltyZ+J0YoECjcKakqeStKLBws8S3HLqAveTBVMTMyEjLz -M9U0uTWgNoc3cThcOUk6ODsoPQ4+Az77P/RA7kHqQuhD6ETpRexG8Uf3SP9KCUsUTCFOQE9SUGZRe1KS -U6tUxVXhVv9YHlk/W4Vcq13SXvtgJWFSYn9jr2TgZhJnR2h8au1sKG1kbqJv4XEicmVzqXTvdjZ4yXoV -e2N8sn4Df1WAqYH/hK+GCYdliMKKIYuBjOOPrJESknuT5JVQlryZm5sMnH+d9J9qolqj1aVRps+oTqtR -rNSuWq/gsvK0frYLt5m6urxNveG/d8KnxEHF3ckZyrrMW83/0UrS8dSb1/HZn9tO3rHgZOPQ5YjnQeq5 -7Hbv9/G59UL3CPqa/jH//wAAAAAAAQADAAsAEAAWACUANwBNAFkAZQCBAJ8AsADBAOUBCwEgATUBYQGQ -AcEB2gH1AisCRwJkAp8C3AL8AxwDXwOjA8YD6gQ0BH8EzQT1BR0FcAXEBe8GGwZ0Bs8HLQdcB4wH7ghS -CLgJIAlUCYoJ9gpkCtULRwuBC7wMMgyrDSYNog3hDiEOoQ8kD6kQLxBzELgRQxHPEl0S7hOAFBUUqxVD -Fd0WeRcXF7YYWBj8GaEZ9BpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwIw8jbyQwJPMltyZ+J0YoECjc -KakqeStKLBws8S3HLqAveTBVMTMyEjLzM9U0uTWgNoc3cThcOUk6ODsoPBo9Dj4DPvs/9EDuQepC6EPo -ROlF7EbxR/dI/0oJSxRMIU0wTkBPUlBmUXtSklOrVMVV4Vb/WT9aYVuFXKtd0l77YCVhUmJ/Y69k4GYS -Z0dofGm0au1tZG6ib+FxInJlc6l073Y2d394yXoVfLJ+A39VgKmB/4NWhK+GCYdliMKKIYuBjOOOR4+s -kRKSe5PklVCWvJgrmZubDJx/nfSfaqJao9WlUabPqE6pzqtRrNSuWq/gsWmy8rYLt5m5Kbq6veG/d8EO -xEHF3ckZyrrMW8+j0UrS8dZF1/HZn9z/3rHiGePQ50Ho/Ox27/fzfPVC+ND8Zf//AAAAAQADAAsAFgAl -ADcATQBlAIEAnwDBAOUBCwE1AZABwQH1AisCZALcAxwDXwOjA+oENAR/BR0FcAXEBhsGdAbPBy0HjAhS -CLgJIAmKCfYKZArVC0cLvAwyDKsNJg2iDiEOoQ8kD6kQLxC4EUMRzxLuE4AUFRSrFUMV3RZ5FxcXthhY -GPwZoRpIGvEcSRz4HageWx8PH8UgfSE3IfIjbyQwJPMltyZ+J0Yo3CmpKnkrSiwcLccuoC95MFUyEjLz -M9U0uTaHN3E4XDlJOyg8Gj0OPgM++z/0QO5B6kLoQ+hE6UbxR/dI/0oJSxRMIU0wTkBPUlBmUXtSklTF -VeFW/1geWT9bhVyrXdJe+2AlYVJif2TgZhJnR2h8abRq7WwobqJv4XEicmVzqXTvd394yXoVe2N8sn4D -f1WAqYH/g1aGCYdliMKKIYuBjOOOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnO -q1Gs1K5arx2v4LFptH62C7eZuSm6urxNveG/d8EOwqfEQcXdx3vJGcq6zFvN/8+j0UrS8dSb1kXX8dmf -207c/96x4GTiGePQ5YjmZOdB6PzqueuX7HbuNu8W7/fw1/G58przfPRf9UL12fZw9wj3oPg4+ND5afoB -+pr7M/vM/GX82P1L/b7+Mf8Y//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AABtbHVjAAAAAAAAAA8AAAAMaXRJVAAAABQAAADEZnJGUgAAAEIAAADYbmJOTwAAABIAAAEaZXNFUwAA -ABIAAAEsZmlGSQAAABAAAAE+cHRQVAAAABgAAAFOemhUVwAAAA4AAAFmamFKUAAAAA4AAAF0bmxOTAAA -ABYAAAGCZGVERQAAABAAAAGYa29LUgAAAAwAAAGoZW5VUwAAABIAAAG0c3ZTRQAAABAAAAHGZGFESwAA -ABwAAAHWemhDTgAAAAwAAAHyAEwAQwBEACAAYwBvAGwAbwByAGkAyQBjAHIAYQBuACAA4AAgAGMAcgBp -AHMAdABhAHUAeAAgAGwAaQBxAHUAaQBkAGUAcwAgAGMAbwB1AGwAZQB1AHIARgBhAHIAZwBlAC0ATABD -AEQATABDAEQAIABjAG8AbABvAHIAVgDkAHIAaQAtAEwAQwBEAEwAQwBEACAAYwBvAGwAbwByAGkAZABv -X2mCcm2yZnaYb3k6VmgwqzDpMPwAIABMAEMARABLAGwAZQB1AHIAZQBuAC0ATABDAEQARgBhAHIAYgAt -AEwAQwBEzuy37AAgAEwAQwBEAEMAbwBsAG8AcgAgAEwAQwBEAEYA5AByAGcALQBMAEMARABMAEMARAAt -AGYAYQByAHYAZQBzAGsA5gByAG1faYJyACAATABDAEQAAG1tb2QAAAAAAAAGEAAAnEUAAAAAvnORAAAA -AAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAA -AAA - - - - - - 3 - MCAwAA - - - - 400 - 75 - - - {243, 18} - {4, 2} - 1143472128 - NSActionCell - - 67108864 - 0 - Radio - - 1211912448 - 0 - - - 400 - 75 - - - - - 3 - MQA - - - - - - 268 - {{209, 141}, {243, 38}} - - - - YES - NO - 2 - 1 - - - 67108864 - 0 - in a new window - - - 1211912448 - 0 - - - - 200 - 25 - - - -2080374784 - 0 - in the current window - - - 1 - 1211912448 - 0 - - 549453824 - {18, 18} - - - - - - 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 -AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA -AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 -cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD -AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH -SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF -hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 -vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt -7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq -Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo -aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e -n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX -2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW -FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O -Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 -ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt -rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA -AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA -AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl -A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq -DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU -HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 -MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v -UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ -eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj -rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn -5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh -AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK -CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY -GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 -MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S -UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 -d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV -pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK -0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// -AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw -BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA -FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H -LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh -Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ -h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp -svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb -1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX -8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE -AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg -QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA - - - - - - - - 400 - 75 - - - {243, 18} - {4, 2} - 1151868928 - NSActionCell - - 67108864 - 0 - Radio - - 1211912448 - 0 - - 549453824 - {18, 18} - - - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - - - - - - - 400 - 75 - - 1 - - - - - - - - 256 - {{209, 47}, {243, 58}} - - - - YES - - 67108864 - 4194304 - This applies to files opened from the Finder (e.g. by double-clicking on a file or by dragging a file onto the MacVim dock icon) or from external programs such as Xcode. - - LucidaGrande - 11 - 3100 - - - - - 6 - System - disabledControlTextColor - - 3 - MC4zMzMzMzMzMzMzAA - - - - NO - - - - 256 - {{207, 186}, {258, 18}} - - - - YES - - 67108864 - 0 - Check for updates - - - 1211912448 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - NO - - - - 256 - {{17, 187}, {187, 17}} - - - - YES - - 67108864 - 71303168 - When MacVim launches: - - - - - - NO - - - - 268 - {{218, 109}, {229, 26}} - - - - YES - - -2076180416 - 2048 - - - 109199360 - 1 - - - 400 - 75 - - - and set the arglist - - 1048576 - 2147483647 - 1 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - _popUpItemAction: - - - YES - - OtherViews - - - - with a tab for each file - - 1048576 - 2147483647 - - - _popUpItemAction: - 3 - - - - - with a window for each file - - 1048576 - 2147483647 - - - _popUpItemAction: - 4 - - - - - with a split for each file - - 1048576 - 2147483647 - - - _popUpItemAction: - 1 - - - - - - 3 - 1 - YES - YES - 2 - - NO - - - - 256 - {{17, 22}, {187, 17}} - - - - YES - - 67108864 - 71303168 - After last window closes: - - - - - - NO - - - - 268 - {{206, 16}, {197, 26}} - - - - YES - - -2076180416 - 2048 - - - 109199360 - 1 - - - 400 - 75 - - - Keep MacVim Running - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - - - - Hide MacVim - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Quit MacVim - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 1 - YES - YES - 2 - - NO - - - {483, 290} - - - - NSView - - - - 268 - - - - 268 - {{18, 50}, {388, 18}} - - - - YES - - -2080374784 - 0 - Prefer native full-screen support (requires Mac OS X 10.7) - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{17, 20}, {415, 28}} - - - - YES - - 67108864 - 272760832 - You may want to disable this option when using multiple monitors since the native full-screen support renders secondary monitors useless. - - - - - 3 - MC41AA - - - NO - - - - 268 - {{18, 146}, {174, 18}} - - - - YES - - 67108864 - 0 - Draw marked text inline - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{17, 74}, {444, 70}} - - - - YES - - 67108864 - 272760832 - 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. - - - - - - NO - - - - 268 - {{18, 282}, {174, 18}} - - - - YES - - 67108864 - 0 - Use Core Text renderer - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{17, 252}, {449, 28}} - - - - YES - - 67108864 - 272760832 - Selecting this option will increase rendering performance but double-tapping with three fingers to look up words will no longer work. - - - - - - NO - - - - 268 - {{18, 228}, {133, 18}} - - - - YES - - 67108864 - 0 - Enable Quickstart - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{17, 170}, {449, 56}} - - - - YES - - 67108864 - 272760832 - New windows open instantaneously with Quickstart enabled but they may not have the latest runtime files sourced. If you modify your runtime files (e.g files inside the ~/.vim directory) then you may need to disable and re-enable Quickstart to ensure that the next window you open will pick up on those changes. - - - - - 3 - MC41AA - - 2 - - - - NO - - - {483, 318} - - - - NSView - - - - - - - generalPreferences - - - - 143 - - - - openInCurrentWindowSelectionChanged: - - - - 572 - - - - layoutPopUpButton - - - - 596 - - - - advancedPreferences - - - - 632 - - - - quickstartButtonClicked: - - - - 858 - - - - atsuiButtonClicked: - - - - 892 - - - - selectedTag: values.MMUntitledWindow - - - - - - selectedTag: values.MMUntitledWindow - selectedTag - values.MMUntitledWindow - 2 - - - 171 - - - - selectedTag: values.MMOpenInCurrentWindow - - - - - - selectedTag: values.MMOpenInCurrentWindow - selectedTag - values.MMOpenInCurrentWindow - 2 - - - 520 - - - - value: values.SUCheckAtStartup - - - - - - value: values.SUCheckAtStartup - value - values.SUCheckAtStartup - 2 - - - 169 - - - - selectedTag: values.MMOpenLayout - - - - - - selectedTag: values.MMOpenLayout - selectedTag - values.MMOpenLayout - 2 - - - 441 - - - - enabled: values.MMOpenInCurrentWindow - - - - - - enabled: values.MMOpenInCurrentWindow - enabled - values.MMOpenInCurrentWindow - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 546 - - - - value: values.MMRenderer - - - - - - value: values.MMRenderer - value - values.MMRenderer - 2 - - - 1000 - - - - value: values.MMPreloadCacheSize - - - - - - value: values.MMPreloadCacheSize - value - values.MMPreloadCacheSize - 2 - - - 828 - - - - selectedIndex: values.MMLastWindowClosedBehavior - - - - - - selectedIndex: values.MMLastWindowClosedBehavior - selectedIndex - values.MMLastWindowClosedBehavior - 2 - - - 968 - - - - value: values.MMUseInlineIm - - - - - - value: values.MMUseInlineIm - value - values.MMUseInlineIm - 2 - - - 1016 - - - - value: values.MMNativeFullScreen - - - - - - value: values.MMNativeFullScreen - value - values.MMNativeFullScreen - 2 - - - 1031 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 58 - - - Shared Defaults - - - 115 - - - - - - - - - - - - - - - General - - - 116 - - - - - - - - 117 - - - - - - - - 119 - - - - - - - - - - - 137 - - - - - 138 - - - - - 139 - - - - - 120 - - - - - - - - - - 134 - - - - - 135 - - - - - 121 - - - - - - - - 122 - - - - - - - - 124 - - - - - - - - 126 - - - - - - - - 427 - - - - - - - - 957 - - - - - - - - 620 - - - - - - - - - - - - - Advanced - - - 782 - - - - - - - - 815 - - - - - - - - 817 - - - - - - - - 826 - - - - - - - - 972 - - - - - 973 - - - - - 974 - - - - - 975 - - - - - 976 - - - - - 977 - - - - - 978 - - - - - - - - 979 - - - - - - - - 990 - - - - - 991 - - - - - 992 - - - - - 993 - - - - - 996 - - - - - 997 - - - - - 429 - - - - - - - - - - - 544 - - - - - 436 - - - - - 431 - - - - - 430 - - - - - 959 - - - - - - - - - - 962 - - - - - 961 - - - - - 960 - - - - - 1001 - - - - - - - - 1004 - - - - - 1013 - - - - - - - - 1014 - - - - - 1017 - - - - - - - - 1020 - - - - - 1028 - - - - - - - - 1029 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 1031 - - - - - DBPrefsWindowController - NSWindowController - - IBProjectSource - ./Classes/DBPrefsWindowController.h - - - - FirstResponder - - id - id - id - - - - atsuiButtonClicked: - id - - - loginShellButtonClicked: - id - - - quickstartButtonClicked: - id - - - - IBUserSource - - - - - MMPreferenceController - DBPrefsWindowController - - openInCurrentWindowSelectionChanged: - id - - - openInCurrentWindowSelectionChanged: - - openInCurrentWindowSelectionChanged: - id - - - - NSView - NSView - NSPopUpButton - - - - advancedPreferences - NSView - - - generalPreferences - NSView - - - layoutPopUpButton - NSPopUpButton - - - - IBProjectSource - ./Classes/MMPreferenceController.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - {11, 11} - {10, 3} - {15, 15} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This applies to files opened from the Finder (e.g. by double-clicking on a file or by dragging a file onto the MacVim dock icon) or from external programs such as Xcode. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + New windows open instantaneously with Quickstart enabled but they may not have the latest runtime files sourced. If you modify your runtime files (e.g files inside the ~/.vim directory) then you may need to disable and re-enable Quickstart to ensure that the next window you open will pick up on those changes. + + + + + + + + + + + + Selecting this option will increase rendering performance but double-tapping with three fingers to look up words will no longer work. + + + + + + + + + + + Selecting this option will enable full support for displaying font ligatures. Using this with a non-proportional font may result in layout issues. + + + + + + + + + + + + + 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. + + + + + + + + + + + + You may want to disable this option when using multiple monitors since the native full-screen support renders secondary monitors useless. + + + + + + + + + + + diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib index 993915f03e6061600f7e78fc5dd47fe92138a733..b019497a60131cacbbcd11a5f09f2a891d8c3db8 100644 GIT binary patch literal 15893 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 0) { + if(count - offset > *length) { + count = (*length) - offset; + } + } + + CFRange range = CFRangeMake(0, count); + CTRunGetGlyphs(run, range, &glyphs[offset]); + + offset += count; + if(offset >= *length) { + // don't copy more glyphs then there is space for + break; + } + } + // as ligatures combine characters it is required to adjust the + // original length value + *length = offset; +} + static void recurseDraw(const unichar *chars, CGGlyph *glyphs, CGPoint *positions, UniCharCount length, CGContextRef context, CTFontRef fontRef, - NSMutableArray *fontCache) + NSMutableArray *fontCache, BOOL useLigatures) { - if (CTFontGetGlyphsForCharacters(fontRef, chars, glyphs, length)) { // All chars were mapped to glyphs, so draw all at once and return. + if (useLigatures) { + memset(glyphs, 0, sizeof(CGGlyph) * length); + ligatureGlyphsForChars(chars, glyphs, &length, fontRef); + } + CGFontRef cgFontRef = CTFontCopyGraphicsFont(fontRef, NULL); CGContextSetFont(context, cgFontRef); CGContextShowGlyphsAtPositions(context, glyphs, positions, length); @@ -1077,7 +1141,7 @@ recurseDraw(const unichar *chars, CGGlyph *glyphs, CGPoint *positions, } recurseDraw(chars, glyphs, positions, attemptedCount, context, - fallback, fontCache); + fallback, fontCache, useLigatures); // If only a portion of the invalid range was rendered above, // the remaining range needs to be attempted by subsequent @@ -1201,7 +1265,7 @@ recurseDraw(const unichar *chars, CGGlyph *glyphs, CGPoint *positions, } CGContextSetTextPosition(context, x, y+fontDescent); - recurseDraw(chars, glyphs, positions, length, context, fontRef, fontCache); + recurseDraw(chars, glyphs, positions, length, context, fontRef, fontCache, useLigatures); CFRelease(fontRef); CGContextRestoreGState(context); diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 727fe36ba5..6d1135081b 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -275,6 +275,7 @@ extern NSString *MMNoWindowKey; extern NSString *MMAutosaveRowsKey; extern NSString *MMAutosaveColumnsKey; extern NSString *MMRendererKey; +extern NSString *MMRendererLigaturesSupportKey; enum { MMRendererDefault = 0, diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 61c8985b36..3b6b4e0428 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -117,6 +117,7 @@ NSString *MMNoWindowKey = @"MMNoWindow"; NSString *MMAutosaveRowsKey = @"MMAutosaveRows"; NSString *MMAutosaveColumnsKey = @"MMAutosaveColumns"; NSString *MMRendererKey = @"MMRenderer"; +NSString *MMRendererLigaturesSupportKey = @"MMRendererLigaturesSupport"; // Vim find pasteboard type (string contains Vim regex patterns) NSString *VimFindPboardType = @"VimFindPboardType"; From 6824350c203116e5505e3bc6b1015a6fcd0024eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Ko=CC=88cher?= Date: Sun, 12 Jul 2015 15:54:05 +0200 Subject: [PATCH 3/7] Fix relative positioning once ligatures come into play. (cherry picked from commit 207d162fb7ab98367002c44bb38335ad264a29dd) --- src/MacVim/MMCoreTextView.m | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/MacVim/MMCoreTextView.m b/src/MacVim/MMCoreTextView.m index 45f5739eb2..bf0245701e 100644 --- a/src/MacVim/MMCoreTextView.m +++ b/src/MacVim/MMCoreTextView.m @@ -1029,7 +1029,7 @@ lookupFont(NSMutableArray *fontCache, const unichar *chars, UniCharCount count, } static void -ligatureGlyphsForChars(const unichar *chars, CGGlyph *glyphs, UniCharCount *length, CTFontRef font ) +ligatureGlyphsForChars(const unichar *chars, CGGlyph *glyphs, CGPoint *positions, UniCharCount *length, CTFontRef font ) { /* CoreText has no simple wait of retrieving a ligature for a set of UniChars. * The way proposed on the CoreText ML is to convert the text to an attributed @@ -1048,6 +1048,8 @@ ligatureGlyphsForChars(const unichar *chars, CGGlyph *glyphs, UniCharCount *leng NSAttributedString *attrText = [[NSAttributedString alloc] initWithString:text attributes:attrs]; + CGPoint refPos = positions[0]; + CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)attrText); UniCharCount offset = 0; @@ -1065,6 +1067,7 @@ ligatureGlyphsForChars(const unichar *chars, CGGlyph *glyphs, UniCharCount *leng CFRange range = CFRangeMake(0, count); CTRunGetGlyphs(run, range, &glyphs[offset]); + CTRunGetPositions(run, range, &positions[offset]); offset += count; if(offset >= *length) { @@ -1072,6 +1075,11 @@ ligatureGlyphsForChars(const unichar *chars, CGGlyph *glyphs, UniCharCount *leng break; } } + // fixup relative positioning + for( CFIndex i = 0; i < offset; ++i ) { + positions[i].x += refPos.x; + positions[i].y += refPos.y; + } // as ligatures combine characters it is required to adjust the // original length value *length = offset; @@ -1086,7 +1094,7 @@ recurseDraw(const unichar *chars, CGGlyph *glyphs, CGPoint *positions, // All chars were mapped to glyphs, so draw all at once and return. if (useLigatures) { memset(glyphs, 0, sizeof(CGGlyph) * length); - ligatureGlyphsForChars(chars, glyphs, &length, fontRef); + ligatureGlyphsForChars(chars, glyphs, positions, &length, fontRef); } CGFontRef cgFontRef = CTFontCopyGraphicsFont(fontRef, NULL); From 3ec129bfc34331665b4668d1a27b49645f6f5208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81=20Ko=CC=88cher?= Date: Sat, 18 Jul 2015 11:06:08 +0200 Subject: [PATCH 4/7] Remove dead-code. (cherry picked from commit e1388424425aeac84d9f2bced36a007d65b896a3) --- src/MacVim/MMAppController.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index c8b36f7430..454d3ab0df 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -1231,9 +1231,6 @@ fsEventCallback(ConstFSEventStreamRef streamRef, ASLogDebug(@"Toggle CoreText ligatures"); BOOL enable = ([sender state] == NSOnState); - if (enable) { - } - // Update the user default MMRendererLigaturesSupport and synchronize the // change so that any new Vim process will pick up on the changed setting. CFPreferencesSetAppValue( From b187ac12323409fcae4ccc36c5d0fb3cd12a1ffc Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Sat, 18 Jul 2015 21:53:24 +0200 Subject: [PATCH 5/7] Add task for creating DMG installation image (cherry picked from commit 83948303f4f71a5ccfe48efa6bea73f936134da2) --- src/Makefile | 22 +- src/create-dmg/LICENSE | 21 ++ src/create-dmg/README | 2 + src/create-dmg/background.png | Bin 0 -> 24421 bytes src/create-dmg/builder/create-dmg.builder | 26 +++ src/create-dmg/create-dmg | 230 ++++++++++++++++++++ src/create-dmg/support/dmg-license.py | 163 ++++++++++++++ src/create-dmg/support/template.applescript | 79 +++++++ 8 files changed, 542 insertions(+), 1 deletion(-) create mode 100644 src/create-dmg/LICENSE create mode 100644 src/create-dmg/README create mode 100644 src/create-dmg/background.png create mode 100644 src/create-dmg/builder/create-dmg.builder create mode 100755 src/create-dmg/create-dmg create mode 100755 src/create-dmg/support/dmg-license.py create mode 100644 src/create-dmg/support/template.applescript diff --git a/src/Makefile b/src/Makefile index 9f03fbba8b..9830d6ed7f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2901,10 +2901,30 @@ $(APPDIR)/Contents: ############################################################################## ### MacVim GUI -.PHONY: macvim macvimclean +.PHONY: macvim macvim-dmg macvimclean + +RELEASEDIR = MacVim/build/Release +DMGDIR = MacVim/build/dmg + macvim: $(VIMTARGET) xcodebuild -project MacVim/MacVim.xcodeproj $(XCODEFLAGS) +macvim-dmg: macvim + mkdir -p $(DMGDIR) + cp MacVim/mvim $(DMGDIR)/ + cp -r $(RELEASEDIR)/MacVim.app $(DMGDIR)/ + rm -rf $(RELEASEDIR)/MacVim-$(VERSION).dmg + create-dmg/create-dmg \ + --volname "MacVim $(VERSION)" \ + --volicon MacVim/icons/MacVim.icns \ + --background create-dmg/background.png \ + --window-size 650 470 \ + --icon-size 80 \ + --icon MacVim.app 240 320 \ + --icon mvim 570 80 \ + --app-drop-link 410 320 \ + $(RELEASEDIR)/MacVim-$(VERSION).dmg $(DMGDIR) + macvimclean: if test -d MacVim; then \ xcodebuild -project MacVim/MacVim.xcodeproj clean; \ diff --git a/src/create-dmg/LICENSE b/src/create-dmg/LICENSE new file mode 100644 index 0000000000..349b6d82b3 --- /dev/null +++ b/src/create-dmg/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2008-2014 Andrey Tarantsov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/create-dmg/README b/src/create-dmg/README new file mode 100644 index 0000000000..4557795edb --- /dev/null +++ b/src/create-dmg/README @@ -0,0 +1,2 @@ +Content of this directory (except background.png) is copied from +https://github.com/andreyvit/create-dmg (5acf22f). diff --git a/src/create-dmg/background.png b/src/create-dmg/background.png new file mode 100644 index 0000000000000000000000000000000000000000..739494dc9f7f11d73c8a677d8dacd3ed0e4716b2 GIT binary patch literal 24421 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 literal 0 HcmV?d00001 diff --git a/src/create-dmg/builder/create-dmg.builder b/src/create-dmg/builder/create-dmg.builder new file mode 100644 index 0000000000..d4285280f1 --- /dev/null +++ b/src/create-dmg/builder/create-dmg.builder @@ -0,0 +1,26 @@ +SET app_name create-dmg + +VERSION create-dmg.cur create-dmg heads/master + +NEWDIR build.dir temp %-build - + +NEWFILE create-dmg.zip featured %.zip % + + +COPYTO [build.dir] + INTO create-dmg [create-dmg.cur]/create-dmg + INTO sample [create-dmg.cur]/sample + INTO support [create-dmg.cur]/support + +SUBSTVARS [build.dir]/create-dmg [[]] + + +ZIP [create-dmg.zip] + INTO [build-files-prefix] [build.dir] + + +PUT megabox-builds create-dmg.zip +PUT megabox-builds build.log + +PUT s3-builds create-dmg.zip +PUT s3-builds build.log diff --git a/src/create-dmg/create-dmg b/src/create-dmg/create-dmg new file mode 100755 index 0000000000..3e55dd9742 --- /dev/null +++ b/src/create-dmg/create-dmg @@ -0,0 +1,230 @@ +#! /bin/bash + +# Create a read-only disk image of the contents of a folder + +set -e; + +function pure_version() { + echo '1.0.0.2' +} + +function version() { + echo "create-dmg $(pure_version)" +} + +function usage() { + version + echo "Creates a fancy DMG file." + echo "Usage: $(basename $0) options... image.dmg source_folder" + echo "All contents of source_folder will be copied into the disk image." + echo "Options:" + echo " --volname name" + echo " set volume name (displayed in the Finder sidebar and window title)" + echo " --volicon icon.icns" + echo " set volume icon" + echo " --background pic.png" + echo " set folder background image (provide png, gif, jpg)" + echo " --window-pos x y" + echo " set position the folder window" + echo " --window-size width height" + echo " set size of the folder window" + echo " --text-size text_size" + echo " set window text size (10-16)" + echo " --icon-size icon_size" + echo " set window icons size (up to 128)" + echo " --icon file_name x y" + echo " set position of the file's icon" + echo " --hide-extension file_name" + echo " hide the extension of file" + echo " --custom-icon file_name custom_icon_or_sample_file x y" + echo " set position and custom icon" + echo " --app-drop-link x y" + echo " make a drop link to Applications, at location x,y" + echo " --eula eula_file" + echo " attach a license file to the dmg" + echo " --no-internet-enable" + echo " disable automatic mount©" + echo " --version show tool version number" + echo " -h, --help display this help" + exit 0 +} + +WINX=10 +WINY=60 +WINW=500 +WINH=350 +ICON_SIZE=128 +TEXT_SIZE=16 + +while test "${1:0:1}" = "-"; do + case $1 in + --volname) + VOLUME_NAME="$2" + shift; shift;; + --volicon) + VOLUME_ICON_FILE="$2" + shift; shift;; + --background) + BACKGROUND_FILE="$2" + BACKGROUND_FILE_NAME="$(basename $BACKGROUND_FILE)" + BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\"" + REPOSITION_HIDDEN_FILES_CLAUSE="set position of every item to {theBottomRightX + 100, 100}" + shift; shift;; + --icon-size) + ICON_SIZE="$2" + shift; shift;; + --text-size) + TEXT_SIZE="$2" + shift; shift;; + --window-pos) + WINX=$2; WINY=$3 + shift; shift; shift;; + --window-size) + WINW=$2; WINH=$3 + shift; shift; shift;; + --icon) + POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4} +" + shift; shift; shift; shift;; + --hide-extension) + HIDING_CLAUSE="${HIDING_CLAUSE}set the extension hidden of item \"$2\" to true +" + shift; shift;; + --custom-icon) + shift; shift; shift; shift; shift;; + -h | --help) + usage;; + --version) + version; exit 0;; + --pure-version) + pure_version; exit 0;; + --app-drop-link) + APPLICATION_LINK=$2 + APPLICATION_CLAUSE="set position of item \"Applications\" to {$2, $3} +" + shift; shift; shift;; + --eula) + EULA_RSRC=$2 + shift; shift;; + --no-internet-enable) + NOINTERNET=1 + shift;; + -*) + echo "Unknown option $1. Run with --help for help." + exit 1;; + esac +done + +test -z "$2" && { + echo "Not enough arguments. Invoke with --help for help." + exit 1 +} + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +DMG_PATH="$1" +DMG_DIRNAME="$(dirname "$DMG_PATH")" +DMG_DIR="$(cd "$DMG_DIRNAME" > /dev/null; pwd)" +DMG_NAME="$(basename "$DMG_PATH")" +DMG_TEMP_NAME="$DMG_DIR/rw.${DMG_NAME}" +SRC_FOLDER="$(cd "$2" > /dev/null; pwd)" +test -z "$VOLUME_NAME" && VOLUME_NAME="$(basename "$DMG_PATH" .dmg)" + +AUX_PATH="$SCRIPT_DIR/support" + +test -d "$AUX_PATH" || { + echo "Cannot find support directory: $AUX_PATH" + exit 1 +} + +if [ -f "$SRC_FOLDER/.DS_Store" ]; then + echo "Deleting any .DS_Store in source folder" + rm "$SRC_FOLDER/.DS_Store" +fi + +# Create the image +echo "Creating disk image..." +test -f "${DMG_TEMP_NAME}" && rm -f "${DMG_TEMP_NAME}" +ACTUAL_SIZE=`du -sm "$SRC_FOLDER" | sed -e 's/ .*//g'` +DISK_IMAGE_SIZE=$(expr $ACTUAL_SIZE + 20) +hdiutil create -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${DISK_IMAGE_SIZE}m "${DMG_TEMP_NAME}" + +# mount it +echo "Mounting disk image..." +MOUNT_DIR="/Volumes/${VOLUME_NAME}" + +# try unmount dmg if it was mounted previously (e.g. developer mounted dmg, installed app and forgot to unmount it) +echo "Unmounting disk image..." +DEV_NAME=$(hdiutil info | egrep '^/dev/' | sed 1q | awk '{print $1}') +test -d "${MOUNT_DIR}" && hdiutil detach "${DEV_NAME}" + +echo "Mount directory: $MOUNT_DIR" +DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | egrep '^/dev/' | sed 1q | awk '{print $1}') +echo "Device name: $DEV_NAME" + +if ! test -z "$BACKGROUND_FILE"; then + echo "Copying background file..." + test -d "$MOUNT_DIR/.background" || mkdir "$MOUNT_DIR/.background" + cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME" +fi + +if ! test -z "$APPLICATION_LINK"; then + echo "making link to Applications dir" + echo $MOUNT_DIR + ln -s /Applications "$MOUNT_DIR/Applications" +fi + +if ! test -z "$VOLUME_ICON_FILE"; then + echo "Copying volume icon file '$VOLUME_ICON_FILE'..." + cp "$VOLUME_ICON_FILE" "$MOUNT_DIR/.VolumeIcon.icns" + SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" +fi + +# run applescript +APPLESCRIPT=$(mktemp -t createdmg) +cat "$AUX_PATH/template.applescript" | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" -e "s/REPOSITION_HIDDEN_FILES_CLAUSE/$REPOSITION_HIDDEN_FILES_CLAUSE/g" -e "s/ICON_SIZE/$ICON_SIZE/g" -e "s/TEXT_SIZE/$TEXT_SIZE/g" | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" | perl -pe "s/APPLICATION_CLAUSE/$APPLICATION_CLAUSE/g" | perl -pe "s/HIDING_CLAUSE/$HIDING_CLAUSE/" >"$APPLESCRIPT" + +echo "Running Applescript: /usr/bin/osascript \"${APPLESCRIPT}\" \"${VOLUME_NAME}\"" +"/usr/bin/osascript" "${APPLESCRIPT}" "${VOLUME_NAME}" || true +echo "Done running the applescript..." +sleep 4 + +rm "$APPLESCRIPT" + +# make sure it's not world writeable +echo "Fixing permissions..." +chmod -Rf go-w "${MOUNT_DIR}" &> /dev/null || true +echo "Done fixing permissions." + +# make the top window open itself on mount: +echo "Blessing started" +bless --folder "${MOUNT_DIR}" --openfolder "${MOUNT_DIR}" +echo "Blessing finished" + +if ! test -z "$VOLUME_ICON_FILE"; then + # tell the volume that it has a special file attribute + SetFile -a C "$MOUNT_DIR" +fi + +# unmount +echo "Unmounting disk image..." +hdiutil detach "${DEV_NAME}" + +# compress image +echo "Compressing disk image..." +hdiutil convert "${DMG_TEMP_NAME}" -format UDZO -imagekey zlib-level=9 -o "${DMG_DIR}/${DMG_NAME}" +rm -f "${DMG_TEMP_NAME}" + +# adding EULA resources +if [ ! -z "${EULA_RSRC}" -a "${EULA_RSRC}" != "-null-" ]; then + echo "adding EULA resources" + "${AUX_PATH}/dmg-license.py" "${DMG_DIR}/${DMG_NAME}" "${EULA_RSRC}" +fi + +if [ ! -z "${NOINTERNET}" -a "${NOINTERNET}" == 1 ]; then + echo "not setting 'internet-enable' on the dmg" +else + hdiutil internet-enable -yes "${DMG_DIR}/${DMG_NAME}" +fi + +echo "Disk image done" +exit 0 diff --git a/src/create-dmg/support/dmg-license.py b/src/create-dmg/support/dmg-license.py new file mode 100755 index 0000000000..9003a7c5e7 --- /dev/null +++ b/src/create-dmg/support/dmg-license.py @@ -0,0 +1,163 @@ +#! /usr/bin/env python +""" +This script adds a license file to a DMG. Requires Xcode and a plain ascii text +license file. +Obviously only runs on a Mac. + +Copyright (C) 2011-2013 Jared Hobbs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +""" +import os +import sys +import tempfile +import optparse + + +class Path(str): + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + os.unlink(self) + + +def mktemp(dir=None, suffix=''): + (fd, filename) = tempfile.mkstemp(dir=dir, suffix=suffix) + os.close(fd) + return Path(filename) + + +def main(options, args): + dmgFile, license = args + with mktemp('.') as tmpFile: + with open(tmpFile, 'w') as f: + f.write("""data 'TMPL' (128, "LPic") { + $"1344 6566 6175 6C74 204C 616E 6775 6167" + $"6520 4944 4457 5244 0543 6F75 6E74 4F43" + $"4E54 042A 2A2A 2A4C 5354 430B 7379 7320" + $"6C61 6E67 2049 4444 5752 441E 6C6F 6361" + $"6C20 7265 7320 4944 2028 6F66 6673 6574" + $"2066 726F 6D20 3530 3030 4457 5244 1032" + $"2D62 7974 6520 6C61 6E67 7561 6765 3F44" + $"5752 4404 2A2A 2A2A 4C53 5445" +}; + +data 'LPic' (5000) { + $"0000 0002 0000 0000 0000 0000 0004 0000" +}; + +data 'STR#' (5000, "English buttons") { + $"0006 0D45 6E67 6C69 7368 2074 6573 7431" + $"0541 6772 6565 0844 6973 6167 7265 6505" + $"5072 696E 7407 5361 7665 2E2E 2E7A 4966" + $"2079 6F75 2061 6772 6565 2077 6974 6820" + $"7468 6520 7465 726D 7320 6F66 2074 6869" + $"7320 6C69 6365 6E73 652C 2063 6C69 636B" + $"2022 4167 7265 6522 2074 6F20 6163 6365" + $"7373 2074 6865 2073 6F66 7477 6172 652E" + $"2020 4966 2079 6F75 2064 6F20 6E6F 7420" + $"6167 7265 652C 2070 7265 7373 2022 4469" + $"7361 6772 6565 2E22" +}; + +data 'STR#' (5002, "English") { + $"0006 0745 6E67 6C69 7368 0541 6772 6565" + $"0844 6973 6167 7265 6505 5072 696E 7407" + $"5361 7665 2E2E 2E7B 4966 2079 6F75 2061" + $"6772 6565 2077 6974 6820 7468 6520 7465" + $"726D 7320 6F66 2074 6869 7320 6C69 6365" + $"6E73 652C 2070 7265 7373 2022 4167 7265" + $"6522 2074 6F20 696E 7374 616C 6C20 7468" + $"6520 736F 6674 7761 7265 2E20 2049 6620" + $"796F 7520 646F 206E 6F74 2061 6772 6565" + $"2C20 7072 6573 7320 2244 6973 6167 7265" + $"6522 2E" +};\n\n""") + with open(license, 'r') as l: + kind = 'RTF ' if license.lower().endswith('.rtf') else 'TEXT' + f.write('data \'%s\' (5000, "English") {\n' % kind) + def escape(s): + return s.strip().replace('\\', '\\\\').replace('"', '\\"') + + for line in l: + if len(line) < 1000: + f.write(' "' + escape(line) + '\\n"\n') + else: + for liner in line.split('.'): + f.write(' "' + escape(liner) + '. \\n"\n') + f.write('};\n\n') + f.write("""data 'styl' (5000, "English") { + $"0003 0000 0000 000C 0009 0014 0000 0000" + $"0000 0000 0000 0000 0027 000C 0009 0014" + $"0100 0000 0000 0000 0000 0000 002A 000C" + $"0009 0014 0000 0000 0000 0000 0000" +};\n""") + os.system('hdiutil unflatten -quiet "%s"' % dmgFile) + ret = os.system('%s -a %s -o "%s"' % + (options.rez, tmpFile, dmgFile)) + os.system('hdiutil flatten -quiet "%s"' % dmgFile) + if options.compression is not None: + os.system('cp %s %s.temp.dmg' % (dmgFile, dmgFile)) + os.remove(dmgFile) + if options.compression == "bz2": + os.system('hdiutil convert %s.temp.dmg -format UDBZ -o %s' % + (dmgFile, dmgFile)) + elif options.compression == "gz": + os.system('hdiutil convert %s.temp.dmg -format ' % dmgFile + + 'UDZO -imagekey zlib-devel=9 -o %s' % dmgFile) + os.remove('%s.temp.dmg' % dmgFile) + if ret == 0: + print "Successfully added license to '%s'" % dmgFile + else: + print "Failed to add license to '%s'" % dmgFile + +if __name__ == '__main__': + parser = optparse.OptionParser() + parser.set_usage("""%prog [OPTIONS] + This program adds a software license agreement to a DMG file. + It requires Xcode and either a plain ascii text + or a with the RTF contents. + + See --help for more details.""") + parser.add_option( + '--rez', + '-r', + action='store', + default='/Applications/Xcode.app/Contents/Developer/Tools/Rez', + help='The path to the Rez tool. Defaults to %default' + ) + parser.add_option( + '--compression', + '-c', + action='store', + choices=['bz2', 'gz'], + default=None, + help='Optionally compress dmg using specified compression type. ' + 'Choices are bz2 and gz.' + ) + options, args = parser.parse_args() + cond = len(args) != 2 + if not os.path.exists(options.rez): + print 'Failed to find Rez at "%s"!\n' % options.rez + cond = True + if cond: + parser.print_usage() + sys.exit(1) + main(options, args) diff --git a/src/create-dmg/support/template.applescript b/src/create-dmg/support/template.applescript new file mode 100644 index 0000000000..2a7f2aa0b6 --- /dev/null +++ b/src/create-dmg/support/template.applescript @@ -0,0 +1,79 @@ +on run (volumeName) + tell application "Finder" + tell disk (volumeName as string) + open + + set theXOrigin to WINX + set theYOrigin to WINY + set theWidth to WINW + set theHeight to WINH + + set theBottomRightX to (theXOrigin + theWidth) + set theBottomRightY to (theYOrigin + theHeight) + set dsStore to "\"" & "/Volumes/" & volumeName & "/" & ".DS_STORE\"" + + tell container window + set current view to icon view + set toolbar visible to false + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} + set statusbar visible to false + REPOSITION_HIDDEN_FILES_CLAUSE + end tell + + set opts to the icon view options of container window + tell opts + set icon size to ICON_SIZE + set text size to TEXT_SIZE + set arrangement to not arranged + end tell + BACKGROUND_CLAUSE + + -- Positioning + POSITION_CLAUSE + + -- Hiding + HIDING_CLAUSE + + -- Application Link Clause + APPLICATION_CLAUSE + close + open + + update without registering applications + -- Force saving of the size + delay 1 + + tell container window + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10} + end tell + + update without registering applications + end tell + + delay 1 + + tell disk (volumeName as string) + tell container window + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} + end tell + + update without registering applications + end tell + + --give the finder some time to write the .DS_Store file + delay 3 + + set waitTime to 0 + set ejectMe to false + repeat while ejectMe is false + delay 1 + set waitTime to waitTime + 1 + + if (do shell script "[ -f " & dsStore & " ]; echo $?") = "0" then set ejectMe to true + end repeat + log "waited " & waitTime & " seconds for .DS_STORE to be created." + end tell +end run From 99f14531655c5422f74146b5225732ee23e09186 Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Sat, 18 Jul 2015 22:12:18 +0200 Subject: [PATCH 6/7] Add DMG background source in pixlr.com format (cherry picked from commit ce9d45348026b1a4937d44245f90b0e75fa3f37f) --- src/create-dmg/background.pxd | Bin 0 -> 48746 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/create-dmg/background.pxd diff --git a/src/create-dmg/background.pxd b/src/create-dmg/background.pxd new file mode 100644 index 0000000000000000000000000000000000000000..60dddda486123d011cf558ad6187ea3b5c36b8e4 GIT binary patch literal 48746 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 Date: Sun, 23 Aug 2015 18:07:47 +0200 Subject: [PATCH 7/7] Early-out of resize handling if the window has not been presented yet. Fix regression of the bug addressed in commit 40090e. (cherry picked from commit 347d839688c8fef02f6f49545e97e46af5f06923) --- src/MacVim/MMWindowController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index f71b1ffc11..2d04397474 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -1023,7 +1023,7 @@ return; } - if (!setupDone || fullScreenEnabled) return; + if (!setupDone || fullScreenEnabled || !windowPresented) return; // NOTE: Since we have no control over when the window may resize (Cocoa // may resize automatically) we simply set the view to fill the entire