mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-03-20 13:16:34 -04:00
Fix compilation on macOS when clang < 9 or Qt < 5.12 (#7117)
* fix compilation on Qt not having QOperatingSystemVersion::MacOSBigSur
The code uses 'QOperatingSystemVersion::MacOSBigSur' which doesn't exist
in all Qt versions (it has been backported to Qt 5.12.10+ & 5.15.1+ only).
On older macos systems like El Capitan the last supported
version of Qt is 5.11
This will fix compilation issue on such older systems and on systems
running with Qt not supporting QOperatingSystemVersion::MacOSBigSur
Compilation error was:
error: no member named 'MacOSBigSur' in 'QOperatingSystemVersion'
* Fix compilation when osx <= 10.9
* AppKitImpl.mm: button property is new in 10.10. It is used for a feature of
KeePassXC that is only available from 10.17 onwards. So we don't need it when
compiling on <= 10.9
error: property 'button' not found on object of type 'NSStatusItem *'
NSString* appearance = [dummy.button.effectiveAppearance.name lowercaseString];
^
* The code uses @available syntax which is supported by
AppleClang >= 9 or LLVM >= 5.
We check __clang_major__ to allow compilation on older versions
of macOS that don't have a recent clang. For example on El Capitan.
* Fix compilation when osx <= 10.8
* AppKitImpl.mm: AXIsProcessTrustedWithOptions exists from 10.9 onwards
error: use of undeclared identifier 'kAXTrustedCheckOptionPrompt'
error: use of undeclared identifier 'AXIsProcessTrustedWithOptions'
* Fix compilation when osx <= 10.7
* MacUtils.cpp: CoreGraphics exists from 10.8 onwards only, capslock detection
feature would have to be implemented on OSX <= 10.7
* AppKitImpl.mm: CGDisplayStreamRef exists from 10.8 onwards only. It is used for a
feature of KeePassXC that is only available from 10.15 onwards. So we don't need it
when compiling on <= 10.7
error: unknown type name 'CGDisplayStreamRef'
* AppKitImpl.mm: Syntax is not understood by 10.7, update it to be understandable
by <= 10.7
error: expected method to read dictionary element not found on object of type 'NSDictionary *'
NSRunningApplication* app = userInfo[NSWorkspaceApplicationKey];
^
* The code uses @available syntax which is supported by
AppleClang >= 9 or LLVM >= 5.
We check __clang_major__ to allow compilation on older versions
of macOS that don't have a recent clang.
* Fix compilation error on OS X 10.11
src/core/Alloc.cpp:44:10: error: no type named 'free' in namespace 'std'
std::free(ptr);
~~~~~^
This is a regression, since it was fixed in [1]
Per [2], std::free() needs #include <cstdlib>. That file is included
indirectly on newer systems.
[1] 7c6c027d33
[2] https://en.cppreference.com/w/cpp/memory/c/free
* fix compilation when macos SDK <= 10.14
These methods are only available from macOS 10.15
- kSecAccessControlWatch
- LAPolicy.deviceOwnerAuthenticationWithBiometricsOrWatch
The code uses @available syntax which is supported by
AppleClang >= 9 or LLVM >= 5.
We check __clang_major__ to allow compilation on older versions
of macOS that don't have a recent clang.
This commit is contained in:
parent
296cbf0df7
commit
61e378077e
@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
#include <botan/mem_ops.h>
|
||||
#include <cstdlib>
|
||||
#if defined(Q_OS_MACOS)
|
||||
#include <malloc/malloc.h>
|
||||
#elif defined(Q_OS_FREEBSD)
|
||||
|
@ -60,7 +60,7 @@
|
||||
- (void) didDeactivateApplicationObserver:(NSNotification*) notification
|
||||
{
|
||||
NSDictionary* userInfo = notification.userInfo;
|
||||
NSRunningApplication* app = userInfo[NSWorkspaceApplicationKey];
|
||||
NSRunningApplication* app = [userInfo objectForKey:NSWorkspaceApplicationKey];
|
||||
|
||||
if (app.processIdentifier != [self ownProcessId]) {
|
||||
self.lastActiveApplication = app;
|
||||
@ -139,6 +139,7 @@
|
||||
//
|
||||
- (bool) isStatusBarDark
|
||||
{
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
|
||||
if (@available(macOS 10.17, *)) {
|
||||
// This is an ugly hack, but I couldn't find a way to access QTrayIcon's NSStatusItem.
|
||||
NSStatusItem* dummy = [[NSStatusBar systemStatusBar] statusItemWithLength:0];
|
||||
@ -146,6 +147,7 @@
|
||||
[[NSStatusBar systemStatusBar] removeStatusItem:dummy];
|
||||
return [appearance containsString:@"dark"];
|
||||
}
|
||||
#endif
|
||||
|
||||
return [self isDarkMode];
|
||||
}
|
||||
@ -166,9 +168,13 @@
|
||||
//
|
||||
- (bool) enableAccessibility
|
||||
{
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
|
||||
// Request accessibility permissions for Auto-Type type on behalf of the user
|
||||
NSDictionary* opts = @{static_cast<id>(kAXTrustedCheckOptionPrompt): @YES};
|
||||
return AXIsProcessTrustedWithOptions(static_cast<CFDictionaryRef>(opts));
|
||||
#else
|
||||
return YES;
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
@ -176,6 +182,7 @@
|
||||
//
|
||||
- (bool) enableScreenRecording
|
||||
{
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
|
||||
if (@available(macOS 10.15, *)) {
|
||||
// Request screen recording permission on macOS 10.15+
|
||||
// This is necessary to get the current window title
|
||||
@ -193,6 +200,7 @@
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,10 @@
|
||||
#include <QWindow>
|
||||
|
||||
#include <ApplicationServices/ApplicationServices.h>
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
|
||||
#include <CoreGraphics/CGEventSource.h>
|
||||
#endif
|
||||
|
||||
#define INVALID_KEYCODE 0xFFFF
|
||||
|
||||
@ -138,7 +141,11 @@ void MacUtils::setLaunchAtStartup(bool enable)
|
||||
|
||||
bool MacUtils::isCapslockEnabled()
|
||||
{
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080
|
||||
return (CGEventSourceFlagsState(kCGEventSourceStateHIDSystemState) & kCGEventFlagMaskAlphaShift) != 0;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -41,8 +41,10 @@
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
#include <QMainWindow>
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
|
||||
#include <QOperatingSystemVersion>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "gui/Icons.h"
|
||||
|
||||
@ -279,16 +281,22 @@ namespace Phantom
|
||||
#ifdef Q_OS_MACOS
|
||||
QColor tabBarBase(const QPalette& pal)
|
||||
{
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 10) && QT_VERSION < QT_VERSION_CHECK(5, 13, 0) \
|
||||
|| QT_VERSION >= QT_VERSION_CHECK(5, 15, 1)
|
||||
if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSBigSur) {
|
||||
return hack_isLightPalette(pal) ? QRgb(0xD4D4D4) : QRgb(0x2A2A2A);
|
||||
}
|
||||
#endif
|
||||
return hack_isLightPalette(pal) ? QRgb(0xDD1D1D1) : QRgb(0x252525);
|
||||
}
|
||||
QColor tabBarBaseInactive(const QPalette& pal)
|
||||
{
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 10) && QT_VERSION < QT_VERSION_CHECK(5, 13, 0) \
|
||||
|| QT_VERSION >= QT_VERSION_CHECK(5, 15, 1)
|
||||
if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSBigSur) {
|
||||
return hack_isLightPalette(pal) ? QRgb(0xF5F5F5) : QRgb(0x2D2D2D);
|
||||
}
|
||||
#endif
|
||||
return hack_isLightPalette(pal) ? QRgb(0xF4F4F4) : QRgb(0x282828);
|
||||
}
|
||||
#endif
|
||||
|
@ -95,6 +95,7 @@ bool TouchID::storeKey(const QString& databasePath, const QByteArray& passwordKe
|
||||
// prepare adding secure entry to the macOS KeyChain
|
||||
CFErrorRef error = NULL;
|
||||
SecAccessControlRef sacObject;
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
|
||||
if (@available(macOS 10.15, *)) {
|
||||
// kSecAccessControlWatch is only available for macOS 10.15 and later
|
||||
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
|
||||
@ -102,11 +103,14 @@ bool TouchID::storeKey(const QString& databasePath, const QByteArray& passwordKe
|
||||
kSecAccessControlOr | kSecAccessControlBiometryCurrentSet | kSecAccessControlWatch,
|
||||
&error);
|
||||
} else {
|
||||
#endif
|
||||
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
|
||||
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
|
||||
kSecAccessControlTouchIDCurrentSet, // depr: kSecAccessControlBiometryCurrentSet,
|
||||
&error);
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if (sacObject == NULL || error != NULL) {
|
||||
@ -234,11 +238,15 @@ bool TouchID::isAvailable()
|
||||
LAContext* context = [[LAContext alloc] init];
|
||||
|
||||
LAPolicy policyCode;
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
|
||||
if (@available(macOS 10.15, *)) {
|
||||
policyCode = LAPolicyDeviceOwnerAuthenticationWithBiometricsOrWatch;
|
||||
} else {
|
||||
#endif
|
||||
policyCode = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
|
||||
}
|
||||
#endif
|
||||
|
||||
bool canAuthenticate = [context canEvaluatePolicy:policyCode error:nil];
|
||||
[context release];
|
||||
@ -274,11 +282,15 @@ bool TouchID::authenticate(const QString& message) const
|
||||
NSString* authMessage = msg.toNSString(); // autoreleased
|
||||
|
||||
LAPolicy policyCode;
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
|
||||
if (@available(macOS 10.15, *)) {
|
||||
policyCode = LAPolicyDeviceOwnerAuthenticationWithBiometricsOrWatch;
|
||||
} else {
|
||||
#endif
|
||||
policyCode = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
|
||||
#if __clang_major__ >= 9 && MAC_OS_X_VERSION_MIN_REQUIRED >= 101500
|
||||
}
|
||||
#endif
|
||||
|
||||
[context evaluatePolicy:policyCode
|
||||
localizedReason:authMessage reply:^(BOOL success, NSError* error) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user