ZD_GLFW_FORK

This commit is contained in:
Çağatay Yiğit 2023-08-28 15:03:17 +03:00
parent 3eaf1255b2
commit ca7d763ec3
2 changed files with 141 additions and 0 deletions

View File

@ -6200,6 +6200,13 @@ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname);
*/ */
GLFWAPI int glfwVulkanSupported(void); GLFWAPI int glfwVulkanSupported(void);
#ifdef ZD_GLFW_FORK
typedef int(*glfwMouseDragCheckFn)();
GLFWAPI void SetMouseDragCheckFn(glfwMouseDragCheckFn function);
GLFWAPI void glfwGetBorder(int* border);
#endif
/*! @brief Returns the Vulkan instance extensions required by GLFW. /*! @brief Returns the Vulkan instance extensions required by GLFW.
* *
* This function returns an array of names of Vulkan instance extensions required * This function returns an array of names of Vulkan instance extensions required

View File

@ -37,6 +37,97 @@
#include <windowsx.h> #include <windowsx.h>
#include <shellapi.h> #include <shellapi.h>
#ifdef ZD_GLFW_FORK
/*
ZD_GLFW_FORK: Adapted from: https://github.com/melak47/BorderlessWindow
*/
glfwMouseDragCheckFn checkDragFunction;
int g_Cursor = 0;
#define SM_CXPADDEDBORDER 92
DWORD aero_borderless = WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX;
int maximized(HWND hwnd) {
WINDOWPLACEMENT placement;
if (!GetWindowPlacement(hwnd, &placement)) {
return 0;
}
return placement.showCmd == SW_MAXIMIZE;
}
void adjust_maximized_client_rect(HWND window, NCCALCSIZE_PARAMS* params) {
if (!maximized(window)) {
return;
}
HMONITOR monitor = MonitorFromWindow(window, MONITOR_DEFAULTTONULL);
if (!monitor) {
return;
}
MONITORINFO monitor_info;
monitor_info.cbSize = sizeof(monitor_info);
if (!GetMonitorInfoW(monitor, &monitor_info)) {
return;
}
// when maximized, make the client area fill just the monitor (without task bar) rect,
// not the whole window rect which extends beyond the monitor.
params->rgrc[0] = monitor_info.rcWork;
}
LRESULT hit_test(HWND handle, POINT cursor) {
// identify borders and corners to allow resizing the window.
// Note: On Windows 10, windows behave differently and
// allow resizing outside the visible window frame.
// This implementation does not replicate that behavior.
const POINT border = {
GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER),
GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER)
};
RECT window;
if (!GetWindowRect(handle, &window)) {
return HTNOWHERE;
}
const int64_t drag = checkDragFunction ? (checkDragFunction() ? HTCAPTION : HTCLIENT) : HTCLIENT;
enum region_mask {
client = 0b0000,
left = 0b0001,
right = 0b0010,
top = 0b0100,
bottom = 0b1000,
};
const uint64_t result =
left * (cursor.x < (window.left + border.x)) |
right * (cursor.x >= (window.right - border.x)) |
top * (cursor.y < (window.top + border.y)) |
bottom * (cursor.y >= (window.bottom - border.y));
switch (result) {
case left: return HTLEFT;
case right: return HTRIGHT;
case top: return HTTOP;
case bottom: return HTBOTTOM;
case top | left: return HTTOPLEFT;
case top | right: return HTTOPRIGHT;
case bottom | left: return HTBOTTOMLEFT;
case bottom | right: return HTBOTTOMRIGHT;
case client: return drag;
default: return HTNOWHERE;
}
}
#endif // ZD_GLFW_FORK
// Returns the window style for the specified window // Returns the window style for the specified window
// //
static DWORD getWindowStyle(const _GLFWwindow* window) static DWORD getWindowStyle(const _GLFWwindow* window)
@ -553,6 +644,33 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
switch (uMsg) switch (uMsg)
{ {
#ifdef ZD_GLFW_FORK
case WM_NCCALCSIZE:
{
if (wParam)
{
if (!window->decorated) {
NCCALCSIZE_PARAMS* params = ((NCCALCSIZE_PARAMS*)lParam);
adjust_maximized_client_rect(hWnd, params);
return 0;
}
break;
}
break;
}
case WM_NCHITTEST:
{
if (!window->decorated) {
POINT cursor;
cursor.x = GET_X_LPARAM(lParam);
cursor.y = GET_Y_LPARAM(lParam);
return hit_test(hWnd, cursor);
}
break;
}
#endif // ZD_GLFW_FORK
case WM_MOUSEACTIVATE: case WM_MOUSEACTIVATE:
{ {
// HACK: Postpone cursor disabling when the window was activated by // HACK: Postpone cursor disabling when the window was activated by
@ -1336,7 +1454,11 @@ static int createNativeWindow(_GLFWwindow* window,
window->win32.handle = CreateWindowExW(exStyle, window->win32.handle = CreateWindowExW(exStyle,
MAKEINTATOM(_glfw.win32.mainWindowClass), MAKEINTATOM(_glfw.win32.mainWindowClass),
wideTitle, wideTitle,
#ifdef ZD_GLFW_FORK
window->decorated ? style : aero_borderless,
#else
style, style,
#endif
frameX, frameY, frameX, frameY,
frameWidth, frameHeight, frameWidth, frameHeight,
NULL, // No parent window NULL, // No parent window
@ -2433,6 +2555,18 @@ void _glfwGetRequiredInstanceExtensionsWin32(char** extensions)
extensions[1] = "VK_KHR_win32_surface"; extensions[1] = "VK_KHR_win32_surface";
} }
#ifdef ZD_GLFW_FORK
void SetMouseDragCheckFn(glfwMouseDragCheckFn function)
{
checkDragFunction = function;
}
GLFWAPI void glfwGetBorder(int* border)
{
*border = g_Cursor;
}
#endif
GLFWbool _glfwGetPhysicalDevicePresentationSupportWin32(VkInstance instance, GLFWbool _glfwGetPhysicalDevicePresentationSupportWin32(VkInstance instance,
VkPhysicalDevice device, VkPhysicalDevice device,
uint32_t queuefamily) uint32_t queuefamily)