Development/Tutorials/Session Management (es)
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