Compare commits

...

4 Commits

Author SHA1 Message Date
MicroBlock
a39173344e
Merge 9541979be2 into ac10768495 2025-07-18 15:23:19 +02:00
Camilla Löwy
ac10768495 Wayland: Fix memory leaks in data offer reading
The buffer storing the contents of the data offer being read could leak
if buffer reallocation or reading from the pipe failed.
2025-07-18 12:31:07 +02:00
MicroBlock
9541979be2
fix: add DWM_BB_ENABLE | DWM_BB_BLURREGION; 2025-02-03 15:35:46 +08:00
MicroBlock
1952a1b363
fix: unable to make window transparent in later win10 versions 2025-02-03 14:59:37 +08:00
3 changed files with 10 additions and 1 deletions

View File

@ -133,6 +133,7 @@ information on what to include when reporting a bug.
- [Wayland] Bugfix: A drag entering a non-GLFW surface could cause a segfault - [Wayland] Bugfix: A drag entering a non-GLFW surface could cause a segfault
- [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727) - [Wayland] Bugfix: Ignore key repeat events when no window has keyboard focus (#2727)
- [Wayland] Bugfix: Reset key repeat timer when window destroyed (#2741,#2727) - [Wayland] Bugfix: Reset key repeat timer when window destroyed (#2741,#2727)
- [Wayland] Bugfix: Memory would leak if reading a data offer failed midway
- [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631) - [X11] Bugfix: Running without a WM could trigger an assert (#2593,#2601,#2631)
- [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface` - [Null] Added Vulkan 'window' surface creation via `VK_EXT_headless_surface`
- [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless` - [Null] Added EGL context creation on Mesa via `EGL_MESA_platform_surfaceless`

View File

@ -68,6 +68,9 @@ static DWORD getWindowExStyle(const _GLFWwindow* window)
{ {
DWORD style = WS_EX_APPWINDOW; DWORD style = WS_EX_APPWINDOW;
if (_glfw.hints.framebuffer.transparent)
style |= WS_EX_LAYERED;
if (window->monitor || window->floating) if (window->monitor || window->floating)
style |= WS_EX_TOPMOST; style |= WS_EX_TOPMOST;
@ -377,15 +380,17 @@ static void updateFramebufferTransparency(const _GLFWwindow* window)
if (FAILED(DwmIsCompositionEnabled(&composition)) || !composition) if (FAILED(DwmIsCompositionEnabled(&composition)) || !composition)
return; return;
if (IsWindows8OrGreater() || if (IsWindows8OrGreater() ||
(SUCCEEDED(DwmGetColorizationColor(&color, &opaque)) && !opaque)) (SUCCEEDED(DwmGetColorizationColor(&color, &opaque)) && !opaque))
{ {
HRGN region = CreateRectRgn(0, 0, -1, -1); HRGN region = CreateRectRgn(0, 0, -1, -1);
DWM_BLURBEHIND bb = {0}; DWM_BLURBEHIND bb = {0};
bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;;
bb.hRgnBlur = region; bb.hRgnBlur = region;
bb.fEnable = TRUE; bb.fEnable = TRUE;
SetLayeredWindowAttributes(window->win32.handle, 0x0030c100, 254, LWA_ALPHA);
DwmEnableBlurBehindWindow(window->win32.handle, &bb); DwmEnableBlurBehindWindow(window->win32.handle, &bb);
DeleteObject(region); DeleteObject(region);
} }
@ -1290,6 +1295,7 @@ static int createNativeWindow(_GLFWwindow* window,
#else #else
wc.lpszClassName = L"GLFW30"; wc.lpszClassName = L"GLFW30";
#endif #endif
wc.hbrBackground = (HBRUSH)CreateSolidBrush(0x00000000);
// Load user-provided icon if available // Load user-provided icon if available
wc.hIcon = LoadImageW(GetModuleHandleW(NULL), wc.hIcon = LoadImageW(GetModuleHandleW(NULL),
L"GLFW_ICON", IMAGE_ICON, L"GLFW_ICON", IMAGE_ICON,

View File

@ -1333,6 +1333,7 @@ static char* readDataOfferAsString(struct wl_data_offer* offer, const char* mime
if (!longer) if (!longer)
{ {
_glfwInputError(GLFW_OUT_OF_MEMORY, NULL); _glfwInputError(GLFW_OUT_OF_MEMORY, NULL);
_glfw_free(string);
close(fds[0]); close(fds[0]);
return NULL; return NULL;
} }
@ -1352,6 +1353,7 @@ static char* readDataOfferAsString(struct wl_data_offer* offer, const char* mime
_glfwInputError(GLFW_PLATFORM_ERROR, _glfwInputError(GLFW_PLATFORM_ERROR,
"Wayland: Failed to read from data offer pipe: %s", "Wayland: Failed to read from data offer pipe: %s",
strerror(errno)); strerror(errno));
_glfw_free(string);
close(fds[0]); close(fds[0]);
return NULL; return NULL;
} }