fix: filter synthesized click after wheel/gesture to prevent trackpad flicker - #180
fix: filter synthesized click after wheel/gesture to prevent trackpad flicker#180Resurgamz wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Sorry @Resurgamz, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: Resurgamz The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Reviewer's guide (collapsed on small PRs)Reviewer's GuideDebounces and filters synthesized mouse clicks generated shortly after wheel or pinch gestures in LibImageGraphicsView by tracking the last wheel/gesture timestamp and applying it symmetrically to mouse press/release handling, preventing unintended view mode toggles on trackpad zoom. Sequence diagram for debounced synthesized click after wheel/pinch gesturessequenceDiagram
actor User
participant QtEventSystem
participant LibImageGraphicsView
User->>QtEventSystem: trackpad pinch / wheel
QtEventSystem->>LibImageGraphicsView: wheelEvent(event)
LibImageGraphicsView->>LibImageGraphicsView: m_lastWheelOrGestureTime = currentMSecsSinceEpoch()
User->>QtEventSystem: end gesture
QtEventSystem->>LibImageGraphicsView: pinchTriggered(gesture)
LibImageGraphicsView->>LibImageGraphicsView: m_lastWheelOrGestureTime = currentMSecsSinceEpoch() (GestureFinished)
QtEventSystem->>LibImageGraphicsView: mousePressEvent(e)
alt synthesized mouse event within 300ms
LibImageGraphicsView->>LibImageGraphicsView: [e->source() == MouseEventSynthesizedByQt && now - m_lastWheelOrGestureTime < 300]
LibImageGraphicsView-->>QtEventSystem: e->accept(), return
else real or delayed click
LibImageGraphicsView->>LibImageGraphicsView: normal press handling
end
QtEventSystem->>LibImageGraphicsView: mouseReleaseEvent(e)
alt click within 200ms and small movement and not near gesture
LibImageGraphicsView->>LibImageGraphicsView: [now - m_clickTime < 200 && abs(xpos) < 50 && now - m_lastWheelOrGestureTime >= 300]
LibImageGraphicsView->>QtEventSystem: emit sigClicked()
else ignore as gesture artifact
LibImageGraphicsView->>LibImageGraphicsView: no sigClicked()
end
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
… flicker 1. 新增成员 m_lastWheelOrGestureTime 记录最近一次滚轮/缩放手势时间戳; 2. 在 wheelEvent 和 pinchTriggered GestureFinished 中记录时间戳; 3. mousePressEvent 中过滤手势结束后 300ms 内的合成点击,避免误触发查看模式切换; 4. mouseReleaseEvent 合成分支的 sigClicked 发射增加同样的时间窗判断; ===================================== 1. added member m_lastWheelOrGestureTime to record last wheel/gesture timestamp; 2. recorded timestamp in wheelEvent and pinchTriggered GestureFinished; 3. filtered synthesized click within 300ms after gesture in mousePressEvent to avoid spurious view mode toggle; 4. added same time window check for sigClicked emission in mouseReleaseEvent synthesized branch; Log: 修复触摸板双指缩放后手指离开合成点击导致图片闪烁还原默认大小的问题,过滤手势结束后的合成点击 PMS: BUG-279597 Bug: https://pms.uniontech.com/bug-view-279597.html
a2b4deb to
096ca0b
Compare
deepin pr auto review★ 总体评分:95分■ 【总体评价】
■ 【详细分析】
■ 【改进建议代码示例】 // imagegraphicsview.h
private:
// 单击判定阈值(毫秒)
static constexpr qint64 CLICK_THRESHOLD_MS = 200;
// 移动距离判定阈值(像素)
static constexpr int MOVE_THRESHOLD_PX = 50;
// 手势合成点击过滤阈值(毫秒)
static constexpr qint64 GESTURE_FILTER_THRESHOLD_MS = 300;
qint64 m_clickTime{0};
//最近一次滚轮/缩放手势的时间戳,用于过滤手势结束后合成的点击
qint64 m_lastWheelOrGestureTime{0};// imagegraphicsview.cpp
void LibImageGraphicsView::mouseReleaseEvent(QMouseEvent *e)
{
// ... 前置逻辑 ...
const qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
if ((currentTime - m_clickTime) < CLICK_THRESHOLD_MS && abs(xpos) < MOVE_THRESHOLD_PX &&
(currentTime - m_lastWheelOrGestureTime) >= GESTURE_FILTER_THRESHOLD_MS) {
m_clickTime = currentTime;
emit sigClicked();
}
// ...
}
void LibImageGraphicsView::mousePressEvent(QMouseEvent *e)
{
const qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
// 过滤触摸板/触摸屏缩放手势结束后短时间内的合成点击,避免误触发查看模式切换
if (e->source() == Qt::MouseEventSynthesizedByQt &&
(currentTime - m_lastWheelOrGestureTime) < GESTURE_FILTER_THRESHOLD_MS) {
e->accept();
return;
}
// ...
} |
根因分析
PMS #279597 看图触摸板双指缩放闪烁:
LibImageGraphicsView::mousePressEvent(imagegraphicsview.cpp:1063)对任意按下无条件emit clicked()(L1074),不区分MouseEventSynthesizedByQt合成事件、不对滚轮/手势去抖。触摸板双指缩放后手指离开,因event()(L1157-1208)处理TouchBegin/Update/End后未return true/未accept,Qt 默认将残余触摸合成为鼠标 press,命中mousePressEvent无条件emit clicked(),触发viewpanel.cpp:451-454的 overlay(扩展面板/信息面板)反复显隐 → 图片闪烁。同文件mouseReleaseEvent:1029/1049既有 source 过滤 + 200ms 去抖,press 侧缺失,两者不对称。开发者自留注释viewpanel.cpp:277「二指放大会触发信号,导致窗口隐藏,这里下面存在问题」直接印证。关键证据:
mousePressEvent:1074无条件emit clicked()(与mouseReleaseEvent:1029/1049的 source 过滤 + 200ms 去抖 + 位移阈值不对称)event():1207未接纳触摸事件致 Qt 合成鼠标事件修复方案
press/release 两侧对"滚轮/缩放手势结束后 300ms 内的合成点击"去抖过滤,与既有
mouseReleaseEvent过滤模式同构:m_lastWheelOrGestureTime,在wheelEvent/pinchTriggered GestureFinished中记录时间戳mousePressEvent中若e->source() == Qt::MouseEventSynthesizedByQt且 300ms 内 →e->accept(); return;,过滤合成点击mouseReleaseEvent合成分支的sigClicked()发射增加同样的时间窗判断(防御纵深)仅过滤"滚轮/缩放手势结束后短时间窗内的合成点击",真实鼠标点击(source 非 synthesized)、真实单指触摸翻页(位移>200 且非紧随手势)不受影响。
改动安全评估
低风险:局部 early-return + 时间戳记录,无函数签名变更、无公开 API 变更。仅影响合成事件路径。blame 确认
emit clicked()来自 first commit(非历史 bug 修复),无回归风险。附带改动
同步将两个修改文件的
SPDX-FileCopyrightText年份范围结束年份更新为 2026(2020 - 2023/2022→2020 - 2026),以满足仓库Check-SPDX-CopyrightCI 校验(文件在 2026 年被修改,年份范围需反映最新修改时间)。仅版权头注释,不涉及任何代码逻辑。