2021-08-18 22:36:46 +02:00
|
|
|
#include "window.hpp"
|
|
|
|
|
2023-07-13 14:08:23 +02:00
|
|
|
#include "messaging.hpp"
|
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
#include <hex/api/content_registry.hpp>
|
2021-08-29 22:15:18 +02:00
|
|
|
|
2021-08-18 22:36:46 +02:00
|
|
|
#if defined(OS_WINDOWS)
|
|
|
|
|
2021-08-29 22:15:18 +02:00
|
|
|
#include <hex/helpers/utils.hpp>
|
2021-09-16 22:23:51 +02:00
|
|
|
#include <hex/helpers/logger.hpp>
|
2021-08-29 22:15:18 +02:00
|
|
|
|
2023-07-09 12:53:31 +02:00
|
|
|
#include <wolv/utils/string.hpp>
|
|
|
|
|
2021-08-18 22:36:46 +02:00
|
|
|
#include <imgui.h>
|
2021-08-25 19:32:47 +02:00
|
|
|
#include <imgui_internal.h>
|
2022-07-26 14:59:08 +02:00
|
|
|
#include <fonts/codicons_font.h>
|
2021-08-18 22:36:46 +02:00
|
|
|
|
|
|
|
#include <GLFW/glfw3.h>
|
|
|
|
#define GLFW_EXPOSE_NATIVE_WIN32
|
|
|
|
#include <GLFW/glfw3native.h>
|
2021-08-25 19:32:47 +02:00
|
|
|
#undef GLFW_EXPOSE_NATIVE_WIN32
|
|
|
|
|
2023-01-07 10:32:01 +01:00
|
|
|
#include <winbase.h>
|
2021-08-18 22:36:46 +02:00
|
|
|
#include <winuser.h>
|
|
|
|
#include <dwmapi.h>
|
|
|
|
#include <windowsx.h>
|
2023-01-14 14:21:16 +01:00
|
|
|
#include <shobjidl.h>
|
|
|
|
#include <wrl/client.h>
|
2021-08-18 22:36:46 +02:00
|
|
|
|
2022-08-12 15:11:27 +02:00
|
|
|
#include <csignal>
|
2023-03-18 11:35:01 +01:00
|
|
|
#include <cstdio>
|
2022-08-12 15:11:27 +02:00
|
|
|
|
2022-08-04 09:46:17 +02:00
|
|
|
#include <imgui_impl_glfw.h>
|
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
namespace hex {
|
|
|
|
|
2023-05-23 11:34:30 +02:00
|
|
|
template<typename T>
|
|
|
|
using WinUniquePtr = std::unique_ptr<std::remove_pointer_t<T>, BOOL(*)(T)>;
|
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
static LONG_PTR g_oldWndProc;
|
|
|
|
static float g_titleBarHeight;
|
2023-01-14 14:21:16 +01:00
|
|
|
static Microsoft::WRL::ComPtr<ITaskbarList4> g_taskbarList;
|
2022-01-24 20:53:17 +01:00
|
|
|
|
2023-05-27 17:45:41 +02:00
|
|
|
void nativeErrorMessage(const std::string &message) {
|
|
|
|
log::fatal(message);
|
|
|
|
MessageBox(NULL, message.c_str(), "Error", MB_ICONERROR | MB_OK);
|
|
|
|
}
|
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
// Custom Window procedure for receiving OS events
|
2022-09-15 09:47:47 +02:00
|
|
|
static LRESULT commonWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
|
|
switch (uMsg) {
|
2023-02-17 12:03:53 +01:00
|
|
|
case WM_COPYDATA: {
|
|
|
|
// Handle opening files in existing instance
|
|
|
|
|
2022-09-15 09:47:47 +02:00
|
|
|
auto message = reinterpret_cast<COPYDATASTRUCT *>(lParam);
|
|
|
|
if (message == nullptr) break;
|
|
|
|
|
2023-07-13 14:08:23 +02:00
|
|
|
ssize_t nullIndex = -1;
|
|
|
|
|
|
|
|
char* messageData = reinterpret_cast<char*>(message->lpData);
|
|
|
|
size_t messageSize = message->cbData;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < messageSize; i++) {
|
|
|
|
if (messageData[i] == '\0') {
|
|
|
|
nullIndex = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nullIndex == -1) {
|
|
|
|
log::warn("Received invalid forwarded event");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string eventName(messageData, nullIndex);
|
2022-09-15 09:47:47 +02:00
|
|
|
|
2023-07-13 14:08:23 +02:00
|
|
|
std::vector<u8> eventData(messageData + nullIndex + 1, messageData + messageSize);
|
|
|
|
|
|
|
|
hex::messaging::messageReceived(eventName, eventData);
|
2022-09-15 09:47:47 +02:00
|
|
|
break;
|
|
|
|
}
|
2023-02-17 12:03:53 +01:00
|
|
|
case WM_SETTINGCHANGE: {
|
|
|
|
// Handle Windows theme changes
|
2022-09-15 09:47:47 +02:00
|
|
|
if (lParam == 0) break;
|
|
|
|
|
|
|
|
if (LPCTSTR(lParam) == std::string_view("ImmersiveColorSet")) {
|
|
|
|
EventManager::post<EventOSThemeChanged>();
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2023-07-06 10:26:12 +02:00
|
|
|
case WM_SETCURSOR: {
|
|
|
|
if (LOWORD(lParam) != HTCLIENT) {
|
|
|
|
return CallWindowProc((WNDPROC)g_oldWndProc, hwnd, uMsg, wParam, lParam);
|
|
|
|
} else {
|
|
|
|
switch (ImGui::GetMouseCursor()) {
|
|
|
|
case ImGuiMouseCursor_Arrow:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_ARROW));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_Hand:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_HAND));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_ResizeEW:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_SIZEWE));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_ResizeNS:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_SIZENS));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_ResizeNWSE:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_SIZENWSE));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_ResizeNESW:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_SIZENESW));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_ResizeAll:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_SIZEALL));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_NotAllowed:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_NO));
|
|
|
|
break;
|
|
|
|
case ImGuiMouseCursor_TextInput:
|
|
|
|
SetCursor(LoadCursor(nullptr, IDC_IBEAM));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
2022-09-15 09:47:47 +02:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return CallWindowProc((WNDPROC)g_oldWndProc, hwnd, uMsg, wParam, lParam);
|
|
|
|
}
|
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
// Custom window procedure for borderless window
|
2022-09-15 09:47:47 +02:00
|
|
|
static LRESULT borderlessWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
2022-01-24 20:53:17 +01:00
|
|
|
switch (uMsg) {
|
2023-05-20 21:10:12 +02:00
|
|
|
case WM_MOUSELAST:
|
|
|
|
break;
|
2022-02-01 22:09:44 +01:00
|
|
|
case WM_NCACTIVATE:
|
|
|
|
case WM_NCPAINT:
|
2023-02-17 12:03:53 +01:00
|
|
|
// Handle Windows Aero Snap
|
2022-02-01 22:09:44 +01:00
|
|
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
2023-02-17 12:03:53 +01:00
|
|
|
case WM_NCCALCSIZE: {
|
|
|
|
// Handle window resizing
|
|
|
|
|
|
|
|
RECT &rect = *reinterpret_cast<RECT *>(lParam);
|
|
|
|
RECT client = rect;
|
|
|
|
|
|
|
|
CallWindowProc((WNDPROC)g_oldWndProc, hwnd, uMsg, wParam, lParam);
|
|
|
|
|
|
|
|
if (IsMaximized(hwnd)) {
|
|
|
|
WINDOWINFO windowInfo = { };
|
|
|
|
windowInfo.cbSize = sizeof(WINDOWINFO);
|
|
|
|
GetWindowInfo(hwnd, &windowInfo);
|
2023-05-11 12:00:56 +02:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
rect = RECT {
|
|
|
|
.left = static_cast<LONG>(client.left + windowInfo.cyWindowBorders),
|
|
|
|
.top = static_cast<LONG>(client.top + windowInfo.cyWindowBorders),
|
2023-05-11 20:49:07 +02:00
|
|
|
.right = static_cast<LONG>(client.right - windowInfo.cyWindowBorders),
|
|
|
|
.bottom = static_cast<LONG>(client.bottom - windowInfo.cyWindowBorders) + 1
|
2023-02-17 12:03:53 +01:00
|
|
|
};
|
|
|
|
} else {
|
|
|
|
rect = client;
|
2021-08-18 22:36:46 +02:00
|
|
|
}
|
2021-12-10 16:09:55 +01:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
case WM_NCHITTEST: {
|
|
|
|
// Handle window resizing and moving
|
2021-08-21 13:55:21 +02:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
POINT cursor = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
|
2021-08-18 22:36:46 +02:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
const POINT border {
|
2023-05-11 18:43:19 +02:00
|
|
|
static_cast<LONG>((::GetSystemMetrics(SM_CXFRAME) + ::GetSystemMetrics(SM_CXPADDEDBORDER)) * ImHexApi::System::getGlobalScale()),
|
|
|
|
static_cast<LONG>((::GetSystemMetrics(SM_CYFRAME) + ::GetSystemMetrics(SM_CXPADDEDBORDER)) * ImHexApi::System::getGlobalScale())
|
2023-02-17 12:03:53 +01:00
|
|
|
};
|
2022-02-01 22:09:44 +01:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
RECT window;
|
|
|
|
if (!::GetWindowRect(hwnd, &window)) {
|
|
|
|
return HTNOWHERE;
|
|
|
|
}
|
2022-02-01 22:09:44 +01:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
constexpr static auto RegionClient = 0b0000;
|
|
|
|
constexpr static auto RegionLeft = 0b0001;
|
|
|
|
constexpr static auto RegionRight = 0b0010;
|
|
|
|
constexpr static auto RegionTop = 0b0100;
|
|
|
|
constexpr static auto RegionBottom = 0b1000;
|
2022-02-01 22:09:44 +01:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
const auto result =
|
|
|
|
RegionLeft * (cursor.x < (window.left + border.x)) |
|
|
|
|
RegionRight * (cursor.x >= (window.right - border.x)) |
|
|
|
|
RegionTop * (cursor.y < (window.top + border.y)) |
|
|
|
|
RegionBottom * (cursor.y >= (window.bottom - border.y));
|
|
|
|
|
2023-05-20 21:10:12 +02:00
|
|
|
if (result != 0 && (ImGui::IsAnyItemHovered() || ImGui::IsPopupOpen(nullptr, ImGuiPopupFlags_AnyPopupId))) {
|
2023-04-06 14:58:05 +02:00
|
|
|
break;
|
2023-05-20 21:10:12 +02:00
|
|
|
}
|
2023-04-06 14:58:05 +02:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
switch (result) {
|
|
|
|
case RegionLeft:
|
|
|
|
return HTLEFT;
|
|
|
|
case RegionRight:
|
|
|
|
return HTRIGHT;
|
|
|
|
case RegionTop:
|
|
|
|
return HTTOP;
|
|
|
|
case RegionBottom:
|
|
|
|
return HTBOTTOM;
|
|
|
|
case RegionTop | RegionLeft:
|
|
|
|
return HTTOPLEFT;
|
|
|
|
case RegionTop | RegionRight:
|
|
|
|
return HTTOPRIGHT;
|
|
|
|
case RegionBottom | RegionLeft:
|
|
|
|
return HTBOTTOMLEFT;
|
|
|
|
case RegionBottom | RegionRight:
|
|
|
|
return HTBOTTOMRIGHT;
|
|
|
|
case RegionClient:
|
|
|
|
default:
|
|
|
|
if ((cursor.y < (window.top + g_titleBarHeight * 2)) && !(ImGui::IsAnyItemHovered() || ImGui::IsPopupOpen(nullptr, ImGuiPopupFlags_AnyPopupId)))
|
|
|
|
return HTCAPTION;
|
|
|
|
else break;
|
2022-01-24 20:53:17 +01:00
|
|
|
}
|
2023-02-17 12:03:53 +01:00
|
|
|
break;
|
|
|
|
}
|
2022-02-01 22:09:44 +01:00
|
|
|
default:
|
2022-01-24 20:53:17 +01:00
|
|
|
break;
|
2021-08-18 22:36:46 +02:00
|
|
|
}
|
|
|
|
|
2022-09-15 09:47:47 +02:00
|
|
|
return commonWindowProc(hwnd, uMsg, wParam, lParam);
|
2022-01-24 20:53:17 +01:00
|
|
|
}
|
2021-08-22 20:24:42 +02:00
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
|
|
|
|
void Window::initNative() {
|
2023-07-13 14:08:23 +02:00
|
|
|
HWND consoleWindow = ::GetConsoleWindow();
|
|
|
|
DWORD processId = 0;
|
|
|
|
::GetWindowThreadProcessId(consoleWindow, &processId);
|
|
|
|
if (GetCurrentProcessId() == processId) {
|
|
|
|
ShowWindow(consoleWindow, SW_HIDE);
|
|
|
|
FreeConsole();
|
|
|
|
log::impl::redirectToFile();
|
|
|
|
} else {
|
|
|
|
auto hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE);
|
|
|
|
if (hConsole != INVALID_HANDLE_VALUE) {
|
|
|
|
DWORD mode = 0;
|
|
|
|
if (::GetConsoleMode(hConsole, &mode) == TRUE) {
|
|
|
|
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_PROCESSED_OUTPUT;
|
|
|
|
::SetConsoleMode(hConsole, mode);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-14 14:21:16 +01:00
|
|
|
ImHexApi::System::impl::setBorderlessWindowMode(true);
|
2023-01-07 10:32:01 +01:00
|
|
|
|
|
|
|
// Add plugin library folders to dll search path
|
|
|
|
for (const auto &path : hex::fs::getDefaultPaths(fs::ImHexPath::Libraries)) {
|
|
|
|
if (std::fs::exists(path))
|
|
|
|
AddDllDirectory(path.c_str());
|
|
|
|
}
|
|
|
|
|
2023-03-18 11:35:01 +01:00
|
|
|
// Various libraries sadly directly print to stderr with no way to disable it
|
|
|
|
// We redirect stderr to NUL to prevent this
|
|
|
|
freopen("NUL:", "w", stderr);
|
|
|
|
setvbuf(stderr, nullptr, _IONBF, 0);
|
2022-01-24 20:53:17 +01:00
|
|
|
}
|
2021-08-22 20:24:42 +02:00
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
void Window::setupNativeWindow() {
|
|
|
|
// Setup borderless window
|
|
|
|
auto hwnd = glfwGetWin32Window(this->m_window);
|
2021-08-21 13:55:21 +02:00
|
|
|
|
2022-08-04 09:46:17 +02:00
|
|
|
bool borderlessWindowMode = ImHexApi::System::isBorderlessWindowModeEnabled();
|
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
// Set up the correct window procedure based on the borderless window mode state
|
2022-08-04 09:46:17 +02:00
|
|
|
if (borderlessWindowMode) {
|
2022-09-15 09:47:47 +02:00
|
|
|
g_oldWndProc = ::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)borderlessWindowProc);
|
2021-08-21 13:55:21 +02:00
|
|
|
|
2022-02-15 22:36:36 +01:00
|
|
|
MARGINS borderless = { 1, 1, 1, 1 };
|
|
|
|
::DwmExtendFrameIntoClientArea(hwnd, &borderless);
|
2021-08-21 13:55:21 +02:00
|
|
|
|
2022-02-15 22:36:36 +01:00
|
|
|
DWORD attribute = DWMNCRP_ENABLED;
|
|
|
|
::DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &attribute, sizeof(attribute));
|
2021-11-28 11:57:52 +01:00
|
|
|
|
2022-02-15 22:36:36 +01:00
|
|
|
::SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE);
|
|
|
|
::SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW);
|
2022-09-15 09:47:47 +02:00
|
|
|
} else {
|
|
|
|
g_oldWndProc = ::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)commonWindowProc);
|
2022-02-15 22:36:36 +01:00
|
|
|
}
|
2022-08-12 15:11:27 +02:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
// Add a custom exception handler to detect heap corruptions
|
2022-08-12 15:11:27 +02:00
|
|
|
{
|
|
|
|
::AddVectoredExceptionHandler(TRUE, [](PEXCEPTION_POINTERS exception) -> LONG {
|
|
|
|
if ((exception->ExceptionRecord->ExceptionCode & 0xF000'0000) == 0xC000'0000) {
|
|
|
|
log::fatal("Exception raised: 0x{:08X}", exception->ExceptionRecord->ExceptionCode);
|
|
|
|
if (exception->ExceptionRecord->ExceptionCode == STATUS_HEAP_CORRUPTION) {
|
|
|
|
log::fatal("Heap corruption detected!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
|
|
});
|
|
|
|
}
|
2023-01-14 14:21:16 +01:00
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
// Set up a taskbar progress handler
|
|
|
|
{
|
|
|
|
if (SUCCEEDED(CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED))) {
|
|
|
|
CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER, IID_ITaskbarList4, &g_taskbarList);
|
2023-01-14 14:21:16 +01:00
|
|
|
}
|
|
|
|
|
2023-02-17 12:03:53 +01:00
|
|
|
EventManager::subscribe<EventSetTaskBarIconState>([hwnd](u32 state, u32 type, u32 progress){
|
|
|
|
using enum ImHexApi::System::TaskProgressState;
|
|
|
|
switch (ImHexApi::System::TaskProgressState(state)) {
|
|
|
|
case Reset:
|
|
|
|
g_taskbarList->SetProgressState(hwnd, TBPF_NOPROGRESS);
|
|
|
|
g_taskbarList->SetProgressValue(hwnd, 0, 0);
|
|
|
|
break;
|
|
|
|
case Flash:
|
|
|
|
FlashWindow(hwnd, true);
|
|
|
|
break;
|
|
|
|
case Progress:
|
|
|
|
g_taskbarList->SetProgressState(hwnd, TBPF_INDETERMINATE);
|
|
|
|
g_taskbarList->SetProgressValue(hwnd, progress, 100);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
using enum ImHexApi::System::TaskProgressType;
|
|
|
|
switch (ImHexApi::System::TaskProgressType(type)) {
|
|
|
|
case Normal:
|
|
|
|
g_taskbarList->SetProgressState(hwnd, TBPF_NORMAL);
|
|
|
|
break;
|
|
|
|
case Warning:
|
|
|
|
g_taskbarList->SetProgressState(hwnd, TBPF_PAUSED);
|
|
|
|
break;
|
|
|
|
case Error:
|
|
|
|
g_taskbarList->SetProgressState(hwnd, TBPF_ERROR);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2023-05-22 12:00:35 +02:00
|
|
|
|
|
|
|
struct ACCENTPOLICY {
|
2023-05-23 13:20:35 +02:00
|
|
|
u32 accentState;
|
|
|
|
u32 accentFlags;
|
|
|
|
u32 gradientColor;
|
|
|
|
u32 animationId;
|
2023-05-22 12:00:35 +02:00
|
|
|
};
|
|
|
|
struct WINCOMPATTRDATA {
|
2023-05-23 13:20:35 +02:00
|
|
|
int attribute;
|
|
|
|
PVOID pData;
|
|
|
|
ULONG dataSize;
|
2023-05-22 12:00:35 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
EventManager::subscribe<EventThemeChanged>([this]{
|
|
|
|
auto hwnd = glfwGetWin32Window(this->m_window);
|
|
|
|
|
2023-05-23 13:20:35 +02:00
|
|
|
static auto user32Dll = WinUniquePtr<HMODULE>(LoadLibraryA("user32.dll"), FreeLibrary);
|
2023-05-22 12:00:35 +02:00
|
|
|
if (user32Dll != nullptr) {
|
|
|
|
using SetWindowCompositionAttributeFunc = BOOL(WINAPI*)(HWND, WINCOMPATTRDATA*);
|
|
|
|
|
2023-05-23 11:34:30 +02:00
|
|
|
const auto SetWindowCompositionAttribute =
|
|
|
|
(SetWindowCompositionAttributeFunc)
|
|
|
|
(void*)
|
|
|
|
GetProcAddress(user32Dll.get(), "SetWindowCompositionAttribute");
|
|
|
|
|
2023-05-22 12:00:35 +02:00
|
|
|
if (SetWindowCompositionAttribute != nullptr) {
|
2023-05-23 13:20:35 +02:00
|
|
|
ACCENTPOLICY policy = { ImGui::GetCustomStyle().WindowBlur > 0.5F ? 4U : 0U, 0, ImGui::GetCustomColorU32(ImGuiCustomCol_BlurBackground), 0 };
|
2023-05-22 13:20:25 +02:00
|
|
|
WINCOMPATTRDATA data = { 19, &policy, sizeof(ACCENTPOLICY) };
|
2023-05-22 12:00:35 +02:00
|
|
|
SetWindowCompositionAttribute(hwnd, &data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
}
|
2021-08-18 22:36:46 +02:00
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
void Window::beginNativeWindowFrame() {
|
|
|
|
g_titleBarHeight = ImGui::GetCurrentWindow()->MenuBarHeight();
|
|
|
|
}
|
2021-08-18 22:36:46 +02:00
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
void Window::endNativeWindowFrame() {
|
2022-08-04 09:46:17 +02:00
|
|
|
if (!ImHexApi::System::isBorderlessWindowModeEnabled())
|
|
|
|
return;
|
2022-01-24 20:53:17 +01:00
|
|
|
}
|
2021-08-18 22:36:46 +02:00
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
}
|
|
|
|
|
2021-08-18 22:36:46 +02:00
|
|
|
#endif
|