// Kiosk 主窗口 // // 产品流程编排: // 开机 -> 登录页 -> 认证 -> 桌面列表 -> 选择桌面 // -> 获取连接票据 -> Moonlight 串流会话(外部进程 moonlight-qt) // -> 会话结束回桌面列表;退出登录回登录页 // // 对应《VDI 云桌面软件开发方案》3.2 节的状态机, // 并按产品流程扩展 AUTHENTICATING / DESKTOP_LIST 两个状态。 // 全局热键 Ctrl+Alt+Shift+M 呼出管理菜单(含退出终端); // Ctrl+Alt+Shift+Q 退出串流:moonlight-qt 自带同名快捷键, // kiosk 侧保留一份兜底,串流未建立或焦点仍在 kiosk 时也能退出。 #ifndef KIOSK_SHELL_MAIN_WINDOW_H #define KIOSK_SHELL_MAIN_WINDOW_H #include #include #include #include #include "config.h" #include "desktop_service.h" #include "desktop_session.h" #include "moonlight_session.h" #include "state_machine.h" class QStackedWidget; class QStatusBar; class QTimer; class QEvent; namespace vdi { class LoginPage; class DesktopListPage; class TransitionOverlay; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget* parent = nullptr); ~MainWindow() override; private slots: void onLoginRequested(const QString& username, const QString& password); void onDesktopSelected(const QString& desktopId); void onEditDesktopRequested(const QString& desktopId); void onQuitRequested(); void onMoonlightState(bool running, const QString& message); void onMenuAction(int action); private: void setupUi(); void setupHotkey(); void setupHeartbeat(); void onStateChanged(vdi::State from, vdi::State to, const QString& detail); void refreshDesktopList(); void startMoonlightSession(const ConnectionTicket& ticket); void stopSessions(); void showLogin(); void showDesktopList(); void updateStatusBar(const QString& text); void watchFirstFrame(); void onFirstFrameDetected(); StateMachine fsm_; DesktopService desktopService_; std::unique_ptr moonlightSession_; ConnectionTicket activeTicket_; QString currentUser_; std::vector desktops_; QPointer loginPage_; QPointer desktopListPage_; QStackedWidget* stack_ = nullptr; QStatusBar* statusBar_ = nullptr; TransitionOverlay* overlay_ = nullptr; QTimer* firstFrameTimer_ = nullptr; QTimer* heartbeatTimer_ = nullptr; QElapsedTimer firstFrameClock_; TerminalConfig config_; }; } // namespace vdi #endif // KIOSK_SHELL_MAIN_WINDOW_H