Allow build with no private Qt modules

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2022-12-02 18:01:18 +08:00
parent d14a0e62d9
commit 48a1106fc0
32 changed files with 586 additions and 202 deletions

View File

@ -38,6 +38,7 @@ option(FRAMELESSHELPER_BUILD_EXAMPLES "Build FramelessHelper demo applications."
option(FRAMELESSHELPER_EXAMPLES_DEPLOYQT "Deploy the Qt framework after building the demo projects." ON) option(FRAMELESSHELPER_EXAMPLES_DEPLOYQT "Deploy the Qt framework after building the demo projects." ON)
option(FRAMELESSHELPER_NO_DEBUG_OUTPUT "Suppress the debug messages from FramelessHelper." OFF) option(FRAMELESSHELPER_NO_DEBUG_OUTPUT "Suppress the debug messages from FramelessHelper." OFF)
option(FRAMELESSHELPER_NO_BUNDLE_RESOURCE "Do not bundle any resources within FramelessHelper." OFF) option(FRAMELESSHELPER_NO_BUNDLE_RESOURCE "Do not bundle any resources within FramelessHelper." OFF)
option(FRAMELESSHELPER_NO_PRIVATE "Do not use any private functionalities from Qt." OFF)
include(GNUInstallDirs) include(GNUInstallDirs)
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
@ -109,6 +110,18 @@ endif()
set(PROJECT_COMPILE_DATETIME "UNKNOWN") set(PROJECT_COMPILE_DATETIME "UNKNOWN")
string(TIMESTAMP PROJECT_COMPILE_DATETIME UTC) string(TIMESTAMP PROJECT_COMPILE_DATETIME UTC)
if(MSVC)
string(REGEX REPLACE "[-|/]GR-? " " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
string(REGEX REPLACE "[-|/]EHs-?c-? " " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
string(APPEND CMAKE_CXX_FLAGS " /GR ")
string(APPEND CMAKE_CXX_FLAGS " /EHsc ")
set(CMAKE_RC_FLAGS "/c65001 /DWIN32 /nologo")
if(MSVC_VERSION GREATER_EQUAL 1920) # Visual Studio 2019 version 16.0
string(REGEX REPLACE "[-|/]Ob[0|1|2|3] " " " CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Ob3 ")
endif()
endif()
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Gui) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Gui)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui)
@ -177,4 +190,5 @@ message("Build the FramelessHelper demo applications: ${FRAMELESSHELPER_BUILD_EX
message("Deploy Qt libraries after compilation: ${FRAMELESSHELPER_EXAMPLES_DEPLOYQT}") message("Deploy Qt libraries after compilation: ${FRAMELESSHELPER_EXAMPLES_DEPLOYQT}")
message("Suppress debug messages from FramelessHelper: ${FRAMELESSHELPER_NO_DEBUG_OUTPUT}") message("Suppress debug messages from FramelessHelper: ${FRAMELESSHELPER_NO_DEBUG_OUTPUT}")
message("Do not bundle any resources within FramelessHelper: ${FRAMELESSHELPER_NO_BUNDLE_RESOURCE}") message("Do not bundle any resources within FramelessHelper: ${FRAMELESSHELPER_NO_BUNDLE_RESOURCE}")
message("Do not use any private functionalities from Qt: ${FRAMELESSHELPER_NO_PRIVATE}")
message("#######################################") message("#######################################")

View File

@ -29,6 +29,6 @@ if(FRAMELESSHELPER_BUILD_WIDGETS AND TARGET Qt${QT_VERSION_MAJOR}::Widgets)
add_subdirectory(dialog) add_subdirectory(dialog)
endif() endif()
if(FRAMELESSHELPER_BUILD_QUICK AND TARGET Qt${QT_VERSION_MAJOR}::Quick AND ${QT_VERSION_MAJOR} GREATER_EQUAL 6) if(FRAMELESSHELPER_BUILD_QUICK AND TARGET Qt${QT_VERSION_MAJOR}::Quick AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6) AND (NOT FRAMELESSHELPER_NO_PRIVATE))
add_subdirectory(quick) add_subdirectory(quick)
endif() endif()

View File

@ -374,10 +374,10 @@ Q_ENUM_NS(RegistryRootKey)
enum class WindowEdge : quint32 enum class WindowEdge : quint32
{ {
Left = 0x00000000, Left = 0x00000001,
Top = 0x00000001, Top = 0x00000002,
Right = 0x00000002, Right = 0x00000004,
Bottom = 0x00000004 Bottom = 0x00000010
}; };
Q_ENUM_NS(WindowEdge) Q_ENUM_NS(WindowEdge)
Q_DECLARE_FLAGS(WindowEdges, WindowEdge) Q_DECLARE_FLAGS(WindowEdges, WindowEdge)

View File

@ -32,11 +32,11 @@
#endif // REGISTRYKEY_FORCE_QSETTINGS #endif // REGISTRYKEY_FORCE_QSETTINGS
#ifndef REGISTRYKEY_IMPL #ifndef REGISTRYKEY_IMPL
# if ((QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) && !(REGISTRYKEY_FORCE_QSETTINGS)) # if ((QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) && !(REGISTRYKEY_FORCE_QSETTINGS) && !defined(FRAMELESSHELPER_CORE_NO_PRIVATE))
# define REGISTRYKEY_IMPL (1) # define REGISTRYKEY_IMPL (1)
# else // ((QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) || REGISTRYKEY_FORCE_QSETTINGS) # else // ((QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) || REGISTRYKEY_FORCE_QSETTINGS || defined(FRAMELESSHELPER_CORE_NO_PRIVATE))
# define REGISTRYKEY_IMPL (2) # define REGISTRYKEY_IMPL (2)
# endif // ((QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) && !REGISTRYKEY_FORCE_QSETTINGS) # endif // ((QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) && !REGISTRYKEY_FORCE_QSETTINGS && !defined(FRAMELESSHELPER_CORE_NO_PRIVATE))
#endif // REGISTRYKEY_IMPL #endif // REGISTRYKEY_IMPL
#ifndef REGISTRYKEY_QWINREGISTRYKEY #ifndef REGISTRYKEY_QWINREGISTRYKEY

View File

@ -69,6 +69,14 @@ FRAMELESSHELPER_CORE_API void moveWindowToDesktopCenter(
FRAMELESSHELPER_CORE_API void registerThemeChangeNotification(); FRAMELESSHELPER_CORE_API void registerThemeChangeNotification();
[[nodiscard]] FRAMELESSHELPER_CORE_API QColor getFrameBorderColor(const bool active); [[nodiscard]] FRAMELESSHELPER_CORE_API QColor getFrameBorderColor(const bool active);
[[nodiscard]] FRAMELESSHELPER_CORE_API qreal roundScaleFactor(const qreal factor); [[nodiscard]] FRAMELESSHELPER_CORE_API qreal roundScaleFactor(const qreal factor);
[[nodiscard]] FRAMELESSHELPER_CORE_API int toNativePixels(const QWindow *window, const int value);
[[nodiscard]] FRAMELESSHELPER_CORE_API QPoint toNativePixels(const QWindow *window, const QPoint &point);
[[nodiscard]] FRAMELESSHELPER_CORE_API QSize toNativePixels(const QWindow *window, const QSize &size);
[[nodiscard]] FRAMELESSHELPER_CORE_API QRect toNativePixels(const QWindow *window, const QRect &rect);
[[nodiscard]] FRAMELESSHELPER_CORE_API int fromNativePixels(const QWindow *window, const int value);
[[nodiscard]] FRAMELESSHELPER_CORE_API QPoint fromNativePixels(const QWindow *window, const QPoint &point);
[[nodiscard]] FRAMELESSHELPER_CORE_API QSize fromNativePixels(const QWindow *window, const QSize &size);
[[nodiscard]] FRAMELESSHELPER_CORE_API QRect fromNativePixels(const QWindow *window, const QRect &rect);
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
[[nodiscard]] FRAMELESSHELPER_CORE_API bool isWindowsVersionOrGreater(const Global::WindowsVersion version); [[nodiscard]] FRAMELESSHELPER_CORE_API bool isWindowsVersionOrGreater(const Global::WindowsVersion version);
@ -109,7 +117,7 @@ FRAMELESSHELPER_CORE_API void installSystemMenuHook(
const WId windowId, const WId windowId,
const Global::IsWindowFixedSizeCallback &isWindowFixedSize, const Global::IsWindowFixedSizeCallback &isWindowFixedSize,
const Global::IsInsideTitleBarDraggableAreaCallback &isInTitleBarArea, const Global::IsInsideTitleBarDraggableAreaCallback &isInTitleBarArea,
const Global::GetWindowDevicePixelRatioCallback &getDevicePixelRatio); const Global::GetWindowHandleCallback &getWindowHandle);
FRAMELESSHELPER_CORE_API void uninstallSystemMenuHook(const WId windowId); FRAMELESSHELPER_CORE_API void uninstallSystemMenuHook(const WId windowId);
FRAMELESSHELPER_CORE_API void setAeroSnappingEnabled(const WId windowId, const bool enable); FRAMELESSHELPER_CORE_API void setAeroSnappingEnabled(const WId windowId, const bool enable);
FRAMELESSHELPER_CORE_API void tryToEnableHighestDpiAwarenessLevel(); FRAMELESSHELPER_CORE_API void tryToEnableHighestDpiAwarenessLevel();

View File

@ -24,6 +24,8 @@
#pragma once #pragma once
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelesshelperquick_global.h" #include "framelesshelperquick_global.h"
#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h> #include <QtQuickTemplates2/private/qquickapplicationwindow_p.h>
@ -82,3 +84,5 @@ FRAMELESSHELPER_END_NAMESPACE
Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickApplicationWindow)) Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickApplicationWindow))
QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickApplicationWindow)) QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickApplicationWindow))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -24,6 +24,8 @@
#pragma once #pragma once
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelesshelperquick_global.h" #include "framelesshelperquick_global.h"
#include "framelessquickapplicationwindow_p.h" #include "framelessquickapplicationwindow_p.h"
@ -68,3 +70,5 @@ private:
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE
Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickApplicationWindowPrivate)) Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickApplicationWindowPrivate))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -24,6 +24,8 @@
#pragma once #pragma once
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelesshelperquick_global.h" #include "framelesshelperquick_global.h"
#include <QtQuick/private/qquickwindowmodule_p.h> #include <QtQuick/private/qquickwindowmodule_p.h>
@ -82,3 +84,5 @@ FRAMELESSHELPER_END_NAMESPACE
Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickWindow)) Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickWindow))
QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickWindow)) QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickWindow))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -24,6 +24,8 @@
#pragma once #pragma once
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelesshelperquick_global.h" #include "framelesshelperquick_global.h"
#include "framelessquickwindow_p.h" #include "framelessquickwindow_p.h"
@ -68,3 +70,5 @@ private:
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE
Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickWindowPrivate)) Q_DECLARE_METATYPE2(FRAMELESSHELPER_PREPEND_NAMESPACE(FramelessQuickWindowPrivate))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -24,6 +24,8 @@
#pragma once #pragma once
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelesshelperquick_global.h" #include "framelesshelperquick_global.h"
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include <QtQuickTemplates2/private/qquickbutton_p.h> #include <QtQuickTemplates2/private/qquickbutton_p.h>
@ -110,3 +112,5 @@ FRAMELESSHELPER_END_NAMESPACE
Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardSystemButton)) Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardSystemButton))
QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardSystemButton)) QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardSystemButton))
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -24,6 +24,8 @@
#pragma once #pragma once
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelesshelperquick_global.h" #include "framelesshelperquick_global.h"
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include "quickchromepalette.h" #include "quickchromepalette.h"
@ -142,3 +144,5 @@ FRAMELESSHELPER_END_NAMESPACE
Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardTitleBar)) Q_DECLARE_METATYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardTitleBar))
QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardTitleBar)) QML_DECLARE_TYPE(FRAMELESSHELPER_PREPEND_NAMESPACE(QuickStandardTitleBar))
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -158,6 +158,12 @@ if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
) )
endif() endif()
if(FRAMELESSHELPER_NO_PRIVATE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
FRAMELESSHELPER_CORE_NO_PRIVATE
)
endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
QT_NO_KEYWORDS QT_NO_KEYWORDS
FRAMELESSHELPER_CORE_LIBRARY FRAMELESSHELPER_CORE_LIBRARY
@ -182,10 +188,17 @@ elseif(UNIX)
) )
endif() endif()
target_link_libraries(${SUB_PROJ_NAME} PRIVATE if(FRAMELESSHELPER_NO_PRIVATE)
Qt${QT_VERSION_MAJOR}::CorePrivate target_link_libraries(${SUB_PROJ_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::GuiPrivate Qt${QT_VERSION_MAJOR}::Core
) Qt${QT_VERSION_MAJOR}::Gui
)
else()
target_link_libraries(${SUB_PROJ_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::CorePrivate
Qt${QT_VERSION_MAJOR}::GuiPrivate
)
endif()
target_include_directories(${SUB_PROJ_NAME} PUBLIC target_include_directories(${SUB_PROJ_NAME} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${INCLUDE_PREFIX}>"

View File

@ -59,19 +59,88 @@ function(setup_compile_params arg_target)
WIN32_LEAN_AND_MEAN WINRT_LEAN_AND_MEAN WIN32_LEAN_AND_MEAN WINRT_LEAN_AND_MEAN
) )
target_compile_options(${arg_target} PRIVATE target_compile_options(${arg_target} PRIVATE
/options:strict # Don't allow unknown parameters. /bigobj /utf-8 $<$<NOT:$<CONFIG:Debug>>:/fp:fast /GT /Gw /Gy /guard:cf /Zc:inline> # /GA for executables.
/permissive- # Make sure we always write standard code. /sdl /Zc:auto /Zc:forScope /Zc:implicitNoexcept /Zc:noexceptTypes /Zc:referenceBinding
/utf-8 /Zc:rvalueCast /Zc:sizedDealloc /Zc:strictStrings /Zc:throwingNew /Zc:trigraphs
/Zc:__cplusplus # Make sure we use the correct C++ standard. /Zc:wchar_t
/W3 # Can't use /W4 here, Qt's own headers are not warning-clean, especially QtQuick headers. /W4 will trigger too many warnings.
/WX # Make sure we don't ignore any warnings.
$<$<CONFIG:Debug>:/JMC>
$<$<NOT:$<CONFIG:Debug>>:/guard:cf /Gw /Gy /QIntel-jcc-erratum /Zc:inline> # /guard:ehcont? /Qspectre-load?
) )
target_link_options(${arg_target} PRIVATE target_link_options(${arg_target} PRIVATE
/WX # Don't allow unknown parameters. $<$<NOT:$<CONFIG:Debug>>:/OPT:REF /OPT:ICF /OPT:LBR /GUARD:CF>
$<$<NOT:$<CONFIG:Debug>>:/CETCOMPAT /GUARD:CF /OPT:REF /OPT:ICF> # /GUARD:EHCONT? /DYNAMICBASE /NXCOMPAT /LARGEADDRESSAWARE /WX # /TSAWARE for executables.
) )
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
target_link_options(${arg_target} PRIVATE /SAFESEH)
endif()
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
target_link_options(${arg_target} PRIVATE $<$<NOT:$<CONFIG:Debug>>:/HIGHENTROPYVA>)
endif()
if(MSVC_VERSION GREATER_EQUAL 1900) # Visual Studio 2015
target_compile_options(${arg_target} PRIVATE /Zc:threadSafeInit)
endif()
if(MSVC_VERSION GREATER_EQUAL 1910) # Visual Studio 2017 version 15.0
target_compile_options(${arg_target} PRIVATE /permissive- /Zc:ternary)
endif()
if(MSVC_VERSION GREATER_EQUAL 1912) # Visual Studio 2017 version 15.5
target_compile_options(${arg_target} PRIVATE /Zc:alignedNew)
endif()
if(MSVC_VERSION GREATER_EQUAL 1913) # Visual Studio 2017 version 15.6
target_compile_options(${arg_target} PRIVATE /Zc:externConstexpr)
endif()
if(MSVC_VERSION GREATER_EQUAL 1914) # Visual Studio 2017 version 15.7
target_compile_options(${arg_target} PRIVATE /Zc:__cplusplus)
endif()
if(MSVC_VERSION GREATER_EQUAL 1915) # Visual Studio 2017 version 15.8
target_compile_options(${arg_target} PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:/JMC>)
endif()
if(MSVC_VERSION GREATER_EQUAL 1920) # Visual Studio 2019 version 16.0
target_link_options(${arg_target} PRIVATE $<$<NOT:$<CONFIG:Debug>>:/CETCOMPAT>)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
target_compile_options(${arg_target} PRIVATE /d2FH4)
endif()
endif()
if(MSVC_VERSION GREATER_EQUAL 1921) # Visual Studio 2019 version 16.1
target_compile_options(${arg_target} PRIVATE /Zc:char8_t)
endif()
if(MSVC_VERSION GREATER_EQUAL 1923) # Visual Studio 2019 version 16.3
target_compile_options(${arg_target} PRIVATE /Zc:externC)
endif()
if(MSVC_VERSION GREATER_EQUAL 1924) # Visual Studio 2019 version 16.4
target_compile_options(${arg_target} PRIVATE /Zc:hiddenFriend)
endif()
if(MSVC_VERSION GREATER_EQUAL 1925) # Visual Studio 2019 version 16.5
target_compile_options(${arg_target} PRIVATE
/Zc:preprocessor /Zc:tlsGuards $<$<NOT:$<CONFIG:Debug>>:/QIntel-jcc-erratum> # /Qspectre-load ?
)
#elseif(MSVC_VERSION GREATER_EQUAL 1912) # Visual Studio 2017 version 15.5
# target_compile_options(${arg_target} PRIVATE /Qspectre)
endif()
#[[if((MSVC_VERSION GREATER_EQUAL 1927) AND (CMAKE_SIZEOF_VOID_P EQUAL 8)) # Visual Studio 2019 version 16.7
target_compile_options(${arg_target} PRIVATE $<$<NOT:$<CONFIG:Debug>>:/guard:ehcont>)
target_link_options(${arg_target} PRIVATE $<$<NOT:$<CONFIG:Debug>>:/guard:ehcont>)
endif()]]
if(MSVC_VERSION GREATER_EQUAL 1928) # Visual Studio 2019 version 16.8 & 16.9
target_compile_options(${arg_target} PRIVATE /Zc:lambda /Zc:zeroSizeArrayNew)
endif()
if(MSVC_VERSION GREATER_EQUAL 1929) # Visual Studio 2019 version 16.10
target_compile_options(${arg_target} PRIVATE /await:strict)
elseif(MSVC_VERSION GREATER_EQUAL 1900) # Visual Studio 2015
target_compile_options(${arg_target} PRIVATE /await)
endif()
if(MSVC_VERSION GREATER_EQUAL 1930) # Visual Studio 2022 version 17.0
target_compile_options(${arg_target} PRIVATE /options:strict)
endif()
if(MSVC_VERSION GREATER_EQUAL 1931) # Visual Studio 2022 version 17.1
target_compile_options(${arg_target} PRIVATE /Zc:static_assert)
endif()
if(MSVC_VERSION GREATER_EQUAL 1932) # Visual Studio 2022 version 17.2
target_compile_options(${arg_target} PRIVATE /Zc:__STDC__)
endif()
if(MSVC_VERSION GREATER_EQUAL 1934) # Visual Studio 2022 version 17.4
target_compile_options(${arg_target} PRIVATE /Zc:enumTypes /Zc:gotoScope /Zc:nrvo)
endif()
if(MSVC_VERSION GREATER_EQUAL 1935) # Visual Studio 2022 version 17.5
target_compile_options(${arg_target} PRIVATE /Zc:templateScope)
endif()
else() else()
target_compile_options(${arg_target} PRIVATE target_compile_options(${arg_target} PRIVATE
-Wall -Wextra -Werror -Wall -Wextra -Werror
@ -86,18 +155,6 @@ function(setup_compile_params arg_target)
$<$<NOT:$<CONFIG:Debug>>:-Wl,--gc-sections> $<$<NOT:$<CONFIG:Debug>>:-Wl,--gc-sections>
) )
endif() endif()
#[[if(CLANG)
target_compile_options(${arg_target} PRIVATE
$<$<NOT:$<CONFIG:Debug>>:-Xclang -cfguard -mretpoline>
)
target_link_options(${arg_target} PRIVATE
$<$<NOT:$<CONFIG:Debug>>:-Wl,-Xlink,-guard:cf -z retpolineplt -z now>
)
else() # GCC
target_compile_options(${arg_target} PRIVATE
$<$<NOT:$<CONFIG:Debug>>:-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register -mindirect-branch-cs-prefix>
)
endif()]]
endif() endif()
endfunction() endfunction()

