[aseprite] 164/250: Add precise trackpad support on Skia/OSX port

Tobias Hansen thansen at moszumanska.debian.org
Sun Dec 20 15:27:25 UTC 2015


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit 2fe612fd006e2149801bbe85f16921ae03d0b017
Author: David Capello <davidcapello at gmail.com>
Date:   Wed Oct 14 09:27:20 2015 -0300

    Add precise trackpad support on Skia/OSX port
---
 src/app/ui/editor/state_with_wheel_behavior.cpp | 28 +++++++++++++++----------
 src/she/event.h                                 | 12 ++++++++++-
 src/she/osx/view.h                              |  1 +
 src/she/osx/view.mm                             | 25 +++++++++++++++++++++-
 src/ui/manager.cpp                              | 17 +++++++++------
 src/ui/manager.h                                |  9 +++++---
 src/ui/message.h                                | 12 +++++++----
 7 files changed, 78 insertions(+), 26 deletions(-)

diff --git a/src/app/ui/editor/state_with_wheel_behavior.cpp b/src/app/ui/editor/state_with_wheel_behavior.cpp
index c9966db..7fa682c 100644
--- a/src/app/ui/editor/state_with_wheel_behavior.cpp
+++ b/src/app/ui/editor/state_with_wheel_behavior.cpp
@@ -134,24 +134,30 @@ bool StateWithWheelBehavior::onMouseWheel(Editor* editor, MouseMessage* msg)
     case WHEEL_HSCROLL:
     case WHEEL_VSCROLL: {
       View* view = View::getView(editor);
-      gfx::Rect vp = view->getViewportBounds();
+      gfx::Point scroll = view->getViewScroll();
       gfx::Point delta(0, 0);
 
-      if (wheelAction == WHEEL_HSCROLL) {
-        delta.x = dz * vp.w;
+      if (msg->preciseWheel()) {
+        delta = msg->wheelDelta();
       }
       else {
-        delta.y = dz * vp.h;
-      }
+        gfx::Rect vp = view->getViewportBounds();
 
-      if (scrollBigSteps) {
-        delta /= 2;
-      }
-      else {
-        delta /= 10;
+        if (wheelAction == WHEEL_HSCROLL) {
+          delta.x = dz * vp.w;
+        }
+        else {
+          delta.y = dz * vp.h;
+        }
+
+        if (scrollBigSteps) {
+          delta /= 2;
+        }
+        else {
+          delta /= 10;
+        }
       }
 
-      gfx::Point scroll = view->getViewScroll();
       editor->setEditorScroll(scroll+delta, true);
       break;
     }
diff --git a/src/she/event.h b/src/she/event.h
index d58730e..79d7558 100644
--- a/src/she/event.h
+++ b/src/she/event.h
@@ -46,7 +46,14 @@ namespace she {
 
     typedef std::vector<std::string> Files;
 
-    Event() : m_type(None) { }
+    Event() : m_type(None),
+              m_display(nullptr),
+              m_scancode(kKeyNil),
+              m_unicodeChar(0),
+              m_repeat(0),
+              m_preciseWheel(false),
+              m_button(NoneButton) {
+    }
 
     Type type() const { return m_type; }
     Display* display() const { return m_display; }
@@ -56,6 +63,7 @@ namespace she {
     int repeat() const { return m_repeat; }
     gfx::Point position() const { return m_position; }
     gfx::Point wheelDelta() const { return m_wheelDelta; }
+    bool preciseWheel() const { return m_preciseWheel; }
     MouseButton button() const { return m_button; }
 
     void setType(Type type) { m_type = type; }
@@ -67,6 +75,7 @@ namespace she {
     void setRepeat(int repeat) { m_repeat = repeat; }
     void setPosition(const gfx::Point& pos) { m_position = pos; }
     void setWheelDelta(const gfx::Point& delta) { m_wheelDelta = delta; }
+    void setPreciseWheel(bool precise) { m_preciseWheel = precise; }
     void setButton(MouseButton button) { m_button = button; }
 
   private:
@@ -78,6 +87,7 @@ namespace she {
     int m_repeat; // repeat=0 means the first time the key is pressed
     gfx::Point m_position;
     gfx::Point m_wheelDelta;
+    bool m_preciseWheel;
     MouseButton m_button;
   };
 
diff --git a/src/she/osx/view.h b/src/she/osx/view.h
index 454c21b..d2952f2 100644
--- a/src/she/osx/view.h
+++ b/src/she/osx/view.h
@@ -38,6 +38,7 @@
 - (void)handleMouseDown:(NSEvent*)event;
 - (void)handleMouseUp:(NSEvent*)event;
 - (void)handleMouseDragged:(NSEvent*)event;
+- (void)scrollWheel:(NSEvent*)event;
 - (void)setFrameSize:(NSSize)newSize;
 - (void)createMouseTrackingArea;
 - (void)destroyMouseTrackingArea;
diff --git a/src/she/osx/view.mm b/src/she/osx/view.mm
index 8a0714a..2127c05 100644
--- a/src/she/osx/view.mm
+++ b/src/she/osx/view.mm
@@ -25,7 +25,6 @@ inline gfx::Point get_local_mouse_pos(NSView* view, NSEvent* event)
   NSPoint point = [view convertPoint:[event locationInWindow]
                             fromView:nil];
   int scale = 1;
-
   if ([view window])
     scale = [(OSXWindow*)[view window] scale];
 
@@ -286,6 +285,30 @@ inline Event::MouseButton get_mouse_buttons(NSEvent* event)
   }
 }
 
+- (void)scrollWheel:(NSEvent*)event
+{
+  Event ev;
+  ev.setType(Event::MouseWheel);
+  ev.setPosition(get_local_mouse_pos(self, event));
+  ev.setButton(get_mouse_buttons(event));
+
+  int scale = 1;
+  if (self.window)
+    scale = [(OSXWindow*)self.window scale];
+
+  if (event.hasPreciseScrollingDeltas) {
+    ev.setWheelDelta(gfx::Point(-event.scrollingDeltaX / scale,
+                                -event.scrollingDeltaY / scale));
+    ev.setPreciseWheel(true);
+  }
+  else {
+    ev.setWheelDelta(gfx::Point(-event.scrollingDeltaX,
+                                -event.scrollingDeltaY));
+  }
+
+  queue_event(ev);
+}
+
 - (void)createMouseTrackingArea
 {
   // Create a tracking area to receive mouseMoved events
diff --git a/src/ui/manager.cpp b/src/ui/manager.cpp
index c76a1c5..f4d2bd3 100644
--- a/src/ui/manager.cpp
+++ b/src/ui/manager.cpp
@@ -367,7 +367,8 @@ void Manager::generateMessagesFromSheEvents()
       }
 
       case she::Event::MouseWheel: {
-        handleMouseWheel(sheEvent.position(), m_mouseButtons, sheEvent.wheelDelta());
+        handleMouseWheel(sheEvent.position(), m_mouseButtons,
+                         sheEvent.wheelDelta(), sheEvent.preciseWheel());
         break;
       }
     }
@@ -434,12 +435,13 @@ void Manager::handleMouseDoubleClick(const gfx::Point& mousePos, MouseButtons mo
   }
 }
 
