Development/Tutorials/Session Management (es): Difference between revisions

From KDE TechBase
(new page, spanish (Tutorials/Session management))
 
No edit summary
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Development/Tutorials/Session Management}}


==About KDE and X11 session management==


Since KDE 1.0, the legacy X11R4 and ICCCM session management protocols
==KDE y el administrador de sesiones de X11==
are supported. 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 KDE 2.0, also the standard X11R6 session management protocol XSMP
Desde KDE 1.0, están soportados los protocolos de administración de sesiones X11R4 e ICCCM. El legado de las aplicaciones que definen la propiedad <tt>WM_COMMAND</tt> o soportan el protocolo <tt>WM_SAVE_YOURSELF</tt> será restaurado con la orden específica. Es decir, se restaurará la geometría de las ventanas correctamente.
is supported and used. 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 the 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==
A partir de KDE 2.0, también está soportado y en uso el protocolo XSMP del administrador de sesiones de X11R6. La documentación oficial del estándar puede descargarse desde el servidor FTP del consorcio de X [http://stuff.mit.edu/afs/sipb/contrib/doc/X11/hardcopy/SM/xsmp.PS.gz ftp.x.org]. A diferencia de los protocolos de legado, el nuevo administrador de sesiones X11R6 da la posibilidad de guardar la aplicación dependiendo de los ajustes establecidos al salir de ella. Un editor de texto, por ejemplo, guardaría los nombres de los archivos abiertos y los volvería a abrir cuando se iniciara de nuevo. Otra gran ventaja del nuevo protocolo es el soporte para poder cerrar la aplicación de manera normal y segura, incluso si el usuario decide no restaurar la sesión la próxima vez. El protocolo proporciona a las aplicaciones la posibilidad de interactuar con el usuario en el caso de que estén en peligro de perder algunos datos, y también de cancelar el proceso de cerrado si es necesario.


An introductive overview of session management functionality and
==Lectura avanzada==
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]
En [http://doc.trolltech.com/4.4/session.html doc.trolltech.com] está disponible una introducción preliminar de la funcionalidad de administración de sesiones y de la API de Qt.
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
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication] manages a
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKConfig.html KConfig] configuration object
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html#8f88369c240d6d90a04d29b2761989d9 sessionConfig()]
for you, that your application can utilize to store session specific data.


Please read the respective class documentation, especially the one of
En KDE, las clases [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication] y [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] abstraen al programador de todos los detalles de bajo nivel. Fundamentalmente, una [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html KApplication] maneja por ti la [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKApplication.html#8f88369c240d6d90a04d29b2761989d9 sessionConfig()] de un objeto de configuración [http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKConfig.html KConfig], que tu aplicación puede usar para guardar los datos específicos de la sesión.
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], for a detailed interface description. With the advanced
functionality in [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html 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==
Lee por favor la documentación respectiva de la clase, especialmente la de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] para una descripción detallada de la interfaz. Realmente sólo son necesarias unas cuantas lineas de código para tener una aplicación multi-ventana que almacene su estado entre distintas sesiones.


Here's just a brief overview how things are done. Again, see the
== Implementar la administración de sesiones en tu aplicación==
respective class documentation for details.


Implementing session management in KDE is easy. If your main window inherits from [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], you have just 2 things to do:
Aquí tienes una pequeña sinopsis sobre como llevarla a cabo. De nuevo lee la respectiva documentación de la clase para los detalles.
* Reimplement some virtual functions of [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow].
* Add session management support to your main() function.
That's all.


===Reimplement some virtual functions of KMainWindow===
Implementar la administración de sesiones en KDE es facil. Si tu ventana principal hereda de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], sólo tienes que hacer dos cosas:
* Reimplementar algunas funciones virtuales de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow].
* Añadir el soporte de administración de sesiones a tu función main().
Esto es todo :P.