View File

@ -200,8 +200,8 @@ Q_GLOBAL_STATIC(Win32Helper, g_win32Helper)
WARNING << Utils::getSystemErrorMessage(kScreenToClient); WARNING << Utils::getSystemErrorMessage(kScreenToClient);
break; break;
} }
const qreal devicePixelRatio = data.params.getWindowDevicePixelRatio(); const QPoint qtScenePos = Utils::fromNativePixels(data.params.getWindowHandle(),
const QPoint qtScenePos = QPointF(QPointF(qreal(nativeLocalPos.x), qreal(nativeLocalPos.y)) / devicePixelRatio).toPoint(); QPoint(nativeLocalPos.x, nativeLocalPos.y));
SystemButtonType buttonType = SystemButtonType::Unknown; SystemButtonType buttonType = SystemButtonType::Unknown;
if (data.params.isInsideSystemButtons(qtScenePos, &buttonType)) { if (data.params.isInsideSystemButtons(qtScenePos, &buttonType)) {
switch (buttonType) { switch (buttonType) {
@ -989,8 +989,8 @@ bool FramelessHelperWin::nativeEventFilter(const QByteArray &eventType, void *me
WARNING << Utils::getSystemErrorMessage(kScreenToClient); WARNING << Utils::getSystemErrorMessage(kScreenToClient);
break; break;
} }
const qreal dpr = data.params.getWindowDevicePixelRatio(); const QPoint qtScenePos = Utils::fromNativePixels(data.params.getWindowHandle(),
const QPoint qtScenePos = QPointF(QPointF(qreal(nativeLocalPos.x), qreal(nativeLocalPos.y)) / dpr).toPoint(); QPoint(nativeLocalPos.x, nativeLocalPos.y));
const bool max = IsMaximized(hWnd); const bool max = IsMaximized(hWnd);
const bool full = Utils::isFullScreen(windowId); const bool full = Utils::isFullScreen(windowId);
const int frameSizeY = Utils::getResizeBorderThickness(windowId, false, true); const int frameSizeY = Utils::getResizeBorderThickness(windowId, false, true);
@ -1125,11 +1125,11 @@ bool FramelessHelperWin::nativeEventFilter(const QByteArray &eventType, void *me
windowPos->flags |= SWP_NOCOPYBITS; windowPos->flags |= SWP_NOCOPYBITS;
} break; } break;
#endif #endif
#if ((QT_VERSION <= QT_VERSION_CHECK(6, 2, 6)) || ((QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) && (QT_VERSION <= QT_VERSION_CHECK(6, 4, 1)))) #if ((QT_VERSION <= QT_VERSION_CHECK(6, 2, 7)) || ((QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) && (QT_VERSION <= QT_VERSION_CHECK(6, 4, 2))))
case WM_GETDPISCALEDSIZE: { case WM_GETDPISCALEDSIZE: {
// QtBase commit 2cfca7fd1911cc82a22763152c04c65bc05bc19a introduced a bug // QtBase commit 2cfca7fd1911cc82a22763152c04c65bc05bc19a introduced a bug
// which caused the custom margins is ignored during the handling of the // which caused the custom margins is ignored during the handling of the
// WM_GETDPISCALEDSIZE message, it was shipped with Qt 6.2.1 ~ 6.2.6 & 6.3 ~ 6.4.1. // WM_GETDPISCALEDSIZE message, it was shipped with Qt 6.2.1 ~ 6.2.7 & 6.3 ~ 6.4.2.
// We workaround it by overriding the wrong handling directly. // We workaround it by overriding the wrong handling directly.
RECT clientRect = {}; RECT clientRect = {};
if (GetClientRect(hWnd, &clientRect) == FALSE) { if (GetClientRect(hWnd, &clientRect) == FALSE) {
@ -1162,14 +1162,14 @@ bool FramelessHelperWin::nativeEventFilter(const QByteArray &eventType, void *me
*result = TRUE; // We have set our preferred window size, don't use the default linear DPI scaling. *result = TRUE; // We have set our preferred window size, don't use the default linear DPI scaling.
return true; // Jump over Qt's wrong handling logic. return true; // Jump over Qt's wrong handling logic.
} }
#endif #endif // ((QT_VERSION <= QT_VERSION_CHECK(6, 2, 7)) || ((QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)) && (QT_VERSION <= QT_VERSION_CHECK(6, 4, 2))))
case WM_DPICHANGED: { case WM_DPICHANGED: {
const Dpi dpi = {UINT(LOWORD(wParam)), UINT(HIWORD(wParam))}; const Dpi dpi = {UINT(LOWORD(wParam)), UINT(HIWORD(wParam))};
DEBUG.noquote() << "New DPI for window" << hwnd2str(hWnd) << "is" << dpi; DEBUG.noquote() << "New DPI for window" << hwnd2str(hWnd) << "is" << dpi;
g_win32Helper()->mutex.lock(); g_win32Helper()->mutex.lock();
g_win32Helper()->data[windowId].dpi = dpi; g_win32Helper()->data[windowId].dpi = dpi;
g_win32Helper()->mutex.unlock(); g_win32Helper()->mutex.unlock();
#if (QT_VERSION <= QT_VERSION_CHECK(6, 4, 1)) #if (QT_VERSION <= QT_VERSION_CHECK(6, 4, 2))
// We need to wait until Qt has handled this message, otherwise everything // We need to wait until Qt has handled this message, otherwise everything
// we have done here will always be overwritten. // we have done here will always be overwritten.
QTimer::singleShot(0, qApp, [data](){ // Copy the variables intentionally, otherwise they'll go out of scope when Qt finally use them. QTimer::singleShot(0, qApp, [data](){ // Copy the variables intentionally, otherwise they'll go out of scope when Qt finally use them.
@ -1177,7 +1177,7 @@ bool FramelessHelperWin::nativeEventFilter(const QByteArray &eventType, void *me
// we will get wrong window sizes after the DPI change. // we will get wrong window sizes after the DPI change.
Utils::updateInternalWindowFrameMargins(data.params.getWindowHandle(), true); Utils::updateInternalWindowFrameMargins(data.params.getWindowHandle(), true);
}); });
#endif // (QT_VERSION <= QT_VERSION_CHECK(6, 4, 1)) #endif // (QT_VERSION <= QT_VERSION_CHECK(6, 4, 2))
} break; } break;
case WM_DWMCOMPOSITIONCHANGED: { case WM_DWMCOMPOSITIONCHANGED: {
// Re-apply the custom window frame if recovered from the basic theme. // Re-apply the custom window frame if recovered from the basic theme.

View File

@ -220,7 +220,7 @@ void FramelessManagerPrivate::addWindow(const SystemParameters &params)
FramelessHelperWin::addWindow(params); FramelessHelperWin::addWindow(params);
} }
Utils::installSystemMenuHook(windowId, params.isWindowFixedSize, Utils::installSystemMenuHook(windowId, params.isWindowFixedSize,
params.isInsideTitleBarDraggableArea, params.getWindowDevicePixelRatio); params.isInsideTitleBarDraggableArea, params.getWindowHandle);
#endif #endif
} }

View File

@ -34,8 +34,10 @@
#include <QtGui/qpainter.h> #include <QtGui/qpainter.h>
#include <QtGui/qscreen.h> #include <QtGui/qscreen.h>
#include <QtGui/qguiapplication.h> #include <QtGui/qguiapplication.h>
#include <QtGui/private/qguiapplication_p.h> #ifndef FRAMELESSHELPER_CORE_NO_PRIVATE
#include <QtGui/private/qmemrotate_p.h> # include <QtGui/private/qguiapplication_p.h>
# include <QtGui/private/qmemrotate_p.h>
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE #ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
// The "Q_INIT_RESOURCE()" macro can't be used within a namespace, // The "Q_INIT_RESOURCE()" macro can't be used within a namespace,
@ -66,11 +68,11 @@ Q_LOGGING_CATEGORY(lcMicaMaterial, "wangwenx190.framelesshelper.core.micamateria
using namespace Global; using namespace Global;
static constexpr const qreal kDefaultTintOpacity = 0.7; [[maybe_unused]] static constexpr const qreal kDefaultTintOpacity = 0.7;
static constexpr const qreal kDefaultNoiseOpacity = 0.04; [[maybe_unused]] static constexpr const qreal kDefaultNoiseOpacity = 0.04;
static constexpr const qreal kDefaultBlurRadius = 128.0; [[maybe_unused]] static constexpr const qreal kDefaultBlurRadius = 128.0;
static Q_CONSTEXPR2 const QColor kDefaultSystemLightColor2 = {243, 243, 243}; // #F3F3F3 [[maybe_unused]] static Q_CONSTEXPR2 const QColor kDefaultSystemLightColor2 = {243, 243, 243}; // #F3F3F3
#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE #ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
FRAMELESSHELPER_STRING_CONSTANT2(NoiseImageFilePath, ":/org.wangwenx190.FramelessHelper/resources/images/noise.png") FRAMELESSHELPER_STRING_CONSTANT2(NoiseImageFilePath, ":/org.wangwenx190.FramelessHelper/resources/images/noise.png")
@ -85,6 +87,14 @@ struct MicaMaterialData
Q_GLOBAL_STATIC(MicaMaterialData, g_micaMaterialData) Q_GLOBAL_STATIC(MicaMaterialData, g_micaMaterialData)
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
[[nodiscard]] static inline Qt::Alignment visualAlignment
(const Qt::LayoutDirection direction, const Qt::Alignment alignment)
{
Q_UNUSED(direction);
return alignment;
}
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
template<const int shift> template<const int shift>
[[nodiscard]] static inline int qt_static_shift(const int value) [[nodiscard]] static inline int qt_static_shift(const int value)
{ {
@ -437,6 +447,7 @@ static inline void expblur(QImage &img, qreal radius, const bool improvedQuality
{ {
return QGuiApplicationPrivate::visualAlignment(direction, alignment); return QGuiApplicationPrivate::visualAlignment(direction, alignment);
} }
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
/*! /*!
Returns a new rectangle of the specified \a size that is aligned to the given Returns a new rectangle of the specified \a size that is aligned to the given
@ -554,11 +565,11 @@ void MicaMaterialPrivate::maybeGenerateBlurredWallpaper(const bool force)
QPainter painter(&g_micaMaterialData()->blurredWallpaper); QPainter painter(&g_micaMaterialData()->blurredWallpaper);
painter.setRenderHints(QPainter::Antialiasing | painter.setRenderHints(QPainter::Antialiasing |
QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform);
#if 1 #ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
qt_blurImage(&painter, buffer, kDefaultBlurRadius, true, false);
#else
painter.drawImage(desktopOriginPoint, buffer); painter.drawImage(desktopOriginPoint, buffer);
#endif #else // !FRAMELESSHELPER_CORE_NO_PRIVATE
qt_blurImage(&painter, buffer, kDefaultBlurRadius, true, false);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
g_micaMaterialData()->mutex.unlock(); g_micaMaterialData()->mutex.unlock();
Q_Q(MicaMaterial); Q_Q(MicaMaterial);
Q_EMIT q->shouldRedraw(); Q_EMIT q->shouldRedraw();
@ -569,6 +580,7 @@ void MicaMaterialPrivate::updateMaterialBrush()
#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE #ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
initResource(); initResource();
static const QImage noiseTexture = QImage(kNoiseImageFilePath); static const QImage noiseTexture = QImage(kNoiseImageFilePath);
#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
QImage micaTexture = QImage(QSize(64, 64), QImage::Format_ARGB32_Premultiplied); QImage micaTexture = QImage(QSize(64, 64), QImage::Format_ARGB32_Premultiplied);
QColor fillColor = (Utils::shouldAppsUseDarkMode() ? kDefaultSystemDarkColor : kDefaultSystemLightColor2); QColor fillColor = (Utils::shouldAppsUseDarkMode() ? kDefaultSystemDarkColor : kDefaultSystemLightColor2);
fillColor.setAlphaF(0.9f); fillColor.setAlphaF(0.9f);
@ -580,13 +592,14 @@ void MicaMaterialPrivate::updateMaterialBrush()
const QRect rect = {QPoint(0, 0), micaTexture.size()}; const QRect rect = {QPoint(0, 0), micaTexture.size()};
painter.fillRect(rect, tintColor); painter.fillRect(rect, tintColor);
painter.setOpacity(noiseOpacity); painter.setOpacity(noiseOpacity);
#ifndef FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
painter.fillRect(rect, QBrush(noiseTexture)); painter.fillRect(rect, QBrush(noiseTexture));
#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
micaBrush = QBrush(micaTexture); micaBrush = QBrush(micaTexture);
if (initialized) { if (initialized) {
Q_Q(MicaMaterial); Q_Q(MicaMaterial);
Q_EMIT q->shouldRedraw(); Q_EMIT q->shouldRedraw();
} }
#endif // FRAMELESSHELPER_CORE_NO_BUNDLE_RESOURCE
} }
void MicaMaterialPrivate::paint(QPainter *painter, const QSize &size, const QPoint &pos) void MicaMaterialPrivate::paint(QPainter *painter, const QSize &size, const QPoint &pos)

View File

@ -23,13 +23,35 @@
*/ */
#include "sysapiloader_p.h" #include "sysapiloader_p.h"
#ifndef SYSAPILOADER_FORCE_QLIBRARY
# define SYSAPILOADER_FORCE_QLIBRARY (0)
#endif // SYSAPILOADER_FORCE_QLIBRARY
#ifndef SYSAPILOADER_IMPL
# if (defined(Q_OS_WINDOWS) && !defined(FRAMELESSHELPER_CORE_NO_PRIVATE))
# define SYSAPILOADER_IMPL (1)
# else // (!Q_OS_WINDOWS || FRAMELESSHELPER_CORE_NO_PRIVATE)
# define SYSAPILOADER_IMPL (2)
# endif // (defined(Q_OS_WINDOWS) && !defined(FRAMELESSHELPER_CORE_NO_PRIVATE))
#endif // SYSAPILOADER_IMPL
#ifndef SYSAPILOADER_QSYSTEMLIBRARY
# define SYSAPILOADER_QSYSTEMLIBRARY ((SYSAPILOADER_IMPL) == 1)
#endif // SYSAPILOADER_QSYSTEMLIBRARY
#ifndef SYSAPILOADER_QLIBRARY
# define SYSAPILOADER_QLIBRARY ((SYSAPILOADER_IMPL) == 2)
#endif // SYSAPILOADER_QLIBRARY
#include <QtCore/qhash.h> #include <QtCore/qhash.h>
#include <QtCore/qmutex.h> #include <QtCore/qmutex.h>
#ifdef Q_OS_WINDOWS #if SYSAPILOADER_QSYSTEMLIBRARY
# include <QtCore/private/qsystemlibrary_p.h> # include <QtCore/private/qsystemlibrary_p.h>
#else #endif // SYSAPILOADER_QSYSTEMLIBRARY
#if SYSAPILOADER_QLIBRARY
# include <QtCore/qlibrary.h> # include <QtCore/qlibrary.h>
#endif #endif // SYSAPILOADER_QLIBRARY
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
@ -75,11 +97,12 @@ QFunctionPointer SysApiLoader::resolve(const QString &library, const char *funct
if (library.isEmpty() || !function) { if (library.isEmpty() || !function) {
return nullptr; return nullptr;
} }
#ifdef Q_OS_WINDOWS #if SYSAPILOADER_QSYSTEMLIBRARY
return QSystemLibrary::resolve(library, function); return QSystemLibrary::resolve(library, function);
#else #endif // SYSAPILOADER_QSYSTEMLIBRARY
#if SYSAPILOADER_QLIBRARY
return QLibrary::resolve(library, function); return QLibrary::resolve(library, function);
#endif #endif // SYSAPILOADER_QLIBRARY
} }
QFunctionPointer SysApiLoader::resolve(const QString &library, const QByteArray &function) QFunctionPointer SysApiLoader::resolve(const QString &library, const QByteArray &function)

View File

@ -25,16 +25,19 @@
#include "utils.h" #include "utils.h"
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
# include "winverhelper_p.h" # include "winverhelper_p.h"
#endif #endif // Q_OS_WINDOWS
#include <QtGui/qwindow.h> #include <QtGui/qwindow.h>
#include <QtGui/qscreen.h> #include <QtGui/qscreen.h>
#include <QtGui/qguiapplication.h> #include <QtGui/qguiapplication.h>
#ifndef FRAMELESSHELPER_CORE_NO_PRIVATE
# include <QtGui/private/qhighdpiscaling_p.h>
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
# include <QtGui/qstylehints.h> # include <QtGui/qstylehints.h>
#elif (QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)) #elif ((QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)) && !defined(FRAMELESSHELPER_CORE_NO_PRIVATE))
# include <QtGui/qpa/qplatformtheme.h> # include <QtGui/qpa/qplatformtheme.h>
# include <QtGui/private/qguiapplication_p.h> # include <QtGui/private/qguiapplication_p.h>
#endif #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
@ -209,8 +212,8 @@ void Utils::moveWindowToDesktopCenter(const GetWindowScreenCallback &getWindowSc
if (!screen) { if (!screen) {
return; return;
} }
const QSize screenSize = (considerTaskBar ? screen->availableSize() : screen->size()); const QSize screenSize = (considerTaskBar ? screen->availableVirtualSize() : screen->virtualSize());
const QPoint offset = (considerTaskBar ? screen->availableGeometry().topLeft() : QPoint(0, 0)); const QPoint offset = (considerTaskBar ? screen->availableVirtualGeometry().topLeft() : QPoint(0, 0));
const int newX = qRound(qreal(screenSize.width() - windowSize.width()) / 2.0); const int newX = qRound(qreal(screenSize.width() - windowSize.width()) / 2.0);
const int newY = qRound(qreal(screenSize.height() - windowSize.height()) / 2.0); const int newY = qRound(qreal(screenSize.height() - windowSize.height()) / 2.0);
setWindowPosition(QPoint(newX + offset.x(), newY + offset.y())); setWindowPosition(QPoint(newX + offset.x(), newY + offset.y()));
@ -282,12 +285,12 @@ bool Utils::shouldAppsUseDarkMode()
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
return (QGuiApplication::styleHints()->appearance() == Qt::Appearance::Dark); return (QGuiApplication::styleHints()->appearance() == Qt::Appearance::Dark);
#elif (QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)) #elif ((QT_VERSION >= QT_VERSION_CHECK(6, 2, 1)) && !defined(FRAMELESSHELPER_CORE_NO_PRIVATE))
if (const QPlatformTheme * const theme = QGuiApplicationPrivate::platformTheme()) { if (const QPlatformTheme * const theme = QGuiApplicationPrivate::platformTheme()) {
return (theme->appearance() == QPlatformTheme::Appearance::Dark); return (theme->appearance() == QPlatformTheme::Appearance::Dark);
} }
return false; return false;
#else #else // ((QT_VERSION < QT_VERSION_CHECK(6, 2, 1)) || FRAMELESSHELPER_CORE_NO_PRIVATE)
# ifdef Q_OS_WINDOWS # ifdef Q_OS_WINDOWS
return shouldAppsUseDarkMode_windows(); return shouldAppsUseDarkMode_windows();
# elif defined(Q_OS_LINUX) # elif defined(Q_OS_LINUX)
@ -306,15 +309,16 @@ qreal Utils::roundScaleFactor(const qreal factor)
if (factor <= 0) { if (factor <= 0) {
return 1; return 1;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) #ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
# if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
static const auto policy = QGuiApplication::highDpiScaleFactorRoundingPolicy(); static const auto policy = QGuiApplication::highDpiScaleFactorRoundingPolicy();
switch (policy) { switch (policy) {
case Qt::HighDpiScaleFactorRoundingPolicy::Unset: case Qt::HighDpiScaleFactorRoundingPolicy::Unset:
# if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
return factor; return factor;
# else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) # else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
return qRound(factor); return qRound(factor);
# endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
case Qt::HighDpiScaleFactorRoundingPolicy::Round: case Qt::HighDpiScaleFactorRoundingPolicy::Round:
return qRound(factor); return qRound(factor);
case Qt::HighDpiScaleFactorRoundingPolicy::Ceil: case Qt::HighDpiScaleFactorRoundingPolicy::Ceil:
@ -327,9 +331,116 @@ qreal Utils::roundScaleFactor(const qreal factor)
return factor; return factor;
} }
return 1; return 1;
#else // (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) # else // (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
return qRound(factor); return qRound(factor);
#endif // (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) # endif // (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpiScaling::roundScaleFactor(factor);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
int Utils::toNativePixels(const QWindow *window, const int value)
{
Q_ASSERT(window);
if (!window) {
return 0;
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return qRound(qreal(value) * window->devicePixelRatio());
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::toNativePixels(value, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
QPoint Utils::toNativePixels(const QWindow *window, const QPoint &point)
{
Q_ASSERT(window);
if (!window) {
return {};
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return QPointF(QPointF(point) * window->devicePixelRatio()).toPoint();
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::toNativePixels(point, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
QSize Utils::toNativePixels(const QWindow *window, const QSize &size)
{
Q_ASSERT(window);
if (!window) {
return {};
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return QSizeF(QSizeF(size) * window->devicePixelRatio()).toSize();
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::toNativePixels(size, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
QRect Utils::toNativePixels(const QWindow *window, const QRect &rect)
{
Q_ASSERT(window);
if (!window) {
return {};
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return QRect(toNativePixels(window, rect.topLeft()), toNativePixels(window, rect.size()));
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::toNativePixels(rect, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
int Utils::fromNativePixels(const QWindow *window, const int value)
{
Q_ASSERT(window);
if (!window) {
return 0;
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return qRound(qreal(value) / window->devicePixelRatio());
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::fromNativePixels(value, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
QPoint Utils::fromNativePixels(const QWindow *window, const QPoint &point)
{
Q_ASSERT(window);
if (!window) {
return {};
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return QPointF(QPointF(point) / window->devicePixelRatio()).toPoint();
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::fromNativePixels(point, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
QSize Utils::fromNativePixels(const QWindow *window, const QSize &size)
{
Q_ASSERT(window);
if (!window) {
return {};
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return QSizeF(QSizeF(size) / window->devicePixelRatio()).toSize();
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::fromNativePixels(size, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
}
QRect Utils::fromNativePixels(const QWindow *window, const QRect &rect)
{
Q_ASSERT(window);
if (!window) {
return {};
}
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return QRect(fromNativePixels(window, rect.topLeft()), fromNativePixels(window, rect.size()));
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
return QHighDpi::fromNativePixels(rect, window);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE

View File

@ -29,14 +29,16 @@
#include <QtGui/qwindow.h> #include <QtGui/qwindow.h>
#include <QtGui/qscreen.h> #include <QtGui/qscreen.h>
#include <QtGui/qguiapplication.h> #include <QtGui/qguiapplication.h>
#include <QtGui/qpa/qplatformnativeinterface.h> #ifndef FRAMELESSHELPER_CORE_NO_PRIVATE
#include <QtGui/qpa/qplatformwindow.h> # include <QtGui/qpa/qplatformnativeinterface.h>
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # include <QtGui/qpa/qplatformwindow.h>
# include <QtGui/qpa/qplatformscreen_p.h> # if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
# include <QtGui/qpa/qplatformscreen.h> # include <QtGui/qpa/qplatformscreen_p.h>
#else # include <QtGui/qpa/qplatformscreen.h>
# include <QtPlatformHeaders/qxcbscreenfunctions.h> # else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
#endif # include <QtPlatformHeaders/qxcbscreenfunctions.h>
# endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <xcb/xcb.h> #include <xcb/xcb.h>
@ -155,6 +157,10 @@ template<typename T>
[[maybe_unused]] [[nodiscard]] static inline [[maybe_unused]] [[nodiscard]] static inline
QScreen *x11_findScreenForVirtualDesktop(const int virtualDesktopNumber) QScreen *x11_findScreenForVirtualDesktop(const int virtualDesktopNumber)
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
Q_UNUSED(virtualDesktopNumber);
return QGuiApplication::primaryScreen();
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (virtualDesktopNumber == -1) { if (virtualDesktopNumber == -1) {
return QGuiApplication::primaryScreen(); return QGuiApplication::primaryScreen();
} }
@ -163,28 +169,33 @@ template<typename T>
return nullptr; return nullptr;
} }
for (auto &&screen : qAsConst(screens)) { for (auto &&screen : qAsConst(screens)) {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
const auto qxcbScreen = dynamic_cast<QNativeInterface::Private::QXcbScreen *>(screen->handle()); const auto qxcbScreen = dynamic_cast<QNativeInterface::Private::QXcbScreen *>(screen->handle());
if (qxcbScreen && (qxcbScreen->virtualDesktopNumber() == virtualDesktopNumber)) { if (qxcbScreen && (qxcbScreen->virtualDesktopNumber() == virtualDesktopNumber)) {
return screen; return screen;
} }
#else # else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
if (QXcbScreenFunctions::virtualDesktopNumber(screen) == virtualDesktopNumber) { if (QXcbScreenFunctions::virtualDesktopNumber(screen) == virtualDesktopNumber) {
return screen; return screen;
} }
#endif # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
} }
return nullptr; return nullptr;
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
[[maybe_unused]] [[nodiscard]] static inline [[maybe_unused]] [[nodiscard]] static inline
unsigned long x11_appRootWindow(const int screen) unsigned long x11_appRootWindow(const int screen)
#else #else // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
[[maybe_unused]] [[nodiscard]] static inline [[maybe_unused]] [[nodiscard]] static inline
quint32 x11_appRootWindow(const int screen) quint32 x11_appRootWindow(const int screen)
#endif #endif // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
Q_UNUSED(screen);
return 0;
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return 0; return 0;
} }
@ -197,10 +208,14 @@ template<typename T>
return 0; return 0;
} }
return static_cast<xcb_window_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(krootwindow, scr))); return static_cast<xcb_window_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(krootwindow, scr)));
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[maybe_unused]] [[nodiscard]] static inline int x11_appScreen() [[maybe_unused]] [[nodiscard]] static inline int x11_appScreen()
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return 0;
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return 0; return 0;
} }
@ -209,10 +224,14 @@ template<typename T>
return 0; return 0;
} }
return reinterpret_cast<qintptr>(native->nativeResourceForIntegration(kx11screen)); return reinterpret_cast<qintptr>(native->nativeResourceForIntegration(kx11screen));
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[maybe_unused]] [[nodiscard]] static inline quint32 x11_appTime() [[maybe_unused]] [[nodiscard]] static inline quint32 x11_appTime()
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return 0;
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return 0; return 0;
} }
@ -225,10 +244,14 @@ template<typename T>
return 0; return 0;
} }
return static_cast<xcb_timestamp_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(kapptime, screen))); return static_cast<xcb_timestamp_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(kapptime, screen)));
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[maybe_unused]] [[nodiscard]] static inline quint32 x11_appUserTime() [[maybe_unused]] [[nodiscard]] static inline quint32 x11_appUserTime()
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return 0;
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return 0; return 0;
} }
@ -241,10 +264,14 @@ template<typename T>
return 0; return 0;
} }
return static_cast<xcb_timestamp_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(kappusertime, screen))); return static_cast<xcb_timestamp_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(kappusertime, screen)));
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[maybe_unused]] [[nodiscard]] static inline quint32 x11_getTimestamp() [[maybe_unused]] [[nodiscard]] static inline quint32 x11_getTimestamp()
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return 0;
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return 0; return 0;
} }
@ -257,10 +284,14 @@ template<typename T>
return 0; return 0;
} }
return static_cast<xcb_timestamp_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(kgettimestamp, screen))); return static_cast<xcb_timestamp_t>(reinterpret_cast<quintptr>(native->nativeResourceForScreen(kgettimestamp, screen)));
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[maybe_unused]] [[nodiscard]] static inline QByteArray x11_nextStartupId() [[maybe_unused]] [[nodiscard]] static inline QByteArray x11_nextStartupId()
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return {};
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return {}; return {};
} }
@ -269,48 +300,57 @@ template<typename T>
return {}; return {};
} }
return static_cast<char *>(native->nativeResourceForIntegration(kstartupid)); return static_cast<char *>(native->nativeResourceForIntegration(kstartupid));
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[maybe_unused]] [[nodiscard]] static inline Display *x11_display() [[maybe_unused]] [[nodiscard]] static inline Display *x11_display()
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return nullptr;
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return nullptr; return nullptr;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
using namespace QNativeInterface; using App = QNativeInterface::QX11Application;
const auto native = qApp->nativeInterface<QX11Application>(); const auto native = qApp->nativeInterface<App>();
#else # else // (QT_VERSION < QT_VERSION_CHECK(6, 2, 0))
const auto native = qApp->platformNativeInterface(); const auto native = qApp->platformNativeInterface();
#endif # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
if (!native) { if (!native) {
return nullptr; return nullptr;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
return native->display(); return native->display();
#else # else // (QT_VERSION < QT_VERSION_CHECK(6, 2, 0))
return reinterpret_cast<Display *>(native->nativeResourceForIntegration(kdisplay)); return reinterpret_cast<Display *>(native->nativeResourceForIntegration(kdisplay));
#endif # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[maybe_unused]] [[nodiscard]] static inline xcb_connection_t *x11_connection() [[maybe_unused]] [[nodiscard]] static inline xcb_connection_t *x11_connection()
{ {
#ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
return nullptr;
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
if (!qApp) { if (!qApp) {
return nullptr; return nullptr;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
using namespace QNativeInterface; using App = QNativeInterface::QX11Application;
const auto native = qApp->nativeInterface<QX11Application>(); const auto native = qApp->nativeInterface<App>();
#else # else // (QT_VERSION < QT_VERSION_CHECK(6, 2, 0))
const auto native = qApp->platformNativeInterface(); const auto native = qApp->platformNativeInterface();
#endif # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
if (!native) { if (!native) {
return nullptr; return nullptr;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
return native->connection(); return native->connection();
#else # else // (QT_VERSION < QT_VERSION_CHECK(6, 2, 0))
return reinterpret_cast<xcb_connection_t *>(native->nativeResourceForIntegration(kconnection)); return reinterpret_cast<xcb_connection_t *>(native->nativeResourceForIntegration(kconnection));
#endif # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 2, 0))
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
static inline void static inline void
@ -387,11 +427,10 @@ static inline void
if (!window) { if (!window) {
return; return;
} }
const qreal dpr = window->devicePixelRatio(); const QPoint nativeGlobalPos = Utils::toNativePixels(window, globalPos);
const QPoint deviceGlobalPos = QPointF(QPointF(globalPos) * dpr).toPoint();
const QPoint logicalLocalPos = window->mapFromGlobal(globalPos); const QPoint logicalLocalPos = window->mapFromGlobal(globalPos);
const QPoint deviceLocalPos = QPointF(QPointF(logicalLocalPos) * dpr).toPoint(); const QPoint nativeLocalPos = Utils::toNativePixels(window, logicalLocalPos);
emulateMouseButtonRelease(window->winId(), deviceGlobalPos, deviceLocalPos); emulateMouseButtonRelease(window->winId(), nativeGlobalPos, nativeLocalPos);
} }
SystemTheme Utils::getSystemTheme() SystemTheme Utils::getSystemTheme()
@ -415,8 +454,8 @@ void Utils::startSystemMove(QWindow *window, const QPoint &globalPos)
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
window->startSystemMove(); window->startSystemMove();
#else #else
const QPoint deviceGlobalPos = QPointF(QPointF(globalPos) * window->devicePixelRatio()).toPoint(); const QPoint nativeGlobalPos = Utils::toNativePixels(window, globalPos);
doStartSystemMoveResize(window->winId(), deviceGlobalPos, _NET_WM_MOVERESIZE_MOVE); doStartSystemMoveResize(window->winId(), nativeGlobalPos, _NET_WM_MOVERESIZE_MOVE);
#endif #endif
} }
@ -442,8 +481,8 @@ void Utils::startSystemResize(QWindow *window, const Qt::Edges edges, const QPoi
if (section < 0) { if (section < 0) {
return; return;
} }
const QPoint deviceGlobalPos = QPointF(QPointF(globalPos) * window->devicePixelRatio()).toPoint(); const QPoint nativeGlobalPos = Utils::toNativePixels(window, globalPos);
doStartSystemMoveResize(window->winId(), deviceGlobalPos, section); doStartSystemMoveResize(window->winId(), nativeGlobalPos, section);
#endif #endif
} }

View File

@ -25,17 +25,20 @@
#include "utils.h" #include "utils.h"
#include <QtCore/qmutex.h> #include <QtCore/qmutex.h>
#include <QtCore/qhash.h> #include <QtCore/qhash.h>
#include <QtCore/private/qsystemerror_p.h> #include <QtGui/qwindow.h>
#include <QtGui/qguiapplication.h> #include <QtGui/qguiapplication.h>
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #ifndef FRAMELESSHELPER_CORE_NO_PRIVATE
# include <QtGui/private/qguiapplication_p.h> # include <QtCore/private/qsystemerror_p.h>
#endif # if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include <QtGui/qpa/qplatformwindow.h> # include <QtGui/private/qguiapplication_p.h>
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
# include <QtGui/qpa/qplatformnativeinterface.h> # include <QtGui/qpa/qplatformwindow.h>
#else # if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
# include <QtGui/qpa/qplatformwindow_p.h> # include <QtGui/qpa/qplatformnativeinterface.h>
#endif # else // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
# include <QtGui/qpa/qplatformwindow_p.h>
# endif // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
#include "framelessmanager.h" #include "framelessmanager.h"
#include "framelesshelper_windows.h" #include "framelesshelper_windows.h"
#include "framelessconfig_p.h" #include "framelessconfig_p.h"
@ -810,7 +813,7 @@ struct Win32UtilsHelperData
WNDPROC originalWindowProc = nullptr; WNDPROC originalWindowProc = nullptr;
IsWindowFixedSizeCallback isWindowFixedSize = nullptr; IsWindowFixedSizeCallback isWindowFixedSize = nullptr;
IsInsideTitleBarDraggableAreaCallback isInTitleBarArea = nullptr; IsInsideTitleBarDraggableAreaCallback isInTitleBarArea = nullptr;
GetWindowDevicePixelRatioCallback getDevicePixelRatio = nullptr; GetWindowHandleCallback getWindowHandle = nullptr;
}; };
struct Win32UtilsHelper struct Win32UtilsHelper
@ -925,21 +928,20 @@ struct SYSTEM_METRIC
if (code == ERROR_SUCCESS) { if (code == ERROR_SUCCESS) {
return kSuccessMessageText; return kSuccessMessageText;
} }
static constexpr const bool flag = false; #ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
if (flag) { LPWSTR buf = nullptr;
// The following code works well, we commented it out just because we want to use as many Qt functionalities as possible. if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
LPWSTR buf = nullptr; nullptr, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&buf), 0, nullptr) == 0) {
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, return kEmptyMessageText;
nullptr, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<LPWSTR>(&buf), 0, nullptr) == 0) {
return kEmptyMessageText;
}
const QString errorText = QString::fromWCharArray(buf).trimmed();
LocalFree(buf);
buf = nullptr;
return kErrorMessageTemplate.arg(function, QString::number(code), errorText);
} }
const QString errorText = QString::fromWCharArray(buf).trimmed();
LocalFree(buf);
buf = nullptr;
return kErrorMessageTemplate.arg(function, QString::number(code), errorText);
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
const QString errorText = QSystemError::windowsString(code); const QString errorText = QSystemError::windowsString(code);
return kErrorMessageTemplate.arg(function, QString::number(code), errorText); return kErrorMessageTemplate.arg(function, QString::number(code), errorText);
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
[[nodiscard]] static inline QString __getSystemErrorMessage(const QString &function, const HRESULT hr) [[nodiscard]] static inline QString __getSystemErrorMessage(const QString &function, const HRESULT hr)
@ -1004,12 +1006,12 @@ static inline void moveWindowToMonitor(const HWND hwnd, const MONITORINFOEXW &ac
WARNING << Utils::getSystemErrorMessage(kGetWindowRect); WARNING << Utils::getSystemErrorMessage(kGetWindowRect);
return; return;
} }
const int currentWindowWidth = currentWindowRect.right - currentWindowRect.left; const int currentWindowWidth = (currentWindowRect.right - currentWindowRect.left);
const int currentWindowHeight = currentWindowRect.bottom - currentWindowRect.top; const int currentWindowHeight = (currentWindowRect.bottom - currentWindowRect.top);
const int currentWindowOffsetX = (currentWindowRect.left - currentMonitorRect.left); const int currentWindowOffsetX = (currentWindowRect.left - currentMonitorRect.left);
const int currentWindowOffsetY = (currentWindowRect.top - currentMonitorRect.top); const int currentWindowOffsetY = (currentWindowRect.top - currentMonitorRect.top);
const int newWindowX = activeMonitorRect.left + currentWindowOffsetX; const int newWindowX = (activeMonitorRect.left + currentWindowOffsetX);
const int newWindowY = activeMonitorRect.top + currentWindowOffsetY; const int newWindowY = (activeMonitorRect.top + currentWindowOffsetY);
static constexpr const UINT flags = static constexpr const UINT flags =
(SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER); (SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER);
if (SetWindowPos(hwnd, nullptr, newWindowX, newWindowY, if (SetWindowPos(hwnd, nullptr, newWindowX, newWindowY,
@ -1134,8 +1136,7 @@ static inline void moveWindowToMonitor(const HWND hwnd, const MONITORINFOEXW &ac
switch (uMsg) { switch (uMsg) {
case WM_RBUTTONUP: { case WM_RBUTTONUP: {
const QPoint nativeLocalPos = getNativePosFromMouse(); const QPoint nativeLocalPos = getNativePosFromMouse();
const qreal dpr = data.getDevicePixelRatio(); const QPoint qtScenePos = Utils::fromNativePixels(data.getWindowHandle(), nativeLocalPos);
const QPoint qtScenePos = QPointF(QPointF(nativeLocalPos) / dpr).toPoint();
if (data.isInTitleBarArea(qtScenePos)) { if (data.isInTitleBarArea(qtScenePos)) {
POINT pos = {nativeLocalPos.x(), nativeLocalPos.y()}; POINT pos = {nativeLocalPos.x(), nativeLocalPos.y()};
if (ClientToScreen(hWnd, &pos) == FALSE) { if (ClientToScreen(hWnd, &pos) == FALSE) {
@ -1299,7 +1300,8 @@ void Utils::updateInternalWindowFrameMargins(QWindow *window, const bool enable)
}(); }();
const QVariant marginsVar = QVariant::fromValue(margins); const QVariant marginsVar = QVariant::fromValue(margins);
window->setProperty("_q_windowsCustomMargins", marginsVar); window->setProperty("_q_windowsCustomMargins", marginsVar);
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #ifndef FRAMELESSHELPER_CORE_NO_PRIVATE
# if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
if (QPlatformWindow *platformWindow = window->handle()) { if (QPlatformWindow *platformWindow = window->handle()) {
if (const auto ni = QGuiApplication::platformNativeInterface()) { if (const auto ni = QGuiApplication::platformNativeInterface()) {
ni->setWindowProperty(platformWindow, kWindowsCustomMargins, marginsVar); ni->setWindowProperty(platformWindow, kWindowsCustomMargins, marginsVar);
@ -1311,14 +1313,15 @@ void Utils::updateInternalWindowFrameMargins(QWindow *window, const bool enable)
WARNING << "Failed to retrieve the platform window."; WARNING << "Failed to retrieve the platform window.";
return; return;
} }
#else # else // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
if (const auto platformWindow = dynamic_cast<QNativeInterface::Private::QWindowsWindow *>(window->handle())) { if (const auto platformWindow = dynamic_cast<QNativeInterface::Private::QWindowsWindow *>(window->handle())) {
platformWindow->setCustomMargins(margins); platformWindow->setCustomMargins(margins);
} else { } else {
WARNING << "Failed to retrieve the platform window."; WARNING << "Failed to retrieve the platform window.";
return; return;
} }
#endif # endif // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
triggerFrameChange(windowId); triggerFrameChange(windowId);
} }
@ -2004,7 +2007,7 @@ bool Utils::isFrameBorderColorized()
void Utils::installSystemMenuHook(const WId windowId, void Utils::installSystemMenuHook(const WId windowId,
const IsWindowFixedSizeCallback &isWindowFixedSize, const IsWindowFixedSizeCallback &isWindowFixedSize,
const IsInsideTitleBarDraggableAreaCallback &isInTitleBarArea, const IsInsideTitleBarDraggableAreaCallback &isInTitleBarArea,
const GetWindowDevicePixelRatioCallback &getDevicePixelRatio) const GetWindowHandleCallback &getWindowHandle)
{ {
Q_ASSERT(windowId); Q_ASSERT(windowId);
Q_ASSERT(isWindowFixedSize); Q_ASSERT(isWindowFixedSize);
@ -2033,7 +2036,7 @@ void Utils::installSystemMenuHook(const WId windowId,
data.originalWindowProc = originalWindowProc; data.originalWindowProc = originalWindowProc;
data.isWindowFixedSize = isWindowFixedSize; data.isWindowFixedSize = isWindowFixedSize;
data.isInTitleBarArea = isInTitleBarArea; data.isInTitleBarArea = isInTitleBarArea;
data.getDevicePixelRatio = getDevicePixelRatio; data.getWindowHandle = getWindowHandle;
g_utilsHelper()->data.insert(windowId, data); g_utilsHelper()->data.insert(windowId, data);
} }
@ -2237,22 +2240,24 @@ bool Utils::shouldAppsUseDarkMode_windows()
if (!WindowsVersionHelper::isWin10RS1OrGreater()) { if (!WindowsVersionHelper::isWin10RS1OrGreater()) {
return false; return false;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #ifndef FRAMELESSHELPER_CORE_NO_PRIVATE
# if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
if (const auto app = qApp->nativeInterface<QNativeInterface::Private::QWindowsApplication>()) { if (const auto app = qApp->nativeInterface<QNativeInterface::Private::QWindowsApplication>()) {
return app->isDarkMode(); return app->isDarkMode();
} else { } else {
WARNING << "QWindowsApplication is not available."; WARNING << "QWindowsApplication is not available.";
} }
#elif (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) # elif (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
if (const auto ni = QGuiApplication::platformNativeInterface()) { if (const auto ni = QGuiApplication::platformNativeInterface()) {
return ni->property("darkMode").toBool(); return ni->property("darkMode").toBool();
} else { } else {
WARNING << "Failed to retrieve the platform native interface."; WARNING << "Failed to retrieve the platform native interface.";
} }
#else # else // (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
// Qt gained the ability to detect the system dark mode setting only since 5.15. // Qt gained the ability to detect the system dark mode setting only since 5.15.
// We should detect it ourself on versions below that. // We should detect it ourself on versions below that.
#endif # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
// Starting from Windows 10 1903, "ShouldAppsUseDarkMode()" (exported by UXTHEME.DLL, // Starting from Windows 10 1903, "ShouldAppsUseDarkMode()" (exported by UXTHEME.DLL,
// ordinal number 132) always return "TRUE" (actually, a random non-zero number at // ordinal number 132) always return "TRUE" (actually, a random non-zero number at
// runtime), so we can't use it due to this unreliability. In this case, we just simply // runtime), so we can't use it due to this unreliability. In this case, we just simply
@ -2604,7 +2609,10 @@ void Utils::hideOriginalTitleBarElements(const WId windowId, const bool disable)
void Utils::setQtDarkModeAwareEnabled(const bool enable) void Utils::setQtDarkModeAwareEnabled(const bool enable)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #ifdef FRAMELESSHELPER_CORE_NO_PRIVATE
Q_UNUSED(enable);
#else // !FRAMELESSHELPER_CORE_NO_PRIVATE
# if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
// We'll call QPA functions, so we have to ensure that the QGuiApplication // We'll call QPA functions, so we have to ensure that the QGuiApplication
// instance has already been created and initialized, because the platform // instance has already been created and initialized, because the platform
// integration infrastructure is created and maintained by QGuiApplication. // integration infrastructure is created and maintained by QGuiApplication.
@ -2617,7 +2625,7 @@ void Utils::setQtDarkModeAwareEnabled(const bool enable)
if (!enable) { if (!enable) {
return {}; // Clear the flags. return {}; // Clear the flags.
} }
#if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # if (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
// Enabling the DarkModeWindowFrames flag will save us the call of the // Enabling the DarkModeWindowFrames flag will save us the call of the
// DwmSetWindowAttribute function. Qt will adjust the non-client area // DwmSetWindowAttribute function. Qt will adjust the non-client area
// (title bar & frame border) automatically. // (title bar & frame border) automatically.
@ -2627,19 +2635,20 @@ void Utils::setQtDarkModeAwareEnabled(const bool enable)
// There's no global dark theme for Qt Quick applications, so setting this // There's no global dark theme for Qt Quick applications, so setting this
// flag has no effect for pure Qt Quick applications. // flag has no effect for pure Qt Quick applications.
return {App::DarkModeWindowFrames | App::DarkModeStyle}; return {App::DarkModeWindowFrames | App::DarkModeStyle};
#else // (QT_VERSION < QT_VERSION_CHECK(6, 5, 0)) # else // (QT_VERSION < QT_VERSION_CHECK(6, 5, 0))
// Don't try to use the broken dark theme for Qt Widgets applications. // Don't try to use the broken dark theme for Qt Widgets applications.
// For Qt Quick applications this is also enough. There's no global dark // For Qt Quick applications this is also enough. There's no global dark
// theme for them anyway. // theme for them anyway.
return {App::DarkModeWindowFrames}; return {App::DarkModeWindowFrames};
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)) # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 5, 0))
}()); }());
} else { } else {
WARNING << "QWindowsApplication is not available."; WARNING << "QWindowsApplication is not available.";
} }
#else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) # else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
Q_UNUSED(enable); Q_UNUSED(enable);
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_CORE_NO_PRIVATE
} }
void Utils::registerThemeChangeNotification() void Utils::registerThemeChangeNotification()

View File

@ -168,15 +168,27 @@ if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
) )
endif() endif()
if(FRAMELESSHELPER_NO_PRIVATE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
FRAMELESSHELPER_QUICK_NO_PRIVATE
)
endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
FRAMELESSHELPER_QUICK_LIBRARY FRAMELESSHELPER_QUICK_LIBRARY
) )
target_link_libraries(${SUB_PROJ_NAME} PRIVATE if(FRAMELESSHELPER_NO_PRIVATE)
Qt${QT_VERSION_MAJOR}::QuickPrivate target_link_libraries(${SUB_PROJ_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::QuickTemplates2Private Qt${QT_VERSION_MAJOR}::Quick
Qt${QT_VERSION_MAJOR}::QuickControls2Private )
) else()
target_link_libraries(${SUB_PROJ_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::QuickPrivate
Qt${QT_VERSION_MAJOR}::QuickTemplates2Private
Qt${QT_VERSION_MAJOR}::QuickControls2Private
)
endif()
target_link_libraries(${SUB_PROJ_NAME} PUBLIC target_link_libraries(${SUB_PROJ_NAME} PUBLIC
${PROJECT_NAME}::Core ${PROJECT_NAME}::Core

View File

@ -28,18 +28,20 @@
# include "framelessquickhelper_p.h" # include "framelessquickhelper_p.h"
# include "framelessquickutils.h" # include "framelessquickutils.h"
# include "quickchromepalette.h" # include "quickchromepalette.h"
# include "quickstandardsystembutton_p.h"
# include "quickstandardtitlebar_p.h"
# include "framelessquickwindow_p.h"
# include "framelessquickwindow_p_p.h"
# include "framelessquickapplicationwindow_p.h"
# include "framelessquickapplicationwindow_p_p.h"
# include "quickmicamaterial.h" # include "quickmicamaterial.h"
# include "quickmicamaterial_p.h" # include "quickmicamaterial_p.h"
# include "quickimageitem.h" # include "quickimageitem.h"
# include "quickimageitem_p.h" # include "quickimageitem_p.h"
# include "quickwindowborder.h" # include "quickwindowborder.h"
# include "quickwindowborder_p.h" # include "quickwindowborder_p.h"
# ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
# include "quickstandardsystembutton_p.h"
# include "quickstandardtitlebar_p.h"
# include "framelessquickwindow_p.h"
# include "framelessquickwindow_p_p.h"
# include "framelessquickapplicationwindow_p.h"
# include "framelessquickapplicationwindow_p_p.h"
# endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
@ -100,6 +102,16 @@ void initialize()
qRegisterMetaType<FramelessQuickUtils *>(); qRegisterMetaType<FramelessQuickUtils *>();
qRegisterMetaType<QuickChromePalette>(); qRegisterMetaType<QuickChromePalette>();
qRegisterMetaType<QuickChromePalette *>(); qRegisterMetaType<QuickChromePalette *>();
qRegisterMetaType<QuickMicaMaterial>();
qRegisterMetaType<QuickMicaMaterial *>();
qRegisterMetaType<QuickMicaMaterialPrivate>();
qRegisterMetaType<QuickImageItem>();
qRegisterMetaType<QuickImageItem *>();
qRegisterMetaType<QuickImageItemPrivate>();
qRegisterMetaType<QuickWindowBorder>();
qRegisterMetaType<QuickWindowBorder *>();
qRegisterMetaType<QuickWindowBorderPrivate>();
# ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
qRegisterMetaType<QuickStandardSystemButton>(); qRegisterMetaType<QuickStandardSystemButton>();
qRegisterMetaType<QuickStandardSystemButton *>(); qRegisterMetaType<QuickStandardSystemButton *>();
qRegisterMetaType<QuickStandardTitleBar>(); qRegisterMetaType<QuickStandardTitleBar>();
@ -110,15 +122,7 @@ void initialize()
qRegisterMetaType<FramelessQuickApplicationWindow>(); qRegisterMetaType<FramelessQuickApplicationWindow>();
qRegisterMetaType<FramelessQuickApplicationWindow *>(); qRegisterMetaType<FramelessQuickApplicationWindow *>();
qRegisterMetaType<FramelessQuickApplicationWindowPrivate>(); qRegisterMetaType<FramelessQuickApplicationWindowPrivate>();
qRegisterMetaType<QuickMicaMaterial>(); # endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
qRegisterMetaType<QuickMicaMaterial *>();
qRegisterMetaType<QuickMicaMaterialPrivate>();
qRegisterMetaType<QuickImageItem>();
qRegisterMetaType<QuickImageItem *>();
qRegisterMetaType<QuickImageItemPrivate>();
qRegisterMetaType<QuickWindowBorder>();
qRegisterMetaType<QuickWindowBorder *>();
qRegisterMetaType<QuickWindowBorderPrivate>();
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
} }

View File

@ -22,6 +22,8 @@
* SOFTWARE. * SOFTWARE.
*/ */
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelessquickapplicationwindow_p.h" #include "framelessquickapplicationwindow_p.h"
#include "framelessquickapplicationwindow_p_p.h" #include "framelessquickapplicationwindow_p_p.h"
#include "framelessquickhelper.h" #include "framelessquickhelper.h"
@ -239,3 +241,5 @@ void FramelessQuickApplicationWindow::componentComplete()
} }
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -28,14 +28,16 @@
#include "quickwindowborder.h" #include "quickwindowborder.h"
#include <QtCore/qmutex.h> #include <QtCore/qmutex.h>
#include <QtCore/qtimer.h> #include <QtCore/qtimer.h>
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
# include <QtGui/qpa/qplatformwindow.h> // For QWINDOWSIZE_MAX # if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#else # include <QtGui/qpa/qplatformwindow.h> // For QWINDOWSIZE_MAX
# include <QtGui/private/qwindow_p.h> // For QWINDOWSIZE_MAX # else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
#endif # include <QtGui/private/qwindow_p.h> // For QWINDOWSIZE_MAX
#include <QtQuick/private/qquickitem_p.h> # endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include <QtQuickTemplates2/private/qquickabstractbutton_p.h> # include <QtQuick/private/qquickitem_p.h>
#include <QtQuickTemplates2/private/qquickabstractbutton_p_p.h> # include <QtQuickTemplates2/private/qquickabstractbutton_p.h>
# include <QtQuickTemplates2/private/qquickabstractbutton_p_p.h>
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
#include <framelessmanager.h> #include <framelessmanager.h>
#include <framelessconfig_p.h> #include <framelessconfig_p.h>
#include <utils.h> #include <utils.h>
@ -43,6 +45,10 @@
# include <winverhelper_p.h> # include <winverhelper_p.h>
#endif // Q_OS_WINDOWS #endif // Q_OS_WINDOWS
#ifndef QWINDOWSIZE_MAX
# define QWINDOWSIZE_MAX ((1 << 24) - 1)
#endif // QWINDOWSIZE_MAX
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcFramelessQuickHelper, "wangwenx190.framelesshelper.quick.framelessquickhelper") Q_LOGGING_CATEGORY(lcFramelessQuickHelper, "wangwenx190.framelesshelper.quick.framelessquickhelper")
@ -356,7 +362,7 @@ void FramelessQuickHelperPrivate::showSystemMenu(const QPoint &pos)
return; return;
} }
const QPoint globalPos = window->mapToGlobal(pos); const QPoint globalPos = window->mapToGlobal(pos);
const QPoint nativePos = QPointF(QPointF(globalPos) * window->effectiveDevicePixelRatio()).toPoint(); const QPoint nativePos = Utils::toNativePixels(window, globalPos);
Utils::showSystemMenu(window->winId(), nativePos, false, [this]() -> bool { return isWindowFixedSize(); }); Utils::showSystemMenu(window->winId(), nativePos, false, [this]() -> bool { return isWindowFixedSize(); });
#else #else
Q_UNUSED(pos); Q_UNUSED(pos);
@ -578,7 +584,9 @@ QuickMicaMaterial *FramelessQuickHelperPrivate::findOrCreateMicaMaterial() const
item->setParent(rootItem); item->setParent(rootItem);
item->setParentItem(rootItem); item->setParentItem(rootItem);
item->setZ(-999); // Make sure it always stays on the bottom. item->setZ(-999); // Make sure it always stays on the bottom.
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
QQuickItemPrivate::get(item)->anchors()->setFill(rootItem); QQuickItemPrivate::get(item)->anchors()->setFill(rootItem);
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
return item; return item;
} }
@ -600,7 +608,9 @@ QuickWindowBorder *FramelessQuickHelperPrivate::findOrCreateWindowBorder() const
item->setParent(rootItem); item->setParent(rootItem);
item->setParentItem(rootItem); item->setParentItem(rootItem);
item->setZ(999); // Make sure it always stays on the top. item->setZ(999); // Make sure it always stays on the top.
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
QQuickItemPrivate::get(item)->anchors()->setFill(rootItem); QQuickItemPrivate::get(item)->anchors()->setFill(rootItem);
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
return item; return item;
} }
@ -804,6 +814,10 @@ bool FramelessQuickHelperPrivate::shouldIgnoreMouseEvents(const QPoint &pos) con
void FramelessQuickHelperPrivate::setSystemButtonState(const QuickGlobal::SystemButtonType button, void FramelessQuickHelperPrivate::setSystemButtonState(const QuickGlobal::SystemButtonType button,
const QuickGlobal::ButtonState state) const QuickGlobal::ButtonState state)
{ {
#ifdef FRAMELESSHELPER_QUICK_NO_PRIVATE
Q_UNUSED(button);
Q_UNUSED(state);
#else // !FRAMELESSHELPER_QUICK_NO_PRIVATE
Q_ASSERT(button != QuickGlobal::SystemButtonType::Unknown); Q_ASSERT(button != QuickGlobal::SystemButtonType::Unknown);
if (button == QuickGlobal::SystemButtonType::Unknown) { if (button == QuickGlobal::SystemButtonType::Unknown) {
return; return;
@ -880,6 +894,7 @@ void FramelessQuickHelperPrivate::setSystemButtonState(const QuickGlobal::System
}; };
updateButtonState(quickButton); updateButtonState(quickButton);
} }
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
} }
QuickHelperData FramelessQuickHelperPrivate::getWindowData() const QuickHelperData FramelessQuickHelperPrivate::getWindowData() const

