1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/doc/session.doc:36 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Session Management</title>
<style type="text/css"><!--
fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; }
--></style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
<a href="index.html">
<font color="#004faf">Home</font></a>
| <a href="classes.html">
<font color="#004faf">All Classes</font></a>
| <a href="mainclasses.html">
<font color="#004faf">Main Classes</font></a>
| <a href="annotated.html">
<font color="#004faf">Annotated</font></a>
| <a href="groups.html">
<font color="#004faf">Grouped Classes</font></a>
| <a href="functions.html">
<font color="#004faf">Functions</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>Session Management</h1>
<p> <h2> Definitions
</h2>
<a name="1"></a><p> A <em>session</em> is a group of running applications, each of which has a
particular state. The session is controlled by a service called the <em>session</em> <em>manager</em>. The applications participating in the session are
called <em>session</em> <em>clients</em>.
<p> The session manager issues commands to its clients on behalf of the
user. These commands may cause clients to commit unsaved changes (for
example by saving open files), to preserve their state for future
sessions, or to terminate gracefully. The set of these operations is
called <em>session</em> <em>management</em>.
<p> In the common case, a session consists of all applications that a
user runs on their desktop at a time. Under Unix/X11, however, a
session may include applications running on different computers and
may span multiple displays.
<p> <h2> Shutting a session down
</h2>
<a name="2"></a><p> A session is shut down by the session manager, usually on behalf of
the user when they want to log out. A system might also perform an
automatic shutdown in an emergency situation, for example, if power is
about to be lost. Clearly there is a significant difference between
these types of shutdown. During the first, the user may want to
interact with the application, specifying exactly which files should
be saved and which should be discarded. In the latter case, there's no
time for interaction. There may not even be a user sitting in front of
the machine!
<p> <h2> Protocols and support on different platforms
</h2>
<a name="3"></a><p> On Mac OS X and MS-Windows, there is nothing like complete session
management for applications yet, i.e. no restoring of previous
sessions. They do support graceful logouts where applications
have the opportunity to cancel the process after getting confirmation
from the user. This is the functionality that corresponds to the <a href="qapplication.html#commitData">QApplication::commitData</a>() method.
<p> X11 has supported complete session management since X11R6.
<p> <h2> Getting session management to work with Qt
</h2>
<a name="4"></a><p> Start by reimplementing <a href="qapplication.html#commitData">QApplication::commitData</a>() to
enable your application to take part in the graceful logout process. If
you are only targeting the MS-Windows platform, this is all you can
and must provide. Ideally, your application should provide a shutdown
dialog similar to the following:
<p> <center><img src="session.png" alt="A typical dialog on shutdown"></center>
<p> Example code to this dialog can be found in the documentation of <a href="qsessionmanager.html#allowsInteraction">QSessionManager::allowsInteraction</a>().
<p> For complete session management (only supported on X11R6 at present),
you must also take care of saving the application's state, and
potentially of restoring the state in the next life cycle of the
session. This saving is done by reimplementing <a href="qapplication.html#saveState">QApplication::saveState</a>(). All state data you are saving in this
function, should be marked with the session identifier <a href="qapplication.html#sessionId">QApplication::sessionId</a>(). This application specific identifier is
globally unique, so no clashes will occur. (See <a href="qsessionmanager.html">QSessionManager</a> for
information on saving/restoring the state of a particular Qt
application.)
<p> Restoration is usually done in the application's main()
function. Check if <a href="qapplication.html#isSessionRestored">QApplication::isSessionRestored</a>() is <tt>TRUE</tt>. If
that's the case, use the session identifier <a href="qapplication.html#sessionId">QApplication::sessionId</a>() again to access your state data and restore
the state of the application.
<p> <strong>Important:</strong> In order to allow the window manager to
restore window attributes such as stacking order or geometry
information, you must identify your top level widgets with
unique application-wide object names (see <a href="qobject.html#setName">QObject::setName</a>()). When
restoring the application, you must ensure that all restored
top level widgets are given the same unique names they had before.
<p> <h2> Testing and debugging session management
</h2>
<a name="5"></a><p> Session management support on Mac OS X and Windows is fairly limited
due to the lack of this functionality in the operating system
itself. Simply shut the session down and verify that your application
behaves as expected. It may be useful to launch another application,
usually the integrated development environment, before starting your
application. This other application will get the shutdown message
afterwards, thus permitting you to cancel the shutdown. Otherwise you
would have to log in again after each test run, which is not a problem
per se, but is time consuming.
<p> On Unix you can either use a desktop environment that supports
standard X11R6 session management or, the recommended method, use the
session manager reference implementation provided by the X Consortium.
This sample manager is called <tt>xsm</tt> and is part of a standard X11R6
installation. As always with X11, a useful and informative manual page
is provided. Using <tt>xsm</tt> is straightforward (apart from the clumsy
Athena-based user interface). Here's a simple approach:
<p> <ul>
<li> Run X11R6.
<li> Create a dot file <tt>.xsmstartup</tt> in your home directory which
contains the single line
<pre>
xterm
</pre>
This tells <tt>xsm</tt> that the default/failsafe session is just an xterm
and nothing else. Otherwise <tt>xsm</tt> would try to invoke lots of
clients including the windowmanager <tt>twm</tt>, which isn't very helpful.
<li> Now launch <tt>xsm</tt> from another terminal window. Both a session
manager window and the xterm will appear. The xterm has a nice
property that sets it apart from all the other shells you are
currently running: within its shell, the <tt>SESSION_MANAGER</tt>
environment variable points to the session manager you just started.
<li> Launch your application from the new xterm window. It will connect
itself automatically to the session manager. You can check with the <em>ClientList</em> push button whether the connect was successful.<br>
<strong>Note:</strong> Never keep the <em>ClientList</em> open when you
start or end session managed clients! Otherwise <tt>xsm</tt> is likely to
crash.
<li> Use the session manager's <em>Checkpoint</em> and <em>Shutdown</em> buttons
with different settings and see how your application behaves. The save
type <em>local</em> means that the clients should save their state. It
corresponds to the <a href="qapplication.html#saveState">QApplication::saveState</a>() function. The <em>global</em> save type asks applications to save their unsaved changes in
permanent, globally accessible storage. It invokes <a href="qapplication.html#commitData">QApplication::commitData</a>().
<li> Whenever something crashes, blame <tt>xsm</tt> and not Qt. <tt>xsm</tt> is far
from being a usable session manager on a user's desktop. It is,
however, stable and useful enough to serve as testing environment.
</ul>
<p>
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2007
<a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a>
<td align=right><div align=right>Qt 3.3.8</div>
</table></div></address></body>
</html>
|