diff --git a/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf b/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf index c177c655..59da888c 100644 --- a/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf +++ b/BeefLibs/Beefy2D/src/widgets/WidgetWindow.bf @@ -23,6 +23,7 @@ namespace Beefy.widgets public Event mOnMouseLeftWindow ~ _.Dispose(); public Event mOnWindowLostFocus ~ _.Dispose(); public Event mOnMouseDown ~ _.Dispose(); + public Event mOnMouseUp ~ _.Dispose(); public Event mOnWindowCloseQuery ~ _.Dispose(); public Event mOnWindowClosed ~ _.Dispose(); public Event mOnWindowMoved ~ _.Dispose(); @@ -653,12 +654,17 @@ namespace Beefy.widgets anEvent.mSender = this; anEvent.mX = x; anEvent.mY = y; + anEvent.mBtn = btn; + anEvent.mBtnCount = btnCount; mOnMouseDown(anEvent); sOnMouseDown(anEvent); if (anEvent.mHandled) return; } - + + if (btn >= 3) // X button - don't pass on to widgets + return; + Widget aWidget = mCaptureWidget ?? mOverWidget; if (aWidget != null) { @@ -679,6 +685,26 @@ namespace Beefy.widgets MouseMove(inX, inY); mMouseFlags &= (MouseFlag)(~(1 << btn)); + + float x; + float y; + TranslateMouseCoords(inX, inY, out x, out y); + + if (mOnMouseUp.HasListeners) + { + MouseEvent anEvent = scope MouseEvent(); + anEvent.mSender = this; + anEvent.mX = x; + anEvent.mY = y; + anEvent.mBtn = btn; + mOnMouseUp(anEvent); + if (anEvent.mHandled) + return; + } + + if (btn >= 3) // X button - don't pass on to widgets + return; + Widget aWidget = mCaptureWidget ?? mOverWidget; if (aWidget != null) { diff --git a/BeefySysLib/platform/win/WinBFApp.cpp b/BeefySysLib/platform/win/WinBFApp.cpp index b307e395..513c7db2 100644 --- a/BeefySysLib/platform/win/WinBFApp.cpp +++ b/BeefySysLib/platform/win/WinBFApp.cpp @@ -531,13 +531,15 @@ LRESULT WinBFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: + case WM_XBUTTONDOWN: case WM_LBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: + case WM_XBUTTONUP: case WM_MOUSEWHEEL: - case WM_MOUSEMOVE: + case WM_MOUSEMOVE: { int x = (short)LOWORD(lParam); int y = (short)HIWORD(lParam); @@ -602,7 +604,10 @@ LRESULT WinBFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar break; case WM_MBUTTONDOWN: _BtnDown(2); - break; + break; + case WM_XBUTTONDOWN: + _BtnDown((int)(wParam >> 16) + 2); + break; case WM_LBUTTONUP: _BtnUp(0); break; @@ -611,7 +616,10 @@ LRESULT WinBFWindow::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar break; case WM_MBUTTONUP: _BtnUp(2); - break; + break; + case WM_XBUTTONUP: + _BtnUp((int)(wParam >> 16) + 2); + break; case WM_MOUSEWHEEL: { WinBFWindow* cursorWindow = this; diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 9db1267c..c8a5c899 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -5308,6 +5308,7 @@ namespace IDE public void SetupNewWindow(WidgetWindow window, bool isMainWindow) { window.mOnWindowKeyDown.Add(new => SysKeyDown); + window.mOnMouseUp.Add(new => MouseUp); if (isMainWindow) window.mOnWindowCloseQuery.Add(new => SecondaryAllowClose); } @@ -7087,6 +7088,14 @@ namespace IDE gApp.mSettings.mUISettings.mScale = DarkTheme.sScale * 100.0f; } + void MouseUp(MouseEvent evt) + { + if (evt.mBtn == 3) + NavigateBackwards(); + else if (evt.mBtn == 4) + NavigateForwards(); + } + void SysKeyDown(KeyDownEvent evt) { if (evt.mHandled) @@ -10996,6 +11005,7 @@ namespace IDE UpdateTitle(); mMainWindow.SetMinimumSize(GS!(480), GS!(360)); mMainWindow.mIsMainWindow = true; + mMainWindow.mOnMouseUp.Add(new => MouseUp); mMainWindow.mOnWindowKeyDown.Add(new => SysKeyDown); mMainWindow.mOnWindowCloseQuery.Add(new => AllowClose); CreateMenu();