View File

@ -29,12 +29,14 @@
#include "quickmicamaterial.h" #include "quickmicamaterial.h"
#include "quickimageitem.h" #include "quickimageitem.h"
#include "quickwindowborder.h" #include "quickwindowborder.h"
#include "framelessquickwindow_p.h" #ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # include "framelessquickwindow_p.h"
# include "framelessquickapplicationwindow_p.h" # if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
# include "quickstandardsystembutton_p.h" # include "framelessquickapplicationwindow_p.h"
# include "quickstandardtitlebar_p.h" # include "quickstandardsystembutton_p.h"
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # include "quickstandardtitlebar_p.h"
# endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
#ifndef QUICK_URI_SHORT #ifndef QUICK_URI_SHORT
# define QUICK_URI_SHORT FRAMELESSHELPER_QUICK_URI, 1 # define QUICK_URI_SHORT FRAMELESSHELPER_QUICK_URI, 1
@ -90,22 +92,28 @@ void FramelessHelper::Quick::registerTypes(QQmlEngine *engine)
qmlRegisterAnonymousType<QuickChromePalette>(QUICK_URI_SHORT); qmlRegisterAnonymousType<QuickChromePalette>(QUICK_URI_SHORT);
qmlRegisterType<FramelessQuickHelper>(QUICK_URI_EXPAND("FramelessHelper")); qmlRegisterType<FramelessQuickHelper>(QUICK_URI_EXPAND("FramelessHelper"));
qmlRegisterType<FramelessQuickWindow>(QUICK_URI_EXPAND("FramelessWindow"));
qmlRegisterType<QuickMicaMaterial>(QUICK_URI_EXPAND("MicaMaterial")); qmlRegisterType<QuickMicaMaterial>(QUICK_URI_EXPAND("MicaMaterial"));
qmlRegisterType<QuickImageItem>(QUICK_URI_EXPAND("ImageItem")); qmlRegisterType<QuickImageItem>(QUICK_URI_EXPAND("ImageItem"));
qmlRegisterType<QuickWindowBorder>(QUICK_URI_EXPAND("WindowBorder")); qmlRegisterType<QuickWindowBorder>(QUICK_URI_EXPAND("WindowBorder"));
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #ifdef FRAMELESSHELPER_QUICK_NO_PRIVATE
qmlRegisterTypeNotAvailable(QUICK_URI_EXPAND("FramelessWindow"),
FRAMELESSHELPER_STRING_LITERAL("FramelessWindow is not available."));
#else // !FRAMELESSHELPER_QUICK_NO_PRIVATE
qmlRegisterType<FramelessQuickWindow>(QUICK_URI_EXPAND("FramelessWindow"));
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
#if ((QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) && !defined(FRAMELESSHELPER_QUICK_NO_PRIVATE))
qmlRegisterType<FramelessQuickApplicationWindow>(QUICK_URI_EXPAND("FramelessApplicationWindow")); qmlRegisterType<FramelessQuickApplicationWindow>(QUICK_URI_EXPAND("FramelessApplicationWindow"));
qmlRegisterType<QuickStandardSystemButton>(QUICK_URI_EXPAND("StandardSystemButton")); qmlRegisterType<QuickStandardSystemButton>(QUICK_URI_EXPAND("StandardSystemButton"));
qmlRegisterType<QuickStandardTitleBar>(QUICK_URI_EXPAND("StandardTitleBar")); qmlRegisterType<QuickStandardTitleBar>(QUICK_URI_EXPAND("StandardTitleBar"));
#else // (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #else // ((QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) || FRAMELESSHELPER_QUICK_NO_PRIVATE)
qmlRegisterTypeNotAvailable(QUICK_URI_EXPAND("FramelessApplicationWindow"), qmlRegisterTypeNotAvailable(QUICK_URI_EXPAND("FramelessApplicationWindow"),
FRAMELESSHELPER_STRING_LITERAL("FramelessApplicationWindow is not available until Qt6.")); FRAMELESSHELPER_STRING_LITERAL("FramelessApplicationWindow is not available."));
qmlRegisterTypeNotAvailable(QUICK_URI_EXPAND("StandardSystemButton"), qmlRegisterTypeNotAvailable(QUICK_URI_EXPAND("StandardSystemButton"),
FRAMELESSHELPER_STRING_LITERAL("StandardSystemButton is not available until Qt6.")); FRAMELESSHELPER_STRING_LITERAL("StandardSystemButton is not available."));
qmlRegisterTypeNotAvailable(QUICK_URI_EXPAND("StandardTitleBar"), qmlRegisterTypeNotAvailable(QUICK_URI_EXPAND("StandardTitleBar"),
FRAMELESSHELPER_STRING_LITERAL("StandardTitleBar is not available until Qt6.")); FRAMELESSHELPER_STRING_LITERAL("StandardTitleBar is not available."));
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
qmlRegisterModule(QUICK_URI_FULL); qmlRegisterModule(QUICK_URI_FULL);

