mirror of
https://github.com/crystalidea/qt-build-tools.git
synced 2024-11-22 19:00:04 +08:00
no more 5.13.0 & 5.13.1
This commit is contained in:
parent
da8de2cb52
commit
653d0f7aae
Binary file not shown.
Binary file not shown.
@ -1,72 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# requirements:
|
|
||||||
# 1. brew
|
|
||||||
# 2. brew install llvm (https://bugreports.qt.io/browse/QTBUG-66353)
|
|
||||||
|
|
||||||
export PATH=$PATH:/usr/local/Qt-5.13.0/bin
|
|
||||||
|
|
||||||
cd qtbase
|
|
||||||
|
|
||||||
if [[ $1 == openssl ]]; then
|
|
||||||
|
|
||||||
# download openssl
|
|
||||||
curl -O https://www.openssl.org/source/openssl-1.1.1a.tar.gz
|
|
||||||
tar -xvzf openssl-1.1.1a.tar.gz
|
|
||||||
|
|
||||||
# compile openssl
|
|
||||||
cd openssl-1.1.1a
|
|
||||||
./Configure darwin64-x86_64-cc --prefix=$PWD/dist
|
|
||||||
make
|
|
||||||
# print arch info (optional)
|
|
||||||
lipo -info libssl.a
|
|
||||||
lipo -info libcrypto.a
|
|
||||||
make install
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# continue
|
|
||||||
|
|
||||||
OPENSSL_LIBS='-L$PWD/openssl-1.1.1a/dist/lib -lssl -lcrypto' ./configure -opensource -confirm-license -no-securetransport -nomake examples -nomake tests -openssl-linked -I $PWD/openssl-1.1.1a/dist/include -L $PWD/openssl-1.1.1a/dist/lib
|
|
||||||
|
|
||||||
elif [[ $1 == securetransport ]]; then
|
|
||||||
|
|
||||||
./configure -opensource -confirm-license -nomake examples -nomake tests -no-openssl -securetransport
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
echo "Error: please specify which SSL layer to use (openssl or securetransport)"
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
make -j 12
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
cd ../qttools
|
|
||||||
qmake
|
|
||||||
make -j 12
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
cd ../qtmacextras
|
|
||||||
qmake
|
|
||||||
make -j 12
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
cd ../qtdeclarative/src
|
|
||||||
qmake
|
|
||||||
make -j 12 sub-qmldevtools
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
# make docs - currently doesnt work
|
|
||||||
|
|
||||||
#cd ../qtbase
|
|
||||||
#make -j 12 docs
|
|
||||||
#cd ../qttools
|
|
||||||
#make -j 12 docs
|
|
||||||
#cd ../qtmacextras
|
|
||||||
#make -j 12 docs
|
|
||||||
|
|
||||||
#echo maki | sudo -S cp -f -r ../qtbase/doc /usr/local/Qt-5.13.0/
|
|
||||||
|
|
||||||
cd /usr/local
|
|
||||||
zip -r ~/Desktop/qt5.13.0_mac.zip Qt-5.13.0/*
|
|
@ -1,86 +0,0 @@
|
|||||||
use strict;
|
|
||||||
|
|
||||||
die "Cannot proceed without the 'bin' folder'" if (!-e "bin");
|
|
||||||
|
|
||||||
my $arch = $ARGV[0];
|
|
||||||
my $openssl_v_major = "1.1.1"; # The 1.1.1 series is Long Term Support (LTS) release, supported until 11th September 2023
|
|
||||||
my $openssl_v_minor = "a";
|
|
||||||
my $openssl_version = "$openssl_v_major$openssl_v_minor";
|
|
||||||
my $openssl_dir = "openssl-$openssl_version";
|
|
||||||
my $openssl_download = "https://www.openssl.org/source/openssl-$openssl_version.tar.gz";
|
|
||||||
my $openssl_arch = $arch eq "amd64" ? "WIN64A" : "WIN32";
|
|
||||||
|
|
||||||
$arch = "x86" if ($arch eq ''); # specify x86 is nothing is specified
|
|
||||||
die "Please specify architecture (x86 or amd64)" if ($arch ne "x86" && $arch ne "amd64"); # die if user specified anything except x86 or amd64
|
|
||||||
|
|
||||||
# will create a batch file
|
|
||||||
|
|
||||||
my $batfile = 'compile_win.bat';
|
|
||||||
|
|
||||||
open BAT, '>', $batfile;
|
|
||||||
|
|
||||||
printLineToBat ("SET PATH=%PATH%;%cd%\\bin"); # add bin folder to the path for 7z and wget
|
|
||||||
printLineToBat ("CALL \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" $arch");
|
|
||||||
printLineToBat ("SET _ROOT=%cd%");
|
|
||||||
printLineToBat ("SET PATH=%_ROOT%\\qtbase\\bin;%_ROOT%\\gnuwin32\\bin;%PATH%"); # http://doc.qt.io/qt-5/windows-building.html
|
|
||||||
|
|
||||||
printLineToBat ("cd qtbase");
|
|
||||||
printLineToBat ("if \"%~1\"==\"step2\" goto step2");
|
|
||||||
|
|
||||||
# step1: compile openssl and do configure. For some reason, can't continue script execution after configure, have to make step2
|
|
||||||
printLineToBat ("IF EXIST $openssl_dir\\build GOTO OPENSSL_ALREAD_COMPILED");
|
|
||||||
printLineToBat ("wget --no-check-certificate $openssl_download");
|
|
||||||
printLineToBat ("7z x openssl-$openssl_version.tar.gz");
|
|
||||||
printLineToBat ("7z x openssl-$openssl_version.tar");
|
|
||||||
printLineToBat ("rm openssl-$openssl_version.tar.gz");
|
|
||||||
printLineToBat ("rm openssl-$openssl_version.tar");
|
|
||||||
printLineToBat ("cd $openssl_dir");
|
|
||||||
printLineToBat ("perl Configure VC-$openssl_arch no-asm no-shared no-tests --prefix=%cd%\\build --openssldir=%cd%\\build");
|
|
||||||
printLineToBat ("nmake");
|
|
||||||
printLineToBat ("nmake install");
|
|
||||||
# do little clean up
|
|
||||||
printLineToBat ("rm test\\*.exe");
|
|
||||||
printLineToBat ("rm test\\*.pdb");
|
|
||||||
printLineToBat ("rm test\\*.obj");
|
|
||||||
printLineToBat (":OPENSSL_ALREAD_COMPILED");
|
|
||||||
# go back to qtbase
|
|
||||||
printLineToBat ("cd ..");
|
|
||||||
|
|
||||||
# -developer-build creates an in-source build for developer usage.
|
|
||||||
# openssl: see https://bugreports.qt.io/browse/QTBUG-65501
|
|
||||||
printLineToBat ("configure -opensource -developer-build -confirm-license -opengl desktop -mp -nomake tests -nomake examples -I \"%cd%\\$openssl_dir\\build\\include\" -openssl-linked OPENSSL_LIBS=\"%cd%\\$openssl_dir\\build\\lib\\libssl.lib %cd%\\$openssl_dir\\build\\lib\\libcrypto.lib -lcrypt32 -lws2_32 -lAdvapi32 -luser32\"");
|
|
||||||
printLineToBat ("goto :EOF");
|
|
||||||
|
|
||||||
# step 2:
|
|
||||||
printLineToBat (":step2");
|
|
||||||
|
|
||||||
printLineToBat ("nmake");
|
|
||||||
printLineToBat ("cd ..\\qttools");
|
|
||||||
printLineToBat ("..\\qtbase\\bin\\qmake");
|
|
||||||
printLineToBat ("nmake");
|
|
||||||
printLineToBat ("cd ..\\qtbase");
|
|
||||||
printLineToBat ("cd .."); # go up to qt dir
|
|
||||||
# openssl clean up
|
|
||||||
printLineToBat ("cd qtbase");
|
|
||||||
printLineToBat ("cd $openssl_dir");
|
|
||||||
printLineToBat ("del /s /f /q out32");
|
|
||||||
printLineToBat ("del /s /f /q out32.dbg");
|
|
||||||
printLineToBat ("cd ..");
|
|
||||||
printLineToBat ("cd ..");
|
|
||||||
# the rest
|
|
||||||
printLineToBat ("del *.obj /s /f");
|
|
||||||
printLineToBat ("del *.ilk /s /f");
|
|
||||||
printLineToBat ("del *.pch /s /f");
|
|
||||||
printLineToBat ("del Makefile* /s /f");
|
|
||||||
|
|
||||||
close BAT;
|
|
||||||
|
|
||||||
system ($batfile);
|
|
||||||
system ("$batfile step2");
|
|
||||||
|
|
||||||
system ("pause");
|
|
||||||
|
|
||||||
sub printLineToBat
|
|
||||||
{
|
|
||||||
print BAT "$_[0]\n";
|
|
||||||
}
|
|
@ -1,119 +0,0 @@
|
|||||||
#
|
|
||||||
# This file is used as a basis for the following compilers:
|
|
||||||
#
|
|
||||||
# - Microsoft C/C++ Optimizing Compiler (all desktop versions)
|
|
||||||
# - Intel C++ Compiler on Windows
|
|
||||||
# - Clang-cl
|
|
||||||
#
|
|
||||||
# Baseline:
|
|
||||||
#
|
|
||||||
# - Visual Studio 2005 (8.0), VC++ 14.0
|
|
||||||
#
|
|
||||||
# Version-specific settings go in msvc-version.conf (loaded by default_pre)
|
|
||||||
#
|
|
||||||
|
|
||||||
MAKEFILE_GENERATOR = MSVC.NET
|
|
||||||
QMAKE_PLATFORM = win32
|
|
||||||
QMAKE_COMPILER = msvc
|
|
||||||
CONFIG += flat debug_and_release debug_and_release_target precompile_header autogen_precompile_source embed_manifest_dll embed_manifest_exe
|
|
||||||
# MSVC 2017 15.8+ fixed std::aligned_storage but compilation fails without
|
|
||||||
# _ENABLE_EXTENDED_ALIGNED_STORAGE flag since the fix breaks binary compatibility.
|
|
||||||
DEFINES += UNICODE _UNICODE WIN32 _ENABLE_EXTENDED_ALIGNED_STORAGE
|
|
||||||
QMAKE_COMPILER_DEFINES += _WIN32
|
|
||||||
contains(QMAKE_TARGET.arch, x86_64) {
|
|
||||||
DEFINES += WIN64
|
|
||||||
QMAKE_COMPILER_DEFINES += _WIN64
|
|
||||||
}
|
|
||||||
|
|
||||||
QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Od
|
|
||||||
QMAKE_CFLAGS_OPTIMIZE = -O2
|
|
||||||
QMAKE_CFLAGS_OPTIMIZE_SIZE = -O1
|
|
||||||
|
|
||||||
QMAKE_CC = cl
|
|
||||||
QMAKE_LEX = flex
|
|
||||||
QMAKE_LEXFLAGS =
|
|
||||||
QMAKE_YACC = bison -y
|
|
||||||
QMAKE_YACCFLAGS = -d
|
|
||||||
QMAKE_CFLAGS = -nologo -Zc:wchar_t
|
|
||||||
QMAKE_CFLAGS_WARN_ON = -W3
|
|
||||||
QMAKE_CFLAGS_WARN_OFF = -W0
|
|
||||||
QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MD -Zi
|
|
||||||
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD
|
|
||||||
QMAKE_CFLAGS_DEBUG = -Zi -MDd
|
|
||||||
QMAKE_CFLAGS_YACC =
|
|
||||||
QMAKE_CFLAGS_LTCG = -GL
|
|
||||||
|
|
||||||
contains(QMAKE_TARGET.arch, x86_64) {
|
|
||||||
# SSE2 is mandatory on 64-bit mode, so skip the option. It triggers:
|
|
||||||
# cl : Command line warning D9002 : ignoring unknown option '-arch:SSE2'
|
|
||||||
QMAKE_CFLAGS_SSE2 =
|
|
||||||
} else {
|
|
||||||
QMAKE_CFLAGS_SSE2 = -arch:SSE2
|
|
||||||
}
|
|
||||||
QMAKE_CFLAGS_SSE3 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SSSE3 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SSE4_1 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SSE4_2 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_AESNI = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SHANI = $$QMAKE_CFLAGS_SSE2
|
|
||||||
|
|
||||||
QMAKE_CXX = $$QMAKE_CC
|
|
||||||
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
|
|
||||||
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON -w34100 -w34189 -w44996
|
|
||||||
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
|
||||||
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
|
|
||||||
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
|
|
||||||
QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
|
|
||||||
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
|
|
||||||
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
|
|
||||||
QMAKE_CXXFLAGS_STL_ON = -EHsc
|
|
||||||
QMAKE_CXXFLAGS_STL_OFF =
|
|
||||||
QMAKE_CXXFLAGS_RTTI_ON = -GR
|
|
||||||
QMAKE_CXXFLAGS_RTTI_OFF =
|
|
||||||
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -EHsc
|
|
||||||
QMAKE_CXXFLAGS_EXCEPTIONS_OFF =
|
|
||||||
|
|
||||||
QMAKE_INCDIR =
|
|
||||||
|
|
||||||
QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$obj $src
|
|
||||||
QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
|
|
||||||
QMAKE_RUN_CC_IMP_BATCH = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ @<<
|
|
||||||
QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$obj $src
|
|
||||||
QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
|
|
||||||
QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
|
|
||||||
|
|
||||||
QMAKE_LINK = link
|
|
||||||
QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT
|
|
||||||
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO
|
|
||||||
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO
|
|
||||||
QMAKE_LFLAGS_DEBUG = /DEBUG
|
|
||||||
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
|
|
||||||
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS
|
|
||||||
QMAKE_LFLAGS_EXE = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
|
|
||||||
QMAKE_LFLAGS_DLL = /DLL
|
|
||||||
QMAKE_LFLAGS_LTCG = /LTCG
|
|
||||||
QMAKE_PREFIX_SHLIB =
|
|
||||||
QMAKE_EXTENSION_SHLIB = dll
|
|
||||||
QMAKE_PREFIX_STATICLIB =
|
|
||||||
QMAKE_EXTENSION_STATICLIB = lib
|
|
||||||
|
|
||||||
QMAKE_LIBS =
|
|
||||||
QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib uuid.lib user32.lib advapi32.lib
|
|
||||||
QMAKE_LIBS_NETWORK = ws2_32.lib user32.lib gdi32.lib
|
|
||||||
QMAKE_LIBS_OPENGL = glu32.lib opengl32.lib gdi32.lib user32.lib
|
|
||||||
QMAKE_LIBS_OPENGL_ES2 = gdi32.lib user32.lib
|
|
||||||
QMAKE_LIBS_OPENGL_ES2_DEBUG = gdi32.lib user32.lib
|
|
||||||
QMAKE_LIBS_COMPAT = advapi32.lib shell32.lib comdlg32.lib user32.lib gdi32.lib ws2_32.lib
|
|
||||||
QMAKE_LIBS_QT_ENTRY = -lqtmain
|
|
||||||
|
|
||||||
QMAKE_IDL = midl
|
|
||||||
QMAKE_LIB = lib /NOLOGO
|
|
||||||
QMAKE_RC = rc /NOLOGO
|
|
||||||
|
|
||||||
VCPROJ_EXTENSION = .vcproj
|
|
||||||
VCSOLUTION_EXTENSION = .sln
|
|
||||||
VCPROJ_KEYWORD = Qt4VSv1.0
|
|
||||||
|
|
||||||
include(angle.conf)
|
|
||||||
include(windows-desktop.conf)
|
|
||||||
include(windows-vulkan.conf)
|
|
@ -1,431 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2018 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of the plugins of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 3 requirements
|
|
||||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 2.0 or (at your option) the GNU General
|
|
||||||
** Public license version 3 or any later version approved by the KDE Free
|
|
||||||
** Qt Foundation. The licenses are as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
||||||
** included in the packaging of this file. Please review the following
|
|
||||||
** information to ensure the GNU General Public License requirements will
|
|
||||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
||||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (c) 2007-2008, Apple, Inc.
|
|
||||||
**
|
|
||||||
** All rights reserved.
|
|
||||||
**
|
|
||||||
** Redistribution and use in source and binary forms, with or without
|
|
||||||
** modification, are permitted provided that the following conditions are met:
|
|
||||||
**
|
|
||||||
** * Redistributions of source code must retain the above copyright notice,
|
|
||||||
** this list of conditions and the following disclaimer.
|
|
||||||
**
|
|
||||||
** * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
** this list of conditions and the following disclaimer in the documentation
|
|
||||||
** and/or other materials provided with the distribution.
|
|
||||||
**
|
|
||||||
** * Neither the name of Apple, Inc. nor the names of its contributors
|
|
||||||
** may be used to endorse or promote products derived from this software
|
|
||||||
** without specific prior written permission.
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#import "qcocoaapplicationdelegate.h"
|
|
||||||
#include "qcocoaintegration.h"
|
|
||||||
#include "qcocoamenu.h"
|
|
||||||
#include "qcocoamenuloader.h"
|
|
||||||
#include "qcocoamenuitem.h"
|
|
||||||
#include "qcocoansmenu.h"
|
|
||||||
|
|
||||||
#include <qevent.h>
|
|
||||||
#include <qurl.h>
|
|
||||||
#include <qdebug.h>
|
|
||||||
#include <qguiapplication.h>
|
|
||||||
#include <private/qguiapplication_p.h>
|
|
||||||
#include "qt_mac_p.h"
|
|
||||||
#include <qpa/qwindowsysteminterface.h>
|
|
||||||
#include <qwindowdefs.h>
|
|
||||||
|
|
||||||
QT_USE_NAMESPACE
|
|
||||||
|
|
||||||
@implementation QCocoaApplicationDelegate {
|
|
||||||
bool startedQuit;
|
|
||||||
NSObject <NSApplicationDelegate> *reflectionDelegate;
|
|
||||||
bool inLaunch;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (instancetype)sharedDelegate
|
|
||||||
{
|
|
||||||
static QCocoaApplicationDelegate *shared = nil;
|
|
||||||
static dispatch_once_t onceToken;
|
|
||||||
dispatch_once(&onceToken, ^{
|
|
||||||
shared = [[self alloc] init];
|
|
||||||
atexit_b(^{
|
|
||||||
[shared release];
|
|
||||||
shared = nil;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return shared;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
self = [super init];
|
|
||||||
if (self) {
|
|
||||||
inLaunch = true;
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)dealloc
|
|
||||||
{
|
|
||||||
[_dockMenu release];
|
|
||||||
if (reflectionDelegate) {
|
|
||||||
[[NSApplication sharedApplication] setDelegate:reflectionDelegate];
|
|
||||||
[reflectionDelegate release];
|
|
||||||
}
|
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
||||||
|
|
||||||
[super dealloc];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSMenu *)applicationDockMenu:(NSApplication *)sender
|
|
||||||
{
|
|
||||||
Q_UNUSED(sender);
|
|
||||||
// Manually invoke the delegate's -menuWillOpen: method.
|
|
||||||
// See QTBUG-39604 (and its fix) for details.
|
|
||||||
[self.dockMenu.delegate menuWillOpen:self.dockMenu];
|
|
||||||
return [[self.dockMenu retain] autorelease];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)canQuit
|
|
||||||
{
|
|
||||||
[[NSApp mainMenu] cancelTracking];
|
|
||||||
|
|
||||||
bool handle_quit = true;
|
|
||||||
NSMenuItem *quitMenuItem = [[QT_MANGLE_NAMESPACE(QCocoaMenuLoader) sharedMenuLoader] quitMenuItem];
|
|
||||||
if (!QGuiApplicationPrivate::instance()->modalWindowList.isEmpty()
|
|
||||||
&& [quitMenuItem isEnabled]) {
|
|
||||||
int visible = 0;
|
|
||||||
const QWindowList tlws = QGuiApplication::topLevelWindows();
|
|
||||||
for (int i = 0; i < tlws.size(); ++i) {
|
|
||||||
if (tlws.at(i)->isVisible())
|
|
||||||
++visible;
|
|
||||||
}
|
|
||||||
handle_quit = (visible <= 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle_quit) {
|
|
||||||
QCloseEvent ev;
|
|
||||||
QGuiApplication::sendEvent(qGuiApp, &ev);
|
|
||||||
if (ev.isAccepted()) {
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function will only be called when NSApp is actually running.
|
|
||||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
|
|
||||||
{
|
|
||||||
// The reflection delegate gets precedence
|
|
||||||
if (reflectionDelegate) {
|
|
||||||
if ([reflectionDelegate respondsToSelector:@selector(applicationShouldTerminate:)])
|
|
||||||
return [reflectionDelegate applicationShouldTerminate:sender];
|
|
||||||
return NSTerminateNow;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([self canQuit]) {
|
|
||||||
if (!startedQuit) {
|
|
||||||
startedQuit = true;
|
|
||||||
// Close open windows. This is done in order to deliver de-expose
|
|
||||||
// events while the event loop is still running.
|
|
||||||
const QWindowList topLevels = QGuiApplication::topLevelWindows();
|
|
||||||
for (int i = 0; i < topLevels.size(); ++i) {
|
|
||||||
QWindow *topLevelWindow = topLevels.at(i);
|
|
||||||
// Already closed windows will not have a platform window, skip those
|
|
||||||
if (topLevelWindow->handle())
|
|
||||||
QWindowSystemInterface::handleCloseEvent(topLevelWindow);
|
|
||||||
}
|
|
||||||
QWindowSystemInterface::flushWindowSystemEvents();
|
|
||||||
|
|
||||||
QGuiApplication::exit(0);
|
|
||||||
startedQuit = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QGuiApplicationPrivate::instance()->threadData->eventLoops.isEmpty()) {
|
|
||||||
// INVARIANT: No event loop is executing. This probably
|
|
||||||
// means that Qt is used as a plugin, or as a part of a native
|
|
||||||
// Cocoa application. In any case it should be fine to
|
|
||||||
// terminate now:
|
|
||||||
return NSTerminateNow;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NSTerminateCancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
Q_UNUSED(notification);
|
|
||||||
|
|
||||||
/*
|
|
||||||
From the Cocoa documentation: "A good place to install event handlers
|
|
||||||
is in the applicationWillFinishLaunching: method of the application
|
|
||||||
delegate. At that point, the Application Kit has installed its default
|
|
||||||
event handlers, so if you install a handler for one of the same events,
|
|
||||||
it will replace the Application Kit version."
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
If Qt is used as a plugin, we let the 3rd party application handle
|
|
||||||
events like quit and open file events. Otherwise, if we install our own
|
|
||||||
handlers, we easily end up breaking functionality the 3rd party
|
|
||||||
application depends on.
|
|
||||||
*/
|
|
||||||
NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager];
|
|
||||||
/*[eventManager setEventHandler:self
|
|
||||||
andSelector:@selector(appleEventQuit:withReplyEvent:)
|
|
||||||
forEventClass:kCoreEventClass
|
|
||||||
andEventID:kAEQuitApplication];*/
|
|
||||||
[eventManager setEventHandler:self
|
|
||||||
andSelector:@selector(getUrl:withReplyEvent:)
|
|
||||||
forEventClass:kInternetEventClass
|
|
||||||
andEventID:kAEGetURL];
|
|
||||||
}
|
|
||||||
|
|
||||||
// called by QCocoaIntegration's destructor before resetting the application delegate to nil
|
|
||||||
- (void)removeAppleEventHandlers
|
|
||||||
{
|
|
||||||
NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager];
|
|
||||||
//[eventManager removeEventHandlerForEventClass:kCoreEventClass andEventID:kAEQuitApplication];
|
|
||||||
[eventManager removeEventHandlerForEventClass:kInternetEventClass andEventID:kAEGetURL];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (bool)inLaunch
|
|
||||||
{
|
|
||||||
return inLaunch;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
Q_UNUSED(aNotification);
|
|
||||||
inLaunch = false;
|
|
||||||
|
|
||||||
if (qEnvironmentVariableIsEmpty("QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM")) {
|
|
||||||
// Move the application window to front to avoid launching behind the terminal.
|
|
||||||
// Ignoring other apps is necessary (we must ignore the terminal), but makes
|
|
||||||
// Qt apps play slightly less nice with other apps when lanching from Finder
|
|
||||||
// (See the activateIgnoringOtherApps docs.)
|
|
||||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
|
|
||||||
{
|
|
||||||
Q_UNUSED(filenames);
|
|
||||||
Q_UNUSED(sender);
|
|
||||||
|
|
||||||
for (NSString *fileName in filenames) {
|
|
||||||
QString qtFileName = QString::fromNSString(fileName);
|
|
||||||
if (inLaunch) {
|
|
||||||
// We need to be careful because Cocoa will be nice enough to take
|
|
||||||
// command line arguments and send them to us as events. Given the history
|
|
||||||
// of Qt Applications, this will result in behavior people don't want, as
|
|
||||||
// they might be doing the opening themselves with the command line parsing.
|
|
||||||
if (qApp->arguments().contains(qtFileName))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QWindowSystemInterface::handleFileOpenEvent(qtFileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reflectionDelegate &&
|
|
||||||
[reflectionDelegate respondsToSelector:@selector(application:openFiles:)])
|
|
||||||
[reflectionDelegate application:sender openFiles:filenames];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
|
|
||||||
{
|
|
||||||
// If we have a reflection delegate, that will get to call the shots.
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:
|
|
||||||
@selector(applicationShouldTerminateAfterLastWindowClosed:)])
|
|
||||||
return [reflectionDelegate applicationShouldTerminateAfterLastWindowClosed:sender];
|
|
||||||
return NO; // Someday qApp->quitOnLastWindowClosed(); when QApp and NSApp work closer together.
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidBecomeActive:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:@selector(applicationDidBecomeActive:)])
|
|
||||||
[reflectionDelegate applicationDidBecomeActive:notification];
|
|
||||||
|
|
||||||
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidResignActive:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:@selector(applicationDidResignActive:)])
|
|
||||||
[reflectionDelegate applicationDidResignActive:notification];
|
|
||||||
|
|
||||||
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationInactive);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
|
|
||||||
{
|
|
||||||
Q_UNUSED(theApplication);
|
|
||||||
Q_UNUSED(flag);
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:@selector(applicationShouldHandleReopen:hasVisibleWindows:)])
|
|
||||||
return [reflectionDelegate applicationShouldHandleReopen:theApplication hasVisibleWindows:flag];
|
|
||||||
|
|
||||||
/*
|
|
||||||
true to force delivery of the event even if the application state is already active,
|
|
||||||
because rapp (handle reopen) events are sent each time the dock icon is clicked regardless
|
|
||||||
of the active state of the application or number of visible windows. For example, a browser
|
|
||||||
app that has no windows opened would need the event be to delivered even if it was already
|
|
||||||
active in order to create a new window as per OS X conventions.
|
|
||||||
*/
|
|
||||||
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive, true /*forcePropagate*/);
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)setReflectionDelegate:(NSObject <NSApplicationDelegate> *)oldDelegate
|
|
||||||
{
|
|
||||||
[oldDelegate retain];
|
|
||||||
[reflectionDelegate release];
|
|
||||||
reflectionDelegate = oldDelegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
|
|
||||||
{
|
|
||||||
NSMethodSignature *result = [super methodSignatureForSelector:aSelector];
|
|
||||||
if (!result && reflectionDelegate) {
|
|
||||||
result = [reflectionDelegate methodSignatureForSelector:aSelector];
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)respondsToSelector:(SEL)aSelector
|
|
||||||
{
|
|
||||||
BOOL result = [super respondsToSelector:aSelector];
|
|
||||||
if (!result && reflectionDelegate)
|
|
||||||
result = [reflectionDelegate respondsToSelector:aSelector];
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)forwardInvocation:(NSInvocation *)invocation
|
|
||||||
{
|
|
||||||
SEL invocationSelector = [invocation selector];
|
|
||||||
if (reflectionDelegate && [reflectionDelegate respondsToSelector:invocationSelector])
|
|
||||||
[invocation invokeWithTarget:reflectionDelegate];
|
|
||||||
else
|
|
||||||
[self doesNotRecognizeSelector:invocationSelector];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
|
|
||||||
{
|
|
||||||
Q_UNUSED(replyEvent);
|
|
||||||
NSString *urlString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
|
|
||||||
QWindowSystemInterface::handleFileOpenEvent(QUrl(QString::fromNSString(urlString)));
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)appleEventQuit:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
|
|
||||||
{
|
|
||||||
Q_UNUSED(event);
|
|
||||||
Q_UNUSED(replyEvent);
|
|
||||||
[NSApp terminate:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation QCocoaApplicationDelegate (Menus)
|
|
||||||
|
|
||||||
- (BOOL)validateMenuItem:(NSMenuItem*)item
|
|
||||||
{
|
|
||||||
auto *nativeItem = qt_objc_cast<QCocoaNSMenuItem *>(item);
|
|
||||||
if (!nativeItem)
|
|
||||||
return item.enabled; // FIXME Test with with Qt as plugin or embedded QWindow.
|
|
||||||
|
|
||||||
auto *platformItem = nativeItem.platformMenuItem;
|
|
||||||
if (!platformItem) // Try a bit harder with orphan menu itens
|
|
||||||
return item.hasSubmenu || (item.enabled && (item.action != @selector(qt_itemFired:)));
|
|
||||||
|
|
||||||
// Menu-holding items are always enabled, as it's conventional in Cocoa
|
|
||||||
if (platformItem->menu())
|
|
||||||
return YES;
|
|
||||||
|
|
||||||
return platformItem->isEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation QCocoaApplicationDelegate (MenuAPI)
|
|
||||||
|
|
||||||
- (void)qt_itemFired:(QCocoaNSMenuItem *)item
|
|
||||||
{
|
|
||||||
if (item.hasSubmenu)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto *nativeItem = qt_objc_cast<QCocoaNSMenuItem *>(item);
|
|
||||||
Q_ASSERT_X(nativeItem, qPrintable(__FUNCTION__), "Triggered menu item is not a QCocoaNSMenuItem.");
|
|
||||||
auto *platformItem = nativeItem.platformMenuItem;
|
|
||||||
// Menu-holding items also get a target to play nicely
|
|
||||||
// with NSMenuValidation but should not trigger.
|
|
||||||
if (!platformItem || platformItem->menu())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData);
|
|
||||||
QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers:[NSEvent modifierFlags]];
|
|
||||||
|
|
||||||
static QMetaMethod activatedSignal = QMetaMethod::fromSignal(&QCocoaMenuItem::activated);
|
|
||||||
activatedSignal.invoke(platformItem, Qt::QueuedConnection);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
@ -1,244 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2017 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of the plugins of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 3 requirements
|
|
||||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 2.0 or (at your option) the GNU General
|
|
||||||
** Public license version 3 or any later version approved by the KDE Free
|
|
||||||
** Qt Foundation. The licenses are as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
||||||
** included in the packaging of this file. Please review the following
|
|
||||||
** information to ensure the GNU General Public License requirements will
|
|
||||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
||||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qcocoasystemsettings.h"
|
|
||||||
|
|
||||||
#include "qcocoahelpers.h"
|
|
||||||
|
|
||||||
#include <QtCore/private/qcore_mac_p.h>
|
|
||||||
#include <QtGui/qfont.h>
|
|
||||||
#include <QtGui/private/qcoregraphics_p.h>
|
|
||||||
|
|
||||||
#if !QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
|
|
||||||
@interface NSColor (MojaveForwardDeclarations)
|
|
||||||
@property (class, strong, readonly) NSColor *selectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextBackgroundColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSColor *unemphasizedSelectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSArray<NSColor *> *alternatingContentBackgroundColors NS_AVAILABLE_MAC(10_14);
|
|
||||||
@end
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QPalette * qt_mac_createSystemPalette()
|
|
||||||
{
|
|
||||||
QColor qc;
|
|
||||||
|
|
||||||
// Standard palette initialization (copied from Qt 4 styles)
|
|
||||||
QBrush backgroundBrush = qt_mac_toQBrush([NSColor windowBackgroundColor]);
|
|
||||||
QColor background = backgroundBrush.color();
|
|
||||||
QColor light(background.lighter(110));
|
|
||||||
QColor dark(background.darker(160));
|
|
||||||
QColor mid(background.darker(140));
|
|
||||||
QPalette *palette = new QPalette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::Window, backgroundBrush);
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::WindowText, dark);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Text, dark);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Base, backgroundBrush);
|
|
||||||
QBrush textBackgroundBrush = qt_mac_toQBrush([NSColor textBackgroundColor]);
|
|
||||||
palette->setBrush(QPalette::Active, QPalette::Base, textBackgroundBrush);
|
|
||||||
palette->setBrush(QPalette::Inactive, QPalette::Base, textBackgroundBrush);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::Dark, QColor(191, 191, 191));
|
|
||||||
palette->setColor(QPalette::Active, QPalette::Dark, QColor(191, 191, 191));
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::Dark, QColor(191, 191, 191));
|
|
||||||
|
|
||||||
// System palette initialization:
|
|
||||||
QBrush br = qt_mac_toQBrush([NSColor selectedControlColor]);
|
|
||||||
palette->setBrush(QPalette::Active, QPalette::Highlight, br);
|
|
||||||
if (__builtin_available(macOS 10.14, *)) {
|
|
||||||
const auto inactiveHighlight = qt_mac_toQBrush([NSColor unemphasizedSelectedContentBackgroundColor]);
|
|
||||||
palette->setBrush(QPalette::Inactive, QPalette::Highlight, inactiveHighlight);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Highlight, inactiveHighlight);
|
|
||||||
} else {
|
|
||||||
palette->setBrush(QPalette::Inactive, QPalette::Highlight, br);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Highlight, br);
|
|
||||||
}
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::Shadow, qt_mac_toQColor([NSColor shadowColor]));
|
|
||||||
|
|
||||||
qc = qt_mac_toQColor([NSColor controlTextColor]);
|
|
||||||
palette->setColor(QPalette::Active, QPalette::Text, qc);
|
|
||||||
palette->setColor(QPalette::Active, QPalette::WindowText, qc);
|
|
||||||
palette->setColor(QPalette::Active, QPalette::HighlightedText, qc);
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::Text, qc);
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::WindowText, qc);
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
|
|
||||||
|
|
||||||
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::Text, qc);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::WindowText, qc);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::ToolTipBase, qt_mac_toQBrush([NSColor controlColor]));
|
|
||||||
|
|
||||||
// fix for https://bugreports.qt.io/browse/QTBUG-71740
|
|
||||||
palette->setColor(QPalette::Normal, QPalette::Link, qt_mac_toQColor([NSColor linkColor]));
|
|
||||||
|
|
||||||
return palette;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct QMacPaletteMap {
|
|
||||||
inline QMacPaletteMap(QPlatformTheme::Palette p, NSColor *a, NSColor *i) :
|
|
||||||
active(a), inactive(i), paletteRole(p) { }
|
|
||||||
|
|
||||||
NSColor *active;
|
|
||||||
NSColor *inactive;
|
|
||||||
QPlatformTheme::Palette paletteRole;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAC_PALETTE_ENTRY(pal, active, inactive) \
|
|
||||||
QMacPaletteMap(pal, [NSColor active], [NSColor inactive])
|
|
||||||
static QMacPaletteMap mac_widget_colors[] = {
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ToolButtonPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ButtonPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::HeaderPalette, headerTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ComboBoxPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ItemViewPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::MessageBoxLabelPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::TabBarPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::LabelPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::GroupBoxPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::MenuPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::MenuBarPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::TextEditPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::TextLineEditPalette, textColor, disabledControlTextColor)
|
|
||||||
};
|
|
||||||
#undef MAC_PALETTE_ENTRY
|
|
||||||
|
|
||||||
static const int mac_widget_colors_count = sizeof(mac_widget_colors) / sizeof(mac_widget_colors[0]);
|
|
||||||
|
|
||||||
QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes()
|
|
||||||
{
|
|
||||||
QHash<QPlatformTheme::Palette, QPalette*> palettes;
|
|
||||||
QColor qc;
|
|
||||||
for (int i = 0; i < mac_widget_colors_count; i++) {
|
|
||||||
QPalette &pal = *qt_mac_createSystemPalette();
|
|
||||||
if (mac_widget_colors[i].active) {
|
|
||||||
qc = qt_mac_toQColor(mac_widget_colors[i].active);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::Text, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::Text, qc);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::WindowText, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::WindowText, qc);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::HighlightedText, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::ButtonText, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::ButtonText, qc);
|
|
||||||
qc = qt_mac_toQColor(mac_widget_colors[i].inactive);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::Text, qc);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::WindowText, qc);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::ButtonText, qc);
|
|
||||||
}
|
|
||||||
if (mac_widget_colors[i].paletteRole == QPlatformTheme::MenuPalette
|
|
||||||
|| mac_widget_colors[i].paletteRole == QPlatformTheme::MenuBarPalette) {
|
|
||||||
NSColor *selectedMenuItemColor = nil;
|
|
||||||
if (__builtin_available(macOS 10.14, *)) {
|
|
||||||
// Cheap approximation for NSVisualEffectView (see deprecation note for selectedMenuItemTextColor)
|
|
||||||
selectedMenuItemColor = [[NSColor selectedContentBackgroundColor] highlightWithLevel:0.4];
|
|
||||||
} else {
|
|
||||||
// selectedMenuItemColor would presumably be the correct color to use as the background
|
|
||||||
// for selected menu items. But that color is always blue, and doesn't follow the
|
|
||||||
// appearance color in system preferences. So we therefore deliberatly choose to use
|
|
||||||
// keyboardFocusIndicatorColor instead, which appears to have the same color value.
|
|
||||||
selectedMenuItemColor = [NSColor keyboardFocusIndicatorColor];
|
|
||||||
}
|
|
||||||
pal.setBrush(QPalette::Highlight, qt_mac_toQColor(selectedMenuItemColor));
|
|
||||||
qc = qt_mac_toQColor([NSColor labelColor]);
|
|
||||||
pal.setBrush(QPalette::ButtonText, qc);
|
|
||||||
pal.setBrush(QPalette::Text, qc);
|
|
||||||
qc = qt_mac_toQColor([NSColor selectedMenuItemTextColor]);
|
|
||||||
pal.setBrush(QPalette::HighlightedText, qc);
|
|
||||||
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
|
|
||||||
pal.setBrush(QPalette::Disabled, QPalette::Text, qc);
|
|
||||||
} else if ((mac_widget_colors[i].paletteRole == QPlatformTheme::ButtonPalette)
|
|
||||||
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::HeaderPalette)
|
|
||||||
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::TabBarPalette)) {
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::ButtonText,
|
|
||||||
pal.color(QPalette::Disabled, QPalette::Text));
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::ButtonText,
|
|
||||||
pal.color(QPalette::Inactive, QPalette::Text));
|
|
||||||
pal.setColor(QPalette::Active, QPalette::ButtonText,
|
|
||||||
pal.color(QPalette::Active, QPalette::Text));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::ItemViewPalette) {
|
|
||||||
NSArray<NSColor *> *baseColors = nil;
|
|
||||||
NSColor *activeHighlightColor = nil;
|
|
||||||
if (__builtin_available(macOS 10.14, *)) {
|
|
||||||
baseColors = [NSColor alternatingContentBackgroundColors];
|
|
||||||
activeHighlightColor = [NSColor selectedContentBackgroundColor];
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
|
|
||||||
qt_mac_toQBrush([NSColor unemphasizedSelectedTextColor]));
|
|
||||||
} else {
|
|
||||||
baseColors = [NSColor controlAlternatingRowBackgroundColors];
|
|
||||||
activeHighlightColor = [NSColor alternateSelectedControlColor];
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
}
|
|
||||||
pal.setBrush(QPalette::Base, qt_mac_toQBrush(baseColors[0]));
|
|
||||||
pal.setBrush(QPalette::AlternateBase, qt_mac_toQBrush(baseColors[1]));
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::Highlight,
|
|
||||||
qt_mac_toQBrush(activeHighlightColor));
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::HighlightedText,
|
|
||||||
qt_mac_toQBrush([NSColor alternateSelectedControlTextColor]));
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::Text,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextEditPalette) {
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::Text,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextLineEditPalette
|
|
||||||
|| mac_widget_colors[i].paletteRole == QPlatformTheme::ComboBoxPalette) {
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
|
|
||||||
pal.setBrush(QPalette::Disabled, QPalette::Base,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Base));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::LabelPalette) {
|
|
||||||
qc = qt_mac_toQColor([NSColor labelColor]);
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::ToolTipText, qc);
|
|
||||||
}
|
|
||||||
palettes.insert(mac_widget_colors[i].paletteRole, &pal);
|
|
||||||
}
|
|
||||||
return palettes;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
Binary file not shown.
Binary file not shown.
@ -1,72 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# requirements:
|
|
||||||
# 1. brew
|
|
||||||
# 2. brew install llvm (https://bugreports.qt.io/browse/QTBUG-66353)
|
|
||||||
|
|
||||||
export PATH=$PATH:/usr/local/Qt-5.13.1/bin
|
|
||||||
|
|
||||||
cd qtbase
|
|
||||||
|
|
||||||
if [[ $1 == openssl ]]; then
|
|
||||||
|
|
||||||
# download openssl
|
|
||||||
curl -O https://www.openssl.org/source/openssl-1.1.1a.tar.gz
|
|
||||||
tar -xvzf openssl-1.1.1a.tar.gz
|
|
||||||
|
|
||||||
# compile openssl
|
|
||||||
cd openssl-1.1.1a
|
|
||||||
./Configure darwin64-x86_64-cc --prefix=$PWD/dist
|
|
||||||
make
|
|
||||||
# print arch info (optional)
|
|
||||||
lipo -info libssl.a
|
|
||||||
lipo -info libcrypto.a
|
|
||||||
make install
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# continue
|
|
||||||
|
|
||||||
OPENSSL_LIBS='-L$PWD/openssl-1.1.1a/dist/lib -lssl -lcrypto' ./configure -opensource -confirm-license -no-securetransport -nomake examples -nomake tests -openssl-linked -I $PWD/openssl-1.1.1a/dist/include -L $PWD/openssl-1.1.1a/dist/lib
|
|
||||||
|
|
||||||
elif [[ $1 == securetransport ]]; then
|
|
||||||
|
|
||||||
./configure -opensource -confirm-license -nomake examples -nomake tests -no-openssl -securetransport
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
echo "Error: please specify which SSL layer to use (openssl or securetransport)"
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
make -j 12
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
cd ../qttools
|
|
||||||
qmake
|
|
||||||
make -j 12
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
cd ../qtmacextras
|
|
||||||
qmake
|
|
||||||
make -j 12
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
cd ../qtdeclarative/src
|
|
||||||
qmake
|
|
||||||
make -j 12 sub-qmldevtools
|
|
||||||
echo maki | sudo -S sudo make install
|
|
||||||
|
|
||||||
# make docs - currently doesnt work
|
|
||||||
|
|
||||||
#cd ../qtbase
|
|
||||||
#make -j 12 docs
|
|
||||||
#cd ../qttools
|
|
||||||
#make -j 12 docs
|
|
||||||
#cd ../qtmacextras
|
|
||||||
#make -j 12 docs
|
|
||||||
|
|
||||||
#echo maki | sudo -S cp -f -r ../qtbase/doc /usr/local/Qt-5.13.1/
|
|
||||||
|
|
||||||
cd /usr/local
|
|
||||||
zip -r ~/Desktop/qt5.13.1_mac.zip Qt-5.13.1/*
|
|
@ -1,86 +0,0 @@
|
|||||||
use strict;
|
|
||||||
|
|
||||||
die "Cannot proceed without the 'bin' folder'" if (!-e "bin");
|
|
||||||
|
|
||||||
my $arch = $ARGV[0];
|
|
||||||
my $openssl_v_major = "1.1.1"; # The 1.1.1 series is Long Term Support (LTS) release, supported until 11th September 2023
|
|
||||||
my $openssl_v_minor = "a";
|
|
||||||
my $openssl_version = "$openssl_v_major$openssl_v_minor";
|
|
||||||
my $openssl_dir = "openssl-$openssl_version";
|
|
||||||
my $openssl_download = "https://www.openssl.org/source/openssl-$openssl_version.tar.gz";
|
|
||||||
my $openssl_arch = $arch eq "amd64" ? "WIN64A" : "WIN32";
|
|
||||||
|
|
||||||
$arch = "x86" if ($arch eq ''); # specify x86 is nothing is specified
|
|
||||||
die "Please specify architecture (x86 or amd64)" if ($arch ne "x86" && $arch ne "amd64"); # die if user specified anything except x86 or amd64
|
|
||||||
|
|
||||||
# will create a batch file
|
|
||||||
|
|
||||||
my $batfile = 'compile_win.bat';
|
|
||||||
|
|
||||||
open BAT, '>', $batfile;
|
|
||||||
|
|
||||||
printLineToBat ("SET PATH=%PATH%;%cd%\\bin"); # add bin folder to the path for 7z and wget
|
|
||||||
printLineToBat ("CALL \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" $arch");
|
|
||||||
printLineToBat ("SET _ROOT=%cd%");
|
|
||||||
printLineToBat ("SET PATH=%_ROOT%\\qtbase\\bin;%_ROOT%\\gnuwin32\\bin;%PATH%"); # http://doc.qt.io/qt-5/windows-building.html
|
|
||||||
|
|
||||||
printLineToBat ("cd qtbase");
|
|
||||||
printLineToBat ("if \"%~1\"==\"step2\" goto step2");
|
|
||||||
|
|
||||||
# step1: compile openssl and do configure. For some reason, can't continue script execution after configure, have to make step2
|
|
||||||
printLineToBat ("IF EXIST $openssl_dir\\build GOTO OPENSSL_ALREAD_COMPILED");
|
|
||||||
printLineToBat ("wget --no-check-certificate $openssl_download");
|
|
||||||
printLineToBat ("7z x openssl-$openssl_version.tar.gz");
|
|
||||||
printLineToBat ("7z x openssl-$openssl_version.tar");
|
|
||||||
printLineToBat ("rm openssl-$openssl_version.tar.gz");
|
|
||||||
printLineToBat ("rm openssl-$openssl_version.tar");
|
|
||||||
printLineToBat ("cd $openssl_dir");
|
|
||||||
printLineToBat ("perl Configure VC-$openssl_arch no-asm no-shared no-tests --prefix=%cd%\\build --openssldir=%cd%\\build");
|
|
||||||
printLineToBat ("nmake");
|
|
||||||
printLineToBat ("nmake install");
|
|
||||||
# do little clean up
|
|
||||||
printLineToBat ("rm test\\*.exe");
|
|
||||||
printLineToBat ("rm test\\*.pdb");
|
|
||||||
printLineToBat ("rm test\\*.obj");
|
|
||||||
printLineToBat (":OPENSSL_ALREAD_COMPILED");
|
|
||||||
# go back to qtbase
|
|
||||||
printLineToBat ("cd ..");
|
|
||||||
|
|
||||||
# -developer-build creates an in-source build for developer usage.
|
|
||||||
# openssl: see https://bugreports.qt.io/browse/QTBUG-65501
|
|
||||||
printLineToBat ("configure -opensource -developer-build -confirm-license -opengl desktop -mp -nomake tests -nomake examples -I \"%cd%\\$openssl_dir\\build\\include\" -openssl-linked OPENSSL_LIBS=\"%cd%\\$openssl_dir\\build\\lib\\libssl.lib %cd%\\$openssl_dir\\build\\lib\\libcrypto.lib -lcrypt32 -lws2_32 -lAdvapi32 -luser32\"");
|
|
||||||
printLineToBat ("goto :EOF");
|
|
||||||
|
|
||||||
# step 2:
|
|
||||||
printLineToBat (":step2");
|
|
||||||
|
|
||||||
printLineToBat ("nmake");
|
|
||||||
printLineToBat ("cd ..\\qttools");
|
|
||||||
printLineToBat ("..\\qtbase\\bin\\qmake");
|
|
||||||
printLineToBat ("nmake");
|
|
||||||
printLineToBat ("cd ..\\qtbase");
|
|
||||||
printLineToBat ("cd .."); # go up to qt dir
|
|
||||||
# openssl clean up
|
|
||||||
printLineToBat ("cd qtbase");
|
|
||||||
printLineToBat ("cd $openssl_dir");
|
|
||||||
printLineToBat ("del /s /f /q out32");
|
|
||||||
printLineToBat ("del /s /f /q out32.dbg");
|
|
||||||
printLineToBat ("cd ..");
|
|
||||||
printLineToBat ("cd ..");
|
|
||||||
# the rest
|
|
||||||
printLineToBat ("del *.obj /s /f");
|
|
||||||
printLineToBat ("del *.ilk /s /f");
|
|
||||||
printLineToBat ("del *.pch /s /f");
|
|
||||||
printLineToBat ("del Makefile* /s /f");
|
|
||||||
|
|
||||||
close BAT;
|
|
||||||
|
|
||||||
system ($batfile);
|
|
||||||
system ("$batfile step2");
|
|
||||||
|
|
||||||
system ("pause");
|
|
||||||
|
|
||||||
sub printLineToBat
|
|
||||||
{
|
|
||||||
print BAT "$_[0]\n";
|
|
||||||
}
|
|
@ -1,119 +0,0 @@
|
|||||||
#
|
|
||||||
# This file is used as a basis for the following compilers:
|
|
||||||
#
|
|
||||||
# - Microsoft C/C++ Optimizing Compiler (all desktop versions)
|
|
||||||
# - Intel C++ Compiler on Windows
|
|
||||||
# - Clang-cl
|
|
||||||
#
|
|
||||||
# Baseline:
|
|
||||||
#
|
|
||||||
# - Visual Studio 2005 (8.0), VC++ 14.0
|
|
||||||
#
|
|
||||||
# Version-specific settings go in msvc-version.conf (loaded by default_pre)
|
|
||||||
#
|
|
||||||
|
|
||||||
MAKEFILE_GENERATOR = MSVC.NET
|
|
||||||
QMAKE_PLATFORM = win32
|
|
||||||
QMAKE_COMPILER = msvc
|
|
||||||
CONFIG += flat debug_and_release debug_and_release_target precompile_header autogen_precompile_source embed_manifest_dll embed_manifest_exe
|
|
||||||
# MSVC 2017 15.8+ fixed std::aligned_storage but compilation fails without
|
|
||||||
# _ENABLE_EXTENDED_ALIGNED_STORAGE flag since the fix breaks binary compatibility.
|
|
||||||
DEFINES += UNICODE _UNICODE WIN32 _ENABLE_EXTENDED_ALIGNED_STORAGE
|
|
||||||
QMAKE_COMPILER_DEFINES += _WIN32
|
|
||||||
contains(QMAKE_TARGET.arch, x86_64) {
|
|
||||||
DEFINES += WIN64
|
|
||||||
QMAKE_COMPILER_DEFINES += _WIN64
|
|
||||||
}
|
|
||||||
|
|
||||||
QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Od
|
|
||||||
QMAKE_CFLAGS_OPTIMIZE = -O2
|
|
||||||
QMAKE_CFLAGS_OPTIMIZE_SIZE = -O1
|
|
||||||
|
|
||||||
QMAKE_CC = cl
|
|
||||||
QMAKE_LEX = flex
|
|
||||||
QMAKE_LEXFLAGS =
|
|
||||||
QMAKE_YACC = bison -y
|
|
||||||
QMAKE_YACCFLAGS = -d
|
|
||||||
QMAKE_CFLAGS = -nologo -Zc:wchar_t
|
|
||||||
QMAKE_CFLAGS_WARN_ON = -W3
|
|
||||||
QMAKE_CFLAGS_WARN_OFF = -W0
|
|
||||||
QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MD -Zi
|
|
||||||
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD
|
|
||||||
QMAKE_CFLAGS_DEBUG = -Zi -MDd
|
|
||||||
QMAKE_CFLAGS_YACC =
|
|
||||||
QMAKE_CFLAGS_LTCG = -GL
|
|
||||||
|
|
||||||
contains(QMAKE_TARGET.arch, x86_64) {
|
|
||||||
# SSE2 is mandatory on 64-bit mode, so skip the option. It triggers:
|
|
||||||
# cl : Command line warning D9002 : ignoring unknown option '-arch:SSE2'
|
|
||||||
QMAKE_CFLAGS_SSE2 =
|
|
||||||
} else {
|
|
||||||
QMAKE_CFLAGS_SSE2 = -arch:SSE2
|
|
||||||
}
|
|
||||||
QMAKE_CFLAGS_SSE3 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SSSE3 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SSE4_1 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SSE4_2 = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_AESNI = $$QMAKE_CFLAGS_SSE2
|
|
||||||
QMAKE_CFLAGS_SHANI = $$QMAKE_CFLAGS_SSE2
|
|
||||||
|
|
||||||
QMAKE_CXX = $$QMAKE_CC
|
|
||||||
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
|
|
||||||
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON -w34100 -w34189 -w44996
|
|
||||||
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
|
||||||
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
|
|
||||||
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
|
|
||||||
QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
|
|
||||||
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
|
|
||||||
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
|
|
||||||
QMAKE_CXXFLAGS_STL_ON = -EHsc
|
|
||||||
QMAKE_CXXFLAGS_STL_OFF =
|
|
||||||
QMAKE_CXXFLAGS_RTTI_ON = -GR
|
|
||||||
QMAKE_CXXFLAGS_RTTI_OFF =
|
|
||||||
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -EHsc
|
|
||||||
QMAKE_CXXFLAGS_EXCEPTIONS_OFF =
|
|
||||||
|
|
||||||
QMAKE_INCDIR =
|
|
||||||
|
|
||||||
QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$obj $src
|
|
||||||
QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
|
|
||||||
QMAKE_RUN_CC_IMP_BATCH = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ @<<
|
|
||||||
QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$obj $src
|
|
||||||
QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
|
|
||||||
QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
|
|
||||||
|
|
||||||
QMAKE_LINK = link
|
|
||||||
QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT
|
|
||||||
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO
|
|
||||||
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO
|
|
||||||
QMAKE_LFLAGS_DEBUG = /DEBUG
|
|
||||||
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
|
|
||||||
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS
|
|
||||||
QMAKE_LFLAGS_EXE = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
|
|
||||||
QMAKE_LFLAGS_DLL = /DLL
|
|
||||||
QMAKE_LFLAGS_LTCG = /LTCG
|
|
||||||
QMAKE_PREFIX_SHLIB =
|
|
||||||
QMAKE_EXTENSION_SHLIB = dll
|
|
||||||
QMAKE_PREFIX_STATICLIB =
|
|
||||||
QMAKE_EXTENSION_STATICLIB = lib
|
|
||||||
|
|
||||||
QMAKE_LIBS =
|
|
||||||
QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib uuid.lib user32.lib advapi32.lib
|
|
||||||
QMAKE_LIBS_NETWORK = ws2_32.lib user32.lib gdi32.lib
|
|
||||||
QMAKE_LIBS_OPENGL = glu32.lib opengl32.lib gdi32.lib user32.lib
|
|
||||||
QMAKE_LIBS_OPENGL_ES2 = gdi32.lib user32.lib
|
|
||||||
QMAKE_LIBS_OPENGL_ES2_DEBUG = gdi32.lib user32.lib
|
|
||||||
QMAKE_LIBS_COMPAT = advapi32.lib shell32.lib comdlg32.lib user32.lib gdi32.lib ws2_32.lib
|
|
||||||
QMAKE_LIBS_QT_ENTRY = -lqtmain
|
|
||||||
|
|
||||||
QMAKE_IDL = midl
|
|
||||||
QMAKE_LIB = lib /NOLOGO
|
|
||||||
QMAKE_RC = rc /NOLOGO
|
|
||||||
|
|
||||||
VCPROJ_EXTENSION = .vcproj
|
|
||||||
VCSOLUTION_EXTENSION = .sln
|
|
||||||
VCPROJ_KEYWORD = Qt4VSv1.0
|
|
||||||
|
|
||||||
include(angle.conf)
|
|
||||||
include(windows-desktop.conf)
|
|
||||||
include(windows-vulkan.conf)
|
|
@ -1,431 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2018 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of the plugins of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 3 requirements
|
|
||||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 2.0 or (at your option) the GNU General
|
|
||||||
** Public license version 3 or any later version approved by the KDE Free
|
|
||||||
** Qt Foundation. The licenses are as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
||||||
** included in the packaging of this file. Please review the following
|
|
||||||
** information to ensure the GNU General Public License requirements will
|
|
||||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
||||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (c) 2007-2008, Apple, Inc.
|
|
||||||
**
|
|
||||||
** All rights reserved.
|
|
||||||
**
|
|
||||||
** Redistribution and use in source and binary forms, with or without
|
|
||||||
** modification, are permitted provided that the following conditions are met:
|
|
||||||
**
|
|
||||||
** * Redistributions of source code must retain the above copyright notice,
|
|
||||||
** this list of conditions and the following disclaimer.
|
|
||||||
**
|
|
||||||
** * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
** this list of conditions and the following disclaimer in the documentation
|
|
||||||
** and/or other materials provided with the distribution.
|
|
||||||
**
|
|
||||||
** * Neither the name of Apple, Inc. nor the names of its contributors
|
|
||||||
** may be used to endorse or promote products derived from this software
|
|
||||||
** without specific prior written permission.
|
|
||||||
**
|
|
||||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#import "qcocoaapplicationdelegate.h"
|
|
||||||
#include "qcocoaintegration.h"
|
|
||||||
#include "qcocoamenu.h"
|
|
||||||
#include "qcocoamenuloader.h"
|
|
||||||
#include "qcocoamenuitem.h"
|
|
||||||
#include "qcocoansmenu.h"
|
|
||||||
|
|
||||||
#include <qevent.h>
|
|
||||||
#include <qurl.h>
|
|
||||||
#include <qdebug.h>
|
|
||||||
#include <qguiapplication.h>
|
|
||||||
#include <private/qguiapplication_p.h>
|
|
||||||
#include "qt_mac_p.h"
|
|
||||||
#include <qpa/qwindowsysteminterface.h>
|
|
||||||
#include <qwindowdefs.h>
|
|
||||||
|
|
||||||
QT_USE_NAMESPACE
|
|
||||||
|
|
||||||
@implementation QCocoaApplicationDelegate {
|
|
||||||
bool startedQuit;
|
|
||||||
NSObject <NSApplicationDelegate> *reflectionDelegate;
|
|
||||||
bool inLaunch;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (instancetype)sharedDelegate
|
|
||||||
{
|
|
||||||
static QCocoaApplicationDelegate *shared = nil;
|
|
||||||
static dispatch_once_t onceToken;
|
|
||||||
dispatch_once(&onceToken, ^{
|
|
||||||
shared = [[self alloc] init];
|
|
||||||
atexit_b(^{
|
|
||||||
[shared release];
|
|
||||||
shared = nil;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return shared;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
self = [super init];
|
|
||||||
if (self) {
|
|
||||||
inLaunch = true;
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)dealloc
|
|
||||||
{
|
|
||||||
[_dockMenu release];
|
|
||||||
if (reflectionDelegate) {
|
|
||||||
[[NSApplication sharedApplication] setDelegate:reflectionDelegate];
|
|
||||||
[reflectionDelegate release];
|
|
||||||
}
|
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
||||||
|
|
||||||
[super dealloc];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSMenu *)applicationDockMenu:(NSApplication *)sender
|
|
||||||
{
|
|
||||||
Q_UNUSED(sender);
|
|
||||||
// Manually invoke the delegate's -menuWillOpen: method.
|
|
||||||
// See QTBUG-39604 (and its fix) for details.
|
|
||||||
[self.dockMenu.delegate menuWillOpen:self.dockMenu];
|
|
||||||
return [[self.dockMenu retain] autorelease];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)canQuit
|
|
||||||
{
|
|
||||||
[[NSApp mainMenu] cancelTracking];
|
|
||||||
|
|
||||||
bool handle_quit = true;
|
|
||||||
NSMenuItem *quitMenuItem = [[QT_MANGLE_NAMESPACE(QCocoaMenuLoader) sharedMenuLoader] quitMenuItem];
|
|
||||||
if (!QGuiApplicationPrivate::instance()->modalWindowList.isEmpty()
|
|
||||||
&& [quitMenuItem isEnabled]) {
|
|
||||||
int visible = 0;
|
|
||||||
const QWindowList tlws = QGuiApplication::topLevelWindows();
|
|
||||||
for (int i = 0; i < tlws.size(); ++i) {
|
|
||||||
if (tlws.at(i)->isVisible())
|
|
||||||
++visible;
|
|
||||||
}
|
|
||||||
handle_quit = (visible <= 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle_quit) {
|
|
||||||
QCloseEvent ev;
|
|
||||||
QGuiApplication::sendEvent(qGuiApp, &ev);
|
|
||||||
if (ev.isAccepted()) {
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function will only be called when NSApp is actually running.
|
|
||||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
|
|
||||||
{
|
|
||||||
// The reflection delegate gets precedence
|
|
||||||
if (reflectionDelegate) {
|
|
||||||
if ([reflectionDelegate respondsToSelector:@selector(applicationShouldTerminate:)])
|
|
||||||
return [reflectionDelegate applicationShouldTerminate:sender];
|
|
||||||
return NSTerminateNow;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([self canQuit]) {
|
|
||||||
if (!startedQuit) {
|
|
||||||
startedQuit = true;
|
|
||||||
// Close open windows. This is done in order to deliver de-expose
|
|
||||||
// events while the event loop is still running.
|
|
||||||
const QWindowList topLevels = QGuiApplication::topLevelWindows();
|
|
||||||
for (int i = 0; i < topLevels.size(); ++i) {
|
|
||||||
QWindow *topLevelWindow = topLevels.at(i);
|
|
||||||
// Already closed windows will not have a platform window, skip those
|
|
||||||
if (topLevelWindow->handle())
|
|
||||||
QWindowSystemInterface::handleCloseEvent(topLevelWindow);
|
|
||||||
}
|
|
||||||
QWindowSystemInterface::flushWindowSystemEvents();
|
|
||||||
|
|
||||||
QGuiApplication::exit(0);
|
|
||||||
startedQuit = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (QGuiApplicationPrivate::instance()->threadData->eventLoops.isEmpty()) {
|
|
||||||
// INVARIANT: No event loop is executing. This probably
|
|
||||||
// means that Qt is used as a plugin, or as a part of a native
|
|
||||||
// Cocoa application. In any case it should be fine to
|
|
||||||
// terminate now:
|
|
||||||
return NSTerminateNow;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NSTerminateCancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
Q_UNUSED(notification);
|
|
||||||
|
|
||||||
/*
|
|
||||||
From the Cocoa documentation: "A good place to install event handlers
|
|
||||||
is in the applicationWillFinishLaunching: method of the application
|
|
||||||
delegate. At that point, the Application Kit has installed its default
|
|
||||||
event handlers, so if you install a handler for one of the same events,
|
|
||||||
it will replace the Application Kit version."
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
If Qt is used as a plugin, we let the 3rd party application handle
|
|
||||||
events like quit and open file events. Otherwise, if we install our own
|
|
||||||
handlers, we easily end up breaking functionality the 3rd party
|
|
||||||
application depends on.
|
|
||||||
*/
|
|
||||||
NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager];
|
|
||||||
/*[eventManager setEventHandler:self
|
|
||||||
andSelector:@selector(appleEventQuit:withReplyEvent:)
|
|
||||||
forEventClass:kCoreEventClass
|
|
||||||
andEventID:kAEQuitApplication];*/
|
|
||||||
[eventManager setEventHandler:self
|
|
||||||
andSelector:@selector(getUrl:withReplyEvent:)
|
|
||||||
forEventClass:kInternetEventClass
|
|
||||||
andEventID:kAEGetURL];
|
|
||||||
}
|
|
||||||
|
|
||||||
// called by QCocoaIntegration's destructor before resetting the application delegate to nil
|
|
||||||
- (void)removeAppleEventHandlers
|
|
||||||
{
|
|
||||||
NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager];
|
|
||||||
//[eventManager removeEventHandlerForEventClass:kCoreEventClass andEventID:kAEQuitApplication];
|
|
||||||
[eventManager removeEventHandlerForEventClass:kInternetEventClass andEventID:kAEGetURL];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (bool)inLaunch
|
|
||||||
{
|
|
||||||
return inLaunch;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
Q_UNUSED(aNotification);
|
|
||||||
inLaunch = false;
|
|
||||||
|
|
||||||
if (qEnvironmentVariableIsEmpty("QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM")) {
|
|
||||||
// Move the application window to front to avoid launching behind the terminal.
|
|
||||||
// Ignoring other apps is necessary (we must ignore the terminal), but makes
|
|
||||||
// Qt apps play slightly less nice with other apps when lanching from Finder
|
|
||||||
// (See the activateIgnoringOtherApps docs.)
|
|
||||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
|
|
||||||
{
|
|
||||||
Q_UNUSED(filenames);
|
|
||||||
Q_UNUSED(sender);
|
|
||||||
|
|
||||||
for (NSString *fileName in filenames) {
|
|
||||||
QString qtFileName = QString::fromNSString(fileName);
|
|
||||||
if (inLaunch) {
|
|
||||||
// We need to be careful because Cocoa will be nice enough to take
|
|
||||||
// command line arguments and send them to us as events. Given the history
|
|
||||||
// of Qt Applications, this will result in behavior people don't want, as
|
|
||||||
// they might be doing the opening themselves with the command line parsing.
|
|
||||||
if (qApp->arguments().contains(qtFileName))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
QWindowSystemInterface::handleFileOpenEvent(qtFileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reflectionDelegate &&
|
|
||||||
[reflectionDelegate respondsToSelector:@selector(application:openFiles:)])
|
|
||||||
[reflectionDelegate application:sender openFiles:filenames];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
|
|
||||||
{
|
|
||||||
// If we have a reflection delegate, that will get to call the shots.
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:
|
|
||||||
@selector(applicationShouldTerminateAfterLastWindowClosed:)])
|
|
||||||
return [reflectionDelegate applicationShouldTerminateAfterLastWindowClosed:sender];
|
|
||||||
return NO; // Someday qApp->quitOnLastWindowClosed(); when QApp and NSApp work closer together.
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidBecomeActive:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:@selector(applicationDidBecomeActive:)])
|
|
||||||
[reflectionDelegate applicationDidBecomeActive:notification];
|
|
||||||
|
|
||||||
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)applicationDidResignActive:(NSNotification *)notification
|
|
||||||
{
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:@selector(applicationDidResignActive:)])
|
|
||||||
[reflectionDelegate applicationDidResignActive:notification];
|
|
||||||
|
|
||||||
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationInactive);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
|
|
||||||
{
|
|
||||||
Q_UNUSED(theApplication);
|
|
||||||
Q_UNUSED(flag);
|
|
||||||
if (reflectionDelegate
|
|
||||||
&& [reflectionDelegate respondsToSelector:@selector(applicationShouldHandleReopen:hasVisibleWindows:)])
|
|
||||||
return [reflectionDelegate applicationShouldHandleReopen:theApplication hasVisibleWindows:flag];
|
|
||||||
|
|
||||||
/*
|
|
||||||
true to force delivery of the event even if the application state is already active,
|
|
||||||
because rapp (handle reopen) events are sent each time the dock icon is clicked regardless
|
|
||||||
of the active state of the application or number of visible windows. For example, a browser
|
|
||||||
app that has no windows opened would need the event be to delivered even if it was already
|
|
||||||
active in order to create a new window as per OS X conventions.
|
|
||||||
*/
|
|
||||||
QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive, true /*forcePropagate*/);
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)setReflectionDelegate:(NSObject <NSApplicationDelegate> *)oldDelegate
|
|
||||||
{
|
|
||||||
[oldDelegate retain];
|
|
||||||
[reflectionDelegate release];
|
|
||||||
reflectionDelegate = oldDelegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
|
|
||||||
{
|
|
||||||
NSMethodSignature *result = [super methodSignatureForSelector:aSelector];
|
|
||||||
if (!result && reflectionDelegate) {
|
|
||||||
result = [reflectionDelegate methodSignatureForSelector:aSelector];
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)respondsToSelector:(SEL)aSelector
|
|
||||||
{
|
|
||||||
BOOL result = [super respondsToSelector:aSelector];
|
|
||||||
if (!result && reflectionDelegate)
|
|
||||||
result = [reflectionDelegate respondsToSelector:aSelector];
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)forwardInvocation:(NSInvocation *)invocation
|
|
||||||
{
|
|
||||||
SEL invocationSelector = [invocation selector];
|
|
||||||
if (reflectionDelegate && [reflectionDelegate respondsToSelector:invocationSelector])
|
|
||||||
[invocation invokeWithTarget:reflectionDelegate];
|
|
||||||
else
|
|
||||||
[self doesNotRecognizeSelector:invocationSelector];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
|
|
||||||
{
|
|
||||||
Q_UNUSED(replyEvent);
|
|
||||||
NSString *urlString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
|
|
||||||
QWindowSystemInterface::handleFileOpenEvent(QUrl(QString::fromNSString(urlString)));
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)appleEventQuit:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
|
|
||||||
{
|
|
||||||
Q_UNUSED(event);
|
|
||||||
Q_UNUSED(replyEvent);
|
|
||||||
[NSApp terminate:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation QCocoaApplicationDelegate (Menus)
|
|
||||||
|
|
||||||
- (BOOL)validateMenuItem:(NSMenuItem*)item
|
|
||||||
{
|
|
||||||
auto *nativeItem = qt_objc_cast<QCocoaNSMenuItem *>(item);
|
|
||||||
if (!nativeItem)
|
|
||||||
return item.enabled; // FIXME Test with with Qt as plugin or embedded QWindow.
|
|
||||||
|
|
||||||
auto *platformItem = nativeItem.platformMenuItem;
|
|
||||||
if (!platformItem) // Try a bit harder with orphan menu itens
|
|
||||||
return item.hasSubmenu || (item.enabled && (item.action != @selector(qt_itemFired:)));
|
|
||||||
|
|
||||||
// Menu-holding items are always enabled, as it's conventional in Cocoa
|
|
||||||
if (platformItem->menu())
|
|
||||||
return YES;
|
|
||||||
|
|
||||||
return platformItem->isEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation QCocoaApplicationDelegate (MenuAPI)
|
|
||||||
|
|
||||||
- (void)qt_itemFired:(QCocoaNSMenuItem *)item
|
|
||||||
{
|
|
||||||
if (item.hasSubmenu)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto *nativeItem = qt_objc_cast<QCocoaNSMenuItem *>(item);
|
|
||||||
Q_ASSERT_X(nativeItem, qPrintable(__FUNCTION__), "Triggered menu item is not a QCocoaNSMenuItem.");
|
|
||||||
auto *platformItem = nativeItem.platformMenuItem;
|
|
||||||
// Menu-holding items also get a target to play nicely
|
|
||||||
// with NSMenuValidation but should not trigger.
|
|
||||||
if (!platformItem || platformItem->menu())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData);
|
|
||||||
QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers:[NSEvent modifierFlags]];
|
|
||||||
|
|
||||||
static QMetaMethod activatedSignal = QMetaMethod::fromSignal(&QCocoaMenuItem::activated);
|
|
||||||
activatedSignal.invoke(platformItem, Qt::QueuedConnection);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
@ -1,244 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2017 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of the plugins of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 3 requirements
|
|
||||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 2.0 or (at your option) the GNU General
|
|
||||||
** Public license version 3 or any later version approved by the KDE Free
|
|
||||||
** Qt Foundation. The licenses are as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
||||||
** included in the packaging of this file. Please review the following
|
|
||||||
** information to ensure the GNU General Public License requirements will
|
|
||||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
||||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include "qcocoasystemsettings.h"
|
|
||||||
|
|
||||||
#include "qcocoahelpers.h"
|
|
||||||
|
|
||||||
#include <QtCore/private/qcore_mac_p.h>
|
|
||||||
#include <QtGui/qfont.h>
|
|
||||||
#include <QtGui/private/qcoregraphics_p.h>
|
|
||||||
|
|
||||||
#if !QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
|
|
||||||
@interface NSColor (MojaveForwardDeclarations)
|
|
||||||
@property (class, strong, readonly) NSColor *selectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextBackgroundColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSColor *unemphasizedSelectedTextColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSColor *unemphasizedSelectedContentBackgroundColor NS_AVAILABLE_MAC(10_14);
|
|
||||||
@property (class, strong, readonly) NSArray<NSColor *> *alternatingContentBackgroundColors NS_AVAILABLE_MAC(10_14);
|
|
||||||
@end
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
|
|
||||||
QPalette * qt_mac_createSystemPalette()
|
|
||||||
{
|
|
||||||
QColor qc;
|
|
||||||
|
|
||||||
// Standard palette initialization (copied from Qt 4 styles)
|
|
||||||
QBrush backgroundBrush = qt_mac_toQBrush([NSColor windowBackgroundColor]);
|
|
||||||
QColor background = backgroundBrush.color();
|
|
||||||
QColor light(background.lighter(110));
|
|
||||||
QColor dark(background.darker(160));
|
|
||||||
QColor mid(background.darker(140));
|
|
||||||
QPalette *palette = new QPalette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::Window, backgroundBrush);
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::WindowText, dark);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Text, dark);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Base, backgroundBrush);
|
|
||||||
QBrush textBackgroundBrush = qt_mac_toQBrush([NSColor textBackgroundColor]);
|
|
||||||
palette->setBrush(QPalette::Active, QPalette::Base, textBackgroundBrush);
|
|
||||||
palette->setBrush(QPalette::Inactive, QPalette::Base, textBackgroundBrush);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::Dark, QColor(191, 191, 191));
|
|
||||||
palette->setColor(QPalette::Active, QPalette::Dark, QColor(191, 191, 191));
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::Dark, QColor(191, 191, 191));
|
|
||||||
|
|
||||||
// System palette initialization:
|
|
||||||
QBrush br = qt_mac_toQBrush([NSColor selectedControlColor]);
|
|
||||||
palette->setBrush(QPalette::Active, QPalette::Highlight, br);
|
|
||||||
if (__builtin_available(macOS 10.14, *)) {
|
|
||||||
const auto inactiveHighlight = qt_mac_toQBrush([NSColor unemphasizedSelectedContentBackgroundColor]);
|
|
||||||
palette->setBrush(QPalette::Inactive, QPalette::Highlight, inactiveHighlight);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Highlight, inactiveHighlight);
|
|
||||||
} else {
|
|
||||||
palette->setBrush(QPalette::Inactive, QPalette::Highlight, br);
|
|
||||||
palette->setBrush(QPalette::Disabled, QPalette::Highlight, br);
|
|
||||||
}
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::Shadow, qt_mac_toQColor([NSColor shadowColor]));
|
|
||||||
|
|
||||||
qc = qt_mac_toQColor([NSColor controlTextColor]);
|
|
||||||
palette->setColor(QPalette::Active, QPalette::Text, qc);
|
|
||||||
palette->setColor(QPalette::Active, QPalette::WindowText, qc);
|
|
||||||
palette->setColor(QPalette::Active, QPalette::HighlightedText, qc);
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::Text, qc);
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::WindowText, qc);
|
|
||||||
palette->setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
|
|
||||||
|
|
||||||
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::Text, qc);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::WindowText, qc);
|
|
||||||
palette->setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
|
|
||||||
|
|
||||||
palette->setBrush(QPalette::ToolTipBase, qt_mac_toQBrush([NSColor controlColor]));
|
|
||||||
|
|
||||||
// fix for https://bugreports.qt.io/browse/QTBUG-71740
|
|
||||||
palette->setColor(QPalette::Normal, QPalette::Link, qt_mac_toQColor([NSColor linkColor]));
|
|
||||||
|
|
||||||
return palette;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct QMacPaletteMap {
|
|
||||||
inline QMacPaletteMap(QPlatformTheme::Palette p, NSColor *a, NSColor *i) :
|
|
||||||
active(a), inactive(i), paletteRole(p) { }
|
|
||||||
|
|
||||||
NSColor *active;
|
|
||||||
NSColor *inactive;
|
|
||||||
QPlatformTheme::Palette paletteRole;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAC_PALETTE_ENTRY(pal, active, inactive) \
|
|
||||||
QMacPaletteMap(pal, [NSColor active], [NSColor inactive])
|
|
||||||
static QMacPaletteMap mac_widget_colors[] = {
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ToolButtonPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ButtonPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::HeaderPalette, headerTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ComboBoxPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::ItemViewPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::MessageBoxLabelPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::TabBarPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::LabelPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::GroupBoxPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::MenuPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::MenuBarPalette, controlTextColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::TextEditPalette, textColor, disabledControlTextColor),
|
|
||||||
MAC_PALETTE_ENTRY(QPlatformTheme::TextLineEditPalette, textColor, disabledControlTextColor)
|
|
||||||
};
|
|
||||||
#undef MAC_PALETTE_ENTRY
|
|
||||||
|
|
||||||
static const int mac_widget_colors_count = sizeof(mac_widget_colors) / sizeof(mac_widget_colors[0]);
|
|
||||||
|
|
||||||
QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes()
|
|
||||||
{
|
|
||||||
QHash<QPlatformTheme::Palette, QPalette*> palettes;
|
|
||||||
QColor qc;
|
|
||||||
for (int i = 0; i < mac_widget_colors_count; i++) {
|
|
||||||
QPalette &pal = *qt_mac_createSystemPalette();
|
|
||||||
if (mac_widget_colors[i].active) {
|
|
||||||
qc = qt_mac_toQColor(mac_widget_colors[i].active);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::Text, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::Text, qc);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::WindowText, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::WindowText, qc);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::HighlightedText, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
|
|
||||||
pal.setColor(QPalette::Active, QPalette::ButtonText, qc);
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::ButtonText, qc);
|
|
||||||
qc = qt_mac_toQColor(mac_widget_colors[i].inactive);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::Text, qc);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::WindowText, qc);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::ButtonText, qc);
|
|
||||||
}
|
|
||||||
if (mac_widget_colors[i].paletteRole == QPlatformTheme::MenuPalette
|
|
||||||
|| mac_widget_colors[i].paletteRole == QPlatformTheme::MenuBarPalette) {
|
|
||||||
NSColor *selectedMenuItemColor = nil;
|
|
||||||
if (__builtin_available(macOS 10.14, *)) {
|
|
||||||
// Cheap approximation for NSVisualEffectView (see deprecation note for selectedMenuItemTextColor)
|
|
||||||
selectedMenuItemColor = [[NSColor selectedContentBackgroundColor] highlightWithLevel:0.4];
|
|
||||||
} else {
|
|
||||||
// selectedMenuItemColor would presumably be the correct color to use as the background
|
|
||||||
// for selected menu items. But that color is always blue, and doesn't follow the
|
|
||||||
// appearance color in system preferences. So we therefore deliberatly choose to use
|
|
||||||
// keyboardFocusIndicatorColor instead, which appears to have the same color value.
|
|
||||||
selectedMenuItemColor = [NSColor keyboardFocusIndicatorColor];
|
|
||||||
}
|
|
||||||
pal.setBrush(QPalette::Highlight, qt_mac_toQColor(selectedMenuItemColor));
|
|
||||||
qc = qt_mac_toQColor([NSColor labelColor]);
|
|
||||||
pal.setBrush(QPalette::ButtonText, qc);
|
|
||||||
pal.setBrush(QPalette::Text, qc);
|
|
||||||
qc = qt_mac_toQColor([NSColor selectedMenuItemTextColor]);
|
|
||||||
pal.setBrush(QPalette::HighlightedText, qc);
|
|
||||||
qc = qt_mac_toQColor([NSColor disabledControlTextColor]);
|
|
||||||
pal.setBrush(QPalette::Disabled, QPalette::Text, qc);
|
|
||||||
} else if ((mac_widget_colors[i].paletteRole == QPlatformTheme::ButtonPalette)
|
|
||||||
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::HeaderPalette)
|
|
||||||
|| (mac_widget_colors[i].paletteRole == QPlatformTheme::TabBarPalette)) {
|
|
||||||
pal.setColor(QPalette::Disabled, QPalette::ButtonText,
|
|
||||||
pal.color(QPalette::Disabled, QPalette::Text));
|
|
||||||
pal.setColor(QPalette::Inactive, QPalette::ButtonText,
|
|
||||||
pal.color(QPalette::Inactive, QPalette::Text));
|
|
||||||
pal.setColor(QPalette::Active, QPalette::ButtonText,
|
|
||||||
pal.color(QPalette::Active, QPalette::Text));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::ItemViewPalette) {
|
|
||||||
NSArray<NSColor *> *baseColors = nil;
|
|
||||||
NSColor *activeHighlightColor = nil;
|
|
||||||
if (__builtin_available(macOS 10.14, *)) {
|
|
||||||
baseColors = [NSColor alternatingContentBackgroundColors];
|
|
||||||
activeHighlightColor = [NSColor selectedContentBackgroundColor];
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
|
|
||||||
qt_mac_toQBrush([NSColor unemphasizedSelectedTextColor]));
|
|
||||||
} else {
|
|
||||||
baseColors = [NSColor controlAlternatingRowBackgroundColors];
|
|
||||||
activeHighlightColor = [NSColor alternateSelectedControlColor];
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
}
|
|
||||||
pal.setBrush(QPalette::Base, qt_mac_toQBrush(baseColors[0]));
|
|
||||||
pal.setBrush(QPalette::AlternateBase, qt_mac_toQBrush(baseColors[1]));
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::Highlight,
|
|
||||||
qt_mac_toQBrush(activeHighlightColor));
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::HighlightedText,
|
|
||||||
qt_mac_toQBrush([NSColor alternateSelectedControlTextColor]));
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::Text,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextEditPalette) {
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::Text,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Text));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextLineEditPalette
|
|
||||||
|| mac_widget_colors[i].paletteRole == QPlatformTheme::ComboBoxPalette) {
|
|
||||||
pal.setBrush(QPalette::Active, QPalette::Base, qt_mac_toQColor([NSColor textBackgroundColor]));
|
|
||||||
pal.setBrush(QPalette::Disabled, QPalette::Base,
|
|
||||||
pal.brush(QPalette::Active, QPalette::Base));
|
|
||||||
} else if (mac_widget_colors[i].paletteRole == QPlatformTheme::LabelPalette) {
|
|
||||||
qc = qt_mac_toQColor([NSColor labelColor]);
|
|
||||||
pal.setBrush(QPalette::Inactive, QPalette::ToolTipText, qc);
|
|
||||||
}
|
|
||||||
palettes.insert(mac_widget_colors[i].paletteRole, &pal);
|
|
||||||
}
|
|
||||||
return palettes;
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
|
Loading…
Reference in New Issue
Block a user