-void Manager::handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons, const gfx::Point& wheelDelta)
+void Manager::handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons,
+                               const gfx::Point& wheelDelta, bool preciseWheel)
 {
   enqueueMessage(newMouseMessage(
       kMouseWheelMessage,
       (capture_widget ? capture_widget: mouse_widget),
-      mousePos, mouseButtons, wheelDelta));
+      mousePos, mouseButtons, wheelDelta, preciseWheel));
 }
 
 // Handles Z order: Send the window to top (only when you click in a
@@ -1336,11 +1338,14 @@ Widget* Manager::findMagneticWidget(Widget* widget)
 }
 
 // static
-Message* Manager::newMouseMessage(MessageType type,
+Message* Manager::newMouseMessage(
+  MessageType type,
   Widget* widget, const gfx::Point& mousePos,
-  MouseButtons buttons, const gfx::Point& wheelDelta)
+  MouseButtons buttons,
+  const gfx::Point& wheelDelta, bool preciseWheel)
 {
-  Message* msg = new MouseMessage(type, buttons, mousePos, wheelDelta);
+  Message* msg = new MouseMessage(type, buttons, mousePos,
+                                  wheelDelta, preciseWheel);
 
   if (widget != NULL)
     msg->addRecipient(widget);
diff --git a/src/ui/manager.h b/src/ui/manager.h
index dfce609..8c7eb08 100644
--- a/src/ui/manager.h
+++ b/src/ui/manager.h
@@ -106,16 +106,19 @@ 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, const gfx::Point& wheelDelta);
+    void handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons,
+                          const gfx::Point& wheelDelta, bool preciseWheel);
     void handleWindowZOrder();
 
     void pumpQueue();
     static void removeWidgetFromRecipients(Widget* widget, Message* msg);
     static bool someParentIsFocusStop(Widget* widget);
     static Widget* findMagneticWidget(Widget* widget);
-    static Message* newMouseMessage(MessageType type,
+    static Message* newMouseMessage(
+      MessageType type,
       Widget* widget, const gfx::Point& mousePos,
-      MouseButtons buttons, const gfx::Point& wheelDelta = gfx::Point(0, 0));
+      MouseButtons buttons, const gfx::Point& wheelDelta = gfx::Point(0, 0),
+      bool preciseWheel = false);
     void broadcastKeyMsg(Message* msg);
 
     static Manager* m_defaultManager;
diff --git a/src/ui/message.h b/src/ui/message.h
index 46c3b32..df2dc29 100644
--- a/src/ui/message.h
+++ b/src/ui/message.h
@@ -1,5 +1,5 @@
 // Aseprite UI Library
-// Copyright (C) 2001-2013  David Capello
+// Copyright (C) 2001-2013, 2015  David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -99,12 +99,14 @@ namespace ui {
   {
   public:
     MouseMessage(MessageType type, MouseButtons buttons,
-      const gfx::Point& pos,
-      const gfx::Point& wheelDelta = gfx::Point(0, 0))
+                 const gfx::Point& pos,
+                 const gfx::Point& wheelDelta = gfx::Point(0, 0),
+                 bool preciseWheel = false)
       : Message(type),
         m_buttons(buttons),
         m_pos(pos),
-        m_wheelDelta(wheelDelta) {
+        m_wheelDelta(wheelDelta),
+        m_preciseWheel(preciseWheel) {
     }
 
     MouseButtons buttons() const { return m_buttons; }
@@ -112,6 +114,7 @@ namespace ui {
     bool right() const { return (m_buttons & kButtonRight) == kButtonRight; }
     bool middle() const { return (m_buttons & kButtonMiddle) == kButtonMiddle; }
     gfx::Point wheelDelta() const { return m_wheelDelta; }
+    bool preciseWheel() const { return m_preciseWheel; }
 
     const gfx::Point& position() const { return m_pos; }
 
@@ -119,6 +122,7 @@ namespace ui {
     MouseButtons m_buttons;     // Pressed buttons
     gfx::Point m_pos;           // Mouse position
     gfx::Point m_wheelDelta;    // Wheel axis variation
+    bool m_preciseWheel;
   };
 
   class TimerMessage : public Message

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list