このページについて

セッション管理

セッションとは、それぞれが特定の状態を持つ実行中のアプリケーションのグループのことです。セッションは、セッションマネージャと呼ばれるサービスによって制御されます。セッションに参加しているアプリケーションは、セッションクライアントと呼ばれます。

セッションマネージャは、ユーザーに代わってクライアントに対してコマンドを発行します。これらのコマンドにより、クライアントは未保存の変更を反映したり(例えば、開いているファイルを保存したり)、将来のセッションに向けて状態を保持したり、正常に終了したりすることがあります。こうした一連の操作を「セッション管理」と呼びます。

一般的なケースでは、セッションはユーザーがデスクトップ上で同時に実行しているすべてのアプリケーションで構成されます。ただし、Unix/Linux環境では、セッションには異なるコンピュータ上で実行されているアプリケーションが含まれたり、複数のディスプレイにまたがったりする場合があります。

セッションの終了

セッションは、通常、ユーザーがログアウトを希望した際に、セッションマネージャーによって(ユーザーの代理として)終了されます。また、停電が迫っている場合など、緊急事態においてシステムが自動的にセッションを終了させることもあります。 明らかに、これら2種類の終了には大きな違いがあります。前者の場合、ユーザーはアプリケーションと対話して、どのファイルを保存し、どのファイルを破棄するかを正確に指定したいと思うかもしれません。後者の場合、対話する時間はありません。マシン前にユーザーが座っていることさえないかもしれません!

プロトコルと各プラットフォームでのサポート

macOSやWindows 2000以前のMicrosoft Windowsでは、アプリケーションに対する完全なセッション管理、すなわち以前のセッションを復元する機能はまだ存在しません。 (Windows 2000およびXPでは、「ハイバネーション」機能が提供されており、メモリ全体がディスクに保存され、マシンの再起動時に復元されます。)これらのプラットフォームでは、アプリケーションがユーザーからの確認を得た後にプロセスをキャンセルできる「正常なログアウト」はサポートされています。これは、QGuiApplication::commitDataRequest()シグナルに対応する機能です。

X11は、X11R6以降、完全なセッション管理をサポートしています。

Qtでセッション管理を機能させるには

まず、QGuiApplication::commitDataRequest() シグナルにスロットを接続し、アプリケーションがグレースフルログアウトプロセスに参加できるようにします。Microsoft Windows プラットフォームのみを対象とする場合、これだけで十分であり、これを実装する必要があります。理想的には、アプリケーションは次のようなシャットダウンダイアログを提供すべきです:

シャットダウン時の典型的なダイアログ

このダイアログのサンプルコードは、QSessionManager::allowsInteraction() のドキュメントに記載されています。

完全なセッション管理(現時点では X11R6 でのみサポートされています)を行うには、アプリケーションの状態を保存し、必要に応じてセッションの次のライフサイクルでその状態を復元する処理も行う必要があります。この保存は、QGuiApplication::saveStateRequest() シグナルに接続されたスロットを実装することで行われます。 この関数で保存するすべての状態データには、セッション識別子QGuiApplication::sessionId() を付加する必要があります。このアプリケーション固有の識別子はグローバルに一意であるため、競合は発生しません。(特定の Qt アプリケーションの状態の保存・復元に関する情報については、QSessionManager を参照してください。)

復元は通常、アプリケーションの main() 関数内で行われます。QGuiApplication::isSessionRestored() がtrue であるかどうかを確認してください。その場合は、再度セッション識別子QGuiApplication::sessionId() を使用して状態データにアクセスし、アプリケーションの状態を復元してください。

重要:ウィンドウマネージャが、表示順序やジオメトリ情報などのウィンドウ属性を復元できるようにするには、トップレベルウィジェットを、アプリケーション全体で一意のオブジェクト名で識別する必要があります(QObject::setObjectName()を参照)。アプリケーションを復元する際は、復元されたすべてのトップレベルウィジェットに、以前と同じ一意の名前が割り当てられていることを確認する必要があります。

セッション管理のテストとデバッグ

macOS および Windows におけるセッション管理のサポートは、オペレーティングシステム自体にこの機能が備わっていないため、かなり限定的です。単にセッションを終了させ、アプリケーションが期待どおりに動作することを確認してください。 アプリケーションを起動する前に、別のアプリケーション(通常は統合開発環境)を起動しておくと便利です。この別のアプリケーションは、その後シャットダウンメッセージを受信するため、シャットダウンをキャンセルできるようになります。そうしないと、テスト実行のたびに再ログインする必要が生じますが、それ自体は問題ではありませんが、時間がかかります。

Unix では、標準の X11R6 セッション管理をサポートするデスクトップ環境を使用するか、あるいは推奨される方法として、X Consortium が提供するセッションマネージャーの参照実装を使用することができます。このサンプルマネージャーはxsm と呼ばれ、標準の X11R6 インストールの一部となっています。 X11ではいつものように、有用で有益なマニュアルページが用意されています。xsm の使用方法は(不格好なAthenaベースのユーザーインターフェースを除けば)簡単です。以下に簡単な手順を示します:

  • X11R6を起動します。
  • ホームディレクトリに、次の1行のみを含むドットファイル `.xsmstartup ` を作成します。
    xterm

    これにより、xsm に対して、デフォルト/フェイルセーフセッションが xterm だけであり、それ以外は何も含まれないことを指定します。そうしないと、xsm はウィンドウマネージャーであるtwm を含む多数のクライアントを起動しようとしてしまいますが、これはあまり役に立ちません。

  • 次に、別のターミナルウィンドウからxsm を起動してください。セッションマネージャのウィンドウと xterm の両方が表示されます。この xterm には、現在実行中の他のすべてのシェルとは一線を画す優れた特性があります。それは、そのシェル内では、SESSION_MANAGER 環境変数が、先ほど起動したセッションマネージャを指すようになっていることです。
  • 新しい xterm ウィンドウからアプリケーションを起動してください。アプリケーションは自動的にセッションマネージャーに接続されます。接続が成功したかどうかは、ClientListプッシュボタンで確認できます。

    注: セッション管理対象のクライアントを起動または終了する際は、絶対に ClientListを開いたままにしないでください! そうしないと、xsm がクラッシュする可能性があります。

  • セッションマネージャーの「Checkpoint」および「Shutdown」ボタンを、さまざまな設定で試して、アプリケーションがどのように動作するかを確認してください。「local」という保存タイプは、クライアントが自身の状態を保存すべきであることを意味します。これは `QGuiApplication::saveStateRequest()` シグナルに対応しています。「global」という保存タイプは、アプリケーションに対して、未保存の変更を永続的でグローバルにアクセス可能なストレージに保存するよう要求します。これは `QGuiApplication::commitDataRequest()` を呼び出します。
  • 何かがクラッシュした場合は、Qtではなくxsm のせいにしてください。xsm は、ユーザーのデスクトップ上で実用的なセッションマネージャーとは程遠いものです。しかし、テスト環境としては十分に安定しており、有用です。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.