Repository navigation
Description
SUMMARY | 问题概要
Clicking the dock icon of an already-running application does not raise or focus its window. The dock sends org.deepin.dde.daemon.Dock1.ActivateWindow(u) to dde-shell itself, but the adaptor exposes no matching DBus slot, so QDBus drops the call and logs "Could not find slot DockDaemonAdaptor::ActivateWindow". Reproducible on the first click after a dde-shell restart, present since dde-shell 2.0.52 (2026-11-03), still present in 2.0.61.
SOFTWARE/OS VERSIONS | 软件/系统版本信息
Distribution: deepin 25 (crimson), VERSION_ID=25
Kernel: 6.6.159-amd64-desktop-hwe
dde-shell: 2.0.61 (dde-shell, libdde-shell, libdde-shell-dock)
Qt: 6.8.0+dfsg-0deepin42 (libqt6core6, libqt6dbus6)
DTK: 6.7.52 (libdtk6core, libdtk6gui)
Session: X11 / kwin_x11, 2560x1440@60
PRE-REQUIREMENT | 预置条件
dde-shell is running (org.deepin.dde.shell, one process also acting as the DBus client), and an application window exists in the dock.
STEPS TO REPRODUCE | 复现步骤
- Open any application that shows an icon in the dock/taskbar.
- Minimize it or focus another window.
- Click its dock icon.
OBSERVED RESULT | 观察到的结果
Nothing happens: the window is not raised or focused. Every click logs the same warning in ~/.cache/deepin/org.deepin.dde-shell/org.deepin.dde-shell.log:
QDBusConnection: couldn't handle call to ActivateWindow, no slot matched
Could not find slot DockDaemonAdaptor::ActivateWindow
Could not find slot DockFrontAdaptor::ActivateWindow
It fails on the very first click after systemctl --user restart dde-shell@DDE.service, so this is not accumulated runtime state. The same warning already appears in the logs of dde-shell 2.0.52 (2026-11-03 08:17:40), before the 2026-11-12 update to 2.0.61.
EXPECTED RESULT | 期望的结果
Clicking the dock icon of a running application raises and focuses that window, as other desktops do.
ADDITIONAL INFORMATION | 额外补充
Analysis
Sender — dock::DockDBusProxy::ActivateWindow(uint) in the dock plugin calls org.deepin.dde.daemon.Dock1.ActivateWindow(u) on /org/deepin/dde/daemon/Dock1 over the session bus.
Receiver — DockDaemonAdaptor, which lives in the same dde-shell process. QDBus cannot find a matching slot in the adaptor metaobject, so the call is dropped.
Both functions are compiled in, they are simply not exported as DBus slots:
$ nm -D --defined-only /usr/lib/x86_64-linux-gnu/dde-shell/org.deepin.ds.dock.so | grep -i activatewindow
000000000005a6b0 T _ZN17DockDaemonAdaptor14ActivateWindowEj
00000000000405f0 T _ZN4dock13DockDBusProxy14ActivateWindowEj
In Qt a method is exported over DBus only when it is declared Q_SLOT (or Q_INVOKABLE) in the header that moc processes, so the metaobject is missing the entry.
Cross-checks
- External call succeeds:
busctl --user call org.deepin.dde.shell /org/deepin/dde/daemon/Dock1 org.deepin.dde.daemon.Dock1 ActivateWindow u 0 - Legacy interface has no such method:
busctl --user call org.deepin.dde.shell /org/deepin/dde/Dock1 org.deepin.dde.Dock1 ActivateWindow u 0
→Call failed: No such method 'ActivateWindow' in interface 'org.deepin.dde.Dock1' at object path '/org/deepin/dde/Dock1' (signature 'u') busctl introspectshows both interfaces on the object; onlyorg.deepin.dde.daemon.Dock1declaresActivateWindow(u).- Warning timestamps on this machine: 2026-11-03 08:17:40 (dde-shell 2.0.52), 2026-11-05 10:35:09, 2026-11-13 10:01:19, 11:27:45, 14:26:12 (DockDaemonAdaptor), 14:40:17 (DockFrontAdaptor).
Suggested fix — declare ActivateWindow as Q_SLOT (or add Q_INVOKABLE) in DockDaemonAdaptor / DockFrontAdaptor so moc exports it. Both the legacy org.deepin.dde.Dock1 and org.deepin.dde.daemon.Dock1 interfaces should provide it, because the log shows clients still calling the legacy one.
Regression test — call org.deepin.dde.daemon.Dock1.ActivateWindow over the session bus and assert there is no no slot matched warning.
Activity