diff --git a/uppsrc/CtrlCore/CtrlCore.h b/uppsrc/CtrlCore/CtrlCore.h index ea34c4af9..f4dadd10e 100644 --- a/uppsrc/CtrlCore/CtrlCore.h +++ b/uppsrc/CtrlCore/CtrlCore.h @@ -882,6 +882,7 @@ public: MOUSELEAVE = 0x30, CURSORIMAGE = 0x40, MOUSEWHEEL = 0x50, + MOUSEHWHEEL = 0x60, DOWN = 0x80, UP = 0x90, @@ -987,6 +988,7 @@ public: virtual void MiddleHold(Point p, dword keyflags); virtual void MiddleUp(Point p, dword keyflags); virtual void MouseWheel(Point p, int zdelta, dword keyflags); + virtual void MouseWheelHor(Point p, int zdelta, dword keyflags); virtual void MouseLeave(); virtual void Pen(Point p, const PenInfo& pen, dword keyflags); diff --git a/uppsrc/CtrlCore/CtrlMouse.cpp b/uppsrc/CtrlCore/CtrlMouse.cpp index 051e71fac..3895ba6b4 100644 --- a/uppsrc/CtrlCore/CtrlMouse.cpp +++ b/uppsrc/CtrlCore/CtrlMouse.cpp @@ -95,7 +95,7 @@ Image Ctrl::MouseEvent0(int event, Point p, int zdelta, dword keyflags) sPropagated = false; Image m = this_ ? MouseEvent(event, p, zdelta, keyflags) : Image(); Ctrl *parent = this_ ? this_->GetParent() : NULL; - if(event == MOUSEWHEEL && !sPropagated && this_ && parent) + if(((event == MOUSEWHEEL)||(event == MOUSEHWHEEL)) && !sPropagated && this_ && parent) parent->ChildMouseEvent(this, event, p, zdelta, keyflags); sPropagated = pb; return m; @@ -111,7 +111,7 @@ Image Ctrl::MouseEventH(int event, Point p, int zdelta, dword keyflags) if(this_) LogMouseEvent(NULL, this, event, p, zdelta, keyflags); Ctrl *parent = this_ ? this_->GetParent() : NULL; - if(this_ && parent && event != MOUSEWHEEL) + if(this_ && parent && event != MOUSEWHEEL && event != MOUSEHWHEEL) parent->ChildMouseEvent(this, event, p, zdelta, keyflags); return MouseEvent0(event, p, zdelta, keyflags); } @@ -129,6 +129,19 @@ void Ctrl::MouseWheel(Point p, int zd, dword kf) } } +void Ctrl::MouseWheelHor(Point p, int zd, dword kf) +{ + Ctrl *parent = GetParent(); + if(parent) { + p += GetScreenView().TopLeft(); + Rect r = parent->GetScreenView(); + if(r.Contains(p)) { + parent->MouseEvent0(MOUSEHWHEEL, p - r.TopLeft(), zd, kf); + sPropagated = true; + } + } +} + void Ctrl::ChildFrameMouseEvent(Ctrl *child, int event, Point p, int zdelta, dword keyflags) { GuiLock __; @@ -224,6 +237,9 @@ Image Ctrl::MouseEvent(int event, Point p, int zdelta, dword keyflags) case MOUSEWHEEL: MouseWheel(p, zdelta, keyflags); break; + case MOUSEHWHEEL: + MouseWheelHor(p, zdelta, keyflags); + break; case CURSORIMAGE: return CursorImage(p, keyflags); } @@ -531,7 +547,7 @@ bool sDblTime(int time) Image Ctrl::DispatchMouse(int e, Point p, int zd) { GuiLock __; EventLevelDo ___; - if(e == MOUSEWHEEL && !zd) // ignore non-scroll wheel events + if(((e == MOUSEWHEEL)||(e == MOUSEHWHEEL)) && !zd) // ignore non-scroll wheel events return Null; if(e == MOUSEMOVE && repeatTopCtrl == this) { if(sDistMin(leftmousepos, p) > GUI_DragDistance() && GetMouseLeft()) { @@ -621,7 +637,7 @@ Image Ctrl::DispatchMouseEvent(int e, Point p, int zd) { if(!IsEnabled()) return Image::Arrow(); Ctrl *top = this; - if(e == MOUSEWHEEL && !GetParent()) { + if(((e == MOUSEWHEEL)||(e == MOUSEHWHEEL)) && !GetParent()) { Ctrl *w = GetFocusCtrl(); if(w) { top = w->GetTopCtrl(); diff --git a/uppsrc/CtrlCore/GtkEvent.cpp b/uppsrc/CtrlCore/GtkEvent.cpp index 8313d2fff..edf6ca584 100644 --- a/uppsrc/CtrlCore/GtkEvent.cpp +++ b/uppsrc/CtrlCore/GtkEvent.cpp @@ -168,13 +168,22 @@ gboolean Ctrl::GtkEvent(GtkWidget *widget, GdkEvent *event, gpointer user_data) break; case GDK_SCROLL: { GdkEventScroll *e = (GdkEventScroll *)event; - if(findarg(e->direction, GDK_SCROLL_UP, GDK_SCROLL_LEFT) >= 0) - value = 120; - else - if(findarg(e->direction, GDK_SCROLL_DOWN, GDK_SCROLL_RIGHT) >= 0) - value = -120; - else - return false; + switch(e->direction){ + case GDK_SCROLL_UP: + value = Point(0, 120); + break; + case GDK_SCROLL_DOWN: + value = Point(0, -120); + break; + case GDK_SCROLL_RIGHT: + value = Point(120 ,0); + break; + case GDK_SCROLL_LEFT: + value = Point(-120, 0); + break; + default: + return false; + } break; } case GDK_KEY_PRESS: @@ -571,7 +580,9 @@ void Ctrl::Proc() GtkButtonEvent(UP); break; case GDK_SCROLL: { - GtkMouseEvent(MOUSEWHEEL, MOUSEWHEEL, CurrentEvent.value); + Point delta = CurrentEvent.value; + if(delta.y!=0.0) GtkMouseEvent(MOUSEWHEEL, MOUSEWHEEL, delta.y); + if(delta.x!=0.0) GtkMouseEvent(MOUSEHWHEEL, MOUSEHWHEEL, delta.x); break; } case GDK_KEY_PRESS: @@ -729,7 +740,7 @@ bool Ctrl::ProcessEvent0(bool *quit, bool fetch) b.count += a.count; else if(a.type == GDK_SCROLL) - b.value = (int)b.value + (int)a.value; + b.value = (Point)b.value + (Point)a.value; else if(a.type != GDK_CONFIGURE) break; diff --git a/uppsrc/CtrlCore/Win32Proc.cpp b/uppsrc/CtrlCore/Win32Proc.cpp index fc4f74aff..e954ba797 100644 --- a/uppsrc/CtrlCore/Win32Proc.cpp +++ b/uppsrc/CtrlCore/Win32Proc.cpp @@ -340,6 +340,7 @@ LRESULT Ctrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { } return 0L; case 0x20a: // WM_MOUSEWHEEL: + case 0x20e: // WM_MOUSEHWHEEL: if(ignoreclick) { EndIgnore(); return 0L; @@ -347,7 +348,7 @@ LRESULT Ctrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if(_this) { Point p(0, 0); ::ClientToScreen(hwnd, p); - DoMouse(MOUSEWHEEL, Point((dword)lParam) - p, (short)HIWORD(wParam)); + DoMouse(message == 0x20e ? MOUSEHWHEEL : MOUSEWHEEL, Point((dword)lParam) - p, (short)HIWORD(wParam)); CurrentMousePos = Point((dword)lParam); } if(_this) PostInput();