[graphics/krita] /: Revert "Revert "windows: Set the minimum SDK API to Windows 8 and clean relevant ifdefs""

Alvin Wong alvin at alvinhc.com
Tue Jan 24 09:23:38 GMT 2023


Another way to work around this is to pull the missing mingw-w64 headers 
from upstream and install them to `include/` as part of the 3rdparty 
deps build. (This is what VLC does to enable building with outdated 
mingw-w64 toolchains.)

On 24/1/2023 11:27, L. E. Segovia wrote:
> Git commit 1d3fcd0b6b7434076273794b98e4d8d9f9c13998 by L. E. Segovia.
> Committed on 24/01/2023 at 03:25.
> Pushed by lsegovia into branch 'master'.
>
> Revert "Revert "windows: Set the minimum SDK API to Windows 8 and clean relevant ifdefs""
>
> The only necessary change is ensuring appmodel.h exists, and if not
> (which means an outdated SDK), define the necessary variables as before.
>
> This reverts commit 9505bc4dc0fff15946857b31237d90ec592c5a2a.
>
> CCMAIL: kimageshop at kde.org
>
> M  +11   -0    CMakeLists.txt
> M  +2    -12   krita/main.cc
> M  +50   -51   libs/global/KisWindowsPackageUtils.cpp
> M  +0    -10   libs/ui/input/wintab/kis_tablet_support_win8.cpp
>
> https://invent.kde.org/graphics/krita/commit/1d3fcd0b6b7434076273794b98e4d8d9f9c13998
>
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> index 081bf63ce6..c43b6b4150 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -354,6 +354,17 @@ endif()
>   include(KDECMakeSettings)
>   include(KDECompilerSettings)
>   
> +if (WIN32)
> +# KDECompilerSettings sets Windows Vista as the default,
> +# while MSVC's default is 0x0A00 (_WIN32_WINNT_WIN10, sdkddkver.h) and
> +# MinGW's is 0x0601 (_WIN32_WINNT_WIN7, _mingw.h).
> +# Both are enough to supply the APIs we need in main.cc, but since we
> +# need the Windows 8 APIs anyway for the surface orientation and Store API,
> +# we set the minimum here.
> +remove_definitions(-D_WIN32_WINNT=0x0600 -DWINVER=0x0600 -D_WIN32_IE=0x0600)
> +add_definitions(-D_WIN32_WINNT=0x0602 -DWINVER=0x0602  -D_WIN32_IE=0x0602)
> +endif()
> +
>   # do not reorder to be alphabetical: this is the order in which the frameworks
>   # depend on each other.
>   find_package(KF5 ${MIN_FRAMEWORKS_VERSION} REQUIRED COMPONENTS
> diff --git a/krita/main.cc b/krita/main.cc
> index bde47c1815..79e136dec7 100644
> --- a/krita/main.cc
> +++ b/krita/main.cc
> @@ -60,6 +60,7 @@
>   #if defined Q_OS_WIN
>   #include "config_use_qt_tablet_windows.h"
>   #include <windows.h>
> +#include <winuser.h>
>   #ifndef USE_QT_TABLET_WINDOWS
>   #include <kis_tablet_support_win.h>
>   #include <kis_tablet_support_win8.h>
> @@ -120,18 +121,7 @@ void installTranslators(KisApplication &app);
>   #ifdef Q_OS_WIN
>   namespace
>   {
> -using ORIENTATION_PREFERENCE = enum ORIENTATION_PREFERENCE {
> -    ORIENTATION_PREFERENCE_NONE = 0x0,
> -    ORIENTATION_PREFERENCE_LANDSCAPE = 0x1,
> -    ORIENTATION_PREFERENCE_PORTRAIT = 0x2,
> -    ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED = 0x4,
> -    ORIENTATION_PREFERENCE_PORTRAIT_FLIPPED = 0x8
> -};
> -#if !defined(_MSC_VER)
> -using pSetDisplayAutoRotationPreferences_t = BOOL WINAPI (*)(ORIENTATION_PREFERENCE orientation);
> -#else
> -using pSetDisplayAutoRotationPreferences_t = BOOL(WINAPI *)(ORIENTATION_PREFERENCE orientation);
> -#endif
> +using pSetDisplayAutoRotationPreferences_t = decltype(&SetDisplayAutoRotationPreferences);
>   
>   void resetRotation()
>   {
> diff --git a/libs/global/KisWindowsPackageUtils.cpp b/libs/global/KisWindowsPackageUtils.cpp
> index eb99fbbd88..72931e7dfc 100644
> --- a/libs/global/KisWindowsPackageUtils.cpp
> +++ b/libs/global/KisWindowsPackageUtils.cpp
> @@ -5,48 +5,61 @@
>    * SPDX-License-Identifier: GPL-3.0-or-later
>    */
>   
> -// Get Windows Vista API
> -#if defined(WINVER) && WINVER < 0x0600
> -#undef WINVER
> -#endif
> -#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0600
> -#undef _WIN32_WINNT
> -#endif
> -#ifndef WINVER
> -#define WINVER 0x0600
> -#endif
> -#ifndef _WIN32_WINNT
> -#define _WIN32_WINNT 0x0600
> -#endif
> -
>   #include "KisWindowsPackageUtils.h"
>   
>   #include <array>
>   
> -#include <Shlobj.h>
> +// XXX: needs to go first because under MinGW
> +// clangd gets really confused and errors on missing
> +// definition of WINAPI_FAMILY_PARTITION
>   #include <windows.h>
>   
> -#include <QDebug>
> -#include <QLibrary>
> -#include <QString>
> -
> -constexpr int appmodel_PACKAGE_FULL_NAME_MAX_LENGTH = 127;
> +#if defined __has_include
> +#if __has_include(<appmodel.h>)
> +#include <appmodel.h>
> +#define HAS_APPMODEL_H
> +#endif
> +#endif
>   
> -constexpr LONG winerror_APPMODEL_ERROR_NO_PACKAGE = 15700;
> +#if defined HAS_APPMODEL_H
> +// ---
> +// GetCurrentPackageFamilyName
> +// appmodel.h / Kernel32.dll / Windows 8
> +// ---
> +using pGetCurrentPackageFamilyName_t = decltype(&GetCurrentPackageFamilyName);
>   
> +// ---
> +// GetCurrentPackageFullName
> +// appmodel.h / Kernel32.dll / Windows 8
> +// ---
> +using pGetCurrentPackageFullName_t = decltype(&GetCurrentPackageFullName);
> +#else
>   // ---
>   // GetCurrentPackageFamilyName
>   // appmodel.h / Kernel32.dll / Windows 8
>   // ---
> -using pGetCurrentPackageFamilyName_t =
> -    LONG(WINAPI *)(UINT32 *packageFamilyNameLength, PWSTR packageFamilyName);
> +using pGetCurrentPackageFamilyName_t = LONG(WINAPI *)(UINT32 *packageFamilyNameLength, PWSTR packageFamilyName);
>   
>   // ---
>   // GetCurrentPackageFullName
>   // appmodel.h / Kernel32.dll / Windows 8
>   // ---
> -using pGetCurrentPackageFullName_t =
> -    LONG(WINAPI *)(UINT32 *packageFullNameLength, PWSTR packageFullName);
> +using pGetCurrentPackageFullName_t = LONG(WINAPI *)(UINT32 *packageFullNameLength, PWSTR packageFullName);
> +#endif
> +
> +#include <shlobj.h>
> +
> +#include <QDebug>
> +#include <QLibrary>
> +#include <QString>
> +
> +#ifndef PACKAGE_FULL_NAME_MAX_LENGTH
> +constexpr int PACKAGE_FULL_NAME_MAX_LENGTH = 127;
> +#endif
> +
> +#ifndef APPMODEL_ERROR_NO_PACKAGE
> +constexpr LONG APPMODEL_ERROR_NO_PACKAGE = 15700;
> +#endif
>   
>   // Flag for `KNOWN_FOLDER_FLAG`, introduced in Win 10 ver 1703, which when
>   // used within a Desktop Bridge process, will cause the API to return the
> @@ -56,6 +69,7 @@ using pGetCurrentPackageFullName_t =
>   // KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET
>   // shlobj_core.h / Windows 10 v1703
>   // ---
> +// TODO: remove this once MinGW adds the flag -- see shlobj.h KNOWN_FOLDER_FLAG
>   constexpr int shlobj_KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET = 0x00040000;
>   
>   struct AppmodelFunctions {
> @@ -102,13 +116,10 @@ bool tryGetCurrentPackageFamilyName(QString *outName)
>           return false;
>       }
>   
> -    std::array<WCHAR, appmodel_PACKAGE_FULL_NAME_MAX_LENGTH + 1>
> -        name{}; // includes null terminator
> +    std::array<WCHAR, PACKAGE_FULL_NAME_MAX_LENGTH + 1> name{}; // includes null terminator
>       UINT32 nameLength = name.size();
> -    LONG result =
> -        AppmodelFunctions::instance().getCurrentPackageFamilyName(&nameLength,
> -                                                                  name.data());
> -    if (result == winerror_APPMODEL_ERROR_NO_PACKAGE) {
> +    const LONG result = AppmodelFunctions::instance().getCurrentPackageFamilyName(&nameLength, name.data());
> +    if (result == APPMODEL_ERROR_NO_PACKAGE) {
>           // Process not running from a package.
>           return false;
>       }
> @@ -123,9 +134,7 @@ bool tryGetCurrentPackageFamilyName(QString *outName)
>           return true;
>       }
>       if (result != ERROR_SUCCESS) {
> -        qWarning()
> -            << "GetCurrentPackageFamilyName returned unexpected error code:"
> -            << result;
> +        qWarning() << "GetCurrentPackageFamilyName returned unexpected error code:" << result;
>           return false;
>       }
>   
> @@ -141,8 +150,7 @@ bool tryGetCurrentPackageFamilyName(QString *outName)
>           if (nameLength > 0 && name.at(nameLength - 1) == L'\0') {
>               nameLength -= 1;
>           }
> -        *outName =
> -            QString::fromWCharArray(name.data(), static_cast<int>(nameLength));
> +        *outName = QString::fromWCharArray(name.data(), static_cast<int>(nameLength));
>       }
>       return true;
>   }
> @@ -154,13 +162,10 @@ bool tryGetCurrentPackageFullName(QString *outName)
>           return false;
>       }
>   
> -    std::array<WCHAR, appmodel_PACKAGE_FULL_NAME_MAX_LENGTH + 1>
> -        name{}; // includes null terminator
> +    std::array<WCHAR, PACKAGE_FULL_NAME_MAX_LENGTH + 1> name{}; // includes null terminator
>       UINT32 nameLength = name.size();
> -    const LONG result =
> -        AppmodelFunctions::instance().getCurrentPackageFullName(&nameLength,
> -                                                                name.data());
> -    if (result == winerror_APPMODEL_ERROR_NO_PACKAGE) {
> +    const LONG result = AppmodelFunctions::instance().getCurrentPackageFullName(&nameLength, name.data());
> +    if (result == APPMODEL_ERROR_NO_PACKAGE) {
>           // Process not running from a package.
>           return false;
>       }
> @@ -175,9 +180,7 @@ bool tryGetCurrentPackageFullName(QString *outName)
>           return true;
>       }
>       if (result != ERROR_SUCCESS) {
> -        qWarning()
> -            << "GetCurrentPackageFullName returned unexpected error code:"
> -            << result;
> +        qWarning() << "GetCurrentPackageFullName returned unexpected error code:" << result;
>           return false;
>       }
>   
> @@ -193,8 +196,7 @@ bool tryGetCurrentPackageFullName(QString *outName)
>           if (nameLength > 0 && name.at(nameLength - 1) == L'\0') {
>               nameLength -= 1;
>           }
> -        *outName =
> -            QString::fromWCharArray(name.data(), static_cast<int>(nameLength));
> +        *outName = QString::fromWCharArray(name.data(), static_cast<int>(nameLength));
>       }
>       return true;
>   }
> @@ -203,10 +205,7 @@ QString getPackageRoamingAppDataLocation()
>   {
>       PWSTR path = nullptr;
>       HRESULT result =
> -        SHGetKnownFolderPath(FOLDERID_RoamingAppData,
> -                             shlobj_KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET,
> -                             nullptr,
> -                             &path);
> +        SHGetKnownFolderPath(FOLDERID_RoamingAppData, shlobj_KF_FLAG_RETURN_FILTER_REDIRECTION_TARGET, nullptr, &path);
>       if (result != S_OK) {
>           qWarning() << "SHGetKnownFolderPath returned error HRESULT:" << result;
>           return {};
> diff --git a/libs/ui/input/wintab/kis_tablet_support_win8.cpp b/libs/ui/input/wintab/kis_tablet_support_win8.cpp
> index 08bba59f27..6d9dfe3f1d 100644
> --- a/libs/ui/input/wintab/kis_tablet_support_win8.cpp
> +++ b/libs/ui/input/wintab/kis_tablet_support_win8.cpp
> @@ -4,16 +4,6 @@
>    * SPDX-License-Identifier: BSD-2-Clause
>    */
>   
> -// Get Windows 8 API prototypes and types
> -#ifdef WINVER
> -#  undef WINVER
> -#endif
> -#ifdef _WIN32_WINNT
> -#  undef _WIN32_WINNT
> -#endif
> -#define WINVER 0x0602
> -#define _WIN32_WINNT 0x0602
> -
>   #include "kis_tablet_support_win8.h"
>   
>   #include <QApplication>
>


More information about the kimageshop mailing list