View File

@ -22,6 +22,8 @@
* SOFTWARE. * SOFTWARE.
*/ */
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "framelessquickwindow_p.h" #include "framelessquickwindow_p.h"
#include "framelessquickwindow_p_p.h" #include "framelessquickwindow_p_p.h"
#include "framelessquickhelper.h" #include "framelessquickhelper.h"
@ -239,3 +241,5 @@ void FramelessQuickWindow::componentComplete()
} }
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -29,9 +29,11 @@
#include <QtGui/qscreen.h> #include <QtGui/qscreen.h>
#include <QtGui/qpainter.h> #include <QtGui/qpainter.h>
#include <QtGui/qguiapplication.h> #include <QtGui/qguiapplication.h>
#include <QtQuick/private/qquickitem_p.h>
#include <QtQuick/qquickwindow.h> #include <QtQuick/qquickwindow.h>
#include <QtQuick/qsgsimpletexturenode.h> #include <QtQuick/qsgsimpletexturenode.h>
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
# include <QtQuick/private/qquickitem_p.h>
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
@ -197,7 +199,9 @@ void QuickMicaMaterialPrivate::rebindWindow()
QQuickItem * const rootItem = window->contentItem(); QQuickItem * const rootItem = window->contentItem();
q->setParent(rootItem); q->setParent(rootItem);
q->setParentItem(rootItem); q->setParentItem(rootItem);
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
QQuickItemPrivate::get(q)->anchors()->setFill(rootItem); QQuickItemPrivate::get(q)->anchors()->setFill(rootItem);
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
q->setZ(-999); // Make sure we always stays on the bottom most place. q->setZ(-999); // Make sure we always stays on the bottom most place.
if (m_rootWindowXChangedConnection) { if (m_rootWindowXChangedConnection) {
disconnect(m_rootWindowXChangedConnection); disconnect(m_rootWindowXChangedConnection);

View File

@ -22,6 +22,8 @@
* SOFTWARE. * SOFTWARE.
*/ */
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "quickstandardsystembutton_p.h" #include "quickstandardsystembutton_p.h"
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include <framelessmanager_p.h> #include <framelessmanager_p.h>
@ -300,3 +302,5 @@ void QuickStandardSystemButton::componentComplete()
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE
#endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -22,6 +22,8 @@
* SOFTWARE. * SOFTWARE.
*/ */
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
#include "quickstandardtitlebar_p.h" #include "quickstandardtitlebar_p.h"
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include "quickimageitem.h" #include "quickimageitem.h"
@ -589,4 +591,6 @@ void QuickStandardTitleBar::componentComplete()
} }
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE
#endif #endif // (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE

