Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions panels/dock/taskmanager/abstracttaskmanagerinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ class AbstractTaskManagerInterface
{
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestClose, force);
}
virtual void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const
virtual void requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const
{
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestUpdateWindowGeometry, geometry, delegate);
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestUpdateWindowIconGeometry, geometry, delegate);
}
virtual void requestWindowsView(const QModelIndexList &indexes) const
{
Expand Down
2 changes: 1 addition & 1 deletion panels/dock/taskmanager/abstractwindowmonitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void AbstractWindowMonitor::requestClose(const QModelIndex &index, bool force) c
}
}

void AbstractWindowMonitor::requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
void AbstractWindowMonitor::requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
{
}

Expand Down
2 changes: 1 addition & 1 deletion panels/dock/taskmanager/abstractwindowmonitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class AbstractWindowMonitor : public QAbstractListModel, public AbstractTaskMana
void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const override;
void requestNewInstance(const QModelIndex &index, const QString &action) const override;
void requestClose(const QModelIndex &index, bool force = false) const override;
void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
void requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;

virtual void
requestPreview(QAbstractItemModel *sourceModel, QWindow *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) = 0;
Expand Down
15 changes: 11 additions & 4 deletions panels/dock/taskmanager/dockglobalelementmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,11 +398,18 @@ void DockGlobalElementModel::requestClose(const QModelIndex &index, bool force)

qWarning() << "unable to close app not running";
}
void DockGlobalElementModel::requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const

void DockGlobalElementModel::requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
{
Q_UNUSED(index)
Q_UNUSED(geometry)
Q_UNUSED(delegate)
auto data = m_data.value(index.row());
auto id = std::get<0>(data);
auto sourceModel = std::get<1>(data);
auto sourceRow = std::get<2>(data);

if (sourceModel == m_activeAppModel) {
auto sourceIndex = sourceModel->index(sourceRow, 0);
m_activeAppModel->requestUpdateWindowIconGeometry(sourceIndex, geometry, delegate);
}
}

void DockGlobalElementModel::requestWindowsView(const QModelIndexList &indexes) const
Expand Down
2 changes: 1 addition & 1 deletion panels/dock/taskmanager/dockglobalelementmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class DockGlobalElementModel : public QAbstractListModel, public AbstractTaskMan

void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const override;
void requestClose(const QModelIndex &index, bool force = false) const override;
void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
void requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;

void requestWindowsView(const QModelIndexList &indexes) const override;

Expand Down
14 changes: 10 additions & 4 deletions panels/dock/taskmanager/dockgroupmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,17 @@ void DockGroupModel::requestClose(const QModelIndex &index, bool force) const
}
}

void DockGroupModel::requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
void DockGroupModel::requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
{
Q_UNUSED(index)
Q_UNUSED(geometry)
Q_UNUSED(delegate)
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(sourceModel());
if (nullptr == interface)
return;
Comment on lines +137 to +139
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (bug_risk): Silent return on failed interface cast may hide errors.

Consider adding logging or error handling when the cast fails to improve debuggability.

Suggested change
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(sourceModel());
if (nullptr == interface)
return;
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(sourceModel());
if (nullptr == interface) {
qWarning() << "DockGroupModel::requestUpdateWindowIconGeometry: sourceModel is not an AbstractTaskManagerInterface";
return;
}


auto indexRowCount = RoleGroupModel::rowCount(index);
for (int i = 0; i < indexRowCount; i++) {
auto cIndex = RoleGroupModel::index(i, 0, index);
callInterfaceMethod(cIndex, &AbstractTaskManagerInterface::requestUpdateWindowIconGeometry, geometry, delegate);
}
}

void DockGroupModel::requestWindowsView(const QModelIndexList &indexes) const
Expand Down
2 changes: 1 addition & 1 deletion panels/dock/taskmanager/dockgroupmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class DockGroupModel : public RoleGroupModel, public AbstractTaskManagerInterfac

void requestActivate(const QModelIndex &index) const override;
void requestClose(const QModelIndex &index, bool force = false) const override;
void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
void requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
void requestWindowsView(const QModelIndexList &indexes) const override;

