整理并精简打包与文档

删除大量过期的 Deepin/packaging 文档与测试脚本,保留并重写 make_deb.sh;同时微调 ARCHITECTURE.md
的格式空格与换行
This commit is contained in:
ubuntu1804 2025-11-08 10:32:47 +08:00
parent 03c763431a
commit e6fec6dfea
17 changed files with 172 additions and 3841 deletions

View File

@ -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 系统编程的学习参考。
适合作为 Qt + Linux 系统编程的学习参考。

View File

@ -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'"
```
## 故障排除
### 问题 1Deepin 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 接口,可以实现可靠、低延迟的锁屏状态监控。如有任何问题,请参考故障排除章节或查看应用日志。

View File

@ -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 用户现在可以享受到与其他桌面环境用户相同的功能体验,应用会在屏幕锁定时自动停止绘制,节省系统资源。
如有任何问题或建议,欢迎反馈!

View File

@ -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<QDBusObjectPath> 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<QVariant> 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 系统上的锁屏信号接收问题。

View File

@ -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
# 检查 LintianDebian 包检查工具)
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
```
---
**检查完成日期**: ___________
**测试人员**: ___________
**版本号**: ___________
**测试环境**: ___________
**结果**: □ 通过 □ 失败 □ 有条件通过
**备注**:

View File

@ -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
* 更新内容描述
-- 维护者 <email@example.com> 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. ✅ 文档完善:添加真实图标、更新维护者信息
**祝打包顺利!** 🚀

View File

@ -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
祝打包顺利!🚀

View File

@ -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
================================================================================

View File

@ -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. ✅ 多重连接策略(提高兼容性)
大多数情况下,这些修复应该能解决问题。如果还有问题,使用提供的调试工具找出系统实际使用的信号机制。

View File

@ -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 <developer@example.com>
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

View File

@ -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

View File

@ -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"

View File

@ -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 <developer@example.com>
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

View File

@ -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 "========================================"

View File

@ -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:-<not set>}"
echo " XDG_SESSION_TYPE: ${XDG_SESSION_TYPE:-<not set>}"
echo " XDG_CURRENT_DESKTOP: ${XDG_CURRENT_DESKTOP:-<not set>}"
echo " DESKTOP_SESSION: ${DESKTOP_SESSION:-<not set>}"
echo " GDMSESSION: ${GDMSESSION:-<not set>}"
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 ""

View File

@ -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:-<not set>}"
echo " DESKTOP_SESSION: ${DESKTOP_SESSION:-<not set>}"
echo ""
echo "Session Information:"
echo " XDG_SESSION_ID: ${XDG_SESSION_ID:-<not set>}"
echo " XDG_SESSION_TYPE: ${XDG_SESSION_TYPE:-<not set>}"
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 ""

View File

@ -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