View File

@ -25,8 +25,10 @@
#include "quickwindowborder.h" #include "quickwindowborder.h"
#include "quickwindowborder_p.h" #include "quickwindowborder_p.h"
#include <windowborderpainter.h> #include <windowborderpainter.h>
#include <QtQuick/private/qquickitem_p.h>
#include <QtQuick/qquickwindow.h> #include <QtQuick/qquickwindow.h>
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
# include <QtQuick/private/qquickitem_p.h>
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
@ -171,7 +173,9 @@ void QuickWindowBorderPrivate::rebindWindow()
QQuickItem * const rootItem = window->contentItem(); QQuickItem * const rootItem = window->contentItem();
q->setParent(rootItem); q->setParent(rootItem);
q->setParentItem(rootItem); q->setParentItem(rootItem);
#ifndef FRAMELESSHELPER_QUICK_NO_PRIVATE
QQuickItemPrivate::get(q)->anchors()->setFill(rootItem); QQuickItemPrivate::get(q)->anchors()->setFill(rootItem);
#endif // FRAMELESSHELPER_QUICK_NO_PRIVATE
q->setZ(999); // Make sure we always stays on the top most place. q->setZ(999); // Make sure we always stays on the top most place.
if (m_activeChangeConnection) { if (m_activeChangeConnection) {
disconnect(m_activeChangeConnection); disconnect(m_activeChangeConnection);

View File

@ -107,13 +107,19 @@ if(FRAMELESSHELPER_NO_BUNDLE_RESOURCE)
) )
endif() endif()
if(FRAMELESSHELPER_NO_PRIVATE)
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
FRAMELESSHELPER_WIDGETS_NO_PRIVATE
)
endif()
target_compile_definitions(${SUB_PROJ_NAME} PRIVATE target_compile_definitions(${SUB_PROJ_NAME} PRIVATE
QT_NO_KEYWORDS QT_NO_KEYWORDS
FRAMELESSHELPER_WIDGETS_LIBRARY FRAMELESSHELPER_WIDGETS_LIBRARY
) )
target_link_libraries(${SUB_PROJ_NAME} PRIVATE target_link_libraries(${SUB_PROJ_NAME} PRIVATE
Qt${QT_VERSION_MAJOR}::WidgetsPrivate Qt${QT_VERSION_MAJOR}::Widgets
) )
target_link_libraries(${SUB_PROJ_NAME} PUBLIC target_link_libraries(${SUB_PROJ_NAME} PUBLIC

View File

@ -41,6 +41,10 @@
#include <framelessconfig_p.h> #include <framelessconfig_p.h>
#include <utils.h> #include <utils.h>
#ifndef QWIDGETSIZE_MAX
# define QWIDGETSIZE_MAX ((1 << 24) - 1)
#endif // QWIDGETSIZE_MAX
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcFramelessWidgetsHelper, "wangwenx190.framelesshelper.widgets.framelesswidgetshelper") Q_LOGGING_CATEGORY(lcFramelessWidgetsHelper, "wangwenx190.framelesshelper.widgets.framelesswidgetshelper")
@ -815,7 +819,7 @@ void FramelessWidgetsHelperPrivate::showSystemMenu(const QPoint &pos)
return; return;
} }
const QPoint globalPos = m_window->mapToGlobal(pos); const QPoint globalPos = m_window->mapToGlobal(pos);
const QPoint nativePos = QPointF(QPointF(globalPos) * m_window->devicePixelRatioF()).toPoint(); const QPoint nativePos = Utils::toNativePixels(m_window->windowHandle(), globalPos);
Utils::showSystemMenu(m_window->winId(), nativePos, false, [this]() -> bool { return isWindowFixedSize(); }); Utils::showSystemMenu(m_window->winId(), nativePos, false, [this]() -> bool { return isWindowFixedSize(); });
#else #else
// ### TODO // ### TODO