Oh yeah - for sure. My Light Mode on macpro 3,1 + GTX680 is fine without transparency. The mbp5,3 however requires it (I increased contrast too) and it has a GeForce 2400M 256MB. So it's GPU/acceleration/metal (shader?) related. I think
@jackluke tried swapping out the entire Skylight framework but it doesn't boot correctly. No surprises there as Skylight is a critical private framework retooled between HS and Mojave (per my previous comment)
At this point, I think the only option is to trace through the code (as
@ASentientBot) suggested and glean a patch.
If it occurs on supported systems, Apple may respond to a radar - but I don't think it does (unless I'm mistaken) so fat chance of that happening.
Peeling though the object code I did find symbols related to shaders associated with ui components in dark (like toolbar) and a new addition from the HS base :
00000000002d32f0 b __ZL34_placeholder_selection_system_dark
A class dump of the Skylight binary also indicates the offending code is probably in WindowServer or a lower level framework or dylib. The Skylight class-dump looks like this:
Code:
//
// Generated by class-dump 3.5 (64 bit).
//
// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//
#pragma mark -
//
// File: /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight
// UUID: 25DCE5F7-0737-301F-8A27-CAB3A1AA298C
//
// Arch: x86_64
// Current version: 600.0.0
// Compatibility version: 64.0.0
// Source version: 336.8.2.0.0
//
// Objective-C Garbage Collection: Unsupported
//
@protocol MTLResource <NSObject>
@property(readonly) unsigned long long allocatedSize;
@property(readonly) id <MTLHeap> heap;
@property(readonly) unsigned long long storageMode;
@property(readonly) unsigned long long cpuCacheMode;
@property(readonly) id <MTLDevice> device;
@property(copy) NSString *label;
- (BOOL)isAliasable;
- (void)makeAliasable;
- (unsigned long long)setPurgeableState:(unsigned long long)arg1;
@end
@protocol MTLResourceSPI <MTLResource>
@property(readonly) MTLResourceAllocationInfo *cachedAllocationInfo;
@property(readonly) MTLResourceAllocationInfo *sharedAllocationInfo;
@property int responsibleProcess;
- (BOOL)doesAliasAnyResources:(const id *)arg1 count:(unsigned long long)arg2;
- (BOOL)doesAliasAllResources:(const id *)arg1 count:(unsigned long long)arg2;
- (BOOL)doesAliasResource:(id <MTLResource>)arg1;
- (void)waitUntilComplete;
- (BOOL)isComplete;
- (BOOL)isPurgeable;
@end
@protocol NSObject
@property(readonly, copy) NSString *description;
@property(readonly) Class superclass;
@property(readonly) unsigned long long hash;
- (struct _NSZone *)zone;
- (unsigned long long)retainCount;
- (id)autorelease;
- (oneway void)release;
- (id)retain;
- (BOOL)respondsToSelector:(SEL)arg1;
- (BOOL)conformsToProtocol:(Protocol *)arg1;
- (BOOL)isMemberOfClass:(Class)arg1;
- (BOOL)isKindOfClass:(Class)arg1;
- (BOOL)isProxy;
- (id)performSelector:(SEL)arg1 withObject:(id)arg2 withObject:(id)arg3;
- (id)performSelector:(SEL)arg1 withObject:(id)arg2;
- (id)performSelector:(SEL)arg1;
- (id)self;
- (Class)class;
- (BOOL)isEqual:(id)arg1;
@optional
@property(readonly, copy) NSString *debugDescription;
@end
@interface SLSessionOwner : NSObject
{
unsigned int _port;
NSNumber *_auditSessionID;
NSNumber *_sessionID;
}
+ (id)sessionOwnerForNewSessionWithAuditSessionID:(id)arg1;
+ (id)sessionOwnerForNewSessionWithAuditSessionID:(id)arg1 launchData:(id)arg2;
+ (id)sessionOwnerBySettingLoginwindowConnection:(unsigned int)arg1;
+ (id)sessionOwnerWithXPCSerialization:(id)arg1;
+ (id)sessionOwnerWithPort:(unsigned int)arg1 auditSessionID:(int)arg2 cgSessionID:(unsigned int)arg3;
@property(retain, nonatomic) NSNumber *sessionID; // @synthesize sessionID=_sessionID;
@property(retain, nonatomic) NSNumber *auditSessionID; // @synthesize auditSessionID=_auditSessionID;
@property(nonatomic) unsigned int port; // @synthesize port=_port;
@property(readonly, nonatomic, getter=isValid) BOOL valid;
- (id)createXPCSerializationAndInvalidate;
- (id)initWithXPCSerialization:(id)arg1;
- (id)initWithPort:(unsigned int)arg1 auditSessionID:(int)arg2 cgSessionID:(unsigned int)arg3;
- (void)dealloc;
@end
So some higher level code that establishes connections and sessions...