|
|
(59 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, since version 2.0, 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].
| |
| | |
| KDE also 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.
| |
| | |
| 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.
| |
| | |
| ==Tutorial==
| |
| | |
| Here's just a brief overview how things are done. Again, see the
| |
| respective class documentation for details. Imagine you have an
| |
| application with a main window MyWindow inherited 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>
| |
| | |
| and 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.
| |
| | |
| 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>
| |
| | |
| ==Architecture==
| |
| | |
| 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]] | |