summaryrefslogtreecommitdiff
path: root/src/ui/touch.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-06-14 15:36:48 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-06-14 15:36:48 +0300
commitfe238b29132b43f07aa88cf6bb60bec1ff0d3f8d (patch)
tree34d08228270960a73f5586ae907a12d7adb7b393 /src/ui/touch.c
parent203426a88b2d94ed56f7d3f8f8eb18a7457cab11 (diff)
Swiping and sidebar; various tweaks
When a page is opened from the sidebar, swiping back will now reopen the sidebar. Another swipe will dismiss the sidebar and navigate back as usual. Attempted to cache theme colors in GmDocument, but there were issues with theme changes.
Diffstat (limited to 'src/ui/touch.c')
-rw-r--r--src/ui/touch.c49
1 files changed, 14 insertions, 35 deletions
diff --git a/src/ui/touch.c b/src/ui/touch.c
index 36bac267..dac1152e 100644
--- a/src/ui/touch.c
+++ b/src/ui/touch.c
@@ -65,6 +65,7 @@ struct Impl_Touch {
65 iBool isLeftDown; 65 iBool isLeftDown;
66 iBool isTouchDrag; 66 iBool isTouchDrag;
67 iBool isTapAndHold; 67 iBool isTapAndHold;
68 iBool didPostEdgeMove;
68 iBool didBeginOnTouchDrag; 69 iBool didBeginOnTouchDrag;
69 int pinchId; 70 int pinchId;
70 enum iTouchEdge edge; 71 enum iTouchEdge edge;
@@ -391,6 +392,12 @@ static void checkNewPinch_TouchState_(iTouchState *d, iTouch *newTouch) {
391 pinch.touchIds[1] = other->id; 392 pinch.touchIds[1] = other->id;
392 newTouch->pinchId = other->pinchId = pinch.id; 393 newTouch->pinchId = other->pinchId = pinch.id;
393 clearWidgetMomentum_TouchState_(d, affinity); 394 clearWidgetMomentum_TouchState_(d, affinity);
395 if (other->edge && other->didPostEdgeMove) {
396 postCommandf_App("edgeswipe.ended abort:1 side:%d id:%llu", other->edge, other->id);
397 other->didPostEdgeMove = iFalse;
398 }
399 other->edge = none_TouchEdge;
400 newTouch->edge = none_TouchEdge;
394 /* Remember current positions to determine pinch amount. */ 401 /* Remember current positions to determine pinch amount. */
395 newTouch->startPos = newTouch->pos[0]; 402 newTouch->startPos = newTouch->pos[0];
396 other->startPos = other->pos[0]; 403 other->startPos = other->pos[0];
@@ -476,7 +483,6 @@ iBool processEvent_Touch(const SDL_Event *ev) {
476 } 483 }
477 else if (x > rootSize.x - edgeWidth) { 484 else if (x > rootSize.x - edgeWidth) {
478 edge = right_TouchEdge; 485 edge = right_TouchEdge;
479// puts("DOWN on right edge");
480 } 486 }
481 iWidget *aff = hitChild_Window(window, init_I2(iRound(x), iRound(y_F3(pos)))); 487 iWidget *aff = hitChild_Window(window, init_I2(iRound(x), iRound(y_F3(pos))));
482#if 0 488#if 0
@@ -523,6 +529,7 @@ iBool processEvent_Touch(const SDL_Event *ev) {
523 (int) (x_F3(pos) - x_F3(touch->startPos)), 529 (int) (x_F3(pos) - x_F3(touch->startPos)),
524 touch->edge, 530 touch->edge,
525 touch->id); 531 touch->id);
532 touch->didPostEdgeMove = iTrue;
526 return iTrue; 533 return iTrue;
527 } 534 }
528 if (touch && touch->affinity) { 535 if (touch && touch->affinity) {
@@ -595,39 +602,6 @@ iBool processEvent_Touch(const SDL_Event *ev) {
595 } 602 }
596 } 603 }
597 iAssert(touch->edge == none_TouchEdge); 604 iAssert(touch->edge == none_TouchEdge);
598#if 0
599 /* Edge swipe aborted? */
600 if (touch->edge == left_TouchEdge) {
601 if (fing->dx < 0 && x_F3(touch->pos[0]) < tapRadiusPt_ * window->pixelRatio) {
602 touch->edge = none_TouchEdge;
603 if (touch->edgeDragging) {
604 setFlags_Widget(touch->edgeDragging, dragged_WidgetFlag, iFalse);
605 setVisualOffset_Widget(touch->edgeDragging, 0, 200, easeOut_AnimFlag);
606 touch->edgeDragging = NULL;
607 }
608 }
609 else if (touch->edgeDragging) {
610 setVisualOffset_Widget(touch->edgeDragging, x_F3(pos) - x_F3(touch->startPos), 10, 0);
611 }
612 }
613 if (touch->edge == right_TouchEdge) {
614 if (fing->dx > 0 && x_F3(touch->pos[0]) > window->size.x - tapRadiusPt_ * window->pixelRatio) {
615 puts("touch->edge==right returned to right edge, aborted");
616 touch->edge = none_TouchEdge;
617 if (touch->edgeDragging) {
618 setFlags_Widget(touch->edgeDragging, dragged_WidgetFlag, iFalse);
619 setVisualOffset_Widget(touch->edgeDragging, 0, 200, easeOut_AnimFlag);
620 touch->edgeDragging = NULL;
621 }
622 }
623 else if (touch->edgeDragging) {
624 setVisualOffset_Widget(touch->edgeDragging, x_F3(pos) - x_F3(touch->startPos), 10, 0);
625 }
626 }
627 if (touch->edge) {
628 pixels.y = 0;
629 }
630#endif
631 if (touch->axis == x_TouchAxis) { 605 if (touch->axis == x_TouchAxis) {
632 pixels.y = 0; 606 pixels.y = 0;
633 } 607 }
@@ -671,7 +645,12 @@ iBool processEvent_Touch(const SDL_Event *ev) {
671 } 645 }
672#endif 646#endif
673 if (touch->edge && !isStationary_Touch_(touch)) { 647 if (touch->edge && !isStationary_Touch_(touch)) {
674 postCommandf_App("edgeswipe.ended side:%d id:%llu", touch->edge, touch->id); 648 const iFloat3 gesture = gestureVector_Touch_(touch);
649 const float pixel = window->pixelRatio;
650 const int moveDir = x_F3(gesture) < -pixel ? -1 : x_F3(gesture) > pixel ? +1 : 0;
651 const int didAbort = (touch->edge == left_TouchEdge && moveDir < 0) ||
652 (touch->edge == right_TouchEdge && moveDir > 0);
653 postCommandf_App("edgeswipe.ended abort:%d side:%d id:%llu", didAbort, touch->edge, touch->id);
675 remove_ArrayIterator(&i); 654 remove_ArrayIterator(&i);
676 continue; 655 continue;
677 } 656 }