Index: intern/ghost/GHOST_Types.h =================================================================== --- intern/ghost/GHOST_Types.h (revision 24467) +++ intern/ghost/GHOST_Types.h (working copy) @@ -373,2 +373,4 @@ GHOST_TInt32 z; + /** Horizontal scroll wheel. */ + GHOST_TInt32 w; } GHOST_TEventWheelData; Index: intern/ghost/intern/GHOST_EventWheel.h =================================================================== --- intern/ghost/intern/GHOST_EventWheel.h (revision 24467) +++ intern/ghost/intern/GHOST_EventWheel.h (working copy) @@ -51,7 +51,9 @@ * @param type The type of this event. - * @param z The displacement of the mouse wheel. + * @param w The horizontal displacement of the mouse wheel. + * @param z The vertical displacement of the mouse wheel. */ - GHOST_EventWheel(GHOST_TUns64 msec, GHOST_IWindow* window, GHOST_TInt32 z) + GHOST_EventWheel(GHOST_TUns64 msec, GHOST_IWindow* window, GHOST_TInt32 w, GHOST_TInt32 z) : GHOST_Event(msec, GHOST_kEventWheel, window) { + m_wheelEventData.w = w; m_wheelEventData.z = z; Index: intern/ghost/intern/GHOST_SystemCarbon.cpp =================================================================== --- intern/ghost/intern/GHOST_SystemCarbon.cpp (revision 24467) +++ intern/ghost/intern/GHOST_SystemCarbon.cpp (working copy) @@ -875,3 +875,3 @@ delta = delta > 0 ? 1 : -1; - pushEvent(new GHOST_EventWheel(getMilliSeconds(), window, delta)); + pushEvent(new GHOST_EventWheel(getMilliSeconds(), window, 0, delta)); err = noErr; Index: intern/ghost/intern/GHOST_SystemCocoa.mm =================================================================== --- intern/ghost/intern/GHOST_SystemCocoa.mm (revision 24467) +++ intern/ghost/intern/GHOST_SystemCocoa.mm (working copy) @@ -1205,7 +1205,14 @@ - double deltaF = [event deltaY]; - if (deltaF == 0.0) break; //discard trackpad delta=0 events + double deltaX = [event deltaX]; + double deltaY = [event deltaY]; - delta = deltaF > 0.0 ? 1 : -1; - pushEvent(new GHOST_EventWheel([event timestamp], window, delta)); + if (deltaX != 0.0) { + delta = deltaX > 0.0 ? 1 : -1; + pushEvent(new GHOST_EventWheel([event timestamp], window, delta, 0)); + } + + if (deltaY != 0.0) { + delta = deltaY > 0.0 ? 1 : -1; + pushEvent(new GHOST_EventWheel([event timestamp], window, 0, delta)); + } } Index: intern/ghost/intern/GHOST_SystemWin32.cpp =================================================================== --- intern/ghost/intern/GHOST_SystemWin32.cpp (revision 24467) +++ intern/ghost/intern/GHOST_SystemWin32.cpp (working copy) @@ -58,2 +58,5 @@ #endif // WM_MOUSEWHEEL +#ifndef WM_MOUSEHWHEEL +#define WM_MOUSEHWHEEL 0x020E +#endif // WM_MOUSEHWHEEL #ifndef WHEEL_DELTA @@ -509,3 +512,3 @@ -GHOST_EventWheel* GHOST_SystemWin32::processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam) +GHOST_EventWheel* GHOST_SystemWin32::processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam, UINT type) { @@ -520,3 +523,7 @@ // short yPos = (short) HIWORD(lParam); // vertical position of pointer - return new GHOST_EventWheel (getSystem()->getMilliSeconds(), window, zDelta); + if (type == WM_MOUSEHWHEEL) { + return new GHOST_EventWheel (getSystem()->getMilliSeconds(), window, zDelta, 0); + } else { + return new GHOST_EventWheel (getSystem()->getMilliSeconds(), window, 0, zDelta); + } } @@ -722,2 +729,3 @@ case WM_MOUSEWHEEL: + case WM_MOUSEHWHEEL: /* The WM_MOUSEWHEEL message is sent to the focus window @@ -729,3 +737,3 @@ */ - event = processWheelEvent(window, wParam, lParam); + event = processWheelEvent(window, wParam, lParam, msg); break; Index: intern/ghost/intern/GHOST_SystemWin32.h =================================================================== --- intern/ghost/intern/GHOST_SystemWin32.h (revision 24467) +++ intern/ghost/intern/GHOST_SystemWin32.h (working copy) @@ -238,3 +238,3 @@ */ - static GHOST_EventWheel* processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam); + static GHOST_EventWheel* processWheelEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam, UINT type); Index: intern/ghost/intern/GHOST_SystemX11.cpp =================================================================== --- intern/ghost/intern/GHOST_SystemX11.cpp (revision 24467) +++ intern/ghost/intern/GHOST_SystemX11.cpp (working copy) @@ -468,3 +468,3 @@ if (xe->xbutton.button == 4) { - g_event = new GHOST_EventWheel(getMilliSeconds(), window, 1); + g_event = new GHOST_EventWheel(getMilliSeconds(), window, 0, 1); break; @@ -472,5 +472,14 @@ if (xe->xbutton.button == 5) { - g_event = new GHOST_EventWheel(getMilliSeconds(), window, -1); + g_event = new GHOST_EventWheel(getMilliSeconds(), window, 0, -1); break; } + if (xe->xbutton.button == 4) { + g_event = new GHOST_EventWheel(getMilliSeconds(), window, 1, 0); + break; + } + if (xe->xbutton.button == 5) { + g_event = new GHOST_EventWheel(getMilliSeconds(), window, -1, 0); + break; + } + } Index: source/blender/windowmanager/intern/wm_event_system.c =================================================================== --- source/blender/windowmanager/intern/wm_event_system.c (revision 24467) +++ source/blender/windowmanager/intern/wm_event_system.c (working copy) @@ -1717,4 +1717,8 @@ event.type= WHEELUPMOUSE; - else + else if (wheelData->z < 0) event.type= WHEELDOWNMOUSE; + else if (wheelData->w < 0) + event.type= WHEELLEFTMOUSE; + else if (wheelData->w > 0) + event.type= WHEELRIGHTMOUSE; Index: source/blender/windowmanager/wm_event_types.h =================================================================== --- source/blender/windowmanager/wm_event_types.h (revision 24467) +++ source/blender/windowmanager/wm_event_types.h (working copy) @@ -64,2 +64,4 @@ #define WHEELDOWNMOUSE 0x00b +#define WHEELLEFTMOUSE 0x00e +#define WHEELRIGHTMOUSE 0x00f /* mapped with userdef */