Development/Tutorials/Session Management (es): Difference between revisions
(new page, spanish (Tutorials/Session management)) |
(traducción al español) |
||
Line 1: | Line 1: | ||
{{Template:I18n/Language Navigation Bar|Development/Tutorials/Session Management}} | {{Template:I18n/Language Navigation Bar|Development/Tutorials/Session Management}} | ||
== | ==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 <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. | |||
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. | |||
[http://stuff.mit.edu/afs/sipb/contrib/doc/X11/hardcopy/SM/xsmp.PS.gz ftp.x.org]. | |||
editor, | |||
== | ==Lectura avanzada== | ||
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. | |||
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/classKApplication.html KApplication] | |||
[http://api.kde.org/4.x-api/kdelibs-apidocs/ | |||
[http://api.kde.org/4.x-api/kdelibs-apidocs/ | |||
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. | |||
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] | |||
== | == 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 [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. | |||
=== | ===Reimplementar algunas funciones virtuales de KMainWindow=== | ||
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] | [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. | ||
* 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. | |||
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. | |||
===Añadir soporte para la administración de sesiones en tu función main()=== | |||
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. | |||
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow] ( | 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: | ||
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/ | |||
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKMainWindow.html KMainWindow]). | |||
<code cppqt> | <code cppqt> | ||
Line 76: | Line 47: | ||
kRestoreMainWindows< MyWindow >(); | kRestoreMainWindows< MyWindow >(); | ||
} else { | } else { | ||
// | // creamos la aplicación por defecto de la forma habitual | ||
// | // por ejemplo | ||
MyWindow * window = new MyWindow(); | MyWindow * window = new MyWindow(); | ||
// # | // la # se reemplazará por un numero, garantizadose | ||
// | // que sea único en la aplicación | ||
window->setObjectName("MyWindow#"); | window->setObjectName("MyWindow#"); | ||
window->show(); | window->show(); | ||
Line 87: | Line 58: | ||
</code> | </code> | ||
[http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed kRestoreMainWindows<>()] | [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. | ||
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 [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: | |||
<code cppqt> | <code cppqt> | ||
Line 101: | Line 71: | ||
kRestoreMainWindows< childMW1, childMW2, childMW3 >(); | kRestoreMainWindows< childMW1, childMW2, childMW3 >(); | ||
} else { | } else { | ||
// | // creamos la aplicación por defecto de la forma habitual | ||
// | // 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(); | ||
// # | // la # se reemplazará por un numero, garantizadose | ||
// | // que sea único en la aplicación | ||
window1->setObjectName("type1mainWindow#"); | window1->setObjectName("type1mainWindow#"); | ||
window2->setObjectName("type2mainWindow#"); | window2->setObjectName("type2mainWindow#"); | ||
Line 118: | Line 88: | ||
</code> | </code> | ||
Actualmente, la plantilla [http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/kmainwindow_8h.html#88ce427e39f425eefa5a94d746eb2bed 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:'' [mailto:[email protected] Matthias Ettrich] | ||
[[Category:Programming]] | [[Category:Programming]] | ||
[[Category:Tutorial]] | [[Category:Tutorial]] | ||
[[Category:FAQs]] | [[Category:FAQs]] |
Revision as of 23:46, 28 March 2009
Development/Tutorials/Session Management
Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | Eesti | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenčina | Slovenščina | српски | Türkçe | Tiếng Việt | Українська | 简体中文 | 繁體中文
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