From 3f97e021b2cf41ac95aa41ab8ba5e60f5b0eb39b Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sat, 11 Oct 2025 16:22:20 +0000 Subject: [PATCH] works on gdi too git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@279 b9cfdab3-6d41-4d17-bbe4-086880011989 --- include/Mw/LowLevel.h | 8 +++++--- src/backend/gdi.c | 14 ++++++++++++++ src/backend/x11.c | 8 ++++++++ src/widget/scrollbar.c | 24 +++++++++++++++++++++++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/include/Mw/LowLevel.h b/include/Mw/LowLevel.h index 0af1415..3d83a89 100644 --- a/include/Mw/LowLevel.h +++ b/include/Mw/LowLevel.h @@ -46,9 +46,11 @@ enum MwLLKeyEnum { }; enum MwLLMouseEnum { - MwLLMouseLeft = 1, - MwLLMouseMiddle = 2, - MwLLMouseRight = 3 + MwLLMouseLeft = 1, + MwLLMouseMiddle, + MwLLMouseRight, + MwLLMouseWheelUp, + MwLLMouseWheelDown }; struct _MwLLMouse { diff --git a/src/backend/gdi.c b/src/backend/gdi.c index 6252d4d..d24373e 100644 --- a/src/backend/gdi.c +++ b/src/backend/gdi.c @@ -72,6 +72,20 @@ static LRESULT CALLBACK wndproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { SetCapture(NULL); MwLLDispatch(u->ll, up, &p); + } else if(msg == WM_MOUSEWHEEL) { + int d = GET_WHEEL_DELTA_WPARAM(wp); + MwLLMouse p; + p.point.x = LOWORD(lp); + p.point.y = HIWORD(lp); + + if(d > 0) { + p.button = MwLLMouseWheelUp; + } else if(d < 0) { + p.button = MwLLMouseWheelDown; + } + + MwLLDispatch(u->ll, down, &p); + MwLLDispatch(u->ll, up, &p); } else if(msg == WM_MOUSEMOVE) { MwPoint p; p.x = LOWORD(lp); diff --git a/src/backend/x11.c b/src/backend/x11.c index d685a12..b5fbb83 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -172,6 +172,10 @@ void MwLLNextEvent(MwLL handle) { p.button = MwLLMouseMiddle; } else if(ev.xbutton.button == Button3) { p.button = MwLLMouseRight; + } else if(ev.xbutton.button == Button4) { + p.button = MwLLMouseWheelUp; + } else if(ev.xbutton.button == Button5) { + p.button = MwLLMouseWheelDown; } MwLLDispatch(handle, down, &p); @@ -187,6 +191,10 @@ void MwLLNextEvent(MwLL handle) { p.button = MwLLMouseMiddle; } else if(ev.xbutton.button == Button3) { p.button = MwLLMouseRight; + } else if(ev.xbutton.button == Button4) { + p.button = MwLLMouseWheelUp; + } else if(ev.xbutton.button == Button5) { + p.button = MwLLMouseWheelDown; } MwLLDispatch(handle, up, &p); diff --git a/src/widget/scrollbar.c b/src/widget/scrollbar.c index c2514cf..5f615a9 100644 --- a/src/widget/scrollbar.c +++ b/src/widget/scrollbar.c @@ -164,8 +164,30 @@ static void mouse_down(MwWidget handle, void* ptr) { int wh = MwGetInteger(handle, MwNheight); int or = MwGetInteger(handle, MwNorientation); scrollbar_t* scr = handle->internal; + MwLLMouse* m = ptr; - if(((MwLLMouse*)ptr)->button != MwLLMouseLeft) return; + if(m->button == MwLLMouseWheelUp) { + int min = MwGetInteger(handle, MwNminValue); + int val = MwGetInteger(handle, MwNvalue); + + val -= MwGetInteger(handle, MwNareaShown); + + if(val < min) val = min; + + MwSetInteger(handle, MwNvalue, val); + MwDispatchUserHandler(handle, MwNchangedHandler, NULL); + } else if(m->button == MwLLMouseWheelDown) { + int max = MwGetInteger(handle, MwNmaxValue); + int val = MwGetInteger(handle, MwNvalue); + + val += MwGetInteger(handle, MwNareaShown); + + if(val > max) val = max; + + MwSetInteger(handle, MwNvalue, val); + MwDispatchUserHandler(handle, MwNchangedHandler, NULL); + } + if(m->button != MwLLMouseLeft) return; scr->point = handle->mouse_point; scr->drag = 0;