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,
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);

View file

@ -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();

View file

@ -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;

View file

@ -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();