From: Alan Third <alan@idiocy.org>
To: "Charles A. Roelli" <charles@aurox.ch>
Cc: Anders Lindgren <andlind@gmail.com>, 27810@debbugs.gnu.org
Subject: bug#27810: NS runtime feature detection
Date: Thu, 10 Aug 2017 22:04:57 +0100 [thread overview]
Message-ID: <20170810210457.GA85019@breton.holly.idiocy.org> (raw)
In-Reply-To: <5d8b81c3-9a45-d59f-8dd1-c0ccc0a19c78@aurox.ch>
[-- Attachment #1: Type: text/plain, Size: 2244 bytes --]
On Mon, Aug 07, 2017 at 09:23:10PM +0200, Charles A. Roelli wrote:
> On 06/08/2017 23:29, Alan Third wrote:
> > I believe we can make this slightly neater:
> >
> > enum NSScrollerStyle {
> > NSScrollerStyleLegacy = 0,
> > NSScrollerStyleOverlay = 1
> > };
>
> Strange, it doesn't work here:
We’ll just go with what works, then.
> > I’ve done a bit more reading up on this and I think I’ve misunderstood
> > how this works, and probably mislead you.
> >
> > It seems these functions need to be declared as weak in the definition
> > of the library they’re supposed to be in. If we declare them in the
> > Emacs code‐base then the linker, reasonably, expects the functions to
> > be in the Emacs code‐base.
>
> Maybe I'm also confused. I thought we would be able to do this,
> since:
>
> - At link time, the symbol is marked as a weak reference, to be
> resolved at runtime.
>
> - At runtime, the dynamic linker resolves the reference to the weak
> symbol, setting it to NULL if it isn't available. Normally the
> definition of the function will be found in a dynamic library that
> is part of macOS (as far as I understand).
>
> The Apple compiler/linker should be capable of doing this, supposedly,
> as long as you give the magical -Wl,-U,_symbol command line arguments
> to the linker. See also https://stackoverflow.com/a/34983229.
That’s quite a good description. I guess that we want to do what
you’re suggesting, then. I’m not sure how, though. I’ll try to have a
look through configure.ac to see if I can work it out sometime over
the weekend.
> I'd like to check, but wouldn't I need to either:
>
> a) Statically link libraries Emacs depends on, or
> b) Include the dependent libraries in the app bundle?
Yes, I suppose so. I kind of assumed it would statically link at least
some of them, but I guess not.
I’ve had a look at the build scripts for emacsformacosx.com, but I
don’t understand what they’re doing.
I’ve attached what I have so far, which I think includes all your
changes except for the requirements for linker arguments.
Unfortunately master doesn’t build here now because of some other
problem so it’s untested.
--
Alan Third
[-- Attachment #2: 0001-Allow-use-of-run-time-OS-version-checks-on-macOS-bug.patch --]
[-- Type: text/plain, Size: 27410 bytes --]
From c4945387576a4fa80f6d4daf34199deba003f171 Mon Sep 17 00:00:00 2001
From: Alan Third <alan@idiocy.org>
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,
initFrameFromEmacs, windowDidMiniaturize, windowDidEnterFullScreen,
windowDidExitFullScreen, isFullscreen, updateCollectionBehavior,
toggleFullScreen, constrainFrameRect, scrollerWidth, syms_of_nsterm):
Allow use of run-time checks and replace version check macros.
(firstRectForCharacterRange): Explicit cast to (EmacsWindow *).
* src/nsfns.m (ns_screen_name): Use run-time OS version checks.
* src/macfont.m (macfont_draw): Use run-time OS version checks and
Explicit cast to (EmacsWindow *).
* src/nsmenu.m (menuWillOpen): Use run-time OS version checks.
---
src/macfont.h | 4 +-
src/macfont.m | 24 +++++---
src/nsfns.m | 83 +++++++++++++------------
| 9 ++-
src/nsterm.h | 64 +++++++++++---------
src/nsterm.m | 191 ++++++++++++++++++++++++++++++++++++++--------------------
6 files changed, 232 insertions(+), 143 deletions(-)
diff --git a/src/macfont.h b/src/macfont.h
index 32899908be..abb37cd8a6 100644
--- a/src/macfont.h
+++ b/src/macfont.h
@@ -45,12 +45,12 @@ struct mac_glyph_layout
CGGlyph glyph_id;
};
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1080
+#if !defined (MAC_OS_X_VERSION_10_8)
enum {
kCTFontTraitItalic = kCTFontItalicTrait,
kCTFontTraitBold = kCTFontBoldTrait,
kCTFontTraitMonoSpace = kCTFontMonoSpaceTrait,
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 && defined (MAC_OS_X_VERSION_10_7)
kCTFontTraitColorGlyphs = kCTFontColorGlyphsTrait
#else
kCTFontTraitColorGlyphs = (1 << 13)
diff --git a/src/macfont.m b/src/macfont.m
index 4d310e47ae..a79feac8f0 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
+ * [(EmacsWindow *) [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);
}
@@ -2883,7 +2891,7 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no
CGContextSetTextMatrix (context, atfm);
CGContextSetTextPosition (context, text_position.x, text_position.y);
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
+#if defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
if (macfont_info->color_bitmap_p
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
&& CTFontDrawGlyphs != NULL
@@ -2897,7 +2905,7 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no
}
}
else
-#endif /* MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */
+#endif /* defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */
{
CGContextSetFont (context, macfont_info->cgfont);
CGContextSetFontSize (context, font_size);
@@ -3892,7 +3900,7 @@ So we use CTFontDescriptorCreateMatchingFontDescriptor (no
{
CFArrayRef result = NULL;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
+#if defined (MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1080
if (CTFontCopyDefaultCascadeListForLanguages != NULL)
#endif
diff --git a/src/nsfns.m b/src/nsfns.m
index 36748cebb8..3f20c8e9e9 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 && defined (MAC_OS_X_VERSION_10_9)
#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,
--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..750b6fe1fe 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -25,30 +25,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#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
@@ -62,6 +38,27 @@ typedef CGFloat EmacsCGFloat;
typedef float EmacsCGFloat;
#endif
+/* macOS 10.7 introduces some new constants, enums and methods.
+ Forward declare them when building on macOS 10.6. */
+#if !defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
+#define NSFullScreenWindowMask (1 << 14)
+#define NSWindowCollectionBehaviorFullScreenPrimary (1 << 7)
+#define NSApplicationPresentationFullScreen (1 << 10)
+#define NSApplicationPresentationAutoHideToolbar (1 << 11)
+#define NSAppKitVersionNumber10_7 1138
+
+// As in https://chromium.googlesource.com/chromium/blink/+/master/Source/platform/mac/NSScrollerImpDetails.h.
+enum {
+ NSScrollerStyleLegacy = 0,
+ NSScrollerStyleOverlay = 1
+};
+typedef NSInteger NSScrollerStyle;
+
+@interface NSScroller(NSObject)
++ (CGFloat)scrollerWidthForControlSize:(NSControlSize)controlSize scrollerStyle:(NSScrollerStyle)scrollerStyle;
+@end
+#endif /* !defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 */
+
/* ==========================================================================
Trace support
@@ -471,7 +468,7 @@ typedef id instancetype;
- (void) toggleFullScreen: (id) sender;
- (BOOL) fsIsNative;
- (BOOL) isFullscreen;
-#ifdef HAVE_NATIVE_FS
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
- (void) updateCollectionBehavior;
#endif
@@ -494,6 +491,10 @@ typedef id instancetype;
{
NSPoint grabOffset;
}
+#if !defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
+- (NSRect)convertRectToScreen:(NSRect)rect;
+@property(readonly) CGFloat backingScaleFactor;
+#endif
@end
@@ -1276,8 +1277,7 @@ extern char gnustep_base_version[]; /* version tracking */
#define SCREENMAXBOUND(x) (IN_BOUND (-SCREENMAX, x, SCREENMAX))
/* 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 +1303,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 +1318,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..e0a977b927 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 = [(EmacsWindow *) [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
next prev parent reply other threads:[~2017-08-10 21:04 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20170716230109.GA54914@breton.holly.idiocy.org>
[not found] ` <1ce59431-ff6b-dc89-31a6-8fc5bd4e3926@aurox.ch>
[not found] ` <CABr8ebb788TSgj=GgP26_nOK6O2SznZaDx9bTQOgxmYfkz321g@mail.gmail.com>
[not found] ` <e6be1e89-14a9-da0a-7d15-3f29dd37e91f@aurox.ch>
[not found] ` <20170718221629.GA55506@breton.holly.idiocy.org>
[not found] ` <bdf95a23-8ea2-73c4-35c9-2943e23a36dd@aurox.ch>
[not found] ` <CABr8ebYtZqNAa5t=QYhBWebcsdFvhXGsuO4t2d2P-UeKQ8hPTQ@mail.gmail.com>
[not found] ` <20170722112230.GA58424@breton.holly.idiocy.org>
[not found] ` <20170723121701.GA3730@breton.holly.idiocy.org>
[not found] ` <508a4930-feab-588b-0ab9-f55a10ea85ec@aurox.ch>
2017-07-24 20:44 ` bug#27810: NS runtime feature detection Alan Third
2017-07-24 20:53 ` Glenn Morris
2017-07-25 17:56 ` Alan Third
2017-07-25 18:22 ` Charles A. Roelli
2017-07-25 20:08 ` Anders Lindgren
2017-07-26 21:57 ` Alan Third
2017-07-31 19:05 ` Charles A. Roelli
2017-08-01 15:38 ` Anders Lindgren
2017-08-01 22:03 ` Alan Third
2017-08-06 20:29 ` Charles A. Roelli
2017-08-06 21:29 ` Alan Third
2017-08-07 19:23 ` Charles A. Roelli
2017-08-10 21:04 ` Alan Third [this message]
2017-08-12 11:13 ` Charles A. Roelli
2017-08-12 13:02 ` Charles A. Roelli
2017-08-16 20:31 ` Alan Third
2017-08-12 15:51 ` Alan Third
2017-09-12 20:01 ` David Caldwell
2017-09-12 20:06 ` David Reitter
2017-09-12 20:34 ` Alan Third
2017-09-12 20:29 ` Alan Third
2017-09-13 19:03 ` Charles A. Roelli
2017-07-24 20:22 bug#27810: macOS " Alan Third
2017-07-26 2:59 ` Richard Stallman
2017-07-26 16:06 ` Alan Third
2017-07-27 1:43 ` Richard Stallman
2017-07-27 17:31 ` Eli Zaretskii
2017-07-28 17:14 ` Richard Stallman
2017-07-28 17:36 ` Eli Zaretskii
2017-07-29 19:04 ` Richard Stallman
2017-07-31 0:45 ` Richard Stallman
2017-07-29 19:07 ` Richard Stallman
2017-07-30 12:12 ` Alan Third
2017-07-30 14:15 ` Eli Zaretskii
2017-07-31 0:47 ` Richard Stallman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170810210457.GA85019@breton.holly.idiocy.org \
--to=alan@idiocy.org \
--cc=27810@debbugs.gnu.org \
--cc=andlind@gmail.com \
--cc=charles@aurox.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).