private:
Expand Down
4 changes: 2 additions & 2 deletions panels/dock/taskmanager/package/AppItem.qml
Original file line number Diff line number Diff line change
Expand Up @@ -272,8 +272,8 @@ Item {
repeat: false
onTriggered: {
var pos = icon.mapToItem(null, 0, 0)
taskmanager.Applet.setAppItemWindowIconGeometry(root.itemId, Panel.rootObject, pos.x, pos.y,
pos.x + icon.width, pos.y + icon.height)
taskmanager.Applet.requestUpdateWindowIconGeometry(root.modelIndex, Qt.rect(pos.x, pos.y,
icon.width, icon.height), Panel.rootObject)
}
}

Expand Down
14 changes: 2 additions & 12 deletions panels/dock/taskmanager/taskmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,9 +201,9 @@ void TaskManager::requestClose(const QModelIndex &index, bool force) const
m_itemModel->requestClose(index, force);
}

void TaskManager::requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
void TaskManager::requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
{
m_itemModel->requestUpdateWindowGeometry(index, geometry, delegate);
m_itemModel->requestUpdateWindowIconGeometry(index, geometry, delegate);
}

void TaskManager::requestPreview(const QModelIndex &index, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction)
Expand Down Expand Up @@ -312,16 +312,6 @@ void TaskManager::hideItemPreview()
m_windowMonitor->hideItemPreview();
}

void TaskManager::setAppItemWindowIconGeometry(const QString& appid, QObject* relativePositionItem, const int& x1, const int& y1, const int& x2, const int& y2)
{
QPointer<AppItem> item = static_cast<AppItem*>(ItemModel::instance()->getItemById(appid).get());
if (item.isNull()) return;

for (auto window : item->getAppendWindows()) {
window->setWindowIconGeometry(qobject_cast<QWindow*>(relativePositionItem), QRect(QPoint(x1, y1),QPoint(x2, y2)));
}
}

bool TaskManager::allowForceQuit()
{
return Settings->isAllowedForceQuit();
Expand Down
3 changes: 1 addition & 2 deletions panels/dock/taskmanager/taskmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage

Q_INVOKABLE void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const override;
Q_INVOKABLE void requestClose(const QModelIndex &index, bool force = false) const override;
Q_INVOKABLE void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
Q_INVOKABLE void requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
Q_INVOKABLE void
requestPreview(const QModelIndex &index, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction);
Q_INVOKABLE void requestWindowsView(const QModelIndexList &indexes) const override;
Expand All @@ -93,7 +93,6 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage
Q_INVOKABLE void dropFilesOnItem(const QString &itemId, const QStringList &urls);
Q_INVOKABLE void hideItemPreview();

Q_INVOKABLE void setAppItemWindowIconGeometry(const QString& appid, QObject* relativePositionItem, const int& x1, const int& y1, const int& x2, const int& y2);
Q_INVOKABLE void activateWindow(uint32_t windowID);
Q_INVOKABLE void saveDockElementsOrder(const QStringList &appIds);

Expand Down
7 changes: 7 additions & 0 deletions panels/dock/taskmanager/x11windowmonitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,13 @@ void X11WindowMonitor::requestPreview(QAbstractItemModel *sourceModel,
m_windowPreview->updatePosition();
}

void X11WindowMonitor::requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
{
xcb_window_t winId = index.data(TaskManager::WinIdRole).toUInt();
auto pos = qobject_cast<QWindow *>(delegate)->position() + geometry.topLeft();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Potential null pointer dereference with delegate casting.

Add a null check or type verification for delegate before casting to QWindow to prevent possible crashes.

X11->setWindowIconGemeotry(winId, QRect(pos.x(), pos.y(), geometry.width(), geometry.height()));
}

void X11WindowMonitor::clearPreviewState()
{
// 发出信号通知 TaskManager 清空预览过滤状态
Expand Down
1 change: 1 addition & 0 deletions panels/dock/taskmanager/x11windowmonitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class X11WindowMonitor : public AbstractWindowMonitor

void
requestPreview(QAbstractItemModel *sourceModel, QWindow *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) override;
void requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;

Q_SIGNALS:
void windowMapped(xcb_window_t window);
Expand Down