mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 17:33:05 +00:00
feat: 修复双击企业微信图标状态异常问题
1. 修复双击企业微信图标状态异常问题 2. 优化xem协议插件触摸下右键菜单显示效果 Log: 修复双击企业微信图标状态异常问题 Influence: 任务栏-企业微信-鼠标双击,图标状态异常 Task: https://pms.uniontech.com/zentao/task-view-90481.html Change-Id: I3c9a77dfeb5c984214f70d5ad95d73cd2c6645c4
This commit is contained in:
parent
ae831c6560
commit
1f280805a9
@ -384,8 +384,6 @@ void AbstractContainer::onWrapperDragStop()
|
||||
|
||||
if (m_currentDraggingWrapper == wrapper) {
|
||||
m_currentDraggingWrapper = nullptr;
|
||||
} else {
|
||||
Q_UNREACHABLE();
|
||||
}
|
||||
|
||||
saveCurrentOrderToConfig();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user