CtrlCore: Horizontal mouse wheel support using MouseWheelHor() (#192)

This commit is contained in:
User0755 2024-02-15 00:10:50 +02:00 committed by GitHub
parent 09960b1056
commit e3e7f75e98
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 44 additions and 14 deletions

View file

@ -882,6 +882,7 @@ public:
MOUSELEAVE = 0x30, MOUSELEAVE = 0x30,
CURSORIMAGE = 0x40, CURSORIMAGE = 0x40,
MOUSEWHEEL = 0x50, MOUSEWHEEL = 0x50,
MOUSEHWHEEL = 0x60,
DOWN = 0x80, DOWN = 0x80,
UP = 0x90, UP = 0x90,
@ -987,6 +988,7 @@ public:
virtual void MiddleHold(Point p, dword keyflags); virtual void MiddleHold(Point p, dword keyflags);
virtual void MiddleUp(Point p, dword keyflags); virtual void MiddleUp(Point p, dword keyflags);
virtual void MouseWheel(Point p, int zdelta, 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 MouseLeave();
virtual void Pen(Point p, const PenInfo& pen, dword keyflags); virtual void Pen(Point p, const PenInfo& pen, dword keyflags);

View file

@ -95,7 +95,7 @@ Image Ctrl::MouseEvent0(int event, Point p, int zdelta, dword keyflags)
sPropagated = false; sPropagated = false;
Image m = this_ ? MouseEvent(event, p, zdelta, keyflags) : Image(); Image m = this_ ? MouseEvent(event, p, zdelta, keyflags) : Image();
Ctrl *parent = this_ ? this_->GetParent() : NULL; 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); parent->ChildMouseEvent(this, event, p, zdelta, keyflags);
sPropagated = pb; sPropagated = pb;
return m; return m;
@ -111,7 +111,7 @@ Image Ctrl::MouseEventH(int event, Point p, int zdelta, dword keyflags)
if(this_) if(this_)
LogMouseEvent(NULL, this, event, p, zdelta, keyflags); LogMouseEvent(NULL, this, event, p, zdelta, keyflags);
Ctrl *parent = this_ ? this_->GetParent() : NULL; 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); parent->ChildMouseEvent(this, event, p, zdelta, keyflags);
return MouseEvent0(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) void Ctrl::ChildFrameMouseEvent(Ctrl *child, int event, Point p, int zdelta, dword keyflags)
{ {
GuiLock __; GuiLock __;
@ -224,6 +237,9 @@ Image Ctrl::MouseEvent(int event, Point p, int zdelta, dword keyflags)
case MOUSEWHEEL: case MOUSEWHEEL:
MouseWheel(p, zdelta, keyflags); MouseWheel(p, zdelta, keyflags);
break; break;
case MOUSEHWHEEL:
MouseWheelHor(p, zdelta, keyflags);
break;
case CURSORIMAGE: case CURSORIMAGE:
return CursorImage(p, keyflags); return CursorImage(p, keyflags);
} }
@ -531,7 +547,7 @@ bool sDblTime(int time)
Image Ctrl::DispatchMouse(int e, Point p, int zd) { Image Ctrl::DispatchMouse(int e, Point p, int zd) {
GuiLock __; GuiLock __;
EventLevelDo ___; EventLevelDo ___;
if(e == MOUSEWHEEL && !zd) // ignore non-scroll wheel events if(((e == MOUSEWHEEL)||(e == MOUSEHWHEEL)) && !zd) // ignore non-scroll wheel events
return Null; return Null;
if(e == MOUSEMOVE && repeatTopCtrl == this) { if(e == MOUSEMOVE && repeatTopCtrl == this) {
if(sDistMin(leftmousepos, p) > GUI_DragDistance() && GetMouseLeft()) { if(sDistMin(leftmousepos, p) > GUI_DragDistance() && GetMouseLeft()) {
@ -621,7 +637,7 @@ Image Ctrl::DispatchMouseEvent(int e, Point p, int zd) {
if(!IsEnabled()) if(!IsEnabled())
return Image::Arrow(); return Image::Arrow();
Ctrl *top = this; Ctrl *top = this;
if(e == MOUSEWHEEL && !GetParent()) { if(((e == MOUSEWHEEL)||(e == MOUSEHWHEEL)) && !GetParent()) {
Ctrl *w = GetFocusCtrl(); Ctrl *w = GetFocusCtrl();
if(w) { if(w) {
top = w->GetTopCtrl(); top = w->GetTopCtrl();

View file

@ -168,13 +168,22 @@ gboolean Ctrl::GtkEvent(GtkWidget *widget, GdkEvent *event, gpointer user_data)
break; break;
case GDK_SCROLL: { case GDK_SCROLL: {
GdkEventScroll *e = (GdkEventScroll *)event; GdkEventScroll *e = (GdkEventScroll *)event;
if(findarg(e->direction, GDK_SCROLL_UP, GDK_SCROLL_LEFT) >= 0) switch(e->direction){
value = 120; case GDK_SCROLL_UP:
else value = Point(0, 120);
if(findarg(e->direction, GDK_SCROLL_DOWN, GDK_SCROLL_RIGHT) >= 0) break;
value = -120; case GDK_SCROLL_DOWN:
else 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; return false;
}
break; break;
} }
case GDK_KEY_PRESS: case GDK_KEY_PRESS:
@ -571,7 +580,9 @@ void Ctrl::Proc()
GtkButtonEvent(UP); GtkButtonEvent(UP);
break; break;
case GDK_SCROLL: { 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; break;
} }
case GDK_KEY_PRESS: case GDK_KEY_PRESS:
@ -729,7 +740,7 @@ bool Ctrl::ProcessEvent0(bool *quit, bool fetch)
b.count += a.count; b.count += a.count;
else else
if(a.type == GDK_SCROLL) if(a.type == GDK_SCROLL)
b.value = (int)b.value + (int)a.value; b.value = (Point)b.value + (Point)a.value;
else else
if(a.type != GDK_CONFIGURE) if(a.type != GDK_CONFIGURE)
break; break;

View file

@ -340,6 +340,7 @@ LRESULT Ctrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
} }
return 0L; return 0L;
case 0x20a: // WM_MOUSEWHEEL: case 0x20a: // WM_MOUSEWHEEL:
case 0x20e: // WM_MOUSEHWHEEL:
if(ignoreclick) { if(ignoreclick) {
EndIgnore(); EndIgnore();
return 0L; return 0L;
@ -347,7 +348,7 @@ LRESULT Ctrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
if(_this) { if(_this) {
Point p(0, 0); Point p(0, 0);
::ClientToScreen(hwnd, p); ::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); CurrentMousePos = Point((dword)lParam);
} }
if(_this) PostInput(); if(_this) PostInput();