feat: 修复双击企业微信图标状态异常问题

1. 修复双击企业微信图标状态异常问题
2. 优化xem协议插件触摸下右键菜单显示效果

Log: 修复双击企业微信图标状态异常问题
Influence: 任务栏-企业微信-鼠标双击,图标状态异常
Task: https://pms.uniontech.com/zentao/task-view-90481.html
Change-Id: I3c9a77dfeb5c984214f70d5ad95d73cd2c6645c4
This commit is contained in:
songwentao 2021-11-12 10:13:56 +08:00
parent ae831c6560
commit 1f280805a9
3 changed files with 45 additions and 14 deletions

View File

@ -384,8 +384,6 @@ void AbstractContainer::onWrapperDragStop()
if (m_currentDraggingWrapper == wrapper) {
m_currentDraggingWrapper = nullptr;
} else {
Q_UNREACHABLE();
}
saveCurrentOrderToConfig();

View File

@ -87,6 +87,11 @@ XEmbedTrayWidget::XEmbedTrayWidget(quint32 winId, xcb_connection_t *cnn, Display
, m_valid(true)
, m_xcbCnn(cnn)
, m_display(disp)
, m_gestureInter(new Gesture("com.deepin.daemon.Gesture"
, "/com/deepin/daemon/Gesture"
, QDBusConnection::systemBus()
, nullptr))
, m_longPress(false)
{
wrapWindow();
@ -103,6 +108,10 @@ XEmbedTrayWidget::XEmbedTrayWidget(quint32 winId, xcb_connection_t *cnn, Display
setMouseTracking(true);
connect(m_sendHoverEvent, &QTimer::timeout, this, &XEmbedTrayWidget::sendHoverEvent);
// 不能使用手势服务监听触摸按下事件来处理触摸屏下的拖动业务,因为会影响其他托盘插件右键菜单显示和隐藏的功能
connect(m_gestureInter, &Gesture::TouchSinglePressTimeout, this, &XEmbedTrayWidget::setTouchDown, Qt::UniqueConnection);
connect(m_gestureInter, &Gesture::TouchUpOrCancel, this, &XEmbedTrayWidget::setTouchEnd, Qt::UniqueConnection);
m_updateTimer->start();
}
@ -143,13 +152,12 @@ void XEmbedTrayWidget::paintEvent(QPaintEvent *e)
void XEmbedTrayWidget::mousePressEvent(QMouseEvent *e)
{
// 支持触摸屏触摸按下,显示右键菜单
AbstractTrayWidget::mousePressEvent(e);
if (e->source() == Qt::MouseEventSynthesizedByQt) {
QTimer::singleShot(100, this, [ & ] {
// 右键
sendClick(XCB_BUTTON_INDEX_3, QCursor::pos().x(), QCursor::pos().y());
});
return;
// 右键-出现
m_startPos = e->pos();
sendClick(XCB_BUTTON_INDEX_3, QCursor::pos().x(), QCursor::pos().y());
}
}
@ -157,17 +165,23 @@ void XEmbedTrayWidget::mouseMoveEvent(QMouseEvent *e)
{
AbstractTrayWidget::mouseMoveEvent(e);
// ignore the touchEvent
if (e->source() == Qt::MouseEventSynthesizedByQt) {
// 临时方案隐藏微信等应用的右键菜单
// 左键
sendClick(XCB_BUTTON_INDEX_2, QCursor::pos().x(), QCursor::pos().y());
return;
if (e->source() == Qt::MouseEventSynthesizedByQt && m_longPress) {
// 模拟拖动时隐藏右键菜单效果, 所以间距设置为5个像素值
if (qAbs(e->pos().x() - m_startPos.x()) > 5 || qAbs(e->pos().y() - m_startPos.y()) > 5) {
sendClick(XCB_BUTTON_INDEX_2, QCursor::pos().x(), QCursor::pos().y());
return;
}
}
m_sendHoverEvent->start();
}
void XEmbedTrayWidget::mouseReleaseEvent(QMouseEvent *e)
{
// 鼠标释放事件不往父类传递
QWidget::mouseReleaseEvent(e);
}
void XEmbedTrayWidget::configContainerPosition()
{
auto c = IS_WAYLAND_DISPLAY ? m_xcbCnn : QX11Info::connection();
@ -589,3 +603,13 @@ bool XEmbedTrayWidget::isBadWindow()
return result;
}
void XEmbedTrayWidget::setTouchDown()
{
m_longPress = true;
}
void XEmbedTrayWidget::setTouchEnd()
{
m_longPress = false;
}

View File

@ -23,6 +23,7 @@
#define XEMBEDTRAYWIDGET_H
#include "abstracttraywidget.h"
#include <com_deepin_daemon_gesture.h>
#include <QWidget>
#include <QTimer>
@ -30,6 +31,7 @@
#include <xcb/xcb.h>
typedef struct _XDisplay Display;
using Gesture = com::deepin::daemon::Gesture;
class XEmbedTrayWidget : public AbstractTrayWidget
{
@ -53,6 +55,7 @@ private:
void paintEvent(QPaintEvent *e) override;
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void configContainerPosition();
void wrapWindow();
@ -65,6 +68,8 @@ private slots:
void setX11PassMouseEvent(const bool pass);
void setWindowOnTop(const bool top);
bool isBadWindow();
void setTouchDown();
void setTouchEnd();
private:
bool m_active = false;
@ -78,6 +83,10 @@ private:
bool m_valid;
xcb_connection_t *m_xcbCnn;
Display* m_display;
Gesture *m_gestureInter;
QPoint m_startPos;
bool m_longPress;
};
#endif // XEMBEDTRAYWIDGET_H