diff --git a/src/app/ui/editor/moving_pixels_state.cpp b/src/app/ui/editor/moving_pixels_state.cpp index 6d9bde103..0a02435ab 100644 --- a/src/app/ui/editor/moving_pixels_state.cpp +++ b/src/app/ui/editor/moving_pixels_state.cpp @@ -268,14 +268,6 @@ bool MovingPixelsState::onMouseMove(Editor* editor, MouseMessage* msg) return StandbyState::onMouseMove(editor, msg); } -bool MovingPixelsState::onMouseWheel(Editor* editor, MouseMessage* msg) -{ - ASSERT(m_pixelsMovement != NULL); - - // Use StandbyState implementation - return StandbyState::onMouseWheel(editor, msg); -} - bool MovingPixelsState::onSetCursor(Editor* editor) { ASSERT(m_pixelsMovement != NULL); diff --git a/src/app/ui/editor/moving_pixels_state.h b/src/app/ui/editor/moving_pixels_state.h index 4174e6220..a57a61ef1 100644 --- a/src/app/ui/editor/moving_pixels_state.h +++ b/src/app/ui/editor/moving_pixels_state.h @@ -50,7 +50,6 @@ namespace app { virtual bool onMouseDown(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onMouseUp(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onMouseMove(Editor* editor, ui::MouseMessage* msg) OVERRIDE; - virtual bool onMouseWheel(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onSetCursor(Editor* editor) OVERRIDE; virtual bool onKeyDown(Editor* editor, ui::KeyMessage* msg) OVERRIDE; virtual bool onKeyUp(Editor* editor, ui::KeyMessage* msg) OVERRIDE; diff --git a/src/app/ui/editor/scrolling_state.cpp b/src/app/ui/editor/scrolling_state.cpp index f33fc6b5e..b7c16deba 100644 --- a/src/app/ui/editor/scrolling_state.cpp +++ b/src/app/ui/editor/scrolling_state.cpp @@ -74,11 +74,6 @@ bool ScrollingState::onMouseMove(Editor* editor, MouseMessage* msg) return true; } -bool ScrollingState::onMouseWheel(Editor* editor, MouseMessage* msg) -{ - return false; -} - bool ScrollingState::onSetCursor(Editor* editor) { editor->hideDrawingCursor(); diff --git a/src/app/ui/editor/scrolling_state.h b/src/app/ui/editor/scrolling_state.h index 029918a30..f92f6a041 100644 --- a/src/app/ui/editor/scrolling_state.h +++ b/src/app/ui/editor/scrolling_state.h @@ -34,7 +34,6 @@ namespace app { virtual bool onMouseDown(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onMouseUp(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onMouseMove(Editor* editor, ui::MouseMessage* msg) OVERRIDE; - virtual bool onMouseWheel(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onSetCursor(Editor* editor) OVERRIDE; virtual bool onKeyDown(Editor* editor, ui::KeyMessage* msg) OVERRIDE; virtual bool onKeyUp(Editor* editor, ui::KeyMessage* msg) OVERRIDE; diff --git a/src/app/ui/editor/standby_state.cpp b/src/app/ui/editor/standby_state.cpp index 97e1155df..be95c32e9 100644 --- a/src/app/ui/editor/standby_state.cpp +++ b/src/app/ui/editor/standby_state.cpp @@ -281,13 +281,16 @@ bool StandbyState::onMouseMove(Editor* editor, MouseMessage* msg) bool StandbyState::onMouseWheel(Editor* editor, MouseMessage* msg) { - int dz = -msg->wheelDelta(); + int dz = msg->wheelDelta().x + msg->wheelDelta().y; WHEEL_ACTION wheelAction = WHEEL_NONE; bool scrollBigSteps = false; // Without modifiers if (msg->keyModifiers() == kKeyNoneModifier) { - wheelAction = WHEEL_ZOOM; + if (msg->wheelDelta().x != 0) + wheelAction = WHEEL_HSCROLL; + else + wheelAction = WHEEL_ZOOM; } else { #if 1 // TODO make it configurable @@ -318,7 +321,6 @@ bool StandbyState::onMouseWheel(Editor* editor, MouseMessage* msg) break; case WHEEL_FG: - // if (m_state == EDITOR_STATE_STANDBY) { int newIndex = 0; if (ColorBar::instance()->getFgColor().getType() == app::Color::IndexType) { @@ -330,7 +332,6 @@ bool StandbyState::onMouseWheel(Editor* editor, MouseMessage* msg) break; case WHEEL_BG: - // if (m_state == EDITOR_STATE_STANDBY) { int newIndex = 0; if (ColorBar::instance()->getBgColor().getType() == app::Color::IndexType) { @@ -342,7 +343,6 @@ bool StandbyState::onMouseWheel(Editor* editor, MouseMessage* msg) break; case WHEEL_FRAME: - // if (m_state == EDITOR_STATE_STANDBY) { Command* command = CommandsModule::instance()->getCommandByName ((dz < 0) ? CommandId::GotoNextFrame: diff --git a/src/app/ui/editor/zooming_state.cpp b/src/app/ui/editor/zooming_state.cpp index 74c0d0e54..07e075ed5 100644 --- a/src/app/ui/editor/zooming_state.cpp +++ b/src/app/ui/editor/zooming_state.cpp @@ -73,11 +73,6 @@ bool ZoomingState::onMouseMove(Editor* editor, MouseMessage* msg) return true; } -bool ZoomingState::onMouseWheel(Editor* editor, MouseMessage* msg) -{ - return false; -} - bool ZoomingState::onSetCursor(Editor* editor) { editor->hideDrawingCursor(); diff --git a/src/app/ui/editor/zooming_state.h b/src/app/ui/editor/zooming_state.h index 7e49b7142..cb4d973f8 100644 --- a/src/app/ui/editor/zooming_state.h +++ b/src/app/ui/editor/zooming_state.h @@ -34,7 +34,6 @@ namespace app { virtual bool onMouseDown(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onMouseUp(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onMouseMove(Editor* editor, ui::MouseMessage* msg) OVERRIDE; - virtual bool onMouseWheel(Editor* editor, ui::MouseMessage* msg) OVERRIDE; virtual bool onSetCursor(Editor* editor) OVERRIDE; virtual bool onKeyDown(Editor* editor, ui::KeyMessage* msg) OVERRIDE; virtual bool onKeyUp(Editor* editor, ui::KeyMessage* msg) OVERRIDE; diff --git a/src/app/ui/file_list.cpp b/src/app/ui/file_list.cpp index 2aee4357d..a25dc946a 100644 --- a/src/app/ui/file_list.cpp +++ b/src/app/ui/file_list.cpp @@ -274,7 +274,7 @@ bool FileList::onProcessMessage(Message* msg) View* view = View::getView(this); if (view) { gfx::Point scroll = view->getViewScroll(); - scroll.y += -static_cast(msg)->wheelDelta() * 3*(2+getTextHeight()+2); + scroll += static_cast(msg)->wheelDelta() * 3*(2+getTextHeight()+2); view->setViewScroll(scroll); } break; diff --git a/src/app/ui/palette_view.cpp b/src/app/ui/palette_view.cpp index 534ab29f2..8cdb2fc12 100644 --- a/src/app/ui/palette_view.cpp +++ b/src/app/ui/palette_view.cpp @@ -255,7 +255,7 @@ bool PaletteView::onProcessMessage(Message* msg) View* view = View::getView(this); if (view) { gfx::Point scroll = view->getViewScroll(); - scroll.y += -static_cast(msg)->wheelDelta() * 3 * m_boxsize; + scroll += static_cast(msg)->wheelDelta() * 3 * m_boxsize; view->setViewScroll(scroll); } break; diff --git a/src/app/ui/tabs.cpp b/src/app/ui/tabs.cpp index 299cb6846..9fb780dcc 100644 --- a/src/app/ui/tabs.cpp +++ b/src/app/ui/tabs.cpp @@ -286,14 +286,15 @@ bool Tabs::onProcessMessage(Message* msg) return true; case kMouseWheelMessage: { - int dx = -static_cast(msg)->wheelDelta() * getBounds().w/6; - // setScrollX(m_scrollX+dx); + int dz = + (static_cast(msg)->wheelDelta().x - + static_cast(msg)->wheelDelta().y) * getBounds().w/6; m_begScrollX = m_scrollX; if (m_ani != ANI_SMOOTH_SCROLL) - m_endScrollX = m_scrollX + dx; + m_endScrollX = m_scrollX + dz; else - m_endScrollX += dx; + m_endScrollX += dz; // Limit endScrollX position (to improve animation ending to the correct position) { diff --git a/src/app/ui/timeline.cpp b/src/app/ui/timeline.cpp index 82c956a1a..938a62e04 100644 --- a/src/app/ui/timeline.cpp +++ b/src/app/ui/timeline.cpp @@ -740,10 +740,12 @@ bool Timeline::onProcessMessage(Message* msg) case kMouseWheelMessage: if (m_document) { - int dz = -static_cast(msg)->wheelDelta(); + int dz = static_cast(msg)->wheelDelta().y; int dx = 0; int dy = 0; + dx += static_cast(msg)->wheelDelta().x; + if (msg->ctrlPressed()) dx = dz * FRMSIZE; else diff --git a/src/app/ui/toolbar.cpp b/src/app/ui/toolbar.cpp index e1b1aecd1..add4dbb3e 100644 --- a/src/app/ui/toolbar.cpp +++ b/src/app/ui/toolbar.cpp @@ -252,7 +252,7 @@ bool ToolBar::onProcessMessage(Message* msg) MouseMessage* mouseMsg2 = new MouseMessage( kMouseDownMessage, mouseMsg->buttons(), - mouseMsg->position(), 0); + mouseMsg->position()); mouseMsg2->addRecipient(strip); getManager()->enqueueMessage(mouseMsg2); } @@ -694,7 +694,7 @@ bool ToolBar::ToolStrip::onProcessMessage(Message* msg) MouseMessage* mouseMsg2 = new MouseMessage( kMouseDownMessage, mouseMsg->buttons(), - mouseMsg->position(), 0); + mouseMsg->position()); mouseMsg2->addRecipient(bar); getManager()->enqueueMessage(mouseMsg2); } diff --git a/src/she/event.h b/src/she/event.h index d7417cf70..07f355369 100644 --- a/src/she/event.h +++ b/src/she/event.h @@ -43,21 +43,21 @@ namespace she { int type() const { return m_type; } const Files& files() const { return m_files; } gfx::Point position() const { return m_position; } + gfx::Point wheelDelta() const { return m_wheelDelta; } MouseButton button() const { return m_button; } - int delta() const { return m_delta; } void setType(Type type) { m_type = type; } void setFiles(const Files& files) { m_files = files; } void setPosition(const gfx::Point& pos) { m_position = pos; } + void setWheelDelta(const gfx::Point& delta) { m_wheelDelta = delta; } void setButton(MouseButton button) { m_button = button; } - void setDelta(int delta) { m_delta = delta; } private: Type m_type; Files m_files; gfx::Point m_position; + gfx::Point m_wheelDelta; MouseButton m_button; - int m_delta; }; } // namespace she diff --git a/src/she/she_alleg4.cpp b/src/she/she_alleg4.cpp index 357ce8bea..92b55d2c6 100644 --- a/src/she/she_alleg4.cpp +++ b/src/she/she_alleg4.cpp @@ -28,6 +28,10 @@ #else typedef FARPROC wndproc_t; #endif + + #ifndef WM_MOUSEHWHEEL + #define WM_MOUSEHWHEEL 0x020E + #endif #endif #ifdef WIN32 @@ -297,7 +301,8 @@ static LRESULT CALLBACK wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpara break; } - case WM_MOUSEWHEEL: { + case WM_MOUSEWHEEL: + case WM_MOUSEHWHEEL: { RECT rc; ::GetWindowRect(hwnd, &rc); @@ -307,7 +312,66 @@ static LRESULT CALLBACK wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpara GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)) - gfx::Point(rc.left, rc.top)) / display_scale); - ev.setDelta(((short)HIWORD(wparam)) / WHEEL_DELTA); + + int z = ((short)HIWORD(wparam)) / WHEEL_DELTA; + gfx::Point delta( + (msg == WM_MOUSEHWHEEL ? z: 0), + (msg == WM_MOUSEWHEEL ? -z: 0)); + ev.setWheelDelta(delta); + + //PRINTF("WHEEL: %d %d\n", delta.x, delta.y); + + queue_event(ev); + break; + } + + case WM_HSCROLL: + case WM_VSCROLL: { + RECT rc; + ::GetWindowRect(hwnd, &rc); + + POINT pos; + ::GetCursorPos(&pos); + + Event ev; + ev.setType(Event::MouseWheel); + ev.setPosition((gfx::Point(pos.x, pos.y) - gfx::Point(rc.left, rc.top)) + / display_scale); + + int bar = (msg == WM_HSCROLL ? SB_HORZ: SB_VERT); + int z = GetScrollPos(hwnd, bar); + + switch (LOWORD(wparam)) { + case SB_LEFT: + case SB_LINELEFT: + --z; + break; + case SB_PAGELEFT: + z -= 2; + break; + case SB_RIGHT: + case SB_LINERIGHT: + ++z; + break; + case SB_PAGERIGHT: + z += 2; + break; + case SB_THUMBPOSITION: + case SB_THUMBTRACK: + case SB_ENDSCROLL: + // Do nothing + break; + } + + gfx::Point delta( + (msg == WM_HSCROLL ? (z-50): 0), + (msg == WM_VSCROLL ? (z-50): 0)); + ev.setWheelDelta(delta); + + //PRINTF("SCROLL: %d %d\n", delta.x, delta.y); + + SetScrollPos(hwnd, bar, 50, FALSE); + queue_event(ev); break; } @@ -318,9 +382,17 @@ static LRESULT CALLBACK wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpara void subclass_hwnd(HWND hwnd) { - // Add the WS_EX_ACCEPTFILES - SetWindowLong(hwnd, GWL_EXSTYLE, - GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_ACCEPTFILES); + SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_HSCROLL | WS_VSCROLL); + SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_ACCEPTFILES); + + SCROLLINFO si; + si.cbSize = sizeof(SCROLLINFO); + si.fMask = SIF_POS | SIF_RANGE; + si.nMin = 0; + si.nPos = 50; + si.nMax = 100; + SetScrollInfo(hwnd, SB_HORZ, &si, FALSE); + SetScrollInfo(hwnd, SB_VERT, &si, FALSE); base_wndproc = (wndproc_t)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)wndproc); } diff --git a/src/ui/combobox.cpp b/src/ui/combobox.cpp index 074fbd6ed..c01565ea5 100644 --- a/src/ui/combobox.cpp +++ b/src/ui/combobox.cpp @@ -436,7 +436,7 @@ bool ComboBoxEntry::onProcessMessage(Message* msg) releaseMouse(); MouseMessage mouseMsg2(kMouseDownMessage, - mouseMsg->buttons(), mouseMsg->position(), 0); + mouseMsg->buttons(), mouseMsg->position()); pick->sendMessage(&mouseMsg2); return true; } diff --git a/src/ui/int_entry.cpp b/src/ui/int_entry.cpp index 5572c3f4c..dfe5f25c9 100644 --- a/src/ui/int_entry.cpp +++ b/src/ui/int_entry.cpp @@ -84,7 +84,7 @@ bool IntEntry::onProcessMessage(Message* msg) MouseMessage mouseMsg2(kMouseDownMessage, mouseMsg->buttons(), - mouseMsg->position(), 0); + mouseMsg->position()); m_slider->sendMessage(&mouseMsg2); } } @@ -93,7 +93,9 @@ bool IntEntry::onProcessMessage(Message* msg) case kMouseWheelMessage: if (isEnabled()) { int oldValue = getValue(); - int newValue = oldValue + static_cast(msg)->wheelDelta(); + int newValue = oldValue + + static_cast(msg)->wheelDelta().x + - static_cast(msg)->wheelDelta().y; newValue = MID(m_min, newValue, m_max); if (newValue != oldValue) { setValue(newValue); diff --git a/src/ui/listbox.cpp b/src/ui/listbox.cpp index 54d7a1478..9c670aa08 100644 --- a/src/ui/listbox.cpp +++ b/src/ui/listbox.cpp @@ -186,7 +186,7 @@ bool ListBox::onProcessMessage(Message* msg) View* view = View::getView(this); if (view) { gfx::Point scroll = view->getViewScroll(); - scroll.y += -static_cast(msg)->wheelDelta() * getTextHeight()*3; + scroll += static_cast(msg)->wheelDelta() * getTextHeight()*3; view->setViewScroll(scroll); } break; diff --git a/src/ui/manager.cpp b/src/ui/manager.cpp index 1a862998b..d33cb07ce 100644 --- a/src/ui/manager.cpp +++ b/src/ui/manager.cpp @@ -290,7 +290,8 @@ void Manager::generateMouseMessages() // Mouse wheel if (jmouse_z(0) != jmouse_z(1)) - handleMouseWheel(mousePos, currentMouseButtons(0), jmouse_z(0) - jmouse_z(1)); + handleMouseWheel(mousePos, currentMouseButtons(0), + gfx::Point(0, jmouse_z(1) - jmouse_z(0))); // Mouse clicks if (jmouse_b(0) != jmouse_b(1)) { @@ -521,7 +522,7 @@ void Manager::generateMessagesFromSheEvents() if (!mouse_events_from_she) continue; - handleMouseWheel(sheEvent.position(), m_mouseButtons, sheEvent.delta()); + handleMouseWheel(sheEvent.position(), m_mouseButtons, sheEvent.wheelDelta()); break; } } @@ -588,11 +589,12 @@ void Manager::handleMouseDoubleClick(const gfx::Point& mousePos, MouseButtons mo } } -void Manager::handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons, int delta) +void Manager::handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons, const gfx::Point& wheelDelta) { - enqueueMessage(newMouseMessage(kMouseWheelMessage, + enqueueMessage(newMouseMessage( + kMouseWheelMessage, (capture_widget ? capture_widget: mouse_widget), - mousePos, mouseButtons, delta)); + mousePos, mouseButtons, wheelDelta)); } // Handles Z order: Send the window to top (only when you click in a @@ -1425,9 +1427,10 @@ Widget* Manager::findMagneticWidget(Widget* widget) // static Message* Manager::newMouseMessage(MessageType type, - Widget* widget, gfx::Point mousePos, MouseButtons buttons, int delta) + Widget* widget, const gfx::Point& mousePos, + MouseButtons buttons, const gfx::Point& wheelDelta) { - Message* msg = new MouseMessage(type, buttons, mousePos, delta); + Message* msg = new MouseMessage(type, buttons, mousePos, wheelDelta); if (widget != NULL) msg->addRecipient(widget); diff --git a/src/ui/manager.h b/src/ui/manager.h index c1f08a267..b130dc9ed 100644 --- a/src/ui/manager.h +++ b/src/ui/manager.h @@ -100,7 +100,7 @@ namespace ui { void handleMouseDown(const gfx::Point& mousePos, MouseButtons mouseButtons); void handleMouseUp(const gfx::Point& mousePos, MouseButtons mouseButtons); void handleMouseDoubleClick(const gfx::Point& mousePos, MouseButtons mouseButtons); - void handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons, int delta); + void handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons, const gfx::Point& wheelDelta); void handleWindowZOrder(); void pumpQueue(); @@ -108,7 +108,8 @@ namespace ui { static bool someParentIsFocusStop(Widget* widget); static Widget* findMagneticWidget(Widget* widget); static Message* newMouseMessage(MessageType type, - Widget* widget, gfx::Point mousePos, MouseButtons buttons, int delta = 0); + Widget* widget, const gfx::Point& mousePos, + MouseButtons buttons, const gfx::Point& wheelDelta = gfx::Point(0, 0)); static MouseButtons currentMouseButtons(int antique); void broadcastKeyMsg(Message* msg); diff --git a/src/ui/message.h b/src/ui/message.h index 36bd885ed..79e5be067 100644 --- a/src/ui/message.h +++ b/src/ui/message.h @@ -101,22 +101,27 @@ namespace ui { class MouseMessage : public Message { public: - MouseMessage(MessageType type, MouseButtons buttons, const gfx::Point& pos, int delta) - : Message(type), m_buttons(buttons), m_pos(pos), m_delta(delta) { + MouseMessage(MessageType type, MouseButtons buttons, + const gfx::Point& pos, + const gfx::Point& wheelDelta = gfx::Point(0, 0)) + : Message(type), + m_buttons(buttons), + m_pos(pos), + m_wheelDelta(wheelDelta) { } MouseButtons buttons() const { return m_buttons; } bool left() const { return (m_buttons & kButtonLeft) == kButtonLeft; } bool right() const { return (m_buttons & kButtonRight) == kButtonRight; } bool middle() const { return (m_buttons & kButtonMiddle) == kButtonMiddle; } - int wheelDelta() const { return m_delta; } + gfx::Point wheelDelta() const { return m_wheelDelta; } const gfx::Point& position() const { return m_pos; } private: MouseButtons m_buttons; // Pressed buttons gfx::Point m_pos; // Mouse position - int m_delta; // Wheel axis variation + gfx::Point m_wheelDelta; // Wheel axis variation }; class TimerMessage : public Message diff --git a/src/ui/slider.cpp b/src/ui/slider.cpp index 02f61716e..2f75c1cd5 100644 --- a/src/ui/slider.cpp +++ b/src/ui/slider.cpp @@ -191,7 +191,9 @@ bool Slider::onProcessMessage(Message* msg) case kMouseWheelMessage: if (isEnabled()) { - int value = m_value + static_cast(msg)->wheelDelta(); + int value = m_value + + static_cast(msg)->wheelDelta().x + - static_cast(msg)->wheelDelta().y; value = MID(m_min, value, m_max); diff --git a/src/ui/textbox.cpp b/src/ui/textbox.cpp index bf1ad10c2..82af66cb8 100644 --- a/src/ui/textbox.cpp +++ b/src/ui/textbox.cpp @@ -134,7 +134,7 @@ bool TextBox::onProcessMessage(Message* msg) if (view) { gfx::Point scroll = view->getViewScroll(); - scroll.y += -static_cast(msg)->wheelDelta() * getTextHeight()*3; + scroll += static_cast(msg)->wheelDelta() * getTextHeight()*3; view->setViewScroll(scroll); }