mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 17:33:05 +00:00
feat: 修复任务栏崩溃问题
输入法切换为中文时,访问空指针导致崩溃 Log: 修复任务栏崩溃问题 Task: https://pms.uniontech.com/zentao/task-view-90342.html Influence: 任务栏插件-中文输入法插件,右键菜单出现后,鼠标或者手指操作过程中会出现崩溃情况 Change-Id: I3d753b093d239b22e4f89272021d9a795f6553d4
This commit is contained in:
parent
153482248e
commit
84b7b5e288
@ -71,9 +71,9 @@ private:
|
||||
void onTrayWidgetClicked();
|
||||
|
||||
private:
|
||||
// 动态加载的插件内存空间与dock进程内存空间相互独立,创建手势服务,监听触摸按下动作
|
||||
QPointer<AbstractTrayWidget> m_absTrayWidget;
|
||||
|
||||
// 动态加载的插件内存空间与dock进程内存空间相互独立,创建手势服务,监听触摸按下动作
|
||||
QPointer<TouchSignalManager> m_touchSignalManager;
|
||||
QVBoxLayout *m_layout;
|
||||
|
||||
|
@ -49,6 +49,7 @@ SNITrayWidget::SNITrayWidget(const QString &sniServicePath, QWidget *parent)
|
||||
, m_popupTipsDelayTimer(new QTimer(this))
|
||||
, m_handleMouseReleaseTimer(new QTimer(this))
|
||||
, m_tipsLabel(new TipsWidget(this))
|
||||
, m_menuState(false)
|
||||
{
|
||||
m_popupTipsDelayTimer->setInterval(500);
|
||||
m_popupTipsDelayTimer->setSingleShot(true);
|
||||
@ -338,12 +339,13 @@ void SNITrayWidget::showContextMenu(int x, int y)
|
||||
// 第三方的右键菜单,事件过滤方式无法捕获,修改x,y值不能改变菜单弹出位置
|
||||
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
|
||||
m_sniInter->ContextMenu(x, y);
|
||||
m_menuState = false;
|
||||
} else {
|
||||
m_menuState = true;
|
||||
if (!m_menu) {
|
||||
qDebug() << "context menu has not be ready, init menu";
|
||||
initMenu();
|
||||
}
|
||||
|
||||
if (m_menu)
|
||||
m_menu->popup(QPoint(x, y));
|
||||
}
|
||||
@ -735,55 +737,17 @@ bool SNITrayWidget::eventFilter(QObject *watched, QEvent *event)
|
||||
if (!m_menu)
|
||||
return QWidget::eventFilter(watched, event);
|
||||
|
||||
QPoint startPos = QPoint();
|
||||
if (!watched->objectName().startsWith("sniMenu")) {
|
||||
if (event->type() == QEvent::MouseButtonPress) {
|
||||
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
|
||||
if (mouseEvent->button() == Qt::LeftButton) {
|
||||
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
|
||||
// 关闭中文输入法或者五笔输入法,当前的关闭方式无效
|
||||
QMouseEvent *pressEvent = new QMouseEvent(QEvent::MouseButtonPress, mapToGlobal(this->pos()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
|
||||
qApp->postEvent(this->parentWidget(), pressEvent);
|
||||
} else {
|
||||
// 只处理qt右键菜单,外部菜单无法处理
|
||||
if (m_menuState)
|
||||
m_menu->hide();
|
||||
}
|
||||
}
|
||||
startPos = mouseEvent->pos();
|
||||
} else if (event->type() == QEvent::DragMove || event->type() == QEvent::Move) {
|
||||
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
|
||||
// 关闭中文输入法或者五笔输入法,当前的关闭方式无效
|
||||
QMouseEvent *pressEvent = new QMouseEvent(QEvent::MouseButtonPress, mapToGlobal(this->pos()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
|
||||
qApp->postEvent(this->parentWidget(), pressEvent);
|
||||
} else {
|
||||
} else if (event->type() == QEvent::DragMove) {
|
||||
if (m_menuState)
|
||||
m_menu->hide();
|
||||
}
|
||||
}
|
||||
|
||||
// 让click无效,避免点击到插件上
|
||||
if (event->type() == QEvent::MouseButtonRelease) {
|
||||
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
|
||||
if (mouseEvent->source() == Qt::MouseEventSynthesizedByQt) {
|
||||
if (isVisible())
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 处理当右键菜单显示时,esc按下,关闭右键菜单,保持和模态框一样的效果
|
||||
if (event->type() == QEvent::KeyPress) {
|
||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
||||
if (keyEvent->key() == Qt::Key_Escape) {
|
||||
if (!isVisible())
|
||||
return false;
|
||||
|
||||
if (m_sniMenuPath.path().startsWith("/NO_DBUSMENU")) {
|
||||
// 关闭中文输入法或者五笔输入法,当前的关闭方式无效
|
||||
QMouseEvent *pressEvent = new QMouseEvent(QEvent::MouseButtonPress, mapToGlobal(this->pos()), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
|
||||
qApp->postEvent(this->parentWidget(), pressEvent);
|
||||
} else {
|
||||
m_menu->hide();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -151,6 +151,9 @@ private:
|
||||
static QPointer<DockPopupWindow> PopupWindow;
|
||||
Dock::TipsWidget *m_tipsLabel;
|
||||
bool m_popupShown;
|
||||
|
||||
// qt右键菜单: true, 外部菜单: false
|
||||
bool m_menuState;
|
||||
};
|
||||
|
||||
#endif /* SNIWIDGET_H */
|
||||
|
Loading…
x
Reference in New Issue
Block a user