Gestione di sessione

Il termine sessione si riferisce al stato del desktop dell'utente: quali applicazioni sono in esecuzione, dove sono posizionate le finestre, quali finestre delle applicazioni aperte sono visualizzate, la dimensione di queste, quali documenti sono aperti, la posizione del cursore e così via. Gli utenti devono essere in grado di salvare la loro sessione prima di uscire da sistema, e di averla automaticamente ripristinata nella sessione di lavoro successiva. Per fare ciò, le applicazioni devono cooperare avendo la possibilità di memorizzare informazioni sul loro stato indipendentemente dal gestore di finestre.

Una particolare applicazione chiamata gestore di sessione (session manager) notifica alle applicazioni il momento in cui queste devono salvare le loro proprietà. Gnome fornisce un session manager chiamato gnome-session, che utilizza, purtroppo, le specifiche per la sessione di X Window, che sono antiquate. CDE utilizza le stesse specifiche, mentre KDE sta progettando di adottare queste specifiche. Una applicazione che implementa la gestione di sessione attraverso l'interfaccia fornita da Gnome funziona su qualunque desktop fornito di questa gestione. Gnome inoltre implementa alcune estensioni alle specifiche di base (Ad esempio la priorità di avvio), che non creano nessun tipo di problema con altri gestori di sessione. Queste verrano inoltre inserite nelle prossime versione di KDE.

È cosa buona e giusta leggere la documentazione sulla gestione di sessione inclusa in X Window: si rivela una buona introduzione su ciò che accade dietro le quinte. Le librerie di Gnome inoltre includono un ottimo documento, chiamato session-management.txt, e anche il file gnome-client.h, il quale è stato appositamente riempito di commenti utili allo sviluppatore.

Utilizzare l'oggetto GnomeClient

Gnome vi protegge dall'interfaccia a basso livello fornita da X Window, attraverso un GtkObject chiamato GnomeClient. Questo rappresenta la connessione fra la vostra applicazione e il gestore di sessione.

Gnome si occupa di gran parte dei dettagli di questa gestione. Per la maggior parte delle applicazioni è necessario rispondere unicamente a due richieste.

Quando il gestore di sessione richiede alla applicazione una particolare azione, l'oggetto GnomeClient emetterà il segnale appropriato. I due segnali più importanti sono "save_yourself" e "die". "save_yourself" viene emesso quando l'applicazione deve salvare il proprio stato, mentre "die" viene emesso quando l'applicazione deve uscire. Una callback per "die" è piuttosto complessa visto il numero degli argomenti che deve accettare, mentre una callback per "dir" è pressoché banale.

GnomeHello ottiene un puntatore dall'oggetto GnomeClient e connette i suoi segnali nel seguente modo:

  client = gnome_master_client ();
  gtk_signal_connect (GTK_OBJECT (client), "save_yourself",
                      GTK_SIGNAL_FUNC (save_session), argv[0]);
  gtk_signal_connect (GTK_OBJECT (client), "die",
                      GTK_SIGNAL_FUNC (session_die), NULL);

argv[0] verrà utilizzando dalla callback per "save_yourself".

Ecco la callback per il segnale "die" dei sorgenti di GnomeHello:

static void
session_die(GnomeClient* client, gpointer client_data)
{
  gtk_main_quit ();
}

In parole povere: l'applicazione termina.

Ecco adesso la callback per "save_yourself":

static gint
save_session (GnomeClient *client, gint phase, GnomeSaveStyle save_style,
              gint is_shutdown, GnomeInteractStyle interact_style,
              gint is_fast, gpointer client_data)
{
  gchar** argv;
  guint argc;

  argv = g_malloc0(sizeof(gchar*)*4);
  argc = 1;

  argv[0] = client_data;

  if (message)
    {
      argv[1] = "--message";
      argv[2] = message;
      argc = 3;
    }
  
  gnome_client_set_clone_command (client, argc, argv);
  gnome_client_set_restart_command (client, argc, argv);

  return TRUE;
}

Questa callback è più complessa della precedente. Il segnale "save_yourself" deve passare al gestore di sessione le modalità di riavvio e di clonazione (creazione di una nuova istanza) della applicazione. L'applicazione riavviata deve poter avere maggiori informazioni possibili sullo stato precedente. Nel caso di GnomeHello, questa ricorderà il messaggio mostrato. Il modo più semplice per registrare le informazioni sullo stato dell'applicazioni è quello di generarle dalla linea di comando, come in GnomeHello. È inoltre possibile effettuare una richiesta a GnomeClient per ottenere il percorso da utilizzare nella API di gnome-config. Sarà possibile quindi salvare le informazioni in un file di configurazione per ogni sessione.