Page Menu
Home
Search
Configure Global Search
Log In
Paste
P2080
GHOST/Trackpad: precise rotation/magnification factor and gesture phases
Archived
Public
Actions
Authored by
Yevgeny Makarov (jenkm)
on Apr 21 2021, 10:07 AM.
Edit Paste
Activate Paste
View Raw File
Subscribe
Mute Notifications
Award Token
Tags
None
Subscribers
None
diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -472,6 +472,12 @@ typedef struct {
GHOST_TInt32 deltaY;
/** The delta is inverted from the device due to system preferences. */
char isDirectionInverted;
+ /** The change in scale factor, or rotation in degrees. */
+ float factor;
+ /** The phase of the trackpad event. */
+ GHOST_TUns32 phase;
+ /** The momentum phase of the trackpad event. */
+ GHOST_TUns32 momentumPhase;
} GHOST_TEventTrackpadData;
typedef enum {
diff --git a/intern/ghost/intern/GHOST_EventTrackpad.h b/intern/ghost/intern/GHOST_EventTrackpad.h
--- a/intern/ghost/intern/GHOST_EventTrackpad.h
+++ b/intern/ghost/intern/GHOST_EventTrackpad.h
@@ -46,7 +46,10 @@ class GHOST_EventTrackpad : public GHOST_Event {
GHOST_TInt32 y,
GHOST_TInt32 deltaX,
GHOST_TInt32 deltaY,
- bool isDirectionInverted)
+ bool isDirectionInverted,
+ float factor,
+ GHOST_TUns32 phase,
+ GHOST_TUns32 momentumPhase)
: GHOST_Event(msec, GHOST_kEventTrackpad, window)
{
m_trackpadEventData.subtype = subtype;
@@ -55,6 +58,9 @@ class GHOST_EventTrackpad : public GHOST_Event {
m_trackpadEventData.deltaX = deltaX;
m_trackpadEventData.deltaY = deltaY;
m_trackpadEventData.isDirectionInverted = isDirectionInverted;
+ m_trackpadEventData.factor = factor;
+ m_trackpadEventData.phase = phase;
+ m_trackpadEventData.momentumPhase = momentumPhase;
m_data = &m_trackpadEventData;
}
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -1706,7 +1706,10 @@ - (void)windowWillClose:(NSNotification *)notification
y,
delta.x,
delta.y,
- [event isDirectionInvertedFromDevice]));
+ [event isDirectionInvertedFromDevice],
+ 0,
+ phase,
+ momentumPhase));
}
} break;
@@ -1719,17 +1722,29 @@ - (void)windowWillClose:(NSNotification *)notification
GHOST_kTrackpadEventMagnify,
x,
y,
- [event magnification] * 125.0 + 0.1,
0,
- false));
+ 0,
+ false,
+ [event magnification],
+ [event phase],
+ 0));
} break;
case NSEventTypeSmartMagnify: {
NSPoint mousePos = [event locationInWindow];
GHOST_TInt32 x, y;
window->clientToScreenIntern(mousePos.x, mousePos.y, x, y);
- pushEvent(new GHOST_EventTrackpad(
- [event timestamp] * 1000, window, GHOST_kTrackpadEventSmartMagnify, x, y, 0, 0, false));
+ pushEvent(new GHOST_EventTrackpad([event timestamp] * 1000,
+ window,
+ GHOST_kTrackpadEventSmartMagnify,
+ x,
+ y,
+ 0,
+ 0,
+ false,
+ 0,
+ 0,
+ 0));
} break;
case NSEventTypeRotate: {
@@ -1741,9 +1756,12 @@ - (void)windowWillClose:(NSNotification *)notification
GHOST_kTrackpadEventRotate,
x,
y,
- [event rotation] * -5.0,
0,
- false));
+ 0,
+ false,
+ [event rotation],
+ [event phase],
+ 0));
}
default:
return GHOST_kFailure;
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -636,6 +636,11 @@ typedef struct wmEvent {
* For absolute scroll direction, the delta must be negated again.
*/
char is_direction_inverted;
+ /** The change in scale factor, or rotation in degrees. */
+ float factor;
+ /** The scrolling event phase, e.g. began, changed, or ended. */
+ uint phase;
+ uint momentumPhase;
} wmEvent;
/**
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -4383,15 +4383,19 @@ static wmEvent *wm_event_add_mousemove(wmWindow *win, const wmEvent *event)
return event_new;
}
-static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int deltax, int deltay)
+static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int deltax, int deltay, float factor)
{
/* Ignore in between trackpad events for performance, we only need high accuracy
* for painting with mouse moves, for navigation using the accumulated value is ok. */
wmEvent *event_last = win->event_queue.last;
- if (event_last && event_last->type == event->type) {
+ if (event_last && event_last->type == event->type &&
+ event_last->phase == event->phase &&
+ event_last->momentumPhase == event->momentumPhase) {
deltax += event_last->x - event_last->prevx;
deltay += event_last->y - event_last->prevy;
+ factor += event_last->factor;
+
wm_event_free_last(win);
}
@@ -4400,6 +4404,8 @@ static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int d
event_new->prevx = event_new->x - deltax;
event_new->prevy = event_new->y - deltay;
+ event_new->factor = factor;
+
return event_new;
}
@@ -4499,14 +4505,14 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
switch (pd->subtype) {
case GHOST_kTrackpadEventMagnify:
event.type = MOUSEZOOM;
- pd->deltaX = -pd->deltaX;
- pd->deltaY = -pd->deltaY;
+ pd->deltaX = -(pd->factor * 125.0 + 0.1); /* deprecated */
break;
case GHOST_kTrackpadEventSmartMagnify:
event.type = MOUSESMARTZOOM;
break;
case GHOST_kTrackpadEventRotate:
event.type = MOUSEROTATE;
+ pd->deltaX = pd->factor * -5.0; /* deprecated */
break;
case GHOST_kTrackpadEventScroll:
default:
@@ -4521,7 +4527,11 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void
/* The direction is inverted from the device due to system preferences. */
event.is_direction_inverted = pd->isDirectionInverted;
- wm_event_add_trackpad(win, &event, pd->deltaX, -pd->deltaY);
+ /** The scrolling event phase, e.g. began, changed, or ended. */
+ event.phase = pd->phase;
+ event.momentumPhase = pd->momentumPhase;
+
+ wm_event_add_trackpad(win, &event, pd->deltaX, -pd->deltaY, pd->factor);
break;
}
/* Mouse button. */
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -501,6 +501,21 @@ enum {
GESTURE_MODAL_FLIP = 14,
};
+/* Gesture phases, matches the NSEventPhase. */
+enum {
+ GESTURE_PHASE_NONE = 0,
+ GESTURE_PHASE_BEGAN = (1 << 0),
+ GESTURE_PHASE_STATIONARY = (1 << 1),
+ GESTURE_PHASE_CHANGED = (1 << 2),
+ GESTURE_PHASE_ENDED = (1 << 3),
+ GESTURE_PHASE_CANCELLED = (1 << 4),
+ GESTURE_PHASE_MAYBEGIN = (1 << 5),
+};
+
+/* Test whether the event is a trackpad event with gesture phase. */
+#define ISMOUSE_GESTURE_WITH_PHASE(event) (ISMOUSE_GESTURE((event)->type) && \
+ (((event)->phase != GESTURE_PHASE_NONE) || ((event)->momentumPhase != GESTURE_PHASE_NONE)))
+
#ifdef __cplusplus
}
#endif
Event Timeline
Yevgeny Makarov (jenkm)
created this paste.
Apr 21 2021, 10:07 AM
Yevgeny Makarov (jenkm)
mentioned this in
D9552: Trackpad: Text Editor scrolling improvement
.
Apr 21 2021, 10:52 AM
Yevgeny Makarov (jenkm)
mentioned this in
D8760: Trackpad: Fix 3D view navigation with Auto Depth enabled
.
Apr 21 2021, 10:56 AM
Yevgeny Makarov (jenkm)
mentioned this in
T82006: Trackpad Support Improvement (Parent Task)
.
Apr 21 2021, 11:06 AM
Yevgeny Makarov (jenkm)
archived this paste.
Oct 15 2021, 7:27 PM
Log In to Comment