[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] will save its position, geometry and positions of toolbars and menubar on logout.
===Reimplementar algunas funciones virtuales de KMainWindow===
* To warn the user that the application or some windows have unsaved data on close or logout (for example: show a dialog with the buttons "Save changes" and "Discard changes"), reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()].
* To save additional data, reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()]. (For a text editor, that would be the loaded files, for example.) Note that no user interaction is allowed in this function! For example, you may not display any dialog!
* To read the additional data again on next login, reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 readProperties()].
These functions are called automatically by [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] respectively by the session manager. Note that it is not determined if [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()] is called before or after [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()]! Please read documentation of the respective functions before reimplementing them.


To save your application-wide properties (data that is only needed once per application, and not for each main window) reimplement [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#cf811d77a3acdcf2b61f8826429615a7 saveGlobalProperties()] and it's counterpart [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#2d4da4f305f00e8a5c94f5b978334231 readGlobalProperties].  Normally, you don't need these functions.
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] guardará su posición, su geometría y la posición de las barras de herramientas y de menú al salir.


===Add session management support to your main() function===
* Para advertir al usuario de que la aplicación o alguna ventana tiene datos sin guardar al cerrarla o al salir (por ejemplo: mostrar un diálogo con los botones "Guardar cambios" y "Aplicar cambios"), reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()].
* Para guardar datos adicionales, reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()]. (Para un editor de textos, deberías guardar los archivos abiertos, por ejemplo). Date cuenta de que no está permitida ninguna interacción con el usuario!. Por ejemplo, no puedes mostrar ningún diálogo.
* Para leer datos adicionales en el siguiente inicio, reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 readProperties()].
Estas funciones son llamadas automáticamente por [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] y respectivamente por el administrador de sesiones. Ten en cuenta de que no se especifica si se invoca a [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 saveProperties()] antes o después de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 queryClose()]! Lee por favor la documentación de dichas funciones antes de reimplementarlas.


While [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 KMainWindow::saveProperties()] and [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 KMainWindow::queryClose()] will work out of the box, [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 KMainWindow::readProperties()] will not. You have to add some code to your main() function to implement session restoring.
Para guardar las propiedades de tu aplicación (datos que solo necesitan una vez por aplicación, y no por cada ventana principal) reimplementa [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#cf811d77a3acdcf2b61f8826429615a7 saveGlobalProperties()] y su homólogo [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#2d4da4f305f00e8a5c94f5b978334231 readGlobalProperties()].
Por norma general, no necesitas dichas funciones.


Imagine you have an
===Añadir soporte para la administración de sesiones en tu función main()===
application with a main window MyWindow inherited from
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] (or from
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKXmlGuiWindow.html KXmlGuiWindow], which inherits from
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow]). In your main() function, you would then create/restore the
application windows with something like:


<code cppqt>
Mientras que [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#4c7a6c395eec0bb245cd9ad6c884f897 KMainWindow::saveProperties()] y [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#f8c5708414be62f259114b0453ef8432 KMainWindow::queryClose()] funcionarán tal cual, [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#c8d0d64ed5b309ba1da410423120d0a6 KMainWindow::readProperties()] no. Tienes que añadir algo de código a tu función main() para implementar la administración de sesiones.
 
Imagina que tienes una aplicación con una ventana principal MyWindows que hereda de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] (o de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKXmlGuiWindow.html KXmlGuiWindow], la cual hereda de KMainWindow). En tu función main() deberás crear/restaurar las ventanas de la aplicación con algo parecido a:
 
<syntaxhighlight lang="cpp-qt">
KApplication app;
KApplication app;
if ( app.isSessionRestored() ) {
if ( app.isSessionRestored() ) {
   kRestoreMainWindows< MyWindow >();
   kRestoreMainWindows< MyWindow >();
} else {
} else {
   // create default application as usual
   // creamos la aplicación por defecto  de la forma habitual
   // for example:
   // por ejemplo
   MyWindow * window = new MyWindow();
   MyWindow * window = new MyWindow();
   // # will be replaced with numbers that are guaranteed
   // la # se reemplazará por un numero, garantizadose
   // to be unique in the application:
   // que sea único en la aplicación
   window->setObjectName("MyWindow#");
   window->setObjectName("MyWindow#");
   window->show();
   window->show();
}
}
return app.exec();
return app.exec();
</code>
</syntaxhighlight>


