|
|
(53 intermediate revisions by 7 users not shown) |
Line 1: |
Line 1: |
| {{Template:I18n/Language Navigation Bar|Development/Tutorials/Session Management}}
| | This tutorial was updated and moved to https://develop.kde.org/docs/features/session-managment/ |
|
| |
|
| {{Under Construction}}
| | [[Category:MovedDevelop]] |
| | |
| ==About KDE and X11 session management==
| |
| | |
| KDE supports the legacy X11R4 and ICCCM session
| |
| management protocols. Legacy applications that define the <tt>WM_COMMAND</tt>
| |
| property or support the <tt>WM_SAVE_YOURSELF</tt> protocol will be restarted
| |
| with the specified command. The window geometries will be restored on a best
| |
| effort basis.
| |
| | |
| Since version 2.0, KDE also supports and uses the standard X11R6
| |
| session management protocol XSMP. The official documentation of the
| |
| standard can be download from the X Consortium's FTP server
| |
| [http://stuff.mit.edu/afs/sipb/contrib/doc/X11/hardcopy/SM/xsmp.PS.gz ftp.x.org].
| |
| | |
| Unlike these legacy protocols, the new X11R6 session management gives a
| |
| chance to save application dependent settings when you log out. A text
| |
| editor, for instance, would save the names of the loaded files and would
| |
| reload them when you log in again. Another major advantage of the new
| |
| protocol is the support for a clean and safe logout procedure even if the
| |
| users decides not to restore the session next time. The protocol gives
| |
| applications the possibility to interact with the user in case they are in
| |
| danger to lose some data, and to cancel the shutdown process if necessary.
| |
| | |
| ==Further Reading==
| |
| | |
| An introductive overview of session management functionality and
| |
| the Qt API for it is available from [http://doc.trolltech.com/4.4/session.html doc.trolltech.com].
| |
| | |
| In KDE, the classes [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication]
| |
| and [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow]
| |
| hide all the ugly details from the programmer. Basically, a
| |
| KApplication manages a KConfig configuration object sessionConfig()
| |
| for you, that your application can utilize to store session specific data.
| |
| | |
| Please read the respective class documentation, especially the one of
| |
| KMainWindow, for a detailed interface description. With the advanced
| |
| functionality in KMainWindow, it's really just a matter of a few lines
| |
| to get even a multi-window application to retains its state between
| |
| different user sessions.
| |
| | |
| ==Implementing session management in your application==
| |
| | |
| Here's just a brief overview how things are done. Again, see the
| |
| respective class documentation for details.
| |
| | |
| ===Add session management support to your main() function===
| |
| | |
| Imagine you have an
| |
| application with a main window MyWindow inherited from KMainWindow (or from KXmlGuiWindow, which inherits from KMainWindow). In
| |
| your main() function, you would then create/restore the application
| |
| windows with something like:
| |
| | |
| <code cppqt3>
| |
| if ( kapp->isRestored() ) {
| |
| RESTORE( MyWindow )
| |
| } else {
| |
| // create default application as usual
| |
| }
| |
| </code>
| |
| | |
| With KMainWindow::classNameOfToplevel(), it is also possible to
| |
| restore different types of toplevel windows within one application. In
| |
| that case, the RESTORE macro is too primitive, use something like this
| |
| in your main() function instead:
| |
| | |
| <code cppqt3>
| |
| if ( kapp->isRestored() ){
| |
| int n = 1;
| |
| while ( KMainWindow::canBeRestored( n ) ) {
| |
| if ( KMainWindow::classNameOfToplevel( n ) == "MyWindow1" )
| |
| ( new MyWindow1 )->restore( n );
| |
| else if ( KMainWindow::classNameOfToplevel( n ) == "MyWindow2" )
| |
| ( new MyWindow2 )->restore( n );
| |
| // and so on....
| |
| n++;
| |
| }
| |
| } else {
| |
| // create default application as usual
| |
| }
| |
| </code>
| |
| | |
| ===Reimplement some virtual functions of KMainWindow===
| |
| | |
| You reimplement the store/restore handlers in MyWindow to save and
| |
| restore all additional settings. For a text editor, that would be the
| |
| loaded files, for example:
| |
| | |
| <code cppqt3>
| |
| void MyWindow::saveProperties( KConfig* ) {
| |
| // save properties here
| |
| }
| |
| | |
| void MyWindow::readProperties( KConfig* ) {
| |
| // read properties here
| |
| }
| |
| </code>
| |
| | |
| Note that standard settings like window sizes, toolbar settings
| |
| etc. are automatically handled by the system.
| |
| | |
| ==Appendix: Architecture of the KDE session manager==
| |
| | |
| The session management server in KDE is called '''ksmserver''' and it is
| |
| part of the '''kdebase''' package. The server interacts with the KDE window
| |
| manager '''kwin''' to save and restore the window geometries and to perform
| |
| legacy session management. To make session management work, '''ksmserver'''
| |
| has to be started as last process of the X login procedure. This happens
| |
| automatically at the end of the '''startkde''' script.
| |
| | |
| | |
| | |
| | |
| [[Category:Programming]]
| |
| [[Category:Tutorial]]
| |
| [[Category:FAQs]] | |