Updated the Win32 window-state handling to include shellapi.h and query taskbar auto-hide/taskbar edge state via SHAppBarMessage, so maximized windows can leave a 1px reveal edge for the auto-hidden taskbar.

Added monitor-aware work-area adjustment when maximized (MonitorFromWindow + GetMonitorInfo) and shrink by 1px on the detected taskbar edge (including bottom edge), then apply that rectangle with SetWindowPos. This addresses the “mouse at bottom edge should unhide taskbar” behavior.
Kept the existing HWND_NOTOPMOST safeguard in place after the adjustment, preserving prior not-topmost behavior.
This commit is contained in:
2026-02-25 14:48:18 -07:00
parent 7cfa3b3513
commit e3f932aa6b

View File

@@ -58,6 +58,7 @@
#ifdef G_OS_WIN32
#include <windows.h>
#include <shellapi.h>
#include <gdk/gdkwin32.h>
static void
@@ -80,6 +81,56 @@ mg_win32_allow_autohide_taskbar (GtkWindow *window, GdkEventWindowState *event)
if (!hwnd)
return;
if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)
{
APPBARDATA appbar_data;
RECT work_area;
ZeroMemory (&appbar_data, sizeof (APPBARDATA));
appbar_data.cbSize = sizeof (APPBARDATA);
if ((SHAppBarMessage (ABM_GETSTATE, &appbar_data) & ABS_AUTOHIDE) != 0 &&
SHAppBarMessage (ABM_GETTASKBARPOS, &appbar_data) != 0)
{
HMONITOR monitor;
MONITORINFO monitor_info;
monitor = MonitorFromWindow (hwnd, MONITOR_DEFAULTTONEAREST);
ZeroMemory (&monitor_info, sizeof (MONITORINFO));
monitor_info.cbSize = sizeof (MONITORINFO);
if (monitor && GetMonitorInfo (monitor, &monitor_info))
{
work_area = monitor_info.rcMonitor;
switch (appbar_data.uEdge)
{
case ABE_LEFT:
work_area.left += 1;
break;
case ABE_TOP:
work_area.top += 1;
break;
case ABE_RIGHT:
work_area.right -= 1;
break;
case ABE_BOTTOM:
default:
work_area.bottom -= 1;
break;
}
SetWindowPos (hwnd,
NULL,
work_area.left,
work_area.top,
work_area.right - work_area.left,
work_area.bottom - work_area.top,
SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);
}
}
}
SetWindowPos (hwnd,
HWND_NOTOPMOST,
0,