source: trunk/doc/src/howtos/session.qdoc@ 846

Last change on this file since 846 was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

  • Property svn:eol-style set to native
File size: 8.0 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the documentation of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:FDL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in a
14** written agreement between you and Nokia.
15**
16** GNU Free Documentation License
17** Alternatively, this file may be used under the terms of the GNU Free
18** Documentation License version 1.3 as published by the Free Software
19** Foundation and appearing in the file included in the packaging of this
20** file.
21**
22** If you have questions regarding the use of this file, please contact
23** Nokia at [email protected].
24** $QT_END_LICENSE$
25**
26****************************************************************************/
27
28/*!
29 \page session.html
30 \title Session Management
31 \brief How to do session management with Qt.
32 \ingroup best-practices
33
34 A \e session is a group of running applications, each of which has a
35 particular state. The session is controlled by a service called the \e
36 session \e manager. The applications participating in the session are
37 called \e{session clients}.
38
39 The session manager issues commands to its clients on behalf of the
40 user. These commands may cause clients to commit unsaved changes (for
41 example by saving open files), to preserve their state for future
42 sessions, or to terminate gracefully. The set of these operations is
43 called \e session \e management.
44
45 In the common case, a session consists of all applications that a
46 user runs on their desktop at a time. Under Unix/X11, however, a
47 session may include applications running on different computers and
48 may span multiple displays.
49
50 \section1 Shutting a Session Down
51
52 A session is shut down by the session manager, usually on behalf of
53 the user when they want to log out. A system might also perform an
54 automatic shutdown in an emergency situation, for example, if power is
55 about to be lost. Clearly there is a significant difference between
56 these types of shutdown. During the first, the user may want to
57 interact with the application, specifying exactly which files should
58 be saved and which should be discarded. In the latter case, there's no
59 time for interaction. There may not even be a user sitting in front of
60 the machine!
61
62
63 \section1 Protocols and Support on Different Platforms
64
65 On Mac OS X, and Microsoft Windows versions prior to Windows 2000,
66 there is nothing like complete session management for applications
67 yet, i.e. no restoring of previous sessions. (Windows 2000 and XP
68 provide "hibernation" where the entire memory is saved to disk and
69 restored when the machine is restarted.) They do support graceful
70 logouts where applications have the opportunity to cancel the process
71 after getting confirmation from the user. This is the functionality
72 that corresponds to the QApplication::commitData() method.
73
74 X11 has supported complete session management since X11R6.
75
76 \section1 Getting Session Management to Work with Qt
77
78 Start by reimplementing QApplication::commitData() to
79 enable your application to take part in the graceful logout process. If
80 you are only targeting the Microsoft Windows platform, this is all you can
81 and must provide. Ideally, your application should provide a shutdown
82 dialog similar to the following:
83
84 \img session.png A typical dialog on shutdown
85
86 Example code for this dialog can be found in the documentation of
87 QSessionManager::allowsInteraction().
88
89 For complete session management (only supported on X11R6 at present),
90 you must also take care of saving the application's state, and
91 potentially of restoring the state in the next life cycle of the
92 session. This saving is done by reimplementing
93 QApplication::saveState(). All state data you are saving in this
94 function, should be marked with the session identifier
95 QApplication::sessionId(). This application specific identifier is
96 globally unique, so no clashes will occur. (See QSessionManager for
97 information on saving/restoring the state of a particular Qt
98 application.)
99
100 Restoration is usually done in the application's main()
101 function. Check if QApplication::isSessionRestored() is \c true. If
102 that's the case, use the session identifier
103 QApplication::sessionId() again to access your state data and restore
104 the state of the application.
105
106 \bold{Important:} In order to allow the window manager to
107 restore window attributes such as stacking order or geometry
108 information, you must identify your top level widgets with
109 unique application-wide object names (see QObject::setObjectName()). When
110 restoring the application, you must ensure that all restored
111 top level widgets are given the same unique names they had before.
112
113 \section1 Testing and Debugging Session Management
114
115 Session management support on Mac OS X and Windows is fairly limited
116 due to the lack of this functionality in the operating system
117 itself. Simply shut the session down and verify that your application
118 behaves as expected. It may be useful to launch another application,
119 usually the integrated development environment, before starting your
120 application. This other application will get the shutdown message
121 afterwards, thus permitting you to cancel the shutdown. Otherwise you
122 would have to log in again after each test run, which is not a problem
123 per se, but is time consuming.
124
125 On Unix you can either use a desktop environment that supports
126 standard X11R6 session management or, the recommended method, use the
127 session manager reference implementation provided by the X Consortium.
128 This sample manager is called \c xsm and is part of a standard X11R6
129 installation. As always with X11, a useful and informative manual page
130 is provided. Using \c xsm is straightforward (apart from the clumsy
131 Athena-based user interface). Here's a simple approach:
132
133 \list
134 \i Run X11R6.
135 \i Create a dot file \c .xsmstartup in your home directory which
136 contains the single line
137 \snippet doc/src/snippets/code/doc_src_session.qdoc 0
138 This tells \c xsm that the default/failsafe session is just an xterm
139 and nothing else. Otherwise \c xsm would try to invoke lots of
140 clients including the windowmanager \c twm, which isn't very helpful.
141 \i Now launch \c xsm from another terminal window. Both a session
142 manager window and the xterm will appear. The xterm has a nice
143 property that sets it apart from all the other shells you are
144 currently running: within its shell, the \c SESSION_MANAGER
145 environment variable points to the session manager you just started.
146 \i Launch your application from the new xterm window. It will connect
147 itself automatically to the session manager. You can check with the \e
148 ClientList push button whether the connect was successful.
149
150 \bold{Note:} Never keep the \e ClientList open when you
151 start or end session managed clients! Otherwise \c xsm is likely to
152 crash.
153 \i Use the session manager's \e Checkpoint and \e Shutdown buttons
154 with different settings and see how your application behaves. The save
155 type \e local means that the clients should save their state. It
156 corresponds to the QApplication::saveState() function. The \e
157 global save type asks applications to save their unsaved changes in
158 permanent, globally accessible storage. It invokes
159 QApplication::commitData().
160 \i Whenever something crashes, blame \c xsm and not Qt. \c xsm is far
161 from being a usable session manager on a user's desktop. It is,
162 however, stable and useful enough to serve as testing environment.
163 \endlist
164*/
Note: See TracBrowser for help on using the repository browser.