整理并精简打包与文档
删除大量过期的 Deepin/packaging 文档与测试脚本,保留并重写 make_deb.sh;同时微调 ARCHITECTURE.md 的格式空格与换行
This commit is contained in:
parent
03c763431a
commit
e6fec6dfea
|
|
@ -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 系统编程的学习参考。
|
||||
|
|
|
|||
|
|
@ -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 接口,可以实现可靠、低延迟的锁屏状态监控。如有任何问题,请参考故障排除章节或查看应用日志。
|
||||
278
DEEPIN_UPDATE.md
278
DEEPIN_UPDATE.md
|
|
@ -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 用户现在可以享受到与其他桌面环境用户相同的功能体验,应用会在屏幕锁定时自动停止绘制,节省系统资源。
|
||||
|
||||
如有任何问题或建议,欢迎反馈!
|
||||
|
|
@ -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 系统上的锁屏信号接收问题。
|
||||
|
|
@ -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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**检查完成日期**: ___________
|
||||
|
||||
**测试人员**: ___________
|
||||
|
||||
**版本号**: ___________
|
||||
|
||||
**测试环境**: ___________
|
||||
|
||||
**结果**: □ 通过 □ 失败 □ 有条件通过
|
||||
|
||||
**备注**:
|
||||
|
|
@ -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. ✅ 文档完善:添加真实图标、更新维护者信息
|
||||
|
||||
**祝打包顺利!** 🚀
|
||||
|
|
@ -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
|
||||
|
||||
祝打包顺利!🚀
|
||||
|
||||
|
|
@ -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
|
||||
================================================================================
|
||||
|
|
@ -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. ✅ 多重连接策略(提高兼容性)
|
||||
|
||||
大多数情况下,这些修复应该能解决问题。如果还有问题,使用提供的调试工具找出系统实际使用的信号机制。
|
||||
256
build_deb.sh
256
build_deb.sh
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
213
make_deb.sh
213
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 <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
|
||||
|
|
|
|||
149
test_deepin.sh
149
test_deepin.sh
|
|
@ -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 "========================================"
|
||||
|
|
@ -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 ""
|
||||
163
verify_fix.sh
163
verify_fix.sh
|
|
@ -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 ""
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue