Make top resizing grabber larger on Windows (#11023)
Some checks failed
Build all / Build All (push) Has been cancelled
Build all / Flatpak (push) Has been cancelled

This commit is contained in:
Noisyfox 2025-10-16 11:20:27 +08:00 committed by GitHub
parent 0493ed03a5
commit e20113402c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 54 additions and 0 deletions

View file

@ -696,3 +696,22 @@ wxAuiToolBarItem* BBLTopbar::FindToolByCurrentPosition()
wxPoint client_pos = this->ScreenToClient(mouse_pos);
return this->FindToolByPosition(client_pos.x, client_pos.y);
}
#ifdef __WIN32__
WXLRESULT BBLTopbar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
switch (nMsg) {
case WM_NCHITTEST: {
const wxAuiToolBarItem* current_item = this->FindToolByCurrentPosition();
if (current_item != nullptr && current_item != m_title_item) {
break;
}
// Pass the event to main window if mouse is on the top bar and not on any of the buttons
return HTTRANSPARENT;
}
}
return wxAuiToolBar::MSWWindowProc(nMsg, wParam, lParam);
}
#endif

View file

@ -56,6 +56,11 @@ public:
void ShowCalibrationButton(bool show = true);
protected:
#ifdef __WIN32__
WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override;
#endif
private:
wxFrame* m_frame;
wxAuiToolBarItem* m_file_menu_item;

View file

@ -739,6 +739,36 @@ WXLRESULT MainFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam
}
break;
case WM_NCHITTEST: {
if (IsMaximized()) {
// When maximized, no resize border
return HTCAPTION;
}
// Allow resizing from top of the title bar
wxPoint mouse_pos = ::wxGetMousePosition();
if (m_topbar->GetScreenRect().GetBottom() >= mouse_pos.y) {
RECT borderThickness;
SetRectEmpty(&borderThickness);
AdjustWindowRectEx(&borderThickness, GetWindowLongPtr(hWnd, GWL_STYLE) & ~WS_CAPTION, FALSE, NULL);
borderThickness.left *= -1;
borderThickness.top *= -1;
wxPoint client_pos = this->ScreenToClient(mouse_pos);
bool on_top_border = client_pos.y <= borderThickness.top;
// And to allow diagonally resizing, we check if mouse is at window corner
if (client_pos.x <= borderThickness.left) {
return on_top_border ? HTTOPLEFT : HTLEFT;
} else if (client_pos.x >= GetClientSize().x - borderThickness.right) {
return on_top_border ? HTTOPRIGHT : HTRIGHT;
}
return on_top_border ? HTTOP : HTCAPTION;
}
break;
}
case WM_GETMINMAXINFO: {
auto mmi = (MINMAXINFO*) lParam;
HandleGetMinMaxInfo(mmi);