diff options
Diffstat (limited to 'doc/src/howtos/session.qdoc')
-rw-r--r-- | doc/src/howtos/session.qdoc | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/doc/src/howtos/session.qdoc b/doc/src/howtos/session.qdoc new file mode 100644 index 0000000..76972ab --- /dev/null +++ b/doc/src/howtos/session.qdoc @@ -0,0 +1,178 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page session.html + \title Session Management + + \ingroup best-practices + + A \e session is a group of running applications, each of which has a + particular state. The session is controlled by a service called the \e + session \e manager. The applications participating in the session are + called \e{session clients}. + + 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 \e session \e management. + + 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. + + \section1 Shutting a Session Down + + 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! + + + \section1 Protocols and Support on Different Platforms + + On Mac OS X, and Microsoft Windows versions prior to Windows 2000, + there is nothing like complete session management for applications + yet, i.e. no restoring of previous sessions. (Windows 2000 and XP + provide "hibernation" where the entire memory is saved to disk and + restored when the machine is restarted.) 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 QApplication::commitData() method. + + X11 has supported complete session management since X11R6. + + \section1 Getting Session Management to Work with Qt + + Start by reimplementing QApplication::commitData() to + enable your application to take part in the graceful logout process. If + you are only targeting the Microsoft Windows platform, this is all you can + and must provide. Ideally, your application should provide a shutdown + dialog similar to the following: + + \img session.png A typical dialog on shutdown + + Example code for this dialog can be found in the documentation of + QSessionManager::allowsInteraction(). + + 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 + QApplication::saveState(). All state data you are saving in this + function, should be marked with the session identifier + QApplication::sessionId(). This application specific identifier is + globally unique, so no clashes will occur. (See QSessionManager for + information on saving/restoring the state of a particular Qt + application.) + + Restoration is usually done in the application's main() + function. Check if QApplication::isSessionRestored() is \c true. If + that's the case, use the session identifier + QApplication::sessionId() again to access your state data and restore + the state of the application. + + \bold{Important:} 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 QObject::setObjectName()). When + restoring the application, you must ensure that all restored + top level widgets are given the same unique names they had before. + + \section1 Testing and Debugging Session Management + + 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. + + 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 \c xsm and is part of a standard X11R6 + installation. As always with X11, a useful and informative manual page + is provided. Using \c xsm is straightforward (apart from the clumsy + Athena-based user interface). Here's a simple approach: + + \list + \i Run X11R6. + \i Create a dot file \c .xsmstartup in your home directory which + contains the single line + \snippet doc/src/snippets/code/doc_src_session.qdoc 0 + This tells \c xsm that the default/failsafe session is just an xterm + and nothing else. Otherwise \c xsm would try to invoke lots of + clients including the windowmanager \c twm, which isn't very helpful. + \i Now launch \c xsm 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 \c SESSION_MANAGER + environment variable points to the session manager you just started. + \i Launch your application from the new xterm window. It will connect + itself automatically to the session manager. You can check with the \e + ClientList push button whether the connect was successful. + + \bold{Note:} Never keep the \e ClientList open when you + start or end session managed clients! Otherwise \c xsm is likely to + crash. + \i Use the session manager's \e Checkpoint and \e Shutdown buttons + with different settings and see how your application behaves. The save + type \e local means that the clients should save their state. It + corresponds to the QApplication::saveState() function. The \e + global save type asks applications to save their unsaved changes in + permanent, globally accessible storage. It invokes + QApplication::commitData(). + \i Whenever something crashes, blame \c xsm and not Qt. \c xsm 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. + \endlist +*/ |