重构:完善串流就绪检测并补充 GPU 联调记录

变更详情:kiosk 会话就绪检测重构(Moonlight 输出解析器/事件化回调/单元测试);GPU 直通实操记录(vfio Subsystem 注入、sysfs vBIOS、7zr+pnputil 安装、566.36 驱动、Sunshine 配对断链修复)
This commit is contained in:
songyiming committed 2026-10-30 14:42:11 +08:00
1 parent b08486046b
commit 13f645a503
14 files changed
+743 -225

No files matched your search

+11 -14
View File
@@ -2,7 +2,9 @@
#include <QEvent>
#include <QFont>
#include <QGuiApplication>
#include <QLabel>
#include <QScreen>
#include <QTimer>
#include <QVBoxLayout>
#include <QVariant>
@@ -10,7 +12,7 @@
namespace vdi {
namespace {
constexpr int kTickMs = 400; // 省略号/旋轮动画与置顶保活周期
constexpr int kTickMs = 400; // 省略号/旋轮动画周期
constexpr int kFadeStepMs = 40; // 淡出步进周期
constexpr int kFadeSteps = 25; // 全程约 1 秒淡出
@@ -19,9 +21,10 @@ const char* kSpinnerFrames[] = {"◐", "◓", "◑", "◒"};
} // namespace
TransitionOverlay::TransitionOverlay(QWidget* parent) : QWidget(parent) {
// 独立置顶无边框窗口:串流启动后 moonlight-qt 会盖住 kiosk 主窗口,
// 过场层必须压在它之上才起作用(onTick 周期性 raise 兜底)。
setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
// 独立置顶无边框窗口只在启动时映射一次,后续不再与 Moonlight 抢焦点。
setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint |
Qt::WindowDoesNotAcceptFocus);
setAttribute(Qt::WA_ShowWithoutActivating);
setStyleSheet(QStringLiteral("TransitionOverlay { background-color: #000000; }"));
auto* layout = new QVBoxLayout(this);
@@ -63,19 +66,17 @@ void TransitionOverlay::start(const QString& title) {
labelTitle_->setText(title);
labelSpinner_->setText(QString::fromUtf8(kSpinnerFrames[0]));
showFullScreen();
if (QScreen* targetScreen = QGuiApplication::primaryScreen()) {
setGeometry(targetScreen->geometry());
}
show();
raise();
activateWindow();
grabKeyboard();
grabMouse();
tickTimer_->start(kTickMs);
}
void TransitionOverlay::finish() {
tickTimer_->stop();
fadeTimer_->stop();
releaseKeyboard();
releaseMouse();
hide();
setWindowOpacity(1.0);
}
@@ -86,8 +87,6 @@ void TransitionOverlay::onFirstFrame() {
return;
}
tickTimer_->stop();
releaseKeyboard();
releaseMouse();
fadeTimer_->start(kFadeStepMs);
}
@@ -98,8 +97,6 @@ void TransitionOverlay::onTick() {
labelTitle_->setText(base + QString(dots_, QLatin1Char('.')));
}
labelSpinner_->setText(QString::fromUtf8(kSpinnerFrames[dots_]));
// X11 下 moonlight 的全屏窗口可能后映射,周期性抬回最上层
raise();
}
void TransitionOverlay::onFadeStep() {