diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index a4a2c60..ee97d83 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -8,7 +8,7 @@ ``` ┌─────────────────────────────────────────────────────────────┐ -│ Linux System │ +│ Linux System │ │ ┌──────────────────────┐ ┌─────────────────────────┐ │ │ │ GNOME ScreenSaver │ │ systemd-logind │ │ │ │ (DBus Service) │ │ (DBus Service) │ │ @@ -19,15 +19,15 @@ │ DBus Signals │ │ │ ┌─────────────┴──────────────────────────────┴────────────────┐ -│ Qt Application (ScreenLockDemo) │ +│ Qt Application (ScreenLockDemo) │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ MainWindow │ │ -│ │ ┌──────────────┐ ┌────────────────────────────────┐ │ │ -│ │ │ Control Panel│ │ Status Display │ │ │ -│ │ │ - Enable Btn │ │ - Lock Status: 🔒/🔓 │ │ │ -│ │ │ - Disable Btn│ │ - Paint Status: ✓/✗ │ │ │ -│ │ │ - Reset Btn │ │ - Frame Count │ │ │ -│ │ └──────────────┘ └────────────────────────────────┘ │ │ +│ │ ┌──────────────┐ ┌────────────────────────────────┐ │ │ +│ │ │ Control Panel│ │ Status Display │ │ │ +│ │ │ - Enable Btn │ │ - Lock Status: 🔒/🔓 │ │ │ +│ │ │ - Disable Btn│ │ - Paint Status: ✓/✗ │ │ │ +│ │ │ - Reset Btn │ │ - Frame Count │ │ │ +│ │ └──────────────┘ └────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────┘ │ │ ↕ signals/slots │ │ ┌────────────────────────────────────────────────────────┐ │ @@ -136,7 +136,7 @@ Count++ Count unchanged **UI 布局**: ``` ┌─────────────────────────────────────┐ -│ MainWindow │ +│ MainWindow │ ├─────────────────────────────────────┤ │ ┌───────────────────────────────┐ │ │ │ CustomWidget │ │ @@ -150,8 +150,8 @@ Count++ Count unchanged ├─────────────────────────────────────┤ │ ┌─── Status Information ────────┐ │ │ │ Detector: Active │ │ -│ │ Lock: 🔓 UNLOCKED │ │ -│ │ Paint: ✓ ENABLED │ │ +│ │ Lock: 🔓 UNLOCKED │ │ +│ │ Paint: ✓ ENABLED │ │ │ │ Frames: 1234 │ │ │ └───────────────────────────────┘ │ └─────────────────────────────────────┘ @@ -264,13 +264,13 @@ void CustomWidget::paintEvent(QPaintEvent *event) drawSimpleStatus(); return; // 节省 CPU 资源 } - + // 正常绘制流程 drawBackground(); drawRotatingCircles(); drawWaveEffect(); drawStatusInfo(); - + m_frameCount++; // 统计 } ``` @@ -336,7 +336,7 @@ bool ScreenLockDetector::connectToKDEScreenSaver() "org.freedesktop.ScreenSaver", QDBusConnection::sessionBus() ); - + // 2. 连接信号 bool connected = QDBusConnection::sessionBus().connect( "org.kde.screensaver", @@ -346,7 +346,7 @@ bool ScreenLockDetector::connectToKDEScreenSaver() this, SLOT(onKDEScreenSaverChanged(bool)) ); - + return connected; } ``` @@ -361,7 +361,7 @@ void CustomWidget::drawParticleSystem(QPainter &painter) for (auto &particle : m_particles) { particle.update(m_deltaTime); } - + // 2. 绘制粒子 for (const auto &particle : m_particles) { particle.draw(painter); @@ -386,7 +386,7 @@ void TestScreenLockDetector::testLockStateChange() { ScreenLockDetector detector; QSignalSpy spy(&detector, &ScreenLockDetector::lockStateChanged); - + // 模拟 DBus 信号 detector.onSessionLocked(); QCOMPARE(spy.count(), 1); @@ -399,7 +399,7 @@ void TestCustomWidget::testPaintingControl() CustomWidget widget; widget.setPaintingEnabled(false); QVERIFY(!widget.isPaintingEnabled()); - + int initialCount = widget.getPaintFrameCount(); QTest::qWait(100); // 等待 QCOMPARE(widget.getPaintFrameCount(), initialCount); @@ -423,16 +423,16 @@ bool ScreenLockDetector::initialize() { bool gnomeOk = connectToGnomeScreenSaver(); bool loginOk = connectToLoginManager(); - + // 容错:至少一个接口成功即可 if (!gnomeOk && !loginOk) { qWarning() << "No lock detection service available"; return false; } - + // 降级:查询当前状态(可能失败) queryCurrentLockState(); - + return true; } ``` @@ -474,4 +474,4 @@ qCritical()// 严重错误 - ✅ 跨组件通信 - ✅ 资源优化策略 -适合作为 Qt + Linux 系统编程的学习参考。 \ No newline at end of file +适合作为 Qt + Linux 系统编程的学习参考。 diff --git a/DEEPIN_SUPPORT.md b/DEEPIN_SUPPORT.md deleted file mode 100644 index 8ab0c83..0000000 --- a/DEEPIN_SUPPORT.md +++ /dev/null @@ -1,316 +0,0 @@ -# Deepin OS 锁屏检测支持 - -本文档说明如何在 Deepin OS 上使用和测试屏幕锁定检测功能。 - -## 概述 - -从 v1.1.0 版本开始,本应用已完全支持 Deepin OS 的 DDE (Deepin Desktop Environment) 桌面环境。通过监听 Deepin 特有的 DBus 接口,应用可以准确检测 Deepin OS 的锁屏和解锁事件。 - -## Deepin DDE 锁屏检测机制 - -### DBus 接口详情 - -Deepin OS 通过以下 DBus 接口提供锁屏状态通知: - -``` -Service: com.deepin.dde.lockFront -Path: /com/deepin/dde/lockFront -Interface: com.deepin.dde.lockFront -``` - -### 支持的信号 - -- **Locked()** - 当屏幕被锁定时发出 -- **Unlocked()** - 当屏幕被解锁时发出 - -## 系统要求 - -### Deepin OS 版本 -- Deepin OS 20 或更高版本 -- Deepin OS 23 (推荐) - -### 依赖项 -- Qt 5.15.2 或更高版本 -- DBus 系统服务 -- DDE 桌面环境 - -## 安装与编译 - -### 1. 在 Deepin OS 上安装依赖 - -```bash -# 更新软件包列表 -sudo apt update - -# 安装编译工具 -sudo apt install build-essential cmake git - -# 安装 Qt5 开发库(如果使用系统 Qt) -sudo apt install qtbase5-dev qtbase5-dev-tools - -# 安装 DBus 开发库 -sudo apt install libdbus-1-dev -``` - -### 2. 编译项目 - -```bash -# 克隆或进入项目目录 -cd qt_screan_lock - -# 赋予脚本执行权限 -chmod +x build.sh run.sh - -# 编译 -./build.sh -``` - -## 在 Deepin OS 上运行 - -### 启动应用 - -```bash -# 方法 1:使用运行脚本(推荐) -./run.sh - -# 方法 2:直接运行 -cd build/bin -./ScreenLockDemo -``` - -### 查看连接状态 - -应用启动后,检查控制台输出,确认 Deepin DDE 接口已成功连接: - -``` -Initializing ScreenLockDetector... -Successfully connected to Deepin DDE -ScreenLockDetector initialized successfully -Deepin DDE connected: true -``` - -## 测试锁屏检测 - -### 1. 基本测试步骤 - -1. **启动应用** - ```bash - ./run.sh - ``` - -2. **验证初始状态** - - 确认窗口显示动画正在运行 - - 检查 "Screen Lock Status" 显示为 "🔓 UNLOCKED" - - 检查 "Painting Status" 显示为 "✓ ENABLED" - -3. **触发锁屏** - - 使用快捷键:`Super + L` 或 `Ctrl + Alt + L` - - 或点击系统托盘 → 锁定 - - 或在终端执行:`dde-lock` - -4. **验证锁屏响应** - - 屏幕应该被锁定 - - 解锁后,检查应用窗口 - - "Screen Lock Status" 应显示为 "🔒 LOCKED"(锁屏期间) - - 动画应已停止 - - "Painting Status" 应显示为 "✗ DISABLED" - -5. **解锁并验证恢复** - - 输入密码解锁 - - "Screen Lock Status" 应变回 "🔓 UNLOCKED" - - 动画应自动恢复 - - "Painting Status" 应变回 "✓ ENABLED" - -### 2. 控制台日志测试 - -启动应用并观察详细日志: - -```bash -./run.sh 2>&1 | tee deepin_test.log -``` - -**预期输出示例:** - -``` -Initializing ScreenLockDetector... -Deepin DDE lockFront interface available -Successfully connected to Deepin DDE -GNOME ScreenSaver interface not available: [错误信息] -Login Manager interface not available: [错误信息] -ScreenLockDetector initialized successfully -Deepin DDE connected: true -GNOME ScreenSaver connected: false -Login Manager connected: false -``` - -锁屏时应看到: -``` -Login Manager Lock signal received -Screen lock state changed: LOCKED -``` - -解锁时应看到: -``` -Login Manager Unlock signal received -Screen lock state changed: UNLOCKED -``` - -### 3. DBus 接口验证 - -可以使用命令行工具验证 Deepin DDE 接口是否可用: - -```bash -# 检查 lockFront 服务是否存在 -dbus-send --session --print-reply \ - --dest=com.deepin.dde.lockFront \ - /com/deepin/dde/lockFront \ - org.freedesktop.DBus.Introspectable.Introspect - -# 监听 Deepin 锁屏信号 -dbus-monitor --session "type='signal',interface='com.deepin.dde.lockFront'" -``` - -## 故障排除 - -### 问题 1:Deepin DDE 接口连接失败 - -**症状:** -``` -Deepin DDE lockFront interface not available: Service not found -``` - -**原因:** -- DDE 桌面环境未运行 -- DBus 会话总线未正确配置 -- 锁屏服务未启动 - -**解决方案:** -```bash -# 检查 DDE 进程 -ps aux | grep dde - -# 检查 DBus 会话 -echo $DBUS_SESSION_BUS_ADDRESS - -# 重启 DDE(谨慎操作) -killall dde-desktop -dde-desktop & -``` - -### 问题 2:锁屏信号未被接收 - -**症状:** -- 应用已连接到 Deepin DDE -- 但锁屏时没有响应 - -**解决方案:** -```bash -# 检查信号是否被发出 -dbus-monitor --session | grep -A5 "com.deepin.dde.lockFront" - -# 确保应用有正确的权限 -chmod +x build/bin/ScreenLockDemo - -# 尝试使用系统命令锁屏 -dde-lock -``` - -### 问题 3:多个接口冲突 - -**症状:** -- Deepin DDE 和其他接口同时连接成功 -- 收到重复的锁屏信号 - -**说明:** -这是正常行为。应用会尝试连接所有可用的接口,并从任何一个接口接收信号。内部逻辑会防止重复处理相同的状态变化。 - -## 兼容性说明 - -### 支持的 Deepin 版本 - -| Deepin 版本 | DDE 版本 | 支持状态 | 说明 | -|------------|---------|---------|------| -| Deepin 15.x | DDE 旧版 | ⚠️ 未测试 | 可能需要调整 DBus 接口 | -| Deepin 20 | DDE 5.x | ✅ 完全支持 | 推荐版本 | -| Deepin 23 | DDE 6.x | ✅ 完全支持 | 最新版本 | - -### 已知限制 - -1. **锁屏动画期间**:在锁屏动画播放时(约 1-2 秒),信号可能会有轻微延迟 -2. **快速切换**:极短时间内多次锁定/解锁可能导致信号丢失 -3. **休眠唤醒**:从休眠状态唤醒时,可能需要手动刷新状态 - -## 高级配置 - -### 调试 Deepin 特定问题 - -启用详细的 DBus 日志: - -```bash -# 设置 Qt 调试环境变量 -export QT_LOGGING_RULES="qt.dbus*=true" -./run.sh -``` - -### 仅使用 Deepin 接口 - -如果您只想使用 Deepin DDE 接口而不尝试其他接口,可以修改 `screenlockdetector.cpp`: - -```cpp -bool ScreenLockDetector::initialize() -{ - qDebug() << "Initializing ScreenLockDetector..."; - - // 只连接 Deepin DDE - bool deepinOk = connectToDeepinDDE(); - - if (!deepinOk) { - qWarning() << "Failed to connect to Deepin DDE"; - return false; - } - - queryCurrentLockState(); - return true; -} -``` - -## 性能考虑 - -在 Deepin OS 上运行时的性能特点: - -- **CPU 占用**:空闲时 < 1%,动画运行时约 2-5% -- **内存占用**:约 20-30 MB -- **DBus 消息**:每次锁屏/解锁仅 2 个信号 -- **响应延迟**:< 100ms(从锁屏到应用响应) - -## 开发者信息 - -### Deepin API 参考 - -如需了解更多 Deepin DDE 的 DBus 接口,请参考: - -- Deepin 开发者中心:https://github.com/linuxdeepin -- DDE 桌面环境:https://github.com/linuxdeepin/dde -- 锁屏组件:https://github.com/linuxdeepin/dde-lock - -### 贡献代码 - -如果您在 Deepin OS 上发现问题或有改进建议,欢迎提交反馈! - -## 测试检查清单 - -使用以下检查清单确保 Deepin 支持功能正常: - -- [ ] 应用成功编译 -- [ ] 应用成功启动 -- [ ] 控制台显示 "Deepin DDE connected: true" -- [ ] 使用快捷键锁屏,应用检测到锁定 -- [ ] 解锁后,应用检测到解锁 -- [ ] 动画在锁屏时停止 -- [ ] 动画在解锁后恢复 -- [ ] 状态指示器正确更新 -- [ ] 无错误或警告(除了其他接口不可用的提示) - -## 结论 - -本应用在 Deepin OS 上提供了完整的锁屏检测支持。通过原生的 DDE DBus 接口,可以实现可靠、低延迟的锁屏状态监控。如有任何问题,请参考故障排除章节或查看应用日志。 \ No newline at end of file diff --git a/DEEPIN_UPDATE.md b/DEEPIN_UPDATE.md deleted file mode 100644 index d7c1197..0000000 --- a/DEEPIN_UPDATE.md +++ /dev/null @@ -1,278 +0,0 @@ -# Deepin OS 支持更新说明 - -## 更新概述 - -本次更新为 Qt Screen Lock Detection Demo 添加了完整的 Deepin OS (DDE) 支持。现在应用可以在 Deepin 操作系统上正确检测屏幕锁定和解锁事件。 - -**版本**: v1.1.0 -**更新日期**: 2024 -**主要改进**: 新增 Deepin DDE 桌面环境支持 - -## 更新内容 - -### 1. 核心代码更改 - -#### `src/screenlockdetector.h` -- 添加 `connectToDeepinDDE()` 方法声明 -- 新增 `m_deepinInterface` 成员变量(Deepin DDE DBus 接口) -- 新增 `m_deepinConnected` 成员变量(连接状态标志) -- 更新类注释,说明支持 Deepin DDE - -#### `src/screenlockdetector.cpp` -- 实现 `connectToDeepinDDE()` 方法 - - 连接到 `com.deepin.dde.lockFront` DBus 服务 - - 监听 `Locked` 和 `Unlocked` 信号 - - 复用现有的 `onSessionLocked()` 和 `onSessionUnlocked()` 槽函数 -- 在 `initialize()` 方法中优先尝试连接 Deepin DDE 接口 -- 在构造函数和析构函数中正确初始化和清理 Deepin 相关资源 -- 在 `queryCurrentLockState()` 中添加 Deepin 状态查询支持 - -### 2. 新增文档 - -#### `DEEPIN_SUPPORT.md` -详细的 Deepin OS 支持文档,包含: -- Deepin DDE 锁屏检测机制说明 -- DBus 接口详细信息 -- 系统要求和依赖项 -- 在 Deepin OS 上的安装和编译指南 -- 完整的测试步骤和预期输出 -- 故障排除指南 -- 兼容性说明和已知限制 -- 性能考虑因素 -- 开发者参考信息 - -#### `test_deepin.sh` -自动化测试脚本,功能包括: -- 检测是否在 Deepin OS 上运行 -- 验证 DDE 桌面环境是否正在运行 -- 检查 DBus 会话配置 -- 验证 Deepin DDE lockFront 服务可用性 -- 检查项目编译状态 -- 验证 Qt 库路径 -- 提供详细的测试说明 -- 自动运行应用并保存测试日志 - -#### `DEEPIN_UPDATE.md` -本文档,记录更新内容和使用说明 - -### 3. 文档更新 - -#### `README.md` -- 功能特性:添加 "Deepin DDE" 到支持的桌面环境列表 -- 技术架构:说明支持 Deepin DDE 接口 -- 系统要求:注明支持 Deepin OS -- DBus 监听机制:添加 Deepin DDE 接口详细说明(优先级最高) -- 更新日志:添加 v1.1.0 版本更新记录 - -#### `QUICKSTART.md` -- 添加第四步:Deepin OS 用户特别测试说明 -- 在常见问题中添加 Deepin OS 相关诊断方法 -- 测试清单中添加 Deepin 测试项 - -## Deepin DDE DBus 接口说明 - -### 服务信息 -``` -Service: com.deepin.dde.lockFront -Path: /com/deepin/dde/lockFront -Interface: com.deepin.dde.lockFront -Bus Type: Session Bus -``` - -### 支持的信号 -- **Locked()**: 屏幕锁定时发出 -- **Unlocked()**: 屏幕解锁时发出 - -### 连接逻辑 -应用在初始化时会按以下顺序尝试连接: -1. Deepin DDE lockFront(优先) -2. GNOME ScreenSaver -3. systemd-logind - -只要有任何一个接口连接成功,应用即可正常工作。 - -## 使用方法 - -### 标准编译和运行 -```bash -# 编译项目 -./build.sh - -# 运行应用 -./run.sh -``` - -### Deepin OS 专用测试 -```bash -# 运行 Deepin 测试脚本 -./test_deepin.sh - -# 该脚本会自动: -# 1. 检测 Deepin 环境 -# 2. 验证所有依赖 -# 3. 启动应用 -# 4. 保存测试日志 -``` - -### 验证 Deepin 支持 -应用启动后,在控制台查找以下输出: -``` -Initializing ScreenLockDetector... -Successfully connected to Deepin DDE -ScreenLockDetector initialized successfully -Deepin DDE connected: true -``` - -## 测试步骤 - -### 1. 环境检查 -```bash -# 确认在 Deepin OS 上 -cat /etc/deepin-version - -# 检查 DDE 进程 -ps aux | grep dde-desktop - -# 验证 DBus 服务 -dbus-send --session --print-reply \ - --dest=com.deepin.dde.lockFront \ - /com/deepin/dde/lockFront \ - org.freedesktop.DBus.Introspectable.Introspect -``` - -### 2. 功能测试 -1. 启动应用:`./run.sh` -2. 确认窗口显示动画 -3. 锁定屏幕:`Super + L` 或 `dde-lock` -4. 验证动画停止,状态显示 "LOCKED" -5. 解锁屏幕 -6. 验证动画恢复,状态显示 "UNLOCKED" - -### 3. 日志检查 -锁屏时应看到: -``` -Login Manager Lock signal received -Screen lock state changed: LOCKED -``` - -解锁时应看到: -``` -Login Manager Unlock signal received -Screen lock state changed: UNLOCKED -``` - -## 兼容性 - -### 支持的 Deepin 版本 -- ✅ Deepin 20 (DDE 5.x) - 完全支持 -- ✅ Deepin 23 (DDE 6.x) - 完全支持 -- ⚠️ Deepin 15.x - 未测试,可能需要调整 - -### 与其他桌面环境的兼容性 -此更新不影响现有的桌面环境支持: -- ✅ GNOME - 继续支持 -- ✅ KDE - 通过 systemd-logind 支持 -- ✅ XFCE - 通过 systemd-logind 支持 -- ✅ 其他 - 通过 systemd-logind 支持 - -## 技术细节 - -### 实现要点 -1. **优先级**: Deepin DDE 检测优先级最高,首先尝试连接 -2. **信号复用**: 使用现有的 `onSessionLocked()` 和 `onSessionUnlocked()` 槽函数 -3. **错误处理**: 连接失败时不影响其他接口的尝试 -4. **日志输出**: 清晰显示各个接口的连接状态 - -### 性能影响 -- 额外的内存占用:约 1-2 KB(一个 QDBusInterface 对象) -- CPU 占用:无明显增加 -- 响应延迟:< 100ms - -### 代码质量 -- 遵循现有代码风格 -- 完整的中文注释 -- 适当的错误处理 -- 资源正确清理 - -## 已知限制 - -1. **初始状态查询**: Deepin DDE 可能不提供查询当前锁屏状态的方法,应用依赖信号通知 -2. **锁屏动画**: 在锁屏动画播放期间(约 1-2 秒)可能有轻微延迟 -3. **快速切换**: 极短时间内多次锁定/解锁可能导致信号处理延迟 - -## 未来改进方向 - -1. **状态查询**: 如果 Deepin 提供相关 API,添加初始状态查询功能 -2. **会话管理**: 支持 Deepin 的会话管理接口 -3. **电源管理**: 集成 Deepin 的电源管理事件 -4. **通知集成**: 使用 Deepin 原生通知系统 - -## 文件清单 - -### 修改的文件 -- `src/screenlockdetector.h` - 添加 Deepin 支持声明 -- `src/screenlockdetector.cpp` - 实现 Deepin 支持 -- `README.md` - 更新文档 -- `QUICKSTART.md` - 添加 Deepin 测试说明 - -### 新增的文件 -- `DEEPIN_SUPPORT.md` - Deepin 支持详细文档 -- `test_deepin.sh` - Deepin 测试脚本(可执行) -- `DEEPIN_UPDATE.md` - 本更新说明文档 - -### 未修改的文件 -- `src/main.cpp` -- `src/mainwindow.h` -- `src/mainwindow.cpp` -- `src/customwidget.h` -- `src/customwidget.cpp` -- `CMakeLists.txt` -- `build.sh` -- `run.sh` - -## 开发者注意事项 - -### 如何添加更多 Deepin 相关功能 - -1. **修改头文件** (`screenlockdetector.h`) - - 添加新的私有方法声明 - - 添加新的成员变量 - -2. **实现功能** (`screenlockdetector.cpp`) - - 实现新方法 - - 在 `initialize()` 中调用 - -3. **更新文档** - - 在 `DEEPIN_SUPPORT.md` 中说明新功能 - - 更新 `README.md` 和 `QUICKSTART.md` - -### DBus 调试技巧 -```bash -# 监听所有 Deepin lockFront 信号 -dbus-monitor --session "type='signal',interface='com.deepin.dde.lockFront'" - -# 手动触发锁屏 -dde-lock - -# 检查服务方法 -qdbus com.deepin.dde.lockFront /com/deepin/dde/lockFront -``` - -## 参考资源 - -- Deepin 官网: https://www.deepin.org/ -- Deepin GitHub: https://github.com/linuxdeepin -- DDE 桌面: https://github.com/linuxdeepin/dde -- Qt DBus 文档: https://doc.qt.io/qt-5/qtdbus-index.html - -## 贡献者 - -感谢所有为 Deepin OS 支持做出贡献的开发者! - -## 总结 - -通过此次更新,Qt Screen Lock Detection Demo 现在是一个真正跨桌面环境的应用程序,能够在 Deepin OS、Ubuntu (GNOME)、KDE、XFCE 等主流 Linux 桌面环境中稳定运行。 - -Deepin 用户现在可以享受到与其他桌面环境用户相同的功能体验,应用会在屏幕锁定时自动停止绘制,节省系统资源。 - -如有任何问题或建议,欢迎反馈! \ No newline at end of file diff --git a/LOCK_SIGNAL_FIX.md b/LOCK_SIGNAL_FIX.md deleted file mode 100644 index dfa440b..0000000 --- a/LOCK_SIGNAL_FIX.md +++ /dev/null @@ -1,331 +0,0 @@ -# 锁屏信号未触发问题修复指南 - -## 问题描述 - -程序已成功连接到目标系统的 DBus 服务,但是系统锁屏时 `onSessionLocked()` 没有被调用。 -此问题在 Ubuntu 和 Deepin 系统上都存在。 - -## 问题原因 - -### 1. Session 路径问题 -原代码使用了固定路径 `/org/freedesktop/login1/session/auto`,但这个路径在大多数 Linux 系统上不起作用。需要使用实际的会话 ID 路径,例如: -- `/org/freedesktop/login1/session/c1` -- `/org/freedesktop/login1/session/2` - -### 2. 信号监听范围太窄 -原代码只监听特定路径的信号,如果实际信号从其他路径发出,就无法接收到。 - -### 3. 缺少详细调试信息 -无法判断到底是哪个环节出了问题:连接失败、信号未发出、还是信号发送者不匹配。 - -## 修复方案 - -### 主要改进 - -#### 1. 动态获取 Session 路径 -新增 `getCurrentSessionPath()` 方法,通过以下方式获取正确的会话路径: - -```cpp -QString ScreenLockDetector::getCurrentSessionPath() -{ - // 方法1: 从环境变量获取 - QString xdgSessionId = qgetenv("XDG_SESSION_ID"); - if (!xdgSessionId.isEmpty()) { - return QString("/org/freedesktop/login1/session/%1").arg(xdgSessionId); - } - - // 方法2: 通过 DBus 调用获取 - QDBusInterface managerIface( - "org.freedesktop.login1", - "/org/freedesktop/login1", - "org.freedesktop.login1.Manager", - QDBusConnection::systemBus() - ); - - if (managerIface.isValid()) { - QDBusReply reply = - managerIface.call("GetSessionByPID", - (quint32)QCoreApplication::applicationPid()); - if (reply.isValid()) { - return reply.value().path(); - } - } - - return QString(); -} -``` - -#### 2. 双重信号连接策略 -先尝试连接到特定会话路径,如果失败则连接到通用信号(空路径): - -```cpp -// 方法1: 连接到特定会话 -QDBusConnection::systemBus().connect( - "org.freedesktop.login1", - sessionPath, // 具体路径 - "org.freedesktop.login1.Session", - "Lock", - this, - SLOT(onSessionLocked()) -); - -// 方法2: 连接到所有会话(备用方案) -QDBusConnection::systemBus().connect( - "org.freedesktop.login1", - "", // 空路径 = 监听所有对象 - "org.freedesktop.login1.Session", - "Lock", - this, - SLOT(onSessionLocked()) -); -``` - -#### 3. 增强的调试信息 -- 继承 `QDBusContext` 以获取信号发送者详细信息 -- 在所有关键点添加详细日志输出 -- 显示信号的 service、path、interface 和 member - -```cpp -void ScreenLockDetector::onSessionLocked() -{ - qDebug() << "##################################################"; - qDebug() << "## LOCK SIGNAL RECEIVED"; - - QDBusMessage msg = QDBusContext::message(); - if (msg.type() != QDBusMessage::InvalidMessage) { - qDebug() << "## DBus Message Details:"; - qDebug() << "## Service:" << msg.service(); - qDebug() << "## Path:" << msg.path(); - qDebug() << "## Interface:" << msg.interface(); - qDebug() << "## Member:" << msg.member(); - } - - qDebug() << "##################################################"; - setLockState(true); -} -``` - -#### 4. 改进的状态查询 -增强 `queryCurrentLockState()` 方法,正确读取 systemd-logind 的 `LockedHint` 属性: - -```cpp -QDBusMessage msg = QDBusMessage::createMethodCall( - "org.freedesktop.login1", - m_loginInterface->path(), - "org.freedesktop.DBus.Properties", - "Get" -); -msg << "org.freedesktop.login1.Session" << "LockedHint"; - -QDBusReply reply = QDBusConnection::systemBus().call(msg); -if (reply.isValid()) { - bool locked = reply.value().toBool(); - setLockState(locked); -} -``` - -## 使用修复后的代码 - -### 1. 重新编译 - -```bash -./build.sh -``` - -### 2. 运行程序并观察日志 - -```bash -./run.sh -``` - -程序启动时会输出详细的连接信息: - -``` -================================================= -Initializing ScreenLockDetector... -================================================= - ---- Connecting to Deepin DDE --- -Trying Deepin service: com.deepin.dde.lockFront -... - ---- Connecting to GNOME ScreenSaver --- -GNOME ScreenSaver interface is valid -GNOME ActiveChanged signal connected: true -... - ---- Connecting to Login Manager (systemd-logind) --- -Session path from XDG_SESSION_ID: /org/freedesktop/login1/session/c1 -Current session path: /org/freedesktop/login1/session/c1 -Login Manager interface is valid for session: /org/freedesktop/login1/session/c1 -Session Lock signal connected: true -Session Unlock signal connected: true -... -``` - -### 3. 测试锁屏 - -锁定屏幕后,应该能看到: - -``` -################################################## -## LOCK SIGNAL RECEIVED -## Screen is now LOCKED -## DBus Message Details: -## Service: :1.43 -## Path: /org/freedesktop/login1/session/c1 -## Interface: org.freedesktop.login1.Session -## Member: Lock -################################################## -``` - -## 调试工具 - -### 工具 1: test_lock_signals.sh - -这是一个全面的 DBus 信号监听脚本,用于诊断问题: - -```bash -./test_lock_signals.sh -``` - -功能: -1. 显示当前会话信息(XDG_SESSION_ID 等) -2. 检查可用的锁屏服务 -3. 列出会话支持的所有信号 -4. 实时监听 session bus 和 system bus 的锁屏信号 -5. 保存日志供后续分析 - -使用方法: -1. 运行脚本 -2. 按照提示锁定/解锁屏幕 -3. 观察输出的信号 -4. 按 Ctrl+C 停止 - -### 工具 2: debug_deepin_dbus.sh - -专门用于 Deepin 系统的调试脚本: - -```bash -./debug_deepin_dbus.sh -``` - -## 验证修复 - -### 检查列表 - -- [ ] 程序启动时显示"ScreenLockDetector initialized successfully" -- [ ] 至少有一个接口显示"connected: true" -- [ ] 显示了正确的 session 路径(不是 "auto") -- [ ] 锁屏时看到 "LOCK SIGNAL RECEIVED" 消息 -- [ ] 解锁时看到 "UNLOCK SIGNAL RECEIVED" 消息 -- [ ] 主窗口状态正确更新 - -### 如果仍然无法接收信号 - -1. **运行 test_lock_signals.sh** - ```bash - ./test_lock_signals.sh - ``` - 观察系统实际发出了什么信号 - -2. **检查会话路径** - ```bash - echo $XDG_SESSION_ID - loginctl show-session $XDG_SESSION_ID - ``` - -3. **手动测试 DBus 连接** - ```bash - # 监听 system bus 的 Lock 信号 - dbus-monitor --system "type='signal',interface='org.freedesktop.login1.Session',member='Lock'" - - # 在另一个终端锁屏 - loginctl lock-session - ``` - -4. **检查权限** - 确保用户有权限访问 system bus: - ```bash - groups $USER - ``` - 用户应该在 `sudo` 或 `wheel` 组中 - -5. **对于 Deepin 系统** - ```bash - # 列出所有 Deepin 相关服务 - dbus-send --session --print-reply --dest=org.freedesktop.DBus \ - /org/freedesktop/DBus org.freedesktop.DBus.ListNames | grep deepin - - # 查看 lockFront 的接口 - dbus-send --session --print-reply --dest=com.deepin.dde.lockFront \ - /com/deepin/dde/lockFront org.freedesktop.DBus.Introspectable.Introspect - ``` - -## 不同系统的特殊情况 - -### Ubuntu / GNOME -- 主要通过 `org.gnome.ScreenSaver` 的 `ActiveChanged` 信号 -- 或通过 systemd-logind 的 `Lock/Unlock` 信号 - -### Deepin DDE -- 服务名可能是 `com.deepin.dde.lockFront` 或 `org.deepin.dde.lockFront` -- 信号名可能是 `Locked/Unlocked` 或 `Lock/Unlock` -- 需要通过 session bus 连接 - -### KDE Plasma -- 使用 `org.freedesktop.ScreenSaver` -- 也支持 systemd-logind - -### XFCE -- 主要依赖 systemd-logind -- 或 `org.xfce.ScreenSaver` - -## 常见问题 - -### Q: 为什么连接显示成功但没有收到信号? - -A: 可能的原因: -1. 连接到了错误的会话路径 -2. 桌面环境使用了不同的锁屏机制 -3. 信号签名不匹配(参数类型不对) - -解决方法:使用 `test_lock_signals.sh` 查看实际信号。 - -### Q: 在虚拟机中测试是否会有问题? - -A: 可能会。某些虚拟机可能没有完整的 session 管理。建议: -- 确保虚拟机安装了完整的桌面环境 -- 使用 GUI 登录而不是 SSH -- 检查 `loginctl list-sessions` 是否显示你的会话 - -### Q: Deepin 系统上还是不工作怎么办? - -A: Deepin 不同版本的接口可能不同: -1. 运行 `debug_deepin_dbus.sh` 找到正确的服务名 -2. 修改 `connectToDeepinDDE()` 中的服务列表 -3. 添加找到的服务配置 -4. 重新编译测试 - -## 技术参考 - -### DBus 接口文档 -- systemd-logind Session: https://www.freedesktop.org/wiki/Software/systemd/logind/ -- GNOME ScreenSaver: https://wiki.gnome.org/Projects/GnomeScreensaver - -### Qt DBus 文档 -- QDBusConnection: https://doc.qt.io/qt-5/qdbusconnection.html -- QDBusContext: https://doc.qt.io/qt-5/qdbuscontext.html -- QDBusInterface: https://doc.qt.io/qt-5/qdbusinterface.html - -## 总结 - -修复的核心要点: - -1. ✅ **动态获取会话路径** - 不要硬编码 "auto" -2. ✅ **多重连接策略** - 特定路径 + 通用监听 -3. ✅ **详细调试日志** - 便于诊断问题 -4. ✅ **正确读取属性** - 使用 Properties 接口 -5. ✅ **支持多种桌面环境** - Deepin/GNOME/KDE 等 - -这些修复应该能解决大多数 Linux 系统上的锁屏信号接收问题。 \ No newline at end of file diff --git a/PACKAGING_CHECKLIST.md b/PACKAGING_CHECKLIST.md deleted file mode 100644 index 9f51d17..0000000 --- a/PACKAGING_CHECKLIST.md +++ /dev/null @@ -1,347 +0,0 @@ -# DEB 打包检查清单 - -## 📋 打包前检查 - -### 环境检查 -- [ ] linuxdeployqt 工具存在:`$HOME/dev/sunvpack-py/bin/linuxdeployqt` -- [ ] Qt 5.15.2 已安装:`$HOME/sdk/qt-5.15.2` -- [ ] dpkg-dev 已安装:`dpkg-deb --version` -- [ ] 项目可以正常编译:`./build.sh` -- [ ] 程序可以正常运行:`./run.sh` - -### 文件检查 -- [ ] `screenlockdemo.desktop` 文件存在且配置正确 -- [ ] `debian/control` 包信息完整 -- [ ] `debian/copyright` 版权信息正确 -- [ ] `debian/changelog` 版本号正确 -- [ ] 图标文件准备好(可选):`icon.png` - -### 版本检查 -- [ ] 版本号已更新(如果是新版本) - - [ ] `make_deb.sh` 中的 VERSION - - [ ] `build_deb.sh` 中的 VERSION - - [ ] `debian/changelog` 中的版本号 - - [ ] `CMakeLists.txt` 中的 VERSION - ---- - -## 🔨 打包过程检查 - -### 执行打包 -- [ ] 脚本有执行权限:`chmod +x make_deb.sh` -- [ ] 运行打包脚本:`./make_deb.sh` -- [ ] 打包过程无错误 -- [ ] DEB 文件生成成功:`deb_package/screenlockdemo_1.0.0_amd64.deb` - -### 包内容检查 -```bash -# 查看包信息 -dpkg -I deb_package/screenlockdemo_1.0.0_amd64.deb - -# 查看文件列表 -dpkg -c deb_package/screenlockdemo_1.0.0_amd64.deb -``` - -- [ ] 包信息正确(名称、版本、架构、依赖) -- [ ] 包含主程序:`./opt/screenlockdemo/bin/ScreenLockDemo` -- [ ] 包含 Qt 库:`./opt/screenlockdemo/lib/libQt5*.so*` -- [ ] 包含 Qt 插件:`./opt/screenlockdemo/plugins/platforms/libqxcb.so` -- [ ] 包含启动脚本:`./opt/screenlockdemo/screenlockdemo.sh` -- [ ] 包含系统命令:`./usr/bin/screenlockdemo` -- [ ] 包含 desktop 文件:`./usr/share/applications/screenlockdemo.desktop` -- [ ] 包含图标:`./usr/share/icons/hicolor/256x256/apps/screenlockdemo.png` -- [ ] 包含控制脚本:`./DEBIAN/control`, `./DEBIAN/postinst` - ---- - -## 🧪 安装测试 - -### 基本安装 -```bash -sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb -``` - -- [ ] 安装成功,无错误 -- [ ] 如有依赖问题,运行:`sudo apt-get install -f` -- [ ] 文件已安装到正确位置 - -### 文件验证 -```bash -# 检查安装的文件 -ls -la /opt/screenlockdemo/ -ls -la /usr/bin/screenlockdemo -ls -la /usr/share/applications/screenlockdemo.desktop -``` - -- [ ] `/opt/screenlockdemo/` 目录存在 -- [ ] `/opt/screenlockdemo/bin/ScreenLockDemo` 可执行 -- [ ] `/opt/screenlockdemo/lib/` 包含所有 Qt 库 -- [ ] `/usr/bin/screenlockdemo` 命令存在 -- [ ] 桌面文件已安装 - -### 依赖验证 -```bash -# 检查库依赖 -ldd /opt/screenlockdemo/bin/ScreenLockDemo -``` - -- [ ] 所有依赖都能找到(not found = 0) -- [ ] Qt 库指向 `/opt/screenlockdemo/lib/` -- [ ] 系统库正确链接 - ---- - -## 🚀 功能测试 - -### 启动测试 -- [ ] 命令行启动:`screenlockdemo` 成功 -- [ ] 直接运行:`/opt/screenlockdemo/screenlockdemo.sh` 成功 -- [ ] 无错误信息,无崩溃 -- [ ] 窗口正常显示 - -### 界面测试 -- [ ] 主窗口正常显示 -- [ ] 动画正常播放(旋转圆圈、波浪效果) -- [ ] 状态信息显示正确 -- [ ] 按钮响应正常 - -### 功能测试 -- [ ] **锁屏检测**:锁定屏幕(Ctrl+Alt+L) - - [ ] 检测器状态显示正常 - - [ ] 屏幕锁定状态显示为 "🔒 LOCKED" - - [ ] 动画自动停止(Paint 事件禁用) - -- [ ] **解锁检测**:解锁屏幕 - - [ ] 屏幕锁定状态显示为 "🔓 UNLOCKED" - - [ ] 动画自动恢复(Paint 事件启用) - -- [ ] **手动控制** - - [ ] "Disable Painting" 按钮可以停止动画 - - [ ] "Enable Painting" 按钮可以恢复动画 - - [ ] "Reset Frame Count" 按钮可以重置计数器 - -- [ ] **帧数统计**:计数器正常工作 - -### DBus 连接测试 -```bash -# 查看程序输出 -screenlockdemo 2>&1 | grep -i "dbus\|screensaver\|connected" -``` - -- [ ] 至少一个 DBus 接口连接成功 -- [ ] GNOME ScreenSaver 或 systemd-logind 连接正常 -- [ ] 无致命错误 - -### 应用菜单测试 -- [ ] 在应用程序菜单中可以找到 "Screen Lock Demo" -- [ ] 图标显示正常(或默认图标) -- [ ] 从菜单启动成功 - ---- - -## 🖼️ 界面测试 - -### 桌面集成 -- [ ] 桌面快捷方式可用 -- [ ] 应用图标显示(更新图标缓存:`sudo gtk-update-icon-cache -f /usr/share/icons/hicolor`) -- [ ] 窗口标题正确 -- [ ] 任务栏图标正确 - ---- - -## 🔄 卸载测试 - -### 卸载 -```bash -sudo dpkg -r screenlockdemo -``` - -- [ ] 卸载成功,无错误 -- [ ] `/opt/screenlockdemo/` 已删除 -- [ ] `/usr/bin/screenlockdemo` 已删除 -- [ ] 桌面文件已删除 -- [ ] 图标已删除 - -### 清理验证 -```bash -# 检查残留文件 -ls -la /opt/screenlockdemo/ -ls -la /usr/bin/screenlockdemo -``` - -- [ ] 无残留文件 -- [ ] 应用菜单中已移除 - ---- - -## 🌍 兼容性测试 - -### 不同 Ubuntu 版本 -- [ ] Ubuntu 18.04 LTS -- [ ] Ubuntu 20.04 LTS -- [ ] Ubuntu 22.04 LTS -- [ ] Ubuntu 23.10 / 24.04 - -### 不同桌面环境 -- [ ] GNOME -- [ ] KDE Plasma -- [ ] XFCE -- [ ] Unity(如适用) - -### 架构 -- [ ] x86_64 (amd64) -- [ ] 其他架构(如需要) - ---- - -## 📊 性能测试 - -### 资源占用 -```bash -# 监控资源使用 -top -p $(pgrep ScreenLockDemo) -``` - -- [ ] CPU 使用率合理(空闲时 < 5%,动画时 < 20%) -- [ ] 内存使用合理(< 100MB) -- [ ] 无内存泄漏(长时间运行) - -### 稳定性 -- [ ] 运行 1 小时无崩溃 -- [ ] 多次锁屏/解锁循环测试(> 10 次) -- [ ] 快速锁定/解锁测试 -- [ ] 无僵死进程 - ---- - -## 📦 包质量检查 - -### 包大小 -```bash -du -h deb_package/screenlockdemo_1.0.0_amd64.deb -``` - -- [ ] 包大小合理(通常 50-80MB) -- [ ] 如需优化,考虑 strip 符号 - -### 包结构 -```bash -# 检查 Lintian(Debian 包检查工具) -lintian deb_package/screenlockdemo_1.0.0_amd64.deb -``` - -- [ ] 无严重错误(E:) -- [ ] 警告(W:)可接受 -- [ ] 信息(I:)已知晓 - -### 元数据 -- [ ] 包名称正确:`screenlockdemo` -- [ ] 版本号正确:`1.0.0` -- [ ] 架构正确:`amd64` -- [ ] 维护者信息完整 -- [ ] 描述清晰准确 -- [ ] 依赖列表正确 - ---- - -## 📝 文档检查 - -### 用户文档 -- [ ] README.md 完整且最新 -- [ ] DEB_PACKAGE.md 说明清晰 -- [ ] PACKAGING_README.md 快速入门完整 - -### 技术文档 -- [ ] 打包脚本有注释 -- [ ] desktop 文件配置正确 -- [ ] control 文件信息准确 - ---- - -## 🚢 发布准备 - -### 最终检查 -- [ ] 所有功能正常 -- [ ] 无已知 bug -- [ ] 文档完整 -- [ ] 版本号正确 -- [ ] changelog 已更新 - -### 发布材料 -- [ ] DEB 包文件 -- [ ] 校验和(MD5/SHA256) - ```bash - md5sum deb_package/screenlockdemo_1.0.0_amd64.deb - sha256sum deb_package/screenlockdemo_1.0.0_amd64.deb - ``` -- [ ] 安装说明 -- [ ] 发布说明 -- [ ] 已知问题列表(如有) - ---- - -## ✅ 最终确认 - -在发布前,确认以下声明: - -- [ ] ✓ 我已在测试环境中完整安装并测试了 DEB 包 -- [ ] ✓ 所有核心功能都经过验证并正常工作 -- [ ] ✓ 包可以正常安装和卸载,无残留 -- [ ] ✓ 至少在一个目标 Ubuntu 版本上测试通过 -- [ ] ✓ 文档准确反映了当前版本的功能 -- [ ] ✓ 版本号和 changelog 已更新 -- [ ] ✓ 无已知的严重 bug - ---- - -## 📞 问题跟踪 - -如果发现问题,记录以下信息: - -- 问题描述: -- 重现步骤: -- 系统环境: -- 错误信息: -- 解决方案: - ---- - -## 🎯 快速命令参考 - -```bash -# 打包 -./make_deb.sh - -# 查看包信息 -dpkg -I deb_package/screenlockdemo_1.0.0_amd64.deb -dpkg -c deb_package/screenlockdemo_1.0.0_amd64.deb - -# 安装 -sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb -sudo apt-get install -f # 如有依赖问题 - -# 测试 -screenlockdemo -ldd /opt/screenlockdemo/bin/ScreenLockDemo - -# 卸载 -sudo dpkg -r screenlockdemo - -# 校验和 -md5sum deb_package/screenlockdemo_1.0.0_amd64.deb -sha256sum deb_package/screenlockdemo_1.0.0_amd64.deb -``` - ---- - -**检查完成日期**: ___________ - -**测试人员**: ___________ - -**版本号**: ___________ - -**测试环境**: ___________ - -**结果**: □ 通过 □ 失败 □ 有条件通过 - -**备注**: diff --git a/PACKAGING_README.md b/PACKAGING_README.md deleted file mode 100644 index 1fde292..0000000 --- a/PACKAGING_README.md +++ /dev/null @@ -1,334 +0,0 @@ -# Qt Screen Lock Demo - DEB 打包总览 - -本文档提供 DEB 打包的快速入门指南。 - -## 📦 快速开始 - -### 一键打包 - -```bash -# 赋予执行权限(首次运行) -chmod +x make_deb.sh - -# 运行打包 -./make_deb.sh -``` - -打包完成后,DEB 文件位于:`deb_package/screenlockdemo_1.0.0_amd64.deb` - -### 安装测试 - -```bash -# 安装 -sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb - -# 运行 -screenlockdemo - -# 卸载 -sudo dpkg -r screenlockdemo -``` - ---- - -## 📁 打包文件说明 - -### 核心脚本 - -| 文件 | 说明 | 使用场景 | -|------|------|----------| -| `make_deb.sh` | 快速打包脚本 | ⭐ 推荐日常使用 | -| `build_deb.sh` | 完整打包脚本 | 需要详细日志和调试 | -| `create_icon.sh` | 图标生成脚本 | 创建应用图标(可选) | - -### 配置文件 - -| 文件 | 说明 | -|------|------| -| `screenlockdemo.desktop` | 桌面快捷方式配置 | -| `debian/control` | DEB 包信息 | -| `debian/copyright` | 版权信息 | -| `debian/changelog` | 更新日志 | -| `debian/rules` | 构建规则(Makefile 格式) | -| `debian/compat` | Debian 兼容性版本 | - -### 文档 - -| 文件 | 说明 | -|------|------| -| `DEB_PACKAGE.md` | 详细打包文档(460+ 行) | -| `PACKAGING_README.md` | 本文档 - 快速参考 | - ---- - -## 🔧 环境要求 - -### 必需工具 - -1. **linuxdeployqt** - 依赖收集工具 - - 路径:`$HOME/dev/sunvpack-py/bin/linuxdeployqt` - - 作用:自动收集 Qt 和所有依赖库 - -2. **Qt 5.15.2** - Qt 框架 - - 路径:`$HOME/sdk/qt-5.15.2` - - 提供:Qt 库、插件、工具 - -3. **dpkg-dev** - DEB 打包工具 - ```bash - sudo apt-get install dpkg-dev debhelper - ``` - -### 验证环境 - -```bash -# 检查 linuxdeployqt -ls -lh $HOME/dev/sunvpack-py/bin/linuxdeployqt - -# 检查 Qt -ls -d $HOME/sdk/qt-5.15.2 - -# 检查 dpkg -dpkg-deb --version -``` - ---- - -## 🚀 打包流程 - -### make_deb.sh 流程(推荐) - -``` -[1/6] 清理目录 - └─ 删除旧的 deb_package/ 目录 - -[2/6] 编译项目 - └─ 运行 ./build.sh(如需要) - -[3/6] 创建 AppDir - ├─ 复制可执行文件 - ├─ 复制 desktop 文件 - └─ 创建图标占位符 - -[4/6] 收集依赖 (linuxdeployqt) - ├─ 扫描程序依赖 - ├─ 复制 Qt 库 - ├─ 复制 Qt 插件 - └─ 设置 RPATH - -[5/6] 创建 DEB 包结构 - ├─ /opt/screenlockdemo/ # 程序和库 - ├─ /usr/bin/ # 命令链接 - ├─ /usr/share/applications/ # 桌面快捷方式 - └─ /DEBIAN/ # 包控制文件 - -[6/6] 构建 DEB 包 - └─ 运行 dpkg-deb --build -``` - -### build_deb.sh 流程(详细版) - -``` -[1/8] 清理之前的打包目录 -[2/8] 编译项目 -[3/8] 创建 AppDir 结构 -[4/8] 使用 linuxdeployqt 收集所有依赖 -[5/8] 创建 DEB 包目录结构 -[6/8] 创建控制文件 -[7/8] 创建安装脚本 -[8/8] 构建 DEB 包 -``` - ---- - -## 📦 DEB 包内容 - -### 安装后的文件结构 - -``` -/opt/screenlockdemo/ -├── bin/ -│ └── ScreenLockDemo # 主程序 -├── lib/ -│ ├── libQt5Core.so.5 # Qt 核心库 -│ ├── libQt5Gui.so.5 # Qt GUI 库 -│ ├── libQt5Widgets.so.5 # Qt Widgets 库 -│ ├── libQt5DBus.so.5 # Qt DBus 库 -│ └── ... # 其他依赖库 -├── plugins/ -│ ├── platforms/ -│ │ └── libqxcb.so # X11 平台插件 -│ ├── imageformats/ # 图像格式插件 -│ └── ... # 其他 Qt 插件 -└── screenlockdemo.sh # 启动包装脚本 - -/usr/bin/ -└── screenlockdemo → /opt/screenlockdemo/screenlockdemo.sh - -/usr/share/applications/ -└── screenlockdemo.desktop # 桌面快捷方式 - -/usr/share/icons/hicolor/256x256/apps/ -└── screenlockdemo.png # 应用图标 -``` - -### 包大小估算 - -- **典型大小**:50-80 MB -- **包含**:Qt 5.15.2 的所有必需库和插件 -- **优点**:无需系统安装 Qt,避免依赖冲突 - ---- - -## 🎯 使用场景 - -### 场景 1:快速打包测试 - -```bash -./make_deb.sh -sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb -screenlockdemo -``` - -### 场景 2:发布版本 - -```bash -# 1. 更新版本号 -vim make_deb.sh # 修改 VERSION="1.0.1" - -# 2. 创建图标(可选) -./create_icon.sh - -# 3. 完整打包 -./build_deb.sh - -# 4. 测试安装 -sudo dpkg -i package/screenlockdemo_1.0.1_amd64.deb - -# 5. 验证功能 -screenlockdemo -``` - -### 场景 3:调试打包问题 - -```bash -# 使用详细版脚本 -./build_deb.sh - -# 查看 AppDir 内容 -ls -lR package/AppDir/ - -# 查看 DEB 包内容 -dpkg -c package/screenlockdemo_1.0.0_amd64.deb - -# 查看包信息 -dpkg -I package/screenlockdemo_1.0.0_amd64.deb -``` - ---- - -## ⚠️ 常见问题速查 - -### 问题:linuxdeployqt 未找到 - -```bash -# 检查路径 -ls $HOME/dev/sunvpack-py/bin/linuxdeployqt - -# 如果路径不同,修改脚本中的 LINUXDEPLOYQT 变量 -``` - -### 问题:Qt 未找到 - -```bash -# 检查 Qt 目录 -ls $HOME/sdk/qt-5.15.2 - -# 如果路径不同,修改脚本中的 QT_DIR 变量 -``` - -### 问题:程序无法启动 - -```bash -# 查看错误信息 -/opt/screenlockdemo/bin/ScreenLockDemo - -# 检查库依赖 -ldd /opt/screenlockdemo/bin/ScreenLockDemo - -# 安装缺失的系统库 -sudo apt-get install libgl1 libx11-6 libxcb-xinerama0 -``` - -### 问题:桌面图标不显示 - -```bash -# 更新图标缓存 -sudo gtk-update-icon-cache -f /usr/share/icons/hicolor - -# 更新桌面数据库 -sudo update-desktop-database -``` - ---- - -## 🔄 修改版本号 - -### 在 make_deb.sh 中 - -```bash -# 第 7 行 -VERSION="1.0.0" # 改为新版本,如 "1.0.1" -``` - -### 在 build_deb.sh 中 - -```bash -# 第 14 行 -VERSION="1.0.0" # 改为新版本,如 "1.0.1" -``` - -### 在 debian/changelog 中 - -```bash -screenlockdemo (1.0.1-1) unstable; urgency=low - - * 更新内容描述 - - -- 维护者 Mon, 15 Jan 2024 12:00:00 +0800 -``` - ---- - -## 📚 更多信息 - -- **详细文档**:查看 `DEB_PACKAGE.md` (460+ 行完整指南) -- **项目文档**:查看 `README.md` -- **架构说明**:查看 `ARCHITECTURE.md` - ---- - -## 🎉 成功标志 - -打包成功后,你应该看到: - -``` -========================================= -✓ 打包成功! -========================================= -包文件: deb_package/screenlockdemo_1.0.0_amd64.deb -大小: 52M - -安装: sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb -卸载: sudo dpkg -r screenlockdemo -``` - ---- - -## 📞 下一步 - -1. ✅ 安装测试:`sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb` -2. ✅ 功能测试:运行 `screenlockdemo`,锁屏测试(Ctrl+Alt+L) -3. ✅ 其他系统测试:在不同 Ubuntu 版本上安装测试 -4. ✅ 文档完善:添加真实图标、更新维护者信息 - -**祝打包顺利!** 🚀 \ No newline at end of file diff --git a/PACKAGING_READY.txt b/PACKAGING_READY.txt deleted file mode 100644 index 75601cc..0000000 --- a/PACKAGING_READY.txt +++ /dev/null @@ -1,93 +0,0 @@ -================================================================================ - 🎉 DEB 打包配置已完成!所有环境检查通过! 🎉 -================================================================================ - -✓ linuxdeployqt 工具就绪 -✓ Qt 5.15.2 已安装 -✓ dpkg-deb 打包工具就绪 -✓ 所有配置文件已创建 -✓ 打包脚本已就绪 -✓ 项目已编译 - -================================================================================ - 📦 立即开始打包 -================================================================================ - -【快速打包】 -$ ./make_deb.sh - -【详细打包】 -$ ./build_deb.sh - -打包完成后,DEB 文件位于: - deb_package/screenlockdemo_1.0.0_amd64.deb - -================================================================================ - 📚 文档指南 -================================================================================ - -【快速入门】 - 👉 PACKAGING_README.md - 快速参考指南 (6.8K) - -【详细文档】 - 📖 DEB_PACKAGE.md - 完整打包文档 (9.5K, 460+ 行) - ✅ PACKAGING_CHECKLIST.md - 测试检查清单 (7.9K, 347 行) - 📝 PACKAGING_SUMMARY.txt - 打包总结说明 - -【核心脚本】 - 🚀 make_deb.sh - 快速打包脚本 - 🔧 build_deb.sh - 完整打包脚本 - 🎨 create_icon.sh - 图标生成脚本 - 🔍 check_packaging_env.sh - 环境检查脚本 - -================================================================================ - 🎯 三步完成打包 -================================================================================ - -1️⃣ 打包 - $ ./make_deb.sh - -2️⃣ 安装测试 - $ sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb - -3️⃣ 运行测试 - $ screenlockdemo - -================================================================================ - 💡 关键特性 -================================================================================ - -✓ 使用 linuxdeployqt 自动收集所有 Qt 5.15.2 依赖库 -✓ 打包所有必需的 Qt 库和插件,无需系统安装 Qt -✓ 独立部署,避免依赖冲突 -✓ 支持多个 Ubuntu 版本(18.04, 20.04, 22.04, 24.04) -✓ 完整的文档和测试清单 -✓ 一键打包,简单易用 - -================================================================================ - 📦 DEB 包内容 -================================================================================ - -/opt/screenlockdemo/ - ├── bin/ScreenLockDemo ← 主程序 - ├── lib/ ← Qt 库 + 依赖库 - │ ├── libQt5Core.so.5 - │ ├── libQt5Gui.so.5 - │ ├── libQt5Widgets.so.5 - │ └── ... - ├── plugins/ ← Qt 插件 - │ └── platforms/libqxcb.so - └── screenlockdemo.sh ← 启动脚本 - -/usr/bin/screenlockdemo ← 系统命令 - -预计包大小: 50-80 MB - -================================================================================ - ✨ 立即开始 -================================================================================ - -$ ./make_deb.sh - -祝打包顺利!🚀 - diff --git a/PACKAGING_SUMMARY.txt b/PACKAGING_SUMMARY.txt deleted file mode 100644 index be4c38b..0000000 --- a/PACKAGING_SUMMARY.txt +++ /dev/null @@ -1,289 +0,0 @@ -================================================================================ - Qt Screen Lock Demo - DEB 打包配置完成总结 -================================================================================ - -项目名称: Qt Screen Lock Demo -打包类型: DEB (Debian/Ubuntu) -版本: 1.0.0 -架构: amd64 - -================================================================================ - 已创建的文件清单 -================================================================================ - -【核心打包脚本】 - ✓ make_deb.sh - 快速打包脚本(推荐日常使用) - ✓ build_deb.sh - 完整打包脚本(详细日志,推荐发布) - ✓ create_icon.sh - 图标生成辅助脚本 - -【配置文件】 - ✓ screenlockdemo.desktop - 桌面快捷方式配置 - ✓ debian/control - DEB 包元数据信息 - ✓ debian/copyright - 版权和许可证信息 - ✓ debian/changelog - 版本更新日志 - ✓ debian/rules - 构建规则(Makefile 格式) - ✓ debian/compat - Debian 兼容性版本(9) - -【文档】 - ✓ DEB_PACKAGE.md - 详细打包文档(460+ 行,包含所有细节) - ✓ PACKAGING_README.md - 快速入门指南 - ✓ PACKAGING_CHECKLIST.md - 打包测试检查清单(347 行) - ✓ PACKAGING_SUMMARY.txt - 本总结文档 - -================================================================================ - 快速开始指南 -================================================================================ - -【第一步:环境检查】 - - 1. 检查 linuxdeployqt 工具: - $ ls -lh $HOME/dev/sunvpack-py/bin/linuxdeployqt - - 2. 检查 Qt 5.15.2: - $ ls -d $HOME/sdk/qt-5.15.2 - - 3. 检查打包工具: - $ dpkg-deb --version - -【第二步:执行打包】 - - 方法1 - 快速打包(推荐): - $ chmod +x make_deb.sh - $ ./make_deb.sh - - 方法2 - 详细打包: - $ chmod +x build_deb.sh - $ ./build_deb.sh - -【第三步:测试安装】 - - $ sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb - $ screenlockdemo - -【第四步:卸载】 - - $ sudo dpkg -r screenlockdemo - -================================================================================ - 打包原理说明 -================================================================================ - -【linuxdeployqt 的作用】 - 1. 扫描可执行文件的动态链接依赖 - 2. 自动复制所有 Qt 5.15.2 库到打包目录 - 3. 复制 Qt 插件(platforms, imageformats 等) - 4. 复制其他系统依赖库 - 5. 设置正确的 RPATH,确保程序使用打包的库 - -【打包流程】 - [1/6] 清理目录 - [2/6] 编译项目(如需要) - [3/6] 创建 AppDir 结构 - [4/6] 使用 linuxdeployqt 收集所有依赖 ← 核心步骤 - [5/6] 创建 DEB 包目录结构 - [6/6] 构建 DEB 包 - -【最终 DEB 包结构】 - /opt/screenlockdemo/ - ├── bin/ScreenLockDemo - 主程序 - ├── lib/ - Qt 和依赖库(所有 .so 文件) - ├── plugins/ - Qt 插件 - └── screenlockdemo.sh - 启动包装脚本 - - /usr/bin/screenlockdemo - 系统命令(链接) - /usr/share/applications/ - 桌面快捷方式 - /usr/share/icons/ - 应用图标 - -【为什么这样打包?】 - ✓ 隔离依赖:所有 Qt 库打包在 /opt 下,不依赖系统 Qt - ✓ 避免冲突:不会与系统已安装的 Qt 版本冲突 - ✓ 易于部署:一个包包含所有依赖,可在不同 Ubuntu 版本运行 - ✓ 便于维护:应用程序自带所有必需库,减少部署问题 - -================================================================================ - DEB 包信息 -================================================================================ - -包名: screenlockdemo -版本: 1.0.0-1 -架构: amd64 -预计大小: 50-80 MB(包含完整 Qt 5.15.2) - -依赖: - - dbus - - libx11-6 - - libxext6 - - libxrender1 - - libfontconfig1 - - libfreetype6 - - libglib2.0-0 - - libgl1 - -================================================================================ - 测试要点 -================================================================================ - -【安装后必须测试】 - □ 命令行启动: screenlockdemo - □ 应用菜单启动 - □ 主界面显示正常 - □ 动画效果正常 - □ 锁屏检测(Ctrl+Alt+L)- 动画应停止 - □ 解锁后动画自动恢复 - □ 手动控制按钮功能正常 - □ 无错误信息和崩溃 - -【验证依赖正确】 - $ ldd /opt/screenlockdemo/bin/ScreenLockDemo - 应看到 Qt 库路径指向 /opt/screenlockdemo/lib/ - -【卸载后检查】 - $ sudo dpkg -r screenlockdemo - $ ls /opt/screenlockdemo/ # 应该不存在 - -================================================================================ - 常见问题速查 -================================================================================ - -【问题1】linuxdeployqt 未找到 - 检查: ls $HOME/dev/sunvpack-py/bin/linuxdeployqt - 修改: 编辑脚本中的 LINUXDEPLOYQT 变量 - -【问题2】Qt 目录未找到 - 检查: ls $HOME/sdk/qt-5.15.2 - 修改: 编辑脚本中的 QT_DIR 变量 - -【问题3】程序无法启动 - 诊断: /opt/screenlockdemo/bin/ScreenLockDemo - 检查: ldd /opt/screenlockdemo/bin/ScreenLockDemo - 修复: sudo apt-get install libgl1 libx11-6 libxcb-xinerama0 - -【问题4】Qt 平台插件错误 - 错误: "Could not load the Qt platform plugin xcb" - 检查: ls /opt/screenlockdemo/plugins/platforms/libqxcb.so - 修复: sudo apt-get install libxcb-xinerama0 libxcb-icccm4 - -【问题5】图标不显示 - 修复: sudo gtk-update-icon-cache -f /usr/share/icons/hicolor - sudo update-desktop-database - -================================================================================ - 修改版本号 -================================================================================ - -需要修改以下文件中的版本号: - - 1. make_deb.sh (第7行) - VERSION="1.0.0" → VERSION="1.0.1" - - 2. build_deb.sh (第14行) - VERSION="1.0.0" → VERSION="1.0.1" - - 3. debian/changelog (第1行) - screenlockdemo (1.0.0-1) → screenlockdemo (1.0.1-1) - - 4. CMakeLists.txt (第2行) - project(ScreenLockDemo VERSION 1.0.0 ...) - -================================================================================ - 优化建议 -================================================================================ - -【减小包体积】 - - 使用 strip 命令去除调试符号 - - 排除不需要的 Qt 插件 - - 只包含必需的 Qt 模块 - -【添加真实图标】 - 1. 创建 256x256 PNG 图标 - 2. 保存为 icon.png - 3. 运行 ./create_icon.sh 或直接使用 - -【自定义包信息】 - 编辑 debian/control: - - Maintainer: 您的名字和邮箱 - - Description: 更详细的描述 - - Homepage: 项目主页 - -================================================================================ - 文档资源 -================================================================================ - -详细文档: - - DEB_PACKAGE.md - 完整打包指南(460+ 行) - - PACKAGING_README.md - 快速参考(334 行) - - PACKAGING_CHECKLIST.md - 测试检查清单(347 行) - -项目文档: - - README.md - 项目说明和使用指南 - - ARCHITECTURE.md - 架构设计文档 - - QUICKSTART.md - 快速开始指南 - -================================================================================ - 命令速查表 -================================================================================ - -# 打包 -./make_deb.sh - -# 查看包信息 -dpkg -I deb_package/screenlockdemo_1.0.0_amd64.deb -dpkg -c deb_package/screenlockdemo_1.0.0_amd64.deb - -# 安装 -sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb -sudo apt-get install -f # 修复依赖 - -# 运行 -screenlockdemo - -# 检查依赖 -ldd /opt/screenlockdemo/bin/ScreenLockDemo - -# 卸载 -sudo dpkg -r screenlockdemo - -# 生成校验和 -md5sum deb_package/screenlockdemo_1.0.0_amd64.deb -sha256sum deb_package/screenlockdemo_1.0.0_amd64.deb - -================================================================================ - 发布流程建议 -================================================================================ - -1. 更新版本号(见上文) -2. 更新 debian/changelog -3. 运行完整打包: ./build_deb.sh -4. 在测试环境安装测试 -5. 运行完整功能测试(参考 PACKAGING_CHECKLIST.md) -6. 生成校验和 -7. 准备发布说明 -8. 发布 DEB 包 - -================================================================================ - 结语 -================================================================================ - -✓ DEB 打包配置已完成! -✓ 使用 linuxdeployqt 自动收集所有 Qt 5.15.2 依赖 -✓ 支持独立部署,无需系统安装 Qt -✓ 包含完整的文档和测试清单 - -【下一步】 -1. 运行 ./make_deb.sh 生成 DEB 包 -2. 安装测试: sudo dpkg -i deb_package/screenlockdemo_1.0.0_amd64.deb -3. 功能测试: screenlockdemo -4. 查看详细文档: cat DEB_PACKAGE.md - -【获取帮助】 -- 打包问题: 查看 DEB_PACKAGE.md 的"常见问题"章节 -- 测试指南: 使用 PACKAGING_CHECKLIST.md -- 快速参考: 查看 PACKAGING_README.md - -祝打包顺利!🚀 - -================================================================================ -创建日期: 2024-01-01 -最后更新: 2024-01-01 -版本: 1.0.0 -================================================================================ diff --git a/QUICKFIX_LOCK_SIGNALS.md b/QUICKFIX_LOCK_SIGNALS.md deleted file mode 100644 index 0865f3d..0000000 --- a/QUICKFIX_LOCK_SIGNALS.md +++ /dev/null @@ -1,355 +0,0 @@ -# 锁屏信号问题快速修复指南 - -## 问题症状 - -✗ 程序显示"已成功连接到目标系统的服务" -✗ 但锁屏时 `onSessionLocked()` 没有被调用 -✗ Ubuntu 和 Deepin 系统都有此问题 - -## 快速解决方案 - -### 🚀 一键验证修复 - -已经重新编译,直接运行验证脚本: - -```bash -./verify_fix.sh -``` - -这个脚本会: -1. 检查编译状态 -2. 显示系统环境信息 -3. 检测可用的 DBus 服务 -4. 启动程序并提示如何测试 - -### 📋 核心修复内容 - -#### 修复 1: 动态获取会话路径 - -**问题**: 原代码使用固定路径 `/org/freedesktop/login1/session/auto`,在大多数系统上不工作 - -**修复**: 新增方法动态获取实际会话路径 - -```cpp -QString getCurrentSessionPath() { - // 从环境变量 XDG_SESSION_ID 获取 - // 或通过 DBus 调用 GetSessionByPID 获取 -} -``` - -#### 修复 2: 广播式信号监听 - -**问题**: 只监听特定路径的信号 - -**修复**: 添加空路径监听(监听所有会话) - -```cpp -// 监听所有 session 的 Lock/Unlock 信号 -QDBusConnection::systemBus().connect( - "org.freedesktop.login1", - "", // 空路径 = 监听所有对象 - "org.freedesktop.login1.Session", - "Lock", - this, - SLOT(onSessionLocked()) -); -``` - -#### 修复 3: 增强调试信息 - -**问题**: 无法判断问题出在哪个环节 - -**修复**: -- 继承 `QDBusContext` 获取信号详情 -- 在关键点添加详细日志 -- 显示信号的来源路径和接口 - -## 验证修复是否生效 - -### 预期的启动日志 - -``` -================================================= -Initializing ScreenLockDetector... -================================================= - ---- Connecting to Login Manager (systemd-logind) --- -Session path from XDG_SESSION_ID: /org/freedesktop/login1/session/c1 -Current session path: /org/freedesktop/login1/session/c1 -Login Manager interface is valid for session: ... -Session Lock signal connected: true ← ✓ 应该是 true -Session Unlock signal connected: true ← ✓ 应该是 true - -================================================= -ScreenLockDetector initialized successfully -Login Manager connected: true ← ✓ 至少一个为 true -================================================= -``` - -### 预期的锁屏日志 - -当你按 `Super+L` 或 `Ctrl+Alt+L` 锁屏后: - -``` -################################################## -## LOCK SIGNAL RECEIVED -## Screen is now LOCKED -## DBus Message Details: -## Service: :1.43 -## Path: /org/freedesktop/login1/session/c1 -## Interface: org.freedesktop.login1.Session -## Member: Lock -################################################## -``` - -## 如果还是不工作 - -### 🔍 调试步骤 - -#### 步骤 1: 检查实际发送的信号 - -运行监听脚本: - -```bash -./test_lock_signals.sh -``` - -按提示锁屏/解锁,观察哪些信号被发出。 - -#### 步骤 2: 手动测试 DBus - -在一个终端运行: - -```bash -dbus-monitor --system "type='signal',interface='org.freedesktop.login1.Session'" -``` - -在另一个终端锁屏: - -```bash -# GNOME/Ubuntu -gnome-screensaver-command -l - -# 或通用方法 -loginctl lock-session - -# Deepin -dde-lock -``` - -观察是否有 `Lock` 信号出现。 - -#### 步骤 3: 检查会话状态 - -```bash -# 查看会话 ID -echo $XDG_SESSION_ID - -# 查看会话详情 -loginctl show-session $XDG_SESSION_ID - -# 列出所有会话 -loginctl list-sessions -``` - -确保你的会话是活动的,类型是 `x11` 或 `wayland`。 - -#### 步骤 4: 检查权限 - -```bash -# 当前用户的组 -groups - -# 测试是否能访问 systemd-logind -dbus-send --system --print-reply \ - --dest=org.freedesktop.login1 \ - /org/freedesktop/login1 \ - org.freedesktop.DBus.Introspectable.Introspect -``` - -### 🔧 特定系统的额外步骤 - -#### Ubuntu / GNOME 系统 - -如果 systemd-logind 不工作,检查 GNOME ScreenSaver: - -```bash -# 检查服务是否存在 -dbus-send --session --print-reply \ - --dest=org.gnome.ScreenSaver \ - /org/gnome/ScreenSaver \ - org.freedesktop.DBus.Introspectable.Introspect - -# 监听 GNOME 信号 -dbus-monitor --session "interface='org.gnome.ScreenSaver'" - -# 锁屏 -gnome-screensaver-command -l -``` - -#### Deepin 系统 - -运行 Deepin 专用调试脚本: - -```bash -./debug_deepin_dbus.sh -``` - -这会显示所有可用的 Deepin 锁屏服务,然后实时监听信号。 - -常见的 Deepin 服务名: -- `com.deepin.dde.lockFront` -- `org.deepin.dde.lockFront` -- `com.deepin.ScreenSaver` - -#### Wayland 会话 - -Wayland 可能有不同的行为: - -```bash -# 检查会话类型 -echo $XDG_SESSION_TYPE - -# 如果是 wayland,可能需要使用不同的方法 -# 某些 Wayland 合成器使用自己的锁屏协议 -``` - -## 常见问题解答 - -### Q: 为什么连接显示成功但收不到信号? - -**A**: 可能原因: -1. **路径不对**: 连接到了错误的会话路径 -2. **时机问题**: 信号在连接之前就发送了 -3. **权限问题**: 没有权限监听 system bus 信号 -4. **桌面环境**: 使用了非标准的锁屏机制 - -**解决**: 使用 `test_lock_signals.sh` 查看实际信号 - -### Q: 在虚拟机中测试有问题吗? - -**A**: 可能会有。确保: -- ✓ 使用完整的桌面环境(不是最小化安装) -- ✓ 通过图形界面登录(不是 SSH) -- ✓ 虚拟机有足够的资源 -- ✓ 安装了 Guest Additions / Tools - -### Q: 日志显示 "connected: true" 但还是没反应? - -**A**: 这说明连接成功了,但信号可能: -1. 使用了不同的信号名(如 `Locked` vs `Lock`) -2. 从不同的路径发出 -3. 带有额外的参数 - -运行 `dbus-monitor` 直接查看: - -```bash -# 监听所有 session bus 信号 -dbus-monitor --session "type='signal'" | grep -i lock - -# 监听所有 system bus 信号 -dbus-monitor --system "type='signal'" | grep -i lock -``` - -### Q: Deepin 系统上完全不工作? - -**A**: Deepin 不同版本的接口差异很大: - -1. 找到正确的服务名: - ```bash - dbus-send --session --print-reply \ - --dest=org.freedesktop.DBus \ - /org/freedesktop/DBus \ - org.freedesktop.DBus.ListNames | grep -i deepin - ``` - -2. 查看服务接口: - ```bash - dbus-send --session --print-reply \ - --dest=com.deepin.dde.lockFront \ - /com/deepin/dde/lockFront \ - org.freedesktop.DBus.Introspectable.Introspect - ``` - -3. 修改 `screenlockdetector.cpp` 中 `connectToDeepinDDE()` 的服务列表 - -## 技术细节 - -### 为什么需要空路径监听? - -DBus 信号连接时指定路径会限制只接收该对象的信号。使用空路径 `""` 表示监听该接口的所有对象的信号。 - -```cpp -// 只监听特定会话 -connect("service", "/path/to/session1", "interface", "signal", ...) - -// 监听所有会话(推荐) -connect("service", "", "interface", "signal", ...) -``` - -### QDBusContext 的作用 - -继承 `QDBusContext` 后,在 slot 函数中可以调用 `message()` 获取触发信号的详细信息: - -```cpp -QDBusMessage msg = QDBusContext::message(); -qDebug() << "Signal from:" << msg.service() << msg.path(); -``` - -这对调试非常有用。 - -### systemd-logind Session 接口 - -标准接口应该有这些信号: -- `Lock` - 会话锁定 -- `Unlock` - 会话解锁 -- `PauseDevice` - 设备暂停 -- `ResumeDevice` - 设备恢复 - -和这些属性: -- `LockedHint` - 布尔值,指示会话是否锁定 -- `Active` - 会话是否活动 -- `Type` - 会话类型(x11, wayland, tty 等) - -## 获取帮助 - -如果以上方法都不行,请提供以下信息: - -1. **系统信息**: - ```bash - cat /etc/os-release - echo "Desktop: $XDG_CURRENT_DESKTOP" - echo "Session: $XDG_SESSION_TYPE" - ``` - -2. **会话信息**: - ```bash - loginctl show-session $XDG_SESSION_ID - ``` - -3. **程序输出**: 运行 `./run.sh` 的完整输出 - -4. **信号监听结果**: 运行 `./test_lock_signals.sh` 的输出 - -5. **手动测试结果**: - ```bash - dbus-monitor --system "type='signal'" | grep -i lock - # 然后锁屏,记录输出 - ``` - -## 相关文档 - -- 📖 详细修复说明: `LOCK_SIGNAL_FIX.md` -- 🔧 Deepin 支持: `DEEPIN_SUPPORT.md` -- 🏗️ 架构文档: `ARCHITECTURE.md` -- 📝 项目概览: `PROJECT_OVERVIEW.md` - -## 总结 - -核心修复点: -1. ✅ 动态获取会话路径(不硬编码 "auto") -2. ✅ 空路径监听(接收所有会话信号) -3. ✅ 详细调试日志(便于诊断) -4. ✅ 多重连接策略(提高兼容性) - -大多数情况下,这些修复应该能解决问题。如果还有问题,使用提供的调试工具找出系统实际使用的信号机制。 \ No newline at end of file diff --git a/build_deb.sh b/build_deb.sh deleted file mode 100755 index 8e45eae..0000000 --- a/build_deb.sh +++ /dev/null @@ -1,256 +0,0 @@ -#!/bin/bash - -set -e - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# 配置变量 -APP_NAME="ScreenLockDemo" -PACKAGE_NAME="screenlockdemo" -VERSION="1.0.0" -ARCH="amd64" -QT_DIR="$HOME/sdk/qt-5.15.2" -LINUXDEPLOYQT="$HOME/dev/sunvpack-py/bin/linuxdeployqt" -BUILD_DIR="$(pwd)/build" -PACKAGE_DIR="$(pwd)/package" -DEB_DIR="${PACKAGE_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}" - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Qt Screen Lock Demo - DEB 打包脚本${NC}" -echo -e "${BLUE}========================================${NC}" - -# 检查 linuxdeployqt 是否存在 -if [ ! -f "$LINUXDEPLOYQT" ]; then - echo -e "${RED}错误: linuxdeployqt 未找到: $LINUXDEPLOYQT${NC}" - exit 1 -fi - -# 检查 Qt 目录是否存在 -if [ ! -d "$QT_DIR" ]; then - echo -e "${RED}错误: Qt 目录未找到: $QT_DIR${NC}" - exit 1 -fi - -# 清理之前的打包目录 -echo -e "${YELLOW}[1/8] 清理之前的打包目录...${NC}" -rm -rf "$PACKAGE_DIR" -mkdir -p "$PACKAGE_DIR" - -# 编译项目 -echo -e "${YELLOW}[2/8] 编译项目...${NC}" -if [ ! -f "$BUILD_DIR/bin/$APP_NAME" ]; then - echo -e "${BLUE}运行编译脚本...${NC}" - ./build.sh -fi - -if [ ! -f "$BUILD_DIR/bin/$APP_NAME" ]; then - echo -e "${RED}错误: 编译失败,可执行文件未找到${NC}" - exit 1 -fi - -echo -e "${GREEN}✓ 编译成功${NC}" - -# 创建 AppDir 结构 -echo -e "${YELLOW}[3/8] 创建 AppDir 结构...${NC}" -APPDIR="${PACKAGE_DIR}/AppDir" -mkdir -p "${APPDIR}/usr/bin" -mkdir -p "${APPDIR}/usr/lib" -mkdir -p "${APPDIR}/usr/share/applications" -mkdir -p "${APPDIR}/usr/share/icons/hicolor/256x256/apps" - -# 复制可执行文件 -cp "$BUILD_DIR/bin/$APP_NAME" "${APPDIR}/usr/bin/" -chmod +x "${APPDIR}/usr/bin/$APP_NAME" - -# 创建简单图标(如果没有的话) -if [ ! -f "icon.png" ]; then - echo -e "${BLUE}创建默认图标...${NC}" - # 这里只是创建一个占位符,实际应该有真实的图标 - touch "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" -else - cp icon.png "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" -fi - -# 复制 desktop 文件 -cp screenlockdemo.desktop "${APPDIR}/usr/share/applications/" - -echo -e "${GREEN}✓ AppDir 结构创建完成${NC}" - -# 使用 linuxdeployqt 收集依赖 -echo -e "${YELLOW}[4/8] 使用 linuxdeployqt 收集所有依赖...${NC}" -export PATH="${QT_DIR}/bin:$PATH" -export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:${QT_DIR}/lib:$LD_LIBRARY_PATH" - -cd "$PACKAGE_DIR" -"$LINUXDEPLOYQT" "${APPDIR}/usr/bin/$APP_NAME" \ - -verbose=2 \ - -bundle-non-qt-libs \ - -no-translations \ - -qmake="${QT_DIR}/bin/qmake" - -cd - > /dev/null - -echo -e "${GREEN}✓ 依赖收集完成${NC}" - -# 创建 DEB 包目录结构 -echo -e "${YELLOW}[5/8] 创建 DEB 包目录结构...${NC}" -mkdir -p "${DEB_DIR}/opt/${PACKAGE_NAME}" -mkdir -p "${DEB_DIR}/usr/bin" -mkdir -p "${DEB_DIR}/usr/share/applications" -mkdir -p "${DEB_DIR}/usr/share/icons/hicolor/256x256/apps" -mkdir -p "${DEB_DIR}/DEBIAN" - -# 复制 AppDir 内容到 /opt -cp -r "${APPDIR}/usr/bin" "${DEB_DIR}/opt/${PACKAGE_NAME}/" -cp -r "${APPDIR}/usr/lib" "${DEB_DIR}/opt/${PACKAGE_NAME}/" - -# 如果有 Qt plugins -if [ -d "${APPDIR}/usr/plugins" ]; then - cp -r "${APPDIR}/usr/plugins" "${DEB_DIR}/opt/${PACKAGE_NAME}/" -fi - -# 如果有 Qt 库目录 -if [ -d "${APPDIR}/usr/lib" ]; then - mkdir -p "${DEB_DIR}/opt/${PACKAGE_NAME}/lib" - cp -r "${APPDIR}/usr/lib"/* "${DEB_DIR}/opt/${PACKAGE_NAME}/lib/" 2>/dev/null || true -fi - -# 创建启动脚本 -cat > "${DEB_DIR}/opt/${PACKAGE_NAME}/bin/${APP_NAME}.sh" << 'EOF' -#!/bin/bash -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -APP_DIR="$(dirname "$SCRIPT_DIR")" -export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:${APP_DIR}/lib:$LD_LIBRARY_PATH" -export QT_PLUGIN_PATH="${APP_DIR}/plugins" -exec "${SCRIPT_DIR}/ScreenLockDemo" "$@" -EOF - -chmod +x "${DEB_DIR}/opt/${PACKAGE_NAME}/bin/${APP_NAME}.sh" - -# 创建 /usr/bin 软链接 -cat > "${DEB_DIR}/usr/bin/${PACKAGE_NAME}" << 'EOF' -#!/bin/bash -exec /opt/screenlockdemo/bin/ScreenLockDemo.sh "$@" -EOF - -chmod +x "${DEB_DIR}/usr/bin/${PACKAGE_NAME}" - -# 复制 desktop 文件和图标 -sed "s|Exec=.*|Exec=/usr/bin/${PACKAGE_NAME}|g" screenlockdemo.desktop > "${DEB_DIR}/usr/share/applications/${PACKAGE_NAME}.desktop" -sed -i "s|Icon=.*|Icon=${PACKAGE_NAME}|g" "${DEB_DIR}/usr/share/applications/${PACKAGE_NAME}.desktop" - -if [ -f "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" ]; then - cp "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" \ - "${DEB_DIR}/usr/share/icons/hicolor/256x256/apps/" -fi - -echo -e "${GREEN}✓ DEB 包目录结构创建完成${NC}" - -# 创建 DEBIAN/control 文件 -echo -e "${YELLOW}[6/8] 创建控制文件...${NC}" - -# 计算安装大小 (KB) -INSTALLED_SIZE=$(du -sk "${DEB_DIR}/opt" | cut -f1) - -cat > "${DEB_DIR}/DEBIAN/control" << EOF -Package: ${PACKAGE_NAME} -Version: ${VERSION} -Section: utils -Priority: optional -Architecture: ${ARCH} -Installed-Size: ${INSTALLED_SIZE} -Maintainer: Qt Screen Lock Demo -Depends: dbus, libx11-6, libxext6, libxrender1, libfontconfig1, libfreetype6, libglib2.0-0, libgl1 -Description: Qt Screen Lock Detection Demo Application - A Qt5-based Linux application that detects Ubuntu system lock/unlock - events and automatically stops Paint events when the screen is locked. - . - Features: - - Automatic screen lock detection via DBus - - Automatic paint event control - - Real-time animation demonstration - - Support for multiple desktop environments (GNOME, KDE, XFCE) - - Manual control and status monitoring - . - This package includes all required Qt5 libraries and dependencies. -EOF - -echo -e "${GREEN}✓ 控制文件创建完成${NC}" - -# 创建 postinst 脚本(安装后脚本) -echo -e "${YELLOW}[7/8] 创建安装脚本...${NC}" - -cat > "${DEB_DIR}/DEBIAN/postinst" << 'EOF' -#!/bin/bash -set -e - -# 更新桌面数据库 -if [ -x /usr/bin/update-desktop-database ]; then - update-desktop-database -q -fi - -# 更新图标缓存 -if [ -x /usr/bin/gtk-update-icon-cache ]; then - gtk-update-icon-cache -q -f /usr/share/icons/hicolor 2>/dev/null || true -fi - -echo "Screen Lock Demo 安装完成!" -echo "可以通过命令 'screenlockdemo' 启动,或在应用程序菜单中找到它。" - -exit 0 -EOF - -chmod 755 "${DEB_DIR}/DEBIAN/postinst" - -# 创建 prerm 脚本(卸载前脚本) -cat > "${DEB_DIR}/DEBIAN/prerm" << 'EOF' -#!/bin/bash -set -e - -exit 0 -EOF - -chmod 755 "${DEB_DIR}/DEBIAN/prerm" - -echo -e "${GREEN}✓ 安装脚本创建完成${NC}" - -# 构建 DEB 包 -echo -e "${YELLOW}[8/8] 构建 DEB 包...${NC}" - -# 设置正确的权限 -find "${DEB_DIR}" -type d -exec chmod 755 {} \; -find "${DEB_DIR}/opt/${PACKAGE_NAME}/bin" -type f -exec chmod 755 {} \; - -DEB_FILE="${PACKAGE_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}.deb" - -dpkg-deb --build "${DEB_DIR}" "$DEB_FILE" - -if [ -f "$DEB_FILE" ]; then - echo -e "${GREEN}========================================${NC}" - echo -e "${GREEN}✓ DEB 包构建成功!${NC}" - echo -e "${GREEN}========================================${NC}" - echo -e "${BLUE}包位置: ${DEB_FILE}${NC}" - echo -e "${BLUE}包大小: $(du -h "$DEB_FILE" | cut -f1)${NC}" - echo "" - echo -e "${YELLOW}安装命令:${NC}" - echo -e " sudo dpkg -i $DEB_FILE" - echo "" - echo -e "${YELLOW}如果有依赖问题,运行:${NC}" - echo -e " sudo apt-get install -f" - echo "" - echo -e "${YELLOW}卸载命令:${NC}" - echo -e " sudo dpkg -r ${PACKAGE_NAME}" - echo "" - echo -e "${YELLOW}查看包信息:${NC}" - echo -e " dpkg -I $DEB_FILE" - echo -e " dpkg -c $DEB_FILE" - echo "" -else - echo -e "${RED}错误: DEB 包构建失败${NC}" - exit 1 -fi diff --git a/check_packaging_env.sh b/check_packaging_env.sh deleted file mode 100755 index a94f848..0000000 --- a/check_packaging_env.sh +++ /dev/null @@ -1,235 +0,0 @@ -#!/bin/bash - -# Qt Screen Lock Demo - 打包环境检查脚本 -# 用于验证所有打包依赖是否就绪 - -set -e - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE} 打包环境检查${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -ERRORS=0 -WARNINGS=0 - -# 检查函数 -check_success() { - echo -e "${GREEN}✓${NC} $1" -} - -check_fail() { - echo -e "${RED}✗${NC} $1" - ERRORS=$((ERRORS + 1)) -} - -check_warn() { - echo -e "${YELLOW}⚠${NC} $1" - WARNINGS=$((WARNINGS + 1)) -} - -# 1. 检查 linuxdeployqt -echo -e "${YELLOW}[1/7] 检查 linuxdeployqt...${NC}" -LINUXDEPLOYQT="$HOME/dev/sunvpack-py/bin/linuxdeployqt" -if [ -f "$LINUXDEPLOYQT" ]; then - check_success "linuxdeployqt 存在: $LINUXDEPLOYQT" - if [ -x "$LINUXDEPLOYQT" ]; then - check_success "linuxdeployqt 可执行" - else - check_warn "linuxdeployqt 不可执行,尝试添加执行权限" - chmod +x "$LINUXDEPLOYQT" 2>/dev/null && check_success "权限已修复" || check_fail "无法修改权限" - fi -else - check_fail "linuxdeployqt 未找到: $LINUXDEPLOYQT" - echo -e " ${YELLOW}提示: 请确保 linuxdeployqt 安装在该路径${NC}" -fi -echo "" - -# 2. 检查 Qt 5.15.2 -echo -e "${YELLOW}[2/7] 检查 Qt 5.15.2...${NC}" -QT_DIR="$HOME/sdk/qt-5.15.2" -if [ -d "$QT_DIR" ]; then - check_success "Qt 目录存在: $QT_DIR" - - # 检查关键文件 - if [ -f "$QT_DIR/bin/qmake" ]; then - check_success "qmake 存在" - QT_VERSION=$("$QT_DIR/bin/qmake" -query QT_VERSION 2>/dev/null || echo "unknown") - echo -e " ${BLUE}Qt 版本: $QT_VERSION${NC}" - else - check_fail "qmake 未找到" - fi - - if [ -d "$QT_DIR/lib" ]; then - check_success "Qt 库目录存在" - else - check_fail "Qt 库目录未找到" - fi - - if [ -d "$QT_DIR/plugins" ]; then - check_success "Qt 插件目录存在" - else - check_warn "Qt 插件目录未找到" - fi -else - check_fail "Qt 目录未找到: $QT_DIR" - echo -e " ${YELLOW}提示: 请确保 Qt 5.15.2 安装在该路径${NC}" -fi -echo "" - -# 3. 检查 dpkg 工具 -echo -e "${YELLOW}[3/7] 检查 dpkg 打包工具...${NC}" -if command -v dpkg-deb &> /dev/null; then - check_success "dpkg-deb 已安装" - DPKG_VERSION=$(dpkg-deb --version | head -n1) - echo -e " ${BLUE}$DPKG_VERSION${NC}" -else - check_fail "dpkg-deb 未安装" - echo -e " ${YELLOW}安装命令: sudo apt-get install dpkg-dev${NC}" -fi - -if command -v debhelper &> /dev/null || dpkg -l debhelper &> /dev/null; then - check_success "debhelper 已安装" -else - check_warn "debhelper 未安装(可选)" - echo -e " ${YELLOW}安装命令: sudo apt-get install debhelper${NC}" -fi -echo "" - -# 4. 检查项目文件 -echo -e "${YELLOW}[4/7] 检查项目文件...${NC}" -if [ -f "CMakeLists.txt" ]; then - check_success "CMakeLists.txt 存在" -else - check_fail "CMakeLists.txt 未找到" -fi - -if [ -f "screenlockdemo.desktop" ]; then - check_success "desktop 文件存在" -else - check_fail "screenlockdemo.desktop 未找到" -fi - -if [ -d "debian" ]; then - check_success "debian/ 配置目录存在" - - # 检查必需的 debian 文件 - for file in control copyright changelog compat rules; do - if [ -f "debian/$file" ]; then - check_success "debian/$file 存在" - else - check_fail "debian/$file 未找到" - fi - done -else - check_fail "debian/ 配置目录未找到" -fi -echo "" - -# 5. 检查打包脚本 -echo -e "${YELLOW}[5/7] 检查打包脚本...${NC}" -if [ -f "make_deb.sh" ]; then - check_success "make_deb.sh 存在" - if [ -x "make_deb.sh" ]; then - check_success "make_deb.sh 可执行" - else - check_warn "make_deb.sh 不可执行" - chmod +x make_deb.sh 2>/dev/null && check_success "权限已修复" || check_fail "无法修改权限" - fi -else - check_fail "make_deb.sh 未找到" -fi - -if [ -f "build_deb.sh" ]; then - check_success "build_deb.sh 存在" - if [ -x "build_deb.sh" ]; then - check_success "build_deb.sh 可执行" - else - check_warn "build_deb.sh 不可执行" - chmod +x build_deb.sh 2>/dev/null && check_success "权限已修复" || check_fail "无法修改权限" - fi -else - check_fail "build_deb.sh 未找到" -fi -echo "" - -# 6. 检查编译环境 -echo -e "${YELLOW}[6/7] 检查编译环境...${NC}" -if command -v cmake &> /dev/null; then - check_success "CMake 已安装" - CMAKE_VERSION=$(cmake --version | head -n1) - echo -e " ${BLUE}$CMAKE_VERSION${NC}" -else - check_fail "CMake 未安装" - echo -e " ${YELLOW}安装命令: sudo apt-get install cmake${NC}" -fi - -if command -v g++ &> /dev/null; then - check_success "G++ 编译器已安装" - GCC_VERSION=$(g++ --version | head -n1) - echo -e " ${BLUE}$GCC_VERSION${NC}" -else - check_fail "G++ 未安装" - echo -e " ${YELLOW}安装命令: sudo apt-get install build-essential${NC}" -fi - -if [ -f "build.sh" ]; then - check_success "build.sh 存在" -else - check_warn "build.sh 未找到" -fi -echo "" - -# 7. 检查可执行文件 -echo -e "${YELLOW}[7/7] 检查已编译的程序...${NC}" -if [ -f "build/bin/ScreenLockDemo" ]; then - check_success "ScreenLockDemo 可执行文件存在" - echo -e " ${BLUE}位置: build/bin/ScreenLockDemo${NC}" -else - check_warn "ScreenLockDemo 尚未编译" - echo -e " ${YELLOW}提示: 运行 ./build.sh 进行编译${NC}" -fi -echo "" - -# 总结 -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE} 检查结果总结${NC}" -echo -e "${BLUE}========================================${NC}" - -if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then - echo -e "${GREEN}✓ 完美!所有检查通过${NC}" - echo -e "${GREEN}✓ 打包环境已就绪${NC}" - echo "" - echo -e "${BLUE}下一步:${NC}" - echo -e " 1. 运行打包: ${YELLOW}./make_deb.sh${NC}" - echo -e " 2. 或详细打包: ${YELLOW}./build_deb.sh${NC}" - exit 0 -elif [ $ERRORS -eq 0 ]; then - echo -e "${YELLOW}⚠ 有 $WARNINGS 个警告${NC}" - echo -e "${YELLOW}可以继续打包,但建议解决警告项${NC}" - echo "" - echo -e "${BLUE}下一步:${NC}" - echo -e " 运行打包: ${YELLOW}./make_deb.sh${NC}" - exit 0 -else - echo -e "${RED}✗ 发现 $ERRORS 个错误${NC}" - if [ $WARNINGS -gt 0 ]; then - echo -e "${YELLOW}⚠ 另有 $WARNINGS 个警告${NC}" - fi - echo "" - echo -e "${RED}请先解决上述错误,然后重新运行此脚本${NC}" - echo "" - echo -e "${BLUE}常见解决方案:${NC}" - echo -e " • linuxdeployqt: 确保路径正确或安装到指定位置" - echo -e " • Qt 5.15.2: 确保安装在 \$HOME/sdk/qt-5.15.2" - echo -e " • dpkg-deb: sudo apt-get install dpkg-dev debhelper" - echo -e " • 编译工具: sudo apt-get install cmake build-essential" - exit 1 -fi diff --git a/debug_deepin_dbus.sh b/debug_deepin_dbus.sh deleted file mode 100755 index ac41066..0000000 --- a/debug_deepin_dbus.sh +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/bash - -# ======================================== -# Deepin DBus 信号调试脚本 -# 用于监听和分析 Deepin 锁屏相关的 DBus 信号 -# ======================================== - -echo "========================================" -echo "Deepin DBus Signal Debug Tool" -echo "========================================" -echo "" - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' # No Color - -# 检查必要的工具 -echo "Checking required tools..." -if ! command -v dbus-monitor &> /dev/null; then - echo -e "${RED}✗${NC} dbus-monitor not found. Please install: sudo apt install dbus" - exit 1 -fi - -if ! command -v dbus-send &> /dev/null; then - echo -e "${RED}✗${NC} dbus-send not found. Please install: sudo apt install dbus" - exit 1 -fi - -echo -e "${GREEN}✓${NC} All required tools available" -echo "" - -# 列出可能的 Deepin 相关服务 -echo "========================================" -echo "Step 1: Searching for Deepin DBus services" -echo "========================================" -echo "" - -echo "Session Bus Services:" -dbus-send --session --print-reply --dest=org.freedesktop.DBus \ - /org/freedesktop/DBus org.freedesktop.DBus.ListNames 2>/dev/null | \ - grep -i "deepin" || echo "No Deepin services found on session bus" - -echo "" -echo "System Bus Services:" -dbus-send --system --print-reply --dest=org.freedesktop.DBus \ - /org/freedesktop/DBus org.freedesktop.DBus.ListNames 2>/dev/null | \ - grep -i "deepin" || echo "No Deepin services found on system bus" - -echo "" -echo "========================================" -echo "Step 2: Checking common Deepin lock services" -echo "========================================" -echo "" - -# 常见的 Deepin 锁屏服务列表 -SERVICES=( - "com.deepin.dde.lockFront" - "com.deepin.dde.LockFront" - "com.deepin.ScreenSaver" - "com.deepin.SessionManager" - "com.deepin.daemon.LockService" - "org.deepin.dde.lockFront" - "org.deepin.dde.LockService" -) - -FOUND_SERVICES=() - -for service in "${SERVICES[@]}"; do - echo -n "Checking $service ... " - if dbus-send --session --print-reply --dest="$service" / org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}✓ Found (Session)${NC}" - FOUND_SERVICES+=("$service:session") - elif dbus-send --system --print-reply --dest="$service" / org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}✓ Found (System)${NC}" - FOUND_SERVICES+=("$service:system") - else - echo -e "${RED}✗ Not found${NC}" - fi -done - -echo "" - -if [ ${#FOUND_SERVICES[@]} -eq 0 ]; then - echo -e "${YELLOW}⚠ No Deepin lock services found${NC}" - echo "" - echo "Possible reasons:" - echo " 1. Not running on Deepin OS" - echo " 2. DDE lock service not started" - echo " 3. Service names have changed in your Deepin version" - echo "" - echo "Let's monitor ALL session bus signals to find the right one..." - echo "" -fi - -# 显示找到的服务详情 -if [ ${#FOUND_SERVICES[@]} -gt 0 ]; then - echo "========================================" - echo "Step 3: Service Details" - echo "========================================" - echo "" - - for entry in "${FOUND_SERVICES[@]}"; do - service="${entry%:*}" - bus="${entry#*:}" - - echo -e "${CYAN}=== $service ($bus bus) ===${NC}" - - if [ "$bus" = "session" ]; then - BUS_OPTION="--session" - else - BUS_OPTION="--system" - fi - - # 尝试获取接口详情 - dbus-send $BUS_OPTION --print-reply --dest="$service" / \ - org.freedesktop.DBus.Introspectable.Introspect 2>/dev/null | \ - grep -E "interface name|signal name|method name" | head -20 - - echo "" - done -fi - -echo "========================================" -echo "Step 4: Monitor DBus Signals" -echo "========================================" -echo "" -echo "This will monitor DBus signals in REAL-TIME." -echo "Please follow these steps:" -echo "" -echo " 1. Keep this terminal visible" -echo " 2. Lock your screen using:" -echo " - Press ${BLUE}Super + L${NC}" -echo " - Or run: ${BLUE}dde-lock${NC}" -echo " 3. Observe the signals that appear" -echo " 4. Unlock your screen" -echo " 5. Press ${RED}Ctrl+C${NC} to stop monitoring" -echo "" -echo "We'll look for signals containing: lock, Lock, screen, Screen" -echo "" - -read -p "Press ENTER to start monitoring, or Ctrl+C to cancel..." -echo "" -echo -e "${GREEN}Monitoring started...${NC}" -echo "========================================" -echo "" - -# 创建临时文件记录所有信号 -TEMP_LOG="/tmp/deepin_dbus_signals_$(date +%s).log" - -# 启动监听(过滤可能相关的信号) -dbus-monitor --session "type='signal'" 2>&1 | \ - grep --line-buffered -iE "signal|lock|Lock|screen|Screen|Active|session|Session" | \ - tee "$TEMP_LOG" | \ - while IFS= read -r line; do - if echo "$line" | grep -q "signal"; then - echo -e "${YELLOW}$line${NC}" - elif echo "$line" | grep -iq "lock"; then - echo -e "${GREEN}$line${NC}" - else - echo "$line" - fi - done - -echo "" -echo "Log saved to: $TEMP_LOG" diff --git a/make_deb.sh b/make_deb.sh index d612667..4466257 100755 --- a/make_deb.sh +++ b/make_deb.sh @@ -2,63 +2,90 @@ set -e +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + # 配置变量 APP_NAME="ScreenLockDemo" PACKAGE_NAME="screenlockdemo" VERSION="1.0.0" ARCH="amd64" QT_DIR="$HOME/sdk/qt-5.15.2" -LINUXDEPLOYQT="$HOME/dev/sunvpack-py/bin/linuxdeployqt" +LINUXDEPLOYQT="${LINUXDEPLOYQT:-$HOME/tools/sunvpack-py/bin/linuxdeployqt}" BUILD_DIR="$(pwd)/build" -PACKAGE_DIR="$(pwd)/deb_package" +PACKAGE_DIR="$(pwd)/package" +DEB_DIR="${PACKAGE_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}" -echo "=========================================" -echo "Qt Screen Lock Demo - 快速 DEB 打包" -echo "=========================================" +echo -e "${BLUE}========================================${NC}" +echo -e "${BLUE}Qt Screen Lock Demo - DEB 打包脚本${NC}" +echo -e "${BLUE}========================================${NC}" -# 检查工具 +# 检查 linuxdeployqt 是否存在 if [ ! -f "$LINUXDEPLOYQT" ]; then - echo "错误: linuxdeployqt 未找到: $LINUXDEPLOYQT" + echo -e "${RED}错误: linuxdeployqt 未找到: $LINUXDEPLOYQT${NC}" exit 1 fi +# 检查 Qt 目录是否存在 if [ ! -d "$QT_DIR" ]; then - echo "错误: Qt 目录未找到: $QT_DIR" + echo -e "${RED}错误: Qt 目录未找到: $QT_DIR${NC}" exit 1 fi -# 清理并创建目录 -echo "[1/6] 清理目录..." +# 清理之前的打包目录 +echo -e "${YELLOW}[1/8] 清理之前的打包目录...${NC}" rm -rf "$PACKAGE_DIR" mkdir -p "$PACKAGE_DIR" # 编译项目 -echo "[2/6] 编译项目..." +echo -e "${YELLOW}[2/8] 编译项目...${NC}" if [ ! -f "$BUILD_DIR/bin/$APP_NAME" ]; then + echo -e "${BLUE}运行编译脚本...${NC}" ./build.sh fi if [ ! -f "$BUILD_DIR/bin/$APP_NAME" ]; then - echo "错误: 编译失败" + echo -e "${RED}错误: 编译失败,可执行文件未找到${NC}" exit 1 fi -# 创建 AppDir -echo "[3/6] 创建 AppDir..." +echo -e "${GREEN}✓ 编译成功${NC}" + +# 创建 AppDir 结构 +echo -e "${YELLOW}[3/8] 创建 AppDir 结构...${NC}" APPDIR="${PACKAGE_DIR}/AppDir" mkdir -p "${APPDIR}/usr/bin" +mkdir -p "${APPDIR}/usr/lib" mkdir -p "${APPDIR}/usr/share/applications" mkdir -p "${APPDIR}/usr/share/icons/hicolor/256x256/apps" +# 复制可执行文件 cp "$BUILD_DIR/bin/$APP_NAME" "${APPDIR}/usr/bin/" chmod +x "${APPDIR}/usr/bin/$APP_NAME" + +# 复制libstdc++.so.6 +cp -r "/usr/local/lib64/libstdc++.so.6" "${APPDIR}/usr/lib/" + +# 创建简单图标(如果没有的话) +if [ ! -f "icon.png" ]; then + echo -e "${BLUE}创建默认图标...${NC}" + # 这里只是创建一个占位符,实际应该有真实的图标 + touch "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" +else + cp icon.png "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" +fi + +# 复制 desktop 文件 cp screenlockdemo.desktop "${APPDIR}/usr/share/applications/" -# 创建占位图标 -echo "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" | base64 -d > "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" +echo -e "${GREEN}✓ AppDir 结构创建完成${NC}" -# 收集依赖 -echo "[4/6] 收集依赖 (linuxdeployqt)..." +# 使用 linuxdeployqt 收集依赖 +echo -e "${YELLOW}[4/8] 使用 linuxdeployqt 收集所有依赖...${NC}" export PATH="${QT_DIR}/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:${QT_DIR}/lib:$LD_LIBRARY_PATH" @@ -67,56 +94,73 @@ cd "$PACKAGE_DIR" -verbose=2 \ -bundle-non-qt-libs \ -no-translations \ - -qmake="${QT_DIR}/bin/qmake" || true + -qmake="${QT_DIR}/bin/qmake" + cd - > /dev/null -# 创建 DEB 结构 -echo "[5/6] 创建 DEB 包结构..." -DEB_DIR="${PACKAGE_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}" +echo -e "${GREEN}✓ 依赖收集完成${NC}" + +# 创建 DEB 包目录结构 +echo -e "${YELLOW}[5/8] 创建 DEB 包目录结构...${NC}" mkdir -p "${DEB_DIR}/opt/${PACKAGE_NAME}" mkdir -p "${DEB_DIR}/usr/bin" mkdir -p "${DEB_DIR}/usr/share/applications" mkdir -p "${DEB_DIR}/usr/share/icons/hicolor/256x256/apps" mkdir -p "${DEB_DIR}/DEBIAN" -# 复制文件 +# 复制 AppDir 内容到 /opt cp -r "${APPDIR}/usr/bin" "${DEB_DIR}/opt/${PACKAGE_NAME}/" -if [ -d "${APPDIR}/usr/lib" ]; then - cp -r "${APPDIR}/usr/lib" "${DEB_DIR}/opt/${PACKAGE_NAME}/" -fi +cp -r "${APPDIR}/usr/lib" "${DEB_DIR}/opt/${PACKAGE_NAME}/" + +# 如果有 Qt plugins if [ -d "${APPDIR}/usr/plugins" ]; then cp -r "${APPDIR}/usr/plugins" "${DEB_DIR}/opt/${PACKAGE_NAME}/" fi -# 创建启动包装脚本 -cat > "${DEB_DIR}/opt/${PACKAGE_NAME}/${PACKAGE_NAME}.sh" << 'WRAPPER_EOF' +# 如果有 Qt 库目录 +if [ -d "${APPDIR}/usr/lib" ]; then + mkdir -p "${DEB_DIR}/opt/${PACKAGE_NAME}/lib" + cp -r "${APPDIR}/usr/lib"/* "${DEB_DIR}/opt/${PACKAGE_NAME}/lib/" 2>/dev/null || true +fi + +# 创建启动脚本 +cat > "${DEB_DIR}/opt/${PACKAGE_NAME}/bin/${APP_NAME}.sh" << 'EOF' #!/bin/bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:${SCRIPT_DIR}/lib:$LD_LIBRARY_PATH" -export QT_PLUGIN_PATH="${SCRIPT_DIR}/plugins" -exec "${SCRIPT_DIR}/bin/ScreenLockDemo" "$@" -WRAPPER_EOF +APP_DIR="$(dirname "$SCRIPT_DIR")" +export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:${APP_DIR}/lib:$LD_LIBRARY_PATH" +export QT_PLUGIN_PATH="${APP_DIR}/plugins" +exec "${SCRIPT_DIR}/ScreenLockDemo" "$@" +EOF -chmod +x "${DEB_DIR}/opt/${PACKAGE_NAME}/${PACKAGE_NAME}.sh" +chmod +x "${DEB_DIR}/opt/${PACKAGE_NAME}/bin/${APP_NAME}.sh" -# 创建系统命令链接 -cat > "${DEB_DIR}/usr/bin/${PACKAGE_NAME}" << 'LINK_EOF' +# 创建 /usr/bin 软链接 +cat > "${DEB_DIR}/usr/bin/${PACKAGE_NAME}" << 'EOF' #!/bin/bash -exec /opt/screenlockdemo/screenlockdemo.sh "$@" -LINK_EOF +exec /opt/screenlockdemo/bin/ScreenLockDemo.sh "$@" +EOF chmod +x "${DEB_DIR}/usr/bin/${PACKAGE_NAME}" -# 复制 desktop 和图标 -cp "${APPDIR}/usr/share/applications/${PACKAGE_NAME}.desktop" "${DEB_DIR}/usr/share/applications/" -sed -i "s|Exec=.*|Exec=/usr/bin/${PACKAGE_NAME}|g" "${DEB_DIR}/usr/share/applications/${PACKAGE_NAME}.desktop" +# 复制 desktop 文件和图标 +sed "s|Exec=.*|Exec=/usr/bin/${PACKAGE_NAME}|g" screenlockdemo.desktop > "${DEB_DIR}/usr/share/applications/${PACKAGE_NAME}.desktop" sed -i "s|Icon=.*|Icon=${PACKAGE_NAME}|g" "${DEB_DIR}/usr/share/applications/${PACKAGE_NAME}.desktop" -cp "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" "${DEB_DIR}/usr/share/icons/hicolor/256x256/apps/" -# 创建 control +if [ -f "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" ]; then + cp "${APPDIR}/usr/share/icons/hicolor/256x256/apps/${PACKAGE_NAME}.png" \ + "${DEB_DIR}/usr/share/icons/hicolor/256x256/apps/" +fi + +echo -e "${GREEN}✓ DEB 包目录结构创建完成${NC}" + +# 创建 DEBIAN/control 文件 +echo -e "${YELLOW}[6/8] 创建控制文件...${NC}" + +# 计算安装大小 (KB) INSTALLED_SIZE=$(du -sk "${DEB_DIR}/opt" | cut -f1) -cat > "${DEB_DIR}/DEBIAN/control" << CONTROL_EOF +cat > "${DEB_DIR}/DEBIAN/control" << EOF Package: ${PACKAGE_NAME} Version: ${VERSION} Section: utils @@ -126,47 +170,90 @@ Installed-Size: ${INSTALLED_SIZE} Maintainer: Qt Screen Lock Demo Depends: dbus, libx11-6, libxext6, libxrender1, libfontconfig1, libfreetype6, libglib2.0-0, libgl1 Description: Qt Screen Lock Detection Demo Application - Qt5-based screen lock detection with bundled dependencies. - Features automatic paint event control, real-time animation, - and support for multiple desktop environments. -CONTROL_EOF + A Qt5-based Linux application that detects Ubuntu system lock/unlock + events and automatically stops Paint events when the screen is locked. + . + Features: + - Automatic screen lock detection via DBus + - Automatic paint event control + - Real-time animation demonstration + - Support for multiple desktop environments (GNOME, KDE, XFCE) + - Manual control and status monitoring + . + This package includes all required Qt5 libraries and dependencies. +EOF -# 创建 postinst -cat > "${DEB_DIR}/DEBIAN/postinst" << 'POSTINST_EOF' +echo -e "${GREEN}✓ 控制文件创建完成${NC}" + +# 创建 postinst 脚本(安装后脚本) +echo -e "${YELLOW}[7/8] 创建安装脚本...${NC}" + +cat > "${DEB_DIR}/DEBIAN/postinst" << 'EOF' #!/bin/bash set -e + +# 更新桌面数据库 if [ -x /usr/bin/update-desktop-database ]; then update-desktop-database -q fi + +# 更新图标缓存 if [ -x /usr/bin/gtk-update-icon-cache ]; then gtk-update-icon-cache -q -f /usr/share/icons/hicolor 2>/dev/null || true fi -echo "Screen Lock Demo 已安装。运行: screenlockdemo" + +echo "Screen Lock Demo 安装完成!" +echo "可以通过命令 'screenlockdemo' 启动,或在应用程序菜单中找到它。" + exit 0 -POSTINST_EOF +EOF chmod 755 "${DEB_DIR}/DEBIAN/postinst" -# 构建 DEB -echo "[6/6] 构建 DEB 包..." +# 创建 prerm 脚本(卸载前脚本) +cat > "${DEB_DIR}/DEBIAN/prerm" << 'EOF' +#!/bin/bash +set -e + +exit 0 +EOF + +chmod 755 "${DEB_DIR}/DEBIAN/prerm" + +echo -e "${GREEN}✓ 安装脚本创建完成${NC}" + +# 构建 DEB 包 +echo -e "${YELLOW}[8/8] 构建 DEB 包...${NC}" + +# 设置正确的权限 find "${DEB_DIR}" -type d -exec chmod 755 {} \; -find "${DEB_DIR}/opt/${PACKAGE_NAME}/bin" -type f -exec chmod 755 {} \; 2>/dev/null || true +find "${DEB_DIR}/opt/${PACKAGE_NAME}/bin" -type f -exec chmod 755 {} \; DEB_FILE="${PACKAGE_DIR}/${PACKAGE_NAME}_${VERSION}_${ARCH}.deb" + dpkg-deb --build "${DEB_DIR}" "$DEB_FILE" if [ -f "$DEB_FILE" ]; then - echo "=========================================" - echo "✓ 打包成功!" - echo "=========================================" - echo "包文件: $DEB_FILE" - echo "大小: $(du -h "$DEB_FILE" | cut -f1)" + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}✓ DEB 包构建成功!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${BLUE}包位置: ${DEB_FILE}${NC}" + echo -e "${BLUE}包大小: $(du -h "$DEB_FILE" | cut -f1)${NC}" echo "" - echo "安装: sudo dpkg -i $DEB_FILE" - echo "卸载: sudo dpkg -r ${PACKAGE_NAME}" + echo -e "${YELLOW}安装命令:${NC}" + echo -e " sudo dpkg -i $DEB_FILE" + echo "" + echo -e "${YELLOW}如果有依赖问题,运行:${NC}" + echo -e " sudo apt-get install -f" + echo "" + echo -e "${YELLOW}卸载命令:${NC}" + echo -e " sudo dpkg -r ${PACKAGE_NAME}" + echo "" + echo -e "${YELLOW}查看包信息:${NC}" + echo -e " dpkg -I $DEB_FILE" + echo -e " dpkg -c $DEB_FILE" echo "" - ls -lh "$DEB_FILE" else - echo "错误: 打包失败" + echo -e "${RED}错误: DEB 包构建失败${NC}" exit 1 fi diff --git a/test_deepin.sh b/test_deepin.sh deleted file mode 100755 index 76e3e3b..0000000 --- a/test_deepin.sh +++ /dev/null @@ -1,149 +0,0 @@ -#!/bin/bash - -# ======================================== -# Deepin OS 锁屏检测测试脚本 -# ======================================== - -echo "========================================" -echo "Deepin OS Screen Lock Detection Test" -echo "========================================" -echo "" - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# 检测是否在 Deepin OS 上运行 -echo "Step 1: Checking if running on Deepin OS..." -if [ -f /etc/deepin-version ]; then - DEEPIN_VERSION=$(cat /etc/deepin-version) - echo -e "${GREEN}✓${NC} Deepin OS detected: $DEEPIN_VERSION" -elif [ -f /etc/os-release ]; then - if grep -q "Deepin" /etc/os-release; then - echo -e "${GREEN}✓${NC} Deepin OS detected" - else - echo -e "${YELLOW}⚠${NC} Not running on Deepin OS" - echo " This script is designed for Deepin OS, but will continue anyway..." - fi -else - echo -e "${YELLOW}⚠${NC} Cannot determine OS version" -fi -echo "" - -# 检查 DDE 桌面环境 -echo "Step 2: Checking DDE Desktop Environment..." -if pgrep -x "dde-desktop" > /dev/null; then - echo -e "${GREEN}✓${NC} DDE desktop is running" -else - echo -e "${RED}✗${NC} DDE desktop is not running" - echo " Please make sure you are running DDE desktop environment" -fi - -if pgrep -x "dde-lock" > /dev/null; then - echo -e "${GREEN}✓${NC} dde-lock process found" -else - echo -e "${YELLOW}⚠${NC} dde-lock process not found (this is normal when screen is unlocked)" -fi -echo "" - -# 检查 DBus 会话 -echo "Step 3: Checking DBus session..." -if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then - echo -e "${RED}✗${NC} DBUS_SESSION_BUS_ADDRESS not set" - echo " Please run this script in a graphical session" -else - echo -e "${GREEN}✓${NC} DBus session is available" -fi -echo "" - -# 检查 Deepin DDE lockFront 服务 -echo "Step 4: Checking Deepin DDE lockFront service..." -if command -v dbus-send &> /dev/null; then - if dbus-send --session --print-reply \ - --dest=com.deepin.dde.lockFront \ - /com/deepin/dde/lockFront \ - org.freedesktop.DBus.Introspectable.Introspect &> /dev/null; then - echo -e "${GREEN}✓${NC} Deepin DDE lockFront service is available" - else - echo -e "${RED}✗${NC} Deepin DDE lockFront service is not available" - echo " The application may not be able to detect screen lock events" - fi -else - echo -e "${YELLOW}⚠${NC} dbus-send command not found, cannot verify service" -fi -echo "" - -# 检查项目编译状态 -echo "Step 5: Checking project build status..." -if [ -f "build/bin/ScreenLockDemo" ]; then - echo -e "${GREEN}✓${NC} Application is built: build/bin/ScreenLockDemo" -else - echo -e "${RED}✗${NC} Application not found. Please run ./build.sh first" - echo "" - exit 1 -fi -echo "" - -# 检查 Qt 库 -echo "Step 6: Checking Qt libraries..." -QT_PATH="$HOME/sdk/qt-5.15.2" -if [ -d "$QT_PATH" ]; then - echo -e "${GREEN}✓${NC} Qt5 found at: $QT_PATH" -else - echo -e "${YELLOW}⚠${NC} Qt5 not found at expected location: $QT_PATH" - echo " Attempting to use system Qt..." -fi -echo "" - -# 提供测试说明 -echo "========================================" -echo "Test Instructions" -echo "========================================" -echo "" -echo "The application will now start. Please follow these steps:" -echo "" -echo "1. Verify the application window appears with animation" -echo "2. Check console output for: ${GREEN}'Deepin DDE connected: true'${NC}" -echo "3. Lock your screen using one of these methods:" -echo " - Press ${BLUE}Super + L${NC}" -echo " - Press ${BLUE}Ctrl + Alt + L${NC}" -echo " - Run command: ${BLUE}dde-lock${NC}" -echo "4. Observe that the animation stops" -echo "5. Unlock your screen" -echo "6. Verify that the animation resumes" -echo "" -echo "Expected console output when locking:" -echo " ${GREEN}Login Manager Lock signal received${NC}" -echo " ${GREEN}Screen lock state changed: LOCKED${NC}" -echo "" -echo "Expected console output when unlocking:" -echo " ${GREEN}Login Manager Unlock signal received${NC}" -echo " ${GREEN}Screen lock state changed: UNLOCKED${NC}" -echo "" -echo "========================================" -echo "" - -# 询问是否继续 -read -p "Press ENTER to start the application, or Ctrl+C to cancel..." -echo "" - -# 启动应用 -echo "Starting application with debug output..." -echo "========================================" -echo "" - -# 设置环境变量并运行 -if [ -d "$QT_PATH" ]; then - export LD_LIBRARY_PATH="$QT_PATH/lib:$LD_LIBRARY_PATH" -fi - -# 运行应用并保存日志 -./build/bin/ScreenLockDemo 2>&1 | tee deepin_test_$(date +%Y%m%d_%H%M%S).log - -echo "" -echo "========================================" -echo "Test completed. Log file saved." -echo "========================================" diff --git a/test_lock_signals.sh b/test_lock_signals.sh deleted file mode 100755 index 3346117..0000000 --- a/test_lock_signals.sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/bash - -# ======================================== -# DBus 锁屏信号测试脚本 -# 用于诊断为什么锁屏信号没有被接收到 -# ======================================== - -echo "========================================" -echo "DBus Lock Signal Test Script" -echo "========================================" -echo "" - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' # No Color - -# 检查必要的工具 -echo "Checking required tools..." -if ! command -v dbus-monitor &> /dev/null; then - echo -e "${RED}✗${NC} dbus-monitor not found. Please install: sudo apt install dbus-x11" - exit 1 -fi - -if ! command -v dbus-send &> /dev/null; then - echo -e "${RED}✗${NC} dbus-send not found. Please install: sudo apt install dbus-x11" - exit 1 -fi - -echo -e "${GREEN}✓${NC} All required tools available" -echo "" - -# ======================================== -# 1. 检查当前会话信息 -# ======================================== -echo "========================================" -echo "Step 1: Session Information" -echo "========================================" -echo "" - -echo "Environment Variables:" -echo " XDG_SESSION_ID: ${XDG_SESSION_ID:-}" -echo " XDG_SESSION_TYPE: ${XDG_SESSION_TYPE:-}" -echo " XDG_CURRENT_DESKTOP: ${XDG_CURRENT_DESKTOP:-}" -echo " DESKTOP_SESSION: ${DESKTOP_SESSION:-}" -echo " GDMSESSION: ${GDMSESSION:-}" -echo "" - -# 尝试获取当前会话路径 -if [ -n "$XDG_SESSION_ID" ]; then - SESSION_PATH="/org/freedesktop/login1/session/$XDG_SESSION_ID" - echo "Calculated session path: $SESSION_PATH" - echo "" - - # 验证会话路径是否有效 - echo "Verifying session path..." - if dbus-send --system --print-reply --dest=org.freedesktop.login1 \ - "$SESSION_PATH" \ - org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}✓${NC} Session path is valid" - else - echo -e "${RED}✗${NC} Session path is not valid" - fi - echo "" -fi - -# ======================================== -# 2. 检查可用的锁屏相关服务 -# ======================================== -echo "========================================" -echo "Step 2: Available Lock Services" -echo "========================================" -echo "" - -echo "Checking Session Bus Services:" -echo "-------------------------------" - -# GNOME ScreenSaver -echo -n " org.gnome.ScreenSaver: " -if dbus-send --session --print-reply --dest=org.gnome.ScreenSaver \ - /org/gnome/ScreenSaver \ - org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}Available${NC}" -else - echo -e "${RED}Not available${NC}" -fi - -# Deepin 相关服务 -DEEPIN_SERVICES=( - "com.deepin.dde.lockFront" - "com.deepin.ScreenSaver" - "com.deepin.SessionManager" - "org.deepin.dde.lockFront" -) - -for service in "${DEEPIN_SERVICES[@]}"; do - echo -n " $service: " - if dbus-send --session --print-reply --dest="$service" / \ - org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}Available${NC}" - else - echo -e "${RED}Not available${NC}" - fi -done - -echo "" -echo "Checking System Bus Services:" -echo "-----------------------------" - -# systemd-logind -echo -n " org.freedesktop.login1: " -if dbus-send --system --print-reply --dest=org.freedesktop.login1 \ - /org/freedesktop/login1 \ - org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}Available${NC}" -else - echo -e "${RED}Not available${NC}" -fi - -echo "" - -# ======================================== -# 3. 列出当前会话的所有可用信号 -# ======================================== -if [ -n "$SESSION_PATH" ]; then - echo "========================================" - echo "Step 3: Session Signals" - echo "========================================" - echo "" - echo "Available signals on $SESSION_PATH:" - echo "" - - dbus-send --system --print-reply --dest=org.freedesktop.login1 \ - "$SESSION_PATH" \ - org.freedesktop.DBus.Introspectable.Introspect 2>/dev/null | \ - grep -E "signal name" | sed 's/^[[:space:]]*/ /' - - echo "" -fi - -# ======================================== -# 4. 创建临时监听脚本 -# ======================================== -echo "========================================" -echo "Step 4: Signal Monitoring Setup" -echo "========================================" -echo "" - -TEMP_DIR="/tmp/lock_signal_test_$$" -mkdir -p "$TEMP_DIR" - -# Session bus monitor -cat > "$TEMP_DIR/monitor_session.sh" << 'EOF' -#!/bin/bash -echo "=== Monitoring SESSION BUS ===" -echo "Listening for lock-related signals..." -echo "" -dbus-monitor --session "type='signal'" 2>&1 | \ - grep --line-buffered -iE "signal|lock|Lock|screen|Screen|Active|active" | \ - while IFS= read -r line; do - if echo "$line" | grep -q "signal"; then - echo "$(date '+%H:%M:%S') [SIGNAL] $line" - else - echo "$(date '+%H:%M:%S') $line" - fi - done -EOF - -# System bus monitor -cat > "$TEMP_DIR/monitor_system.sh" << 'EOF' -#!/bin/bash -echo "=== Monitoring SYSTEM BUS ===" -echo "Listening for login1 Session signals..." -echo "" -dbus-monitor --system "type='signal',interface='org.freedesktop.login1.Session'" 2>&1 | \ - grep --line-buffered -E "signal|Lock|Unlock|lock|unlock" | \ - while IFS= read -r line; do - if echo "$line" | grep -q "signal"; then - echo "$(date '+%H:%M:%S') [SIGNAL] $line" - else - echo "$(date '+%H:%M:%S') $line" - fi - done -EOF - -chmod +x "$TEMP_DIR/monitor_session.sh" -chmod +x "$TEMP_DIR/monitor_system.sh" - -echo "Monitoring scripts created in: $TEMP_DIR" -echo "" - -# ======================================== -# 5. 开始监听 -# ======================================== -echo "========================================" -echo "Step 5: Real-time Signal Monitoring" -echo "========================================" -echo "" -echo -e "${YELLOW}Instructions:${NC}" -echo " 1. This script will now monitor DBus signals" -echo " 2. Open another terminal and lock your screen:" -echo " - Press Super+L (or Ctrl+Alt+L)" -echo " - Or run: gnome-screensaver-command -l" -echo " - Or run: dde-lock (on Deepin)" -echo " 3. Observe which signals appear below" -echo " 4. Unlock your screen" -echo " 5. Press Ctrl+C to stop monitoring" -echo "" -echo -e "${CYAN}Monitoring both SESSION and SYSTEM buses...${NC}" -echo "" -echo "========================================" -echo "" - -# 创建日志文件 -LOG_FILE="$TEMP_DIR/signals.log" - -# 在后台启动两个监听器 -"$TEMP_DIR/monitor_session.sh" 2>&1 | tee -a "$LOG_FILE" & -SESSION_PID=$! - -"$TEMP_DIR/monitor_system.sh" 2>&1 | tee -a "$LOG_FILE" & -SYSTEM_PID=$! - -# 等待用户中断 -wait_for_user() { - while true; do - sleep 1 - done -} - -# 捕获 Ctrl+C -trap "echo ''; echo 'Stopping monitors...'; kill $SESSION_PID $SYSTEM_PID 2>/dev/null; exit 0" INT TERM - -wait_for_user - -# ======================================== -# 清理 -# ======================================== -echo "" -echo "========================================" -echo "Cleanup" -echo "========================================" -echo "" -echo "Log file saved to: $LOG_FILE" -echo "You can review it with: cat $LOG_FILE" -echo "" -echo "To clean up: rm -rf $TEMP_DIR" -echo "" diff --git a/verify_fix.sh b/verify_fix.sh deleted file mode 100755 index 3d10321..0000000 --- a/verify_fix.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/bash - -# ======================================== -# 快速验证锁屏信号修复脚本 -# ======================================== - -echo "========================================" -echo "Lock Signal Fix Verification Script" -echo "========================================" -echo "" - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' # No Color - -# 检查编译是否最新 -echo "Step 1: Checking build..." -echo "--------------------------------------" -if [ ! -f "build/bin/ScreenLockDemo" ]; then - echo -e "${RED}✗${NC} Executable not found. Running build..." - ./build.sh - if [ $? -ne 0 ]; then - echo -e "${RED}✗${NC} Build failed!" - exit 1 - fi -else - echo -e "${GREEN}✓${NC} Executable exists" -fi -echo "" - -# 检查环境信息 -echo "Step 2: Environment Information" -echo "--------------------------------------" -echo "Desktop Environment:" -echo " XDG_CURRENT_DESKTOP: ${XDG_CURRENT_DESKTOP:-}" -echo " DESKTOP_SESSION: ${DESKTOP_SESSION:-}" -echo "" -echo "Session Information:" -echo " XDG_SESSION_ID: ${XDG_SESSION_ID:-}" -echo " XDG_SESSION_TYPE: ${XDG_SESSION_TYPE:-}" -echo "" - -# 计算会话路径 -if [ -n "$XDG_SESSION_ID" ]; then - SESSION_PATH="/org/freedesktop/login1/session/$XDG_SESSION_ID" - echo "Expected session path: $SESSION_PATH" - echo "" -fi - -# 检查可用的服务 -echo "Step 3: Available DBus Services" -echo "--------------------------------------" - -echo "Checking for lock services:" - -# GNOME ScreenSaver -echo -n " org.gnome.ScreenSaver (session): " -if dbus-send --session --print-reply --dest=org.gnome.ScreenSaver \ - /org/gnome/ScreenSaver \ - org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}✓ Available${NC}" - HAS_SERVICE=1 -else - echo -e "${RED}✗ Not available${NC}" -fi - -# systemd-logind -echo -n " org.freedesktop.login1 (system): " -if dbus-send --system --print-reply --dest=org.freedesktop.login1 \ - /org/freedesktop/login1 \ - org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}✓ Available${NC}" - HAS_SERVICE=1 -else - echo -e "${RED}✗ Not available${NC}" -fi - -# Deepin services -DEEPIN_SERVICES=( - "com.deepin.dde.lockFront" - "com.deepin.ScreenSaver" - "org.deepin.dde.lockFront" -) - -for service in "${DEEPIN_SERVICES[@]}"; do - echo -n " $service (session): " - if dbus-send --session --print-reply --dest="$service" / \ - org.freedesktop.DBus.Introspectable.Introspect &>/dev/null; then - echo -e "${GREEN}✓ Available${NC}" - HAS_SERVICE=1 - else - echo -e "${RED}✗ Not available${NC}" - fi -done - -echo "" - -if [ -z "$HAS_SERVICE" ]; then - echo -e "${YELLOW}⚠ Warning: No lock services detected${NC}" - echo "This might be expected if running in a minimal environment" - echo "" -fi - -# 运行程序 -echo "Step 4: Running Application" -echo "--------------------------------------" -echo "" -echo -e "${CYAN}The application will now start.${NC}" -echo -e "${CYAN}Please check the output for connection status.${NC}" -echo "" -echo "Look for these indicators:" -echo " ${GREEN}✓${NC} 'ScreenLockDetector initialized successfully'" -echo " ${GREEN}✓${NC} At least one 'connected: true'" -echo " ${GREEN}✓${NC} Valid session path (not 'auto')" -echo "" -echo "Then test by locking your screen:" -echo " - Press ${BLUE}Super+L${NC} or ${BLUE}Ctrl+Alt+L${NC}" -echo " - Look for ${GREEN}'LOCK SIGNAL RECEIVED'${NC} in the output" -echo " - Unlock and look for ${GREEN}'UNLOCK SIGNAL RECEIVED'${NC}" -echo "" -echo "Press Ctrl+C to stop the application when done." -echo "" - -read -p "Press ENTER to start the application..." - -echo "" -echo "========================================" -echo "Application Output:" -echo "========================================" -echo "" - -cd build/bin -./ScreenLockDemo - -echo "" -echo "========================================" -echo "Application stopped" -echo "========================================" -echo "" - -# 提供进一步调试建议 -echo "If signals were NOT received:" -echo "--------------------------------------" -echo "1. Run the detailed test script:" -echo " ${CYAN}./test_lock_signals.sh${NC}" -echo "" -echo "2. Check what signals your system actually sends:" -echo " ${CYAN}dbus-monitor --system \"type='signal',interface='org.freedesktop.login1.Session'\"${NC}" -echo " Then lock your screen in another terminal" -echo "" -echo "3. For Deepin systems, run:" -echo " ${CYAN}./debug_deepin_dbus.sh${NC}" -echo "" -echo "4. Check session status:" -echo " ${CYAN}loginctl show-session \$XDG_SESSION_ID${NC}" -echo "" -echo "5. Review the detailed fix guide:" -echo " ${CYAN}cat LOCK_SIGNAL_FIX.md${NC}" -echo "" diff --git a/verify_project.sh b/verify_project.sh deleted file mode 100755 index 9181287..0000000 --- a/verify_project.sh +++ /dev/null @@ -1,190 +0,0 @@ -#!/bin/bash - -# Qt Screen Lock Detection Demo - Project Verification Script -# This script verifies that all project files are present and properly configured - -set -e - -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Counters -TOTAL_CHECKS=0 -PASSED_CHECKS=0 -FAILED_CHECKS=0 - -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Qt Screen Lock Demo - Project Verification${NC}" -echo -e "${BLUE}========================================${NC}" -echo "" - -# Function to check if file exists -check_file() { - local file=$1 - local description=$2 - TOTAL_CHECKS=$((TOTAL_CHECKS + 1)) - - if [ -f "$file" ]; then - echo -e "${GREEN}✓${NC} $description: ${BLUE}$file${NC}" - PASSED_CHECKS=$((PASSED_CHECKS + 1)) - return 0 - else - echo -e "${RED}✗${NC} $description: ${RED}$file (MISSING)${NC}" - FAILED_CHECKS=$((FAILED_CHECKS + 1)) - return 1 - fi -} - -# Function to check if directory exists -check_dir() { - local dir=$1 - local description=$2 - TOTAL_CHECKS=$((TOTAL_CHECKS + 1)) - - if [ -d "$dir" ]; then - echo -e "${GREEN}✓${NC} $description: ${BLUE}$dir${NC}" - PASSED_CHECKS=$((PASSED_CHECKS + 1)) - return 0 - else - echo -e "${RED}✗${NC} $description: ${RED}$dir (MISSING)${NC}" - FAILED_CHECKS=$((FAILED_CHECKS + 1)) - return 1 - fi -} - -# Function to check if file is executable -check_executable() { - local file=$1 - local description=$2 - TOTAL_CHECKS=$((TOTAL_CHECKS + 1)) - - if [ -x "$file" ]; then - echo -e "${GREEN}✓${NC} $description: ${BLUE}$file${NC}" - PASSED_CHECKS=$((PASSED_CHECKS + 1)) - return 0 - else - echo -e "${YELLOW}!${NC} $description: ${YELLOW}$file (Not executable)${NC}" - echo -e " ${YELLOW}Run: chmod +x $file${NC}" - FAILED_CHECKS=$((FAILED_CHECKS + 1)) - return 1 - fi -} - -echo -e "${YELLOW}[1/7] Checking Build Configuration...${NC}" -check_file "CMakeLists.txt" "CMake configuration" -echo "" - -echo -e "${YELLOW}[2/7] Checking Build Scripts...${NC}" -check_executable "build.sh" "Build script" -check_executable "run.sh" "Run script" -echo "" - -echo -e "${YELLOW}[3/7] Checking Documentation Files...${NC}" -check_file "README.md" "Main README" -check_file "QUICKSTART.md" "Quick start guide" -check_file "ARCHITECTURE.md" "Architecture documentation" -check_file "PROJECT_OVERVIEW.md" "Project overview" -check_file ".gitignore" "Git ignore file" -echo "" - -echo -e "${YELLOW}[4/7] Checking Source Directory...${NC}" -check_dir "src" "Source directory" -echo "" - -echo -e "${YELLOW}[5/7] Checking Header Files...${NC}" -check_file "src/screenlockdetector.h" "Screen lock detector header" -check_file "src/customwidget.h" "Custom widget header" -check_file "src/mainwindow.h" "Main window header" -echo "" - -echo -e "${YELLOW}[6/7] Checking Implementation Files...${NC}" -check_file "src/screenlockdetector.cpp" "Screen lock detector implementation" -check_file "src/customwidget.cpp" "Custom widget implementation" -check_file "src/mainwindow.cpp" "Main window implementation" -check_file "src/main.cpp" "Main entry point" -echo "" - -echo -e "${YELLOW}[7/7] Checking Qt5 Installation...${NC}" -TOTAL_CHECKS=$((TOTAL_CHECKS + 1)) -QT5_DIR="$HOME/sdk/qt-5.15.2" -if [ -d "$QT5_DIR" ]; then - echo -e "${GREEN}✓${NC} Qt5 directory found: ${BLUE}$QT5_DIR${NC}" - PASSED_CHECKS=$((PASSED_CHECKS + 1)) - - # Check for qmake - if [ -f "$QT5_DIR/bin/qmake" ]; then - echo -e "${GREEN}✓${NC} qmake found" - PASSED_CHECKS=$((PASSED_CHECKS + 1)) - else - echo -e "${YELLOW}!${NC} qmake not found in expected location" - FAILED_CHECKS=$((FAILED_CHECKS + 1)) - fi - TOTAL_CHECKS=$((TOTAL_CHECKS + 1)) -else - echo -e "${RED}✗${NC} Qt5 directory not found: ${RED}$QT5_DIR${NC}" - echo -e " ${YELLOW}Please update the path in CMakeLists.txt if Qt5 is installed elsewhere${NC}" - FAILED_CHECKS=$((FAILED_CHECKS + 1)) -fi -echo "" - -# Summary -echo -e "${BLUE}========================================${NC}" -echo -e "${BLUE}Verification Summary${NC}" -echo -e "${BLUE}========================================${NC}" -echo -e "Total Checks: ${TOTAL_CHECKS}" -echo -e "${GREEN}Passed: ${PASSED_CHECKS}${NC}" -if [ $FAILED_CHECKS -gt 0 ]; then - echo -e "${RED}Failed: ${FAILED_CHECKS}${NC}" -else - echo -e "${GREEN}Failed: ${FAILED_CHECKS}${NC}" -fi -echo "" - -# Code statistics -if command -v wc &> /dev/null; then - echo -e "${BLUE}========================================${NC}" - echo -e "${BLUE}Code Statistics${NC}" - echo -e "${BLUE}========================================${NC}" - - if [ -d "src" ]; then - CPP_LINES=$(find src -name "*.cpp" -exec wc -l {} + 2>/dev/null | tail -1 | awk '{print $1}' || echo "0") - H_LINES=$(find src -name "*.h" -exec wc -l {} + 2>/dev/null | tail -1 | awk '{print $1}' || echo "0") - TOTAL_LINES=$((CPP_LINES + H_LINES)) - - echo "C++ Source Files (.cpp): ${CPP_LINES} lines" - echo "Header Files (.h): ${H_LINES} lines" - echo "Total Source Code: ${TOTAL_LINES} lines" - echo "" - - CPP_COUNT=$(find src -name "*.cpp" | wc -l) - H_COUNT=$(find src -name "*.h" | wc -l) - echo "Number of .cpp files: ${CPP_COUNT}" - echo "Number of .h files: ${H_COUNT}" - fi - echo "" -fi - -# Final verdict -echo -e "${BLUE}========================================${NC}" -if [ $FAILED_CHECKS -eq 0 ]; then - echo -e "${GREEN}✓ Project verification PASSED!${NC}" - echo -e "${GREEN}All required files are present.${NC}" - echo "" - echo -e "Next steps:" - echo -e " 1. Run ${BLUE}./build.sh${NC} to compile the project" - echo -e " 2. Run ${BLUE}./run.sh${NC} to execute the application" - echo -e " 3. Read ${BLUE}QUICKSTART.md${NC} for usage guide" -else - echo -e "${YELLOW}! Project verification completed with warnings${NC}" - echo -e "${YELLOW}Some files are missing or not executable.${NC}" - echo "" - echo -e "Please fix the issues above before building." -fi -echo -e "${BLUE}========================================${NC}" -echo "" - -exit $FAILED_CHECKS