[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows<>()] will create (on the heap) as many instances of your main windows as have existed in the last session and call [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#46e01bd1aa6d488f1be2a5010030efb2 KMainWindow::restore()] with the correct arguments. Note that also QWidget::show() is called implicitly.
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows<>()] creará (en la "heap") tantas instancias de tu ventana principal como hubiera en la última sesión y llamará a [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html#46e01bd1aa6d488f1be2a5010030efb2 KMainWindow::restore()] con los argumentos adecuados. Date cuenta que la llamada a QWidget::show() se realiza de manera implícita.


About setObjectName("MyWindow#"): For session management and window management to work properly, all main windows in the application should have a different name. If you don't do it, KMainWindow will create a unique name, but it's recommended to explicitly pass a window name that will also describe the type of the window. If there can be several windows of the same type, append '#' (hash) to the name, and KMainWindow will replace it with numbers to make the names unique. For example, for a mail client which has one main window showing the mails and folders, and which can also have one or more windows for composing mails, the name for the folders window should be e.g. "mainwindow" and for the composer windows "composer#".
Sobre setObjectName("MyWindow#"): para que el administrador de sesiones y el administrador de ventanas funcionen correctamente, todas las ventanas principales de la aplicación deben tener nombres diferentes. Si tu no lo haces, KMainWindow creará un nombre único, pero es recomendable usar explicitamente un nombre de ventana que también describa el tipo de la ventana. Si se da el caso de tener varias ventanas del mismo tipo, concatena una almohadilla ('#') al nombre y así KMainWindow la reemplazará con un número, de este modo harás los nombres únicos. Por ejemplo, en un cliente de correo que tiene una ventana principal en la que muestra los correos y las carpetas, y que además puede tener una o mas ventanas para redactar correos, el nombre para la ventana de las carpetas debería ser "mainwindow", y el de las ventanas para redactar "redactor#".


With this you can easily restore all toplevel windows of your application.
De esta forma puedes restaurar de manera sencilla las ventanas principales de tu aplicación.


It is also possible to restore different types of toplevel windows (each
También es posible restaurar diferentes tipos de ventanas principales (cada una de ellas derivada de [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], por supuesto) mediante una aplicación. Imagina que tienes tres clases de ventanas principales: childMW1, childMW2 y childMW3:
derived from [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow], of course) within one application. Imagine you have three classes of main windows: childMW1, childMW2 and childMW3:


<code cppqt>
<syntaxhighlight lang="cpp-qt">
KApplication app;
KApplication app;
if ( app.isSessionRestored() ) {
if ( app.isSessionRestored() ) {
   kRestoreMainWindows< childMW1, childMW2, childMW3 >();
   kRestoreMainWindows< childMW1, childMW2, childMW3 >();
} else {
} else {
   // create default application as usual
   // creamos la aplicación por defecto  de la forma habitual
   // for example:
   // por ejemplo
   childMW1* window1 = new childMW1();
   childMW1* window1 = new childMW1();
   childMW2* window2 = new childMW2();
   childMW2* window2 = new childMW2();
   childMW3* window3 = new childMW3();
   childMW3* window3 = new childMW3();
   // # will be replaced with numbers that are guaranteed
   // la # se reemplazará por un numero, garantizadose
   // to be unique in the application:
   // que sea único en la aplicación
   window1->setObjectName("type1mainWindow#");
   window1->setObjectName("type1mainWindow#");
   window2->setObjectName("type2mainWindow#");
   window2->setObjectName("type2mainWindow#");
Line 116: Line 86:
}
}
return app.exec();
return app.exec();
</code>
</syntaxhighlight>


Currently, the [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows<>()] template functions are provided for up to three template arguments.
Actualmente, la plantilla [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows<>()] soporta hasta tres argumentos.


==Appendix: Architecture of the KDE session manager==
== Apéndice: Arquitectura del administrador de sesiones de KDE==


The session management server in KDE is called '''ksmserver''' and it is
En KDE el servidor de administración de sesiones se llama ''ksmserver'' y es parte del paquete '''kdebase'''. El servidor interactua con el administrador de ventanas de KDE, '''kwin''', para guardar y restaurar la geometría de las ventanas. Para que el administrador de sesiones realice su trabajo, '''ksmserver''' debe iniciarse como el ultimo proceso del procedimiento de inicio de X. Esto se realiza de manera automática al final de script '''startkde'''.
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.




''Initial Author:'' [mailto:[email protected] Matthias Ettrich]
''Autor inicial:'' [mailto:[email protected] Matthias Ettrich]


[[Category:Programming]]
[[Category:Programming]]
[[Category:Tutorial]]
[[Category:Tutorial]]
[[Category:FAQs]]
[[Category:FAQs]]

Latest revision as of 12:24, 18 July 2012


KDE y el administrador de sesiones de X11

Desde KDE 1.0, están soportados los protocolos de administración de sesiones X11R4 e ICCCM. El legado de las aplicaciones que definen la propiedad WM_COMMAND o soportan el protocolo WM_SAVE_YOURSELF será restaurado con la orden específica. Es decir, se restaurará la geometría de las ventanas correctamente.

A partir de KDE 2.0, también está soportado y en uso el protocolo XSMP del administrador de sesiones de X11R6. La documentación oficial del estándar puede descargarse desde el servidor FTP del consorcio de X ftp.x.org. A diferencia de los protocolos de legado, el nuevo administrador de sesiones X11R6 da la posibilidad de guardar la aplicación dependiendo de los ajustes establecidos al salir de ella. Un editor de texto, por ejemplo, guardaría los nombres de los archivos abiertos y los volvería a abrir cuando se iniciara de nuevo. Otra gran ventaja del nuevo protocolo es el soporte para poder cerrar la aplicación de manera normal y segura, incluso si el usuario decide no restaurar la sesión la próxima vez. El protocolo proporciona a las aplicaciones la posibilidad de interactuar con el usuario en el caso de que estén en peligro de perder algunos datos, y también de cancelar el proceso de cerrado si es necesario.

Lectura avanzada

En doc.trolltech.com está disponible una introducción preliminar de la funcionalidad de administración de sesiones y de la API de Qt.

En KDE, las clases KApplication y KMainWindow abstraen al programador de todos los detalles de bajo nivel. Fundamentalmente, una KApplication maneja por ti la sessionConfig() de un objeto de configuración KConfig, que tu aplicación puede usar para guardar los datos específicos de la sesión.

Lee por favor la documentación respectiva de la clase, especialmente la de KMainWindow para una descripción detallada de la interfaz. Realmente sólo son necesarias unas cuantas lineas de código para tener una aplicación multi-ventana que almacene su estado entre distintas sesiones.

Implementar la administración de sesiones en tu aplicación

Aquí tienes una pequeña sinopsis sobre como llevarla a cabo. De nuevo lee la respectiva documentación de la clase para los detalles.

Implementar la administración de sesiones en KDE es facil. Si tu ventana principal hereda de KMainWindow, sólo tienes que hacer dos cosas:

  • Reimplementar algunas funciones virtuales de KMainWindow.
  • Añadir el soporte de administración de sesiones a tu función main().

Esto es todo :P.

Reimplementar algunas funciones virtuales de KMainWindow

KMainWindow guardará su posición, su geometría y la posición de las barras de herramientas y de menú al salir.

  • Para advertir al usuario de que la aplicación o alguna ventana tiene datos sin guardar al cerrarla o al salir (por ejemplo: mostrar un diálogo con los botones "Guardar cambios" y "Aplicar cambios"), reimplementa queryClose().
  • Para guardar datos adicionales, reimplementa saveProperties(). (Para un editor de textos, deberías guardar los archivos abiertos, por ejemplo). Date cuenta de que no está permitida ninguna interacción con el usuario!. Por ejemplo, no puedes mostrar ningún diálogo.
  • Para leer datos adicionales en el siguiente inicio, reimplementa readProperties().

Estas funciones son llamadas automáticamente por KMainWindow y respectivamente por el administrador de sesiones. Ten en cuenta de que no se especifica si se invoca a saveProperties() antes o después de queryClose()! Lee por favor la documentación de dichas funciones antes de reimplementarlas.

Para guardar las propiedades de tu aplicación (datos que solo necesitan una vez por aplicación, y no por cada ventana principal) reimplementa saveGlobalProperties() y su homólogo readGlobalProperties(). Por norma general, no necesitas dichas funciones.

Añadir soporte para la administración de sesiones en tu función main()

Mientras que KMainWindow::saveProperties() y KMainWindow::queryClose() funcionarán tal cual, KMainWindow::readProperties() no. Tienes que añadir algo de código a tu función main() para implementar la administración de sesiones.

Imagina que tienes una aplicación con una ventana principal MyWindows que hereda de KMainWindow (o de KXmlGuiWindow, la cual hereda de KMainWindow). En tu función main() deberás crear/restaurar las ventanas de la aplicación con algo parecido a:

KApplication app;
if ( app.isSessionRestored() ) {
  kRestoreMainWindows< MyWindow >();
} else {
  // creamos la aplicación por defecto  de la forma habitual
  // por ejemplo
  MyWindow * window = new MyWindow();
  // la # se reemplazará por un numero, garantizadose
  // que sea único en la aplicación
  window->setObjectName("MyWindow#");
  window->show();
}
return app.exec();

kRestoreMainWindows<>() creará (en la "heap") tantas instancias de tu ventana principal como hubiera en la última sesión y llamará a KMainWindow::restore() con los argumentos adecuados. Date cuenta que la llamada a QWidget::show() se realiza de manera implícita.

Sobre setObjectName("MyWindow#"): para que el administrador de sesiones y el administrador de ventanas funcionen correctamente, todas las ventanas principales de la aplicación deben tener nombres diferentes. Si tu no lo haces, KMainWindow creará un nombre único, pero es recomendable usar explicitamente un nombre de ventana que también describa el tipo de la ventana. Si se da el caso de tener varias ventanas del mismo tipo, concatena una almohadilla ('#') al nombre y así KMainWindow la reemplazará con un número, de este modo harás los nombres únicos. Por ejemplo, en un cliente de correo que tiene una ventana principal en la que muestra los correos y las carpetas, y que además puede tener una o mas ventanas para redactar correos, el nombre para la ventana de las carpetas debería ser "mainwindow", y el de las ventanas para redactar "redactor#".

De esta forma puedes restaurar de manera sencilla las ventanas principales de tu aplicación.

También es posible restaurar diferentes tipos de ventanas principales (cada una de ellas derivada de KMainWindow, por supuesto) mediante una aplicación. Imagina que tienes tres clases de ventanas principales: childMW1, childMW2 y childMW3:

KApplication app;
if ( app.isSessionRestored() ) {
  kRestoreMainWindows< childMW1, childMW2, childMW3 >();
} else {
  // creamos la aplicación por defecto  de la forma habitual
  // por ejemplo
  childMW1* window1 = new childMW1();
  childMW2* window2 = new childMW2();
  childMW3* window3 = new childMW3();
  // la # se reemplazará por un numero, garantizadose
  // que sea único en la aplicación
  window1->setObjectName("type1mainWindow#");
  window2->setObjectName("type2mainWindow#");
  window3->setObjectName("type3mainWindow#");
  window1->show();
  window2->show();
  window3->show();
}
return app.exec();

Actualmente, la plantilla kRestoreMainWindows<>() soporta hasta tres argumentos.

Apéndice: Arquitectura del administrador de sesiones de KDE

En KDE el servidor de administración de sesiones se llama ksmserver y es parte del paquete kdebase. El servidor interactua con el administrador de ventanas de KDE, kwin, para guardar y restaurar la geometría de las ventanas. Para que el administrador de sesiones realice su trabajo, ksmserver debe iniciarse como el ultimo proceso del procedimiento de inicio de X. Esto se realiza de manera automática al final de script startkde.


Autor inicial: Matthias Ettrich