From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Alan Third Newsgroups: gmane.emacs.bugs Subject: bug#27810: NS runtime feature detection Date: Tue, 1 Aug 2017 23:03:39 +0100 Message-ID: <20170801220339.GA57816@breton.holly.idiocy.org> References: <20170718221629.GA55506@breton.holly.idiocy.org> <20170722112230.GA58424@breton.holly.idiocy.org> <20170723121701.GA3730@breton.holly.idiocy.org> <508a4930-feab-588b-0ab9-f55a10ea85ec@aurox.ch> <20170724204404.GA20189@breton.holly.idiocy.org> <20170726215746.GA59679@breton.holly.idiocy.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="RnlQjJ0d97Da+TV1" Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1501625071 2201 195.159.176.226 (1 Aug 2017 22:04:31 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 1 Aug 2017 22:04:31 +0000 (UTC) User-Agent: Mutt/1.7.2 (2016-11-26) Cc: "Charles A. Roelli" , 27810@debbugs.gnu.org To: Anders Lindgren Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Aug 02 00:04:23 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dcfH1-0008DF-Ju for geb-bug-gnu-emacs@m.gmane.org; Wed, 02 Aug 2017 00:04:19 +0200 Original-Received: from localhost ([::1]:44657 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dcfH4-0006bQ-5J for geb-bug-gnu-emacs@m.gmane.org; Tue, 01 Aug 2017 18:04:22 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:43562) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dcfGo-0006Xs-C9 for bug-gnu-emacs@gnu.org; Tue, 01 Aug 2017 18:04:09 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dcfGk-0006GD-B8 for bug-gnu-emacs@gnu.org; Tue, 01 Aug 2017 18:04:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:34718) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dcfGk-0006Fy-3K for bug-gnu-emacs@gnu.org; Tue, 01 Aug 2017 18:04:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dcfGj-000667-Ok for bug-gnu-emacs@gnu.org; Tue, 01 Aug 2017 18:04:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alan Third Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 01 Aug 2017 22:04:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 27810 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 27810-submit@debbugs.gnu.org id=B27810.150162503423425 (code B ref 27810); Tue, 01 Aug 2017 22:04:01 +0000 Original-Received: (at 27810) by debbugs.gnu.org; 1 Aug 2017 22:03:54 +0000 Original-Received: from localhost ([127.0.0.1]:37395 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dcfGb-00065l-Be for submit@debbugs.gnu.org; Tue, 01 Aug 2017 18:03:54 -0400 Original-Received: from mail-wr0-f172.google.com ([209.85.128.172]:34386) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dcfGX-00065U-PR for 27810@debbugs.gnu.org; Tue, 01 Aug 2017 18:03:51 -0400 Original-Received: by mail-wr0-f172.google.com with SMTP id 12so11924949wrb.1 for <27810@debbugs.gnu.org>; Tue, 01 Aug 2017 15:03:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=gAjAy5a8aaW1rJb0PSabO0n1luBMUJHyMuqKfVyU7+4=; b=LzBRyk7cRFcrIQdrCWsIpo5PrGes4WRLDpNscrlzudxRMuZYgAvwfGc48VBWQZTlad SwQYob1dyjeojLlGxZtnKb/3LkJ8ZqnUMY0mtU14okOTVF9i2QwtgNCyfr/ZQJ7iFGqE 6Ryf/0gfFoDpyOumWcS9RqOlFWWD35ZVlbPU0sBUdH5DhNge6CcfnfakSbFzoDoRfWKn mv5gSzv/oxBKu8EyPQzI0BKY/t3zB3aCKH3mK6hC1FJ/G90o2KKlYSeF4d1N0NcG7gLq G27Hs38JtQavPJPnXHsqfh1a+i6d6WesOp1GEU8FTP5aXTx3IwRnJWfUT4D/yKyq6v+Z VhFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=gAjAy5a8aaW1rJb0PSabO0n1luBMUJHyMuqKfVyU7+4=; b=rxM5JmrYhWqvKasWQqY+tuh1PAGe9uiLpaLu8zsdjcasIW4h6lM9CIkMBWLTMlOjqh pYylsaBB/NXprbFKpTu6GK7EUEH9jNeSsar8JuwYvNkfxfkOuAWtQNCpQ5K/ULu3mep+ pPgBIpevw51wByKanMGScDInGUhOa28K0CSX+o0zY0fjZ3S6CiLX0dtuOB6dixnMMl0x Vfz1HP7Izm7Ey1weelcdHpyJdB7/eWFkCKQYgbsc6U00O6DrrcpQk6Er9ipDoQdFFWGu SNyNA/gk691i+2IN9sRXU/UUO9AkTeEVntiJca/Tg0vMOYp/qmdL+NEusuVWEJPGKq51 3TGA== X-Gm-Message-State: AIVw1100mHtQr119D9ywqXQ0DVfcnIbRDAwAOt1Htt/ORNir+ISMQAL4 TnJfH0hLg1zAeA== X-Received: by 10.223.150.101 with SMTP id c34mr15065481wra.266.1501625023404; Tue, 01 Aug 2017 15:03:43 -0700 (PDT) Original-Received: from breton.holly.idiocy.org (ip6-2001-08b0-03f8-8129-b502-fffb-632e-95b3.holly.idiocy.org. [2001:8b0:3f8:8129:b502:fffb:632e:95b3]) by smtp.gmail.com with ESMTPSA id h68sm30272370wrh.32.2017.08.01.15.03.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Aug 2017 15:03:41 -0700 (PDT) Content-Disposition: inline In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:135232 Archived-At: --RnlQjJ0d97Da+TV1 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit On Tue, Aug 01, 2017 at 05:38:03PM +0200, Anders Lindgren wrote: > It's always a good idea to enable warnings when undefined preprocessor > symbols are used. In gcc this is -Wundef and I gess it's the same in clang. Unfortunately this produces an absolute ton of spurious warnings which scroll off my terminal buffer. I think I’ve caught all the important ones now, though. I’ve attached my latest go with this. I’ve removed the MAC_OS_X_VERSION_10_XX macros with their numbers, as we can use the existence of the macros to tell what platform we’re compiling on. Eg. #if !defined (MAC_OS_X_VERSION_10_7) \ && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 I’ve also used the NSAppKitVersionNumber macros in a few places to do runtime version detection. I’m not sure this is reliable. There are two methods of finding the OS version definitively, which we can use if we need to. I’ve got rid of the HAS_NATIVE_FS macro and tried to replace it with other checks where required. It compiles on 10.12, but I’m not at all convinced it will compile on 10.6. New 10.7 variables that need to be available on 10.6 when we’re compiling for 10.7+ have been added near the bottom of nsterm.h. Overall it looks quite different in places, but the functionality hasn’t really changed. -- Alan Third --RnlQjJ0d97Da+TV1 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="0001-Allow-use-of-run-time-OS-version-checks-on-macOS-bug.patch" >From f014f12082b6e9651a331134ee5a683c720fc4fb Mon Sep 17 00:00:00 2001 From: Alan Third Date: Thu, 6 Jul 2017 23:10:49 +0100 Subject: [PATCH] Allow use of run-time OS version checks on macOS (bug#27810) * src/nsterm.h (NSWindowTabbingMode): Define in pre-Sierra macOS. (MAC_OS_X_VERSION_10_6, MAC_OS_X_VERSION_10_7, MAC_OS_X_VERSION_10_8, MAC_OS_X_VERSION_10_9, MAC_OS_X_VERSION_10_12, HAVE_NATIVE_FS): Remove defines. (NSWindowStyleMaskFullScreen, NSWindowCollectionBehaviorFullScreenPrimary, NSApplicationPresentationFullScreen, NSApplicationPresentationAutoHideToolbar): Define in macOS 10.6. * src/nsterm.m (colorForEmacsRed, colorUsingDefaultColorSpace, check_native_fs, ns_read_socket, ns_select, runAlertPanel, firstRectForCharacterRange, initFrameFromEmacs, windowDidMiniaturize, windowDidEnterFullScreen, windowDidExitFullScreen, isFullscreen, updateCollectionBehavior, toggleFullScreen, constrainFrameRect, scrollerWidth, syms_of_nsterm): Allow use of run-time checks and replace version check macros. * src/nsfns.m (ns_screen_name): Use run-time OS version checks. * src/macfont.m (macfont_draw): Use run-time OS version checks. * src/nsmenu.m (menuWillOpen): Use run-time OS version checks. --- src/macfont.m | 18 ++++-- src/nsfns.m | 83 +++++++++++++------------ src/nsmenu.m | 9 ++- src/nsterm.h | 45 ++++++-------- src/nsterm.m | 191 ++++++++++++++++++++++++++++++++++++++-------------------- 5 files changed, 209 insertions(+), 137 deletions(-) diff --git a/src/macfont.m b/src/macfont.m index 4d310e47ae..19145f92c0 100644 --- a/src/macfont.m +++ b/src/macfont.m @@ -2869,11 +2869,19 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no and synthetic bold looks thinner on such environments. Apple says there are no plans to address this issue (rdar://11644870) currently. So we add a workaround. */ -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 - CGContextSetLineWidth (context, synthetic_bold_factor * font_size - * [[FRAME_NS_VIEW(f) window] backingScaleFactor]); -#else - CGContextSetLineWidth (context, synthetic_bold_factor * font_size); +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + if ([[FRAME_NS_VIEW(f) window] respondsToSelector: + @selector(backingScaleFactor)]) +#endif + CGContextSetLineWidth (context, synthetic_bold_factor * font_size + * [[FRAME_NS_VIEW(f) window] backingScaleFactor]); +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + else +#endif +#endif +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + CGContextSetLineWidth (context, synthetic_bold_factor * font_size); #endif CG_SET_STROKE_COLOR_WITH_FACE_FOREGROUND (context, face, f); } diff --git a/src/nsfns.m b/src/nsfns.m index 36748cebb8..e19e4e2641 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -1592,7 +1592,7 @@ Frames are listed from topmost (first) to bottommost (last). */) } #ifdef NS_IMPL_COCOA -#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_9 +#if MAC_OS_X_VERSION_MAX_ALLOWED > 1090 #define MODAL_OK_RESPONSE NSModalResponseOK #endif #endif @@ -2512,52 +2512,61 @@ and GNUstep implementations ("distributor-specific release { char *name = NULL; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 - mach_port_t masterPort; - io_iterator_t it; - io_object_t obj; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090 + if (CGDisplayIOServicePort == NULL) +#endif + { + mach_port_t masterPort; + io_iterator_t it; + io_object_t obj; - // CGDisplayIOServicePort is deprecated. Do it another (harder) way. + /* CGDisplayIOServicePort is deprecated. Do it another (harder) way. - if (IOMasterPort (MACH_PORT_NULL, &masterPort) != kIOReturnSuccess - || IOServiceGetMatchingServices (masterPort, - IOServiceMatching ("IONDRVDevice"), - &it) != kIOReturnSuccess) - return name; + Is this code OK for macOS < 10.9, and GNUstep? I suspect it is, + in which case is it worth keeping the other method in here? */ - /* Must loop until we find a name. Many devices can have the same unit - number (represents different GPU parts), but only one has a name. */ - while (! name && (obj = IOIteratorNext (it))) - { - CFMutableDictionaryRef props; - const void *val; - - if (IORegistryEntryCreateCFProperties (obj, - &props, - kCFAllocatorDefault, - kNilOptions) == kIOReturnSuccess - && props != nil - && (val = CFDictionaryGetValue(props, @"IOFBDependentIndex"))) + if (IOMasterPort (MACH_PORT_NULL, &masterPort) != kIOReturnSuccess + || IOServiceGetMatchingServices (masterPort, + IOServiceMatching ("IONDRVDevice"), + &it) != kIOReturnSuccess) + return name; + + /* Must loop until we find a name. Many devices can have the same unit + number (represents different GPU parts), but only one has a name. */ + while (! name && (obj = IOIteratorNext (it))) { - unsigned nr = [(NSNumber *)val unsignedIntegerValue]; - if (nr == CGDisplayUnitNumber (did)) - name = ns_get_name_from_ioreg (obj); + CFMutableDictionaryRef props; + const void *val; + + if (IORegistryEntryCreateCFProperties (obj, + &props, + kCFAllocatorDefault, + kNilOptions) == kIOReturnSuccess + && props != nil + && (val = CFDictionaryGetValue(props, @"IOFBDependentIndex"))) + { + unsigned nr = [(NSNumber *)val unsignedIntegerValue]; + if (nr == CGDisplayUnitNumber (did)) + name = ns_get_name_from_ioreg (obj); + } + + CFRelease (props); + IOObjectRelease (obj); } - CFRelease (props); - IOObjectRelease (obj); + IOObjectRelease (it); } - - IOObjectRelease (it); - -#else - - name = ns_get_name_from_ioreg (CGDisplayIOServicePort (did)); - +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090 + else +#endif +#endif /* #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 */ +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090 + name = ns_get_name_from_ioreg (CGDisplayIOServicePort (did)); #endif return name; } -#endif +#endif /* NS_IMPL_COCOA */ static Lisp_Object ns_make_monitor_attribute_list (struct MonitorInfo *monitors, diff --git a/src/nsmenu.m b/src/nsmenu.m index 37a1a62d6d..93e06707c0 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -532,9 +532,14 @@ - (void)menuWillOpen:(NSMenu *)menu { ++trackingMenu; -#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 // On 10.6 we get repeated calls, only the one for NSSystemDefined is "real". - if ([[NSApp currentEvent] type] != NSSystemDefined) return; + if ( +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + NSAppKitVersionNumber < NSAppKitVersionNumber10_7 && +#endif + [[NSApp currentEvent] type] != NSEventTypeSystemDefined) + return; #endif /* When dragging from one menu to another, we get willOpen followed by didClose, diff --git a/src/nsterm.h b/src/nsterm.h index 0f1b36db7b..a60f94ef64 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -25,30 +25,6 @@ along with GNU Emacs. If not, see . */ #include "sysselect.h" #ifdef HAVE_NS - -#ifdef NS_IMPL_COCOA -#ifndef MAC_OS_X_VERSION_10_6 -#define MAC_OS_X_VERSION_10_6 1060 -#endif -#ifndef MAC_OS_X_VERSION_10_7 -#define MAC_OS_X_VERSION_10_7 1070 -#endif -#ifndef MAC_OS_X_VERSION_10_8 -#define MAC_OS_X_VERSION_10_8 1080 -#endif -#ifndef MAC_OS_X_VERSION_10_9 -#define MAC_OS_X_VERSION_10_9 1090 -#endif -#ifndef MAC_OS_X_VERSION_10_12 -#define MAC_OS_X_VERSION_10_12 101200 -#endif - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 -#define HAVE_NATIVE_FS -#endif - -#endif /* NS_IMPL_COCOA */ - #ifdef __OBJC__ /* CGFloat on GNUstep may be 4 or 8 byte, but functions expect float* for some @@ -1275,9 +1251,16 @@ extern char gnustep_base_version[]; /* version tracking */ ? (min) : (((x)>(max)) ? (max) : (x))) #define SCREENMAXBOUND(x) (IN_BOUND (-SCREENMAX, x, SCREENMAX)) +/* macOS 10.7 introduces some new constants. */ +#if !defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +#define NSWindowStyleMaskFullScreen (1 << 14) +#define NSWindowCollectionBehaviorFullScreenPrimary (1 << 7) +#define NSApplicationPresentationFullScreen (1 << 10) +#define NSApplicationPresentationAutoHideToolbar (1 << 11) +#endif + /* macOS 10.12 deprecates a bunch of constants. */ -#if !defined (NS_IMPL_COCOA) || \ - MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12 +#if !defined (NS_IMPL_COCOA) || !defined (MAC_OS_X_VERSION_10_12) #define NSEventModifierFlagCommand NSCommandKeyMask #define NSEventModifierFlagControl NSControlKeyMask #define NSEventModifierFlagHelp NSHelpKeyMask @@ -1303,6 +1286,7 @@ extern char gnustep_base_version[]; /* version tracking */ #define NSEventTypeKeyUp NSKeyUp #define NSEventTypeFlagsChanged NSFlagsChanged #define NSEventMaskAny NSAnyEventMask +#define NSEventTypeSystemDefined NSSystemDefined #define NSWindowStyleMaskBorderless NSBorderlessWindowMask #define NSWindowStyleMaskClosable NSClosableWindowMask #define NSWindowStyleMaskFullScreen NSFullScreenWindowMask @@ -1317,6 +1301,13 @@ extern char gnustep_base_version[]; /* version tracking */ #ifdef __OBJC__ typedef NSUInteger NSWindowStyleMask; #endif -#endif +/* Window tabbing mode enums are new too. */ +enum NSWindowTabbingMode + { + NSWindowTabbingModeAutomatic, + NSWindowTabbingModePreferred, + NSWindowTabbingModeDisallowed + }; +#endif #endif /* HAVE_NS */ diff --git a/src/nsterm.m b/src/nsterm.m index 36d906a7ce..1eaf94ad88 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -136,14 +136,18 @@ @implementation NSColor (EmacsColor) + (NSColor *)colorForEmacsRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { -#ifdef NS_IMPL_COCOA -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 - if (ns_use_srgb_colorspace) - return [NSColor colorWithSRGBRed: red - green: green - blue: blue - alpha: alpha]; +#if defined (NS_IMPL_COCOA) \ + && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + if (ns_use_srgb_colorspace +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + && [NSColor respondsToSelector: + @selector(colorWithSRGBRed:green:blue:alpha:)] #endif + ) + return [NSColor colorWithSRGBRed: red + green: green + blue: blue + alpha: alpha]; #endif return [NSColor colorWithCalibratedRed: red green: green @@ -153,11 +157,18 @@ + (NSColor *)colorForEmacsRed:(CGFloat)red green:(CGFloat)green - (NSColor *)colorUsingDefaultColorSpace { -#ifdef NS_IMPL_COCOA -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 - if (ns_use_srgb_colorspace) - return [self colorUsingColorSpace: [NSColorSpace sRGBColorSpace]]; + /* FIXMES: We're checking for colorWithSRGBRed here so this will + only work in the same place as in the method above. It should + really be a check whether we're on macOS 10.7 or above. */ +#if defined (NS_IMPL_COCOA) \ + && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + if (ns_use_srgb_colorspace +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + && [NSColor respondsToSelector: + @selector(colorWithSRGBRed:green:blue:alpha:)] #endif + ) + return [self colorUsingColorSpace: [NSColorSpace sRGBColorSpace]]; #endif return [self colorUsingColorSpaceName: NSCalibratedRGBColorSpace]; } @@ -4140,7 +4151,7 @@ in certain situations (rapid incoming events). } } -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 static void check_native_fs () { @@ -4242,7 +4253,7 @@ in certain situations (rapid incoming events). NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_read_socket"); -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 check_native_fs (); #endif @@ -4324,7 +4335,7 @@ in certain situations (rapid incoming events). NSTRACE_WHEN (NSTRACE_GROUP_EVENTS, "ns_select"); -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 check_native_fs (); #endif @@ -5563,8 +5574,7 @@ - (void) terminate: (id)sender NSString *defaultButton, NSString *alternateButton) { -#if !defined (NS_IMPL_COCOA) || \ - MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9 +#ifdef NS_IMPL_GNUSTEP return NSRunAlertPanel(title, msgFormat, defaultButton, alternateButton, nil) == NSAlertDefaultReturn; #else @@ -6325,14 +6335,27 @@ - (NSRect)firstRectForCharacterRange: (NSRange)theRange +FRAME_LINE_HEIGHT (emacsframe)); pt = [self convertPoint: pt toView: nil]; -#if !defined (NS_IMPL_COCOA) || \ - MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 - pt = [[self window] convertBaseToScreen: pt]; - rect.origin = pt; -#else - rect.origin = pt; - rect = [[self window] convertRectToScreen: rect]; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + if ([[self window] respondsToSelector: @selector(convertRectToScreen:)]) + { #endif + rect.origin = pt; + rect = [[self window] convertRectToScreen: rect]; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + } + else +#endif +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */ +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 \ + || defined (NS_IMPL_GNUSTEP) + { + pt = [[self window] convertBaseToScreen: pt]; + rect.origin = pt; + } +#endif + return rect; } @@ -6988,11 +7011,15 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f scrollbarsNeedingUpdate = 0; fs_state = FULLSCREEN_NONE; fs_before_fs = next_maximized = -1; -#ifdef HAVE_NATIVE_FS - fs_is_native = ns_use_native_fullscreen; -#else + fs_is_native = NO; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_7) #endif + fs_is_native = ns_use_native_fullscreen; +#endif + maximized_width = maximized_height = -1; nonfs_window = nil; @@ -7023,7 +7050,10 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f backing: NSBackingStoreBuffered defer: YES]; -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_7) +#endif [win setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; #endif @@ -7032,9 +7062,11 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f [win setAcceptsMouseMovedEvents: YES]; [win setDelegate: self]; -#if !defined (NS_IMPL_COCOA) || \ - MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9 - [win useOptimizedDrawing: YES]; +#if !defined (NS_IMPL_COCOA) || MAC_OS_X_VERSION_MIN_REQUIRED <= 1090 +#if MAC_OS_X_VERSION_MAX_ALLOWED > 1090 + if ([win respondsToSelector: @selector(useOptimizedDrawing:)]) +#endif + [win useOptimizedDrawing: YES]; #endif [[win contentView] addSubview: self]; @@ -7094,9 +7126,12 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f if ([col alphaComponent] != (EmacsCGFloat) 1.0) [win setOpaque: NO]; -#if !defined (NS_IMPL_COCOA) || \ - MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9 - [self allocateGState]; +#if !defined (NS_IMPL_COCOA) \ + || MAC_OS_X_VERSION_MIN_REQUIRED <= 1090 +#if MAC_OS_X_VERSION_MAX_ALLOWED > 1090 + if ([self respondsToSelector: @selector(allocateGState)]) +#endif + [self allocateGState]; #endif [NSApp registerServicesMenuSendTypes: ns_send_types returnTypes: [NSArray array]]; @@ -7104,9 +7139,12 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f /* macOS Sierra automatically enables tabbed windows. We can't allow this to be enabled until it's available on a Free system. Currently it only happens by accident and is buggy anyway. */ -#if defined (NS_IMPL_COCOA) && \ - MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12 - [win setTabbingMode: NSWindowTabbingModeDisallowed]; +#if defined (NS_IMPL_COCOA) \ + && MAC_OS_X_VERSION_MAX_ALLOWED >= 101200 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 101200 + if ([win respondsToSelector: @selector(setTabbingMode:)]) +#endif + [win setTabbingMode: NSWindowTabbingModeDisallowed]; #endif ns_window_num++; @@ -7323,7 +7361,7 @@ - (void)windowDidMiniaturize: sender } } -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 - (NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions: (NSApplicationPresentationOptions)proposedOptions @@ -7361,8 +7399,8 @@ - (void)windowDidEnterFullScreen /* provided for direct calls */ else { BOOL tbar_visible = FRAME_EXTERNAL_TOOL_BAR (emacsframe) ? YES : NO; -#ifdef NS_IMPL_COCOA -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 \ + && MAC_OS_X_VERSION_MIN_REQUIRED <= 1070 unsigned val = (unsigned)[NSApp presentationOptions]; // Mac OS X 10.7 bug fix, the menu won't appear without this. @@ -7378,7 +7416,6 @@ - (void)windowDidEnterFullScreen /* provided for direct calls */ [NSApp setPresentationOptions: options]; } #endif -#endif [toolbar setVisible:tbar_visible]; } } @@ -7417,7 +7454,7 @@ - (void)windowDidExitFullScreen /* provided for direct calls */ } [self setFSValue: fs_before_fs]; fs_before_fs = -1; -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 [self updateCollectionBehavior]; #endif if (FRAME_EXTERNAL_TOOL_BAR (emacsframe)) @@ -7449,7 +7486,7 @@ - (BOOL)isFullscreen } else { -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 res = (([[self window] styleMask] & NSWindowStyleMaskFullScreen) != 0); #else res = NO; @@ -7462,7 +7499,7 @@ - (BOOL)isFullscreen return res; } -#ifdef HAVE_NATIVE_FS +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 - (void)updateCollectionBehavior { NSTRACE ("[EmacsView updateCollectionBehavior]"); @@ -7477,7 +7514,10 @@ - (void)updateCollectionBehavior b &= ~NSWindowCollectionBehaviorFullScreenPrimary; [win setCollectionBehavior: b]; - fs_is_native = ns_use_native_fullscreen; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_7) +#endif + fs_is_native = ns_use_native_fullscreen; } } #endif @@ -7494,8 +7534,11 @@ - (void)toggleFullScreen: (id)sender if (fs_is_native) { -#ifdef HAVE_NATIVE_FS - [[self window] toggleFullScreen:sender]; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + if ([[self window] respondsToSelector: @selector(toggleFullScreen:)]) +#endif + [[self window] toggleFullScreen:sender]; #endif return; } @@ -7512,10 +7555,13 @@ - (void)toggleFullScreen: (id)sender { NSScreen *screen = [w screen]; -#if defined (NS_IMPL_COCOA) && \ - MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 /* Hide ghost menu bar on secondary monitor? */ - if (! onFirstScreen) + if (! onFirstScreen +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090 + && [NSScreen respondsToSelector: @selector(screensHaveSeparateSpaces)] +#endif + ) onFirstScreen = [NSScreen screensHaveSeparateSpaces]; #endif /* Hide dock and menubar if we are on the primary screen. */ @@ -7543,9 +7589,12 @@ - (void)toggleFullScreen: (id)sender [fw setTitle:[w title]]; [fw setDelegate:self]; [fw setAcceptsMouseMovedEvents: YES]; -#if !defined (NS_IMPL_COCOA) || \ - MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9 - [fw useOptimizedDrawing: YES]; +#if !defined (NS_IMPL_COCOA) \ + || MAC_OS_X_VERSION_MIN_REQUIRED <= 1090 +#if MAC_OS_X_VERSION_MAX_ALLOWED > 1090 + if ([fw respondsToSelector: @selector(useOptimizedDrawing:)]) +#endif + [fw useOptimizedDrawing: YES]; #endif [fw setBackgroundColor: col]; if ([col alphaComponent] != (EmacsCGFloat) 1.0) @@ -8106,10 +8155,14 @@ - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen NSTRACE_ARG_RECT (frameRect)); #ifdef NS_IMPL_COCOA -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 // If separate spaces is on, it is like each screen is independent. There is // no spanning of frames across screens. - if ([NSScreen screensHaveSeparateSpaces]) + if ( +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1090 + [NSScreen respondsToSelector: @selector(screensHaveSeparateSpaces)] && +#endif + [NSScreen screensHaveSeparateSpaces]) { NSTRACE_MSG ("Screens have separate spaces"); frameRect = [super constrainFrameRect:frameRect toScreen:screen]; @@ -8117,7 +8170,8 @@ - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen return frameRect; } else -#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 */ +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1090 */ + // Check that the proposed frameRect is visible in at least one // screen. If it is not, ask the system to reposition it (only // for non-child windows). @@ -8323,12 +8377,21 @@ + (CGFloat) scrollerWidth /* TODO: if we want to allow variable widths, this is the place to do it, however neither GNUstep nor Cocoa support it very well */ CGFloat r; -#if !defined (NS_IMPL_COCOA) || \ - MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 - r = [NSScroller scrollerWidth]; -#else - r = [NSScroller scrollerWidthForControlSize: NSControlSizeRegular - scrollerStyle: NSScrollerStyleLegacy]; +#if defined (NS_IMPL_COCOA) \ + && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + if ([NSScroller respondsToSelector: + @selector(scrollerWidthForControlSize:scrollerStyle:)]) +#endif + r = [NSScroller scrollerWidthForControlSize: NSControlSizeRegular + scrollerStyle: NSScrollerStyleLegacy]; +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + else +#endif +#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */ +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 \ + || defined (NS_IMPL_GNUSTEP) + r = [NSScroller scrollerWidth]; #endif return r; } @@ -9015,12 +9078,8 @@ Convert an X font name (XLFD) to an NS font name. doc: /*Non-nil means to use native fullscreen on Mac OS X 10.7 and later. Nil means use fullscreen the old (< 10.7) way. The old way works better with multiple monitors, but lacks tool bar. This variable is ignored on -Mac OS X < 10.7. Default is t for 10.7 and later, nil otherwise. */); -#ifdef HAVE_NATIVE_FS +Mac OS X < 10.7. Default is t. */); ns_use_native_fullscreen = YES; -#else - ns_use_native_fullscreen = NO; -#endif ns_last_use_native_fullscreen = ns_use_native_fullscreen; DEFVAR_BOOL ("ns-use-fullscreen-animation", ns_use_fullscreen_animation, -- 2.12.0 --RnlQjJ0d97Da+TV1--