Le Be Book Table des Matières

Images d'arrière-plan

Declaré dans: be/be_apps/Tracker/Background.h

Le Tracker vous laisse la possibilité d'inclure une image en arrière-plan dans chaque espace de travail de votre bureau ainsi que dans chaque fenêtre de visualisation de ré,pertoire.

Le Tracker ne remplit, pour le moment, l'arrière-plan des fenêtres de répertoire que lorsque celles-ci sont en mode de visualisation par icône (ou par mini-icône) .


Attributs d'arrière plan

Les informations au sujet de l'image d'arrière plan d'un répertoire sont stockées en tant que BMessage mis à plat dans l'attribut de fichier B_BACKGROUND_INFO de ce dossier. Le répertoire B_DESKTOP_FOLDER porte les informations d'arrière-plan pour tous les espaces de travail (un message mis à plat par espace de travail).

Les données de l'attribut B_BACKGROUND_INFO composent un BMessage mis à plat contenant ces champs:

Nom Type Description
B_BACKGROUND_IMAGE B_STRING_TYPE Le chemin complet vers l'image. Cette image doit être dans un format compris par l'un des traducteurs (cf. le Kit de Traduction) installés dans le système.
B_BACKGROUND_MODE B_INT32_TYPE Spécifie le mode de disposition de l'arrière-plan (en mosaïque, centrée, etc). Voir la liste des constantes de mode après ce tableau.
B_BACKGROUND_ORIGIN B_POINT_TYPE Si B_BACKGROUND_MODE prend la valeur B_BACKGROUND_MODE_USE_ORIGIN, l'image sera dessinée de manière à ce que son coin supérieur gauche soit aligné avec ce point (qui peut prendre n'importe quelle valeur, même négative).
B_BACKGROUND_ERASE_TEXT B_BOOL_TYPE Si positionné à true le texte des icônes aura son arrière plan rempli à la couleur d'arrière plan de la fenêtre, dans le cas contraire, ce texte sera dessiné par dessus l'image de fond (ce qui peut occasionner une lecture difficile).
B_BACKGROUND_WORKSPACES B_UINT32_TYPE Un masque de bits indiquant dans quel espace de travail l'image devrait être dessinée. Cela s'applique uniquement aux images du bureau (dossier /boot/home/Desktop).

Les valeurs de B_BACKGROUND_MODE sont:

Vous pouvez définir ces champs de manière redondante dans le message d'attribut B_BACKGROUND_INFO du Desktop afin de définir une image différente pour chaque espace de travail. Ces champs sont mise en corrélation grâce à leur indices. Ne placez pas plusieurs chemins B_BACKGROUND_IMAGE différents pour un même espace de travail, sous peine d'obtenir quelque chose qui soit indéfini.

Par exemple, ceci est correct:

   ...
   /*ALMOST_ALL_WORKSPACES correspond à tous les espaces de travail sauf le 1er*/
   const int32 ALMOST_ALL_WORKSPACES = 0xffffffff - 0x00000001;
   const int32 OTHER_WORKSPACE = 0x00000001;
   ...
   BMessage backgrounds;
   
   /* Ajouter la première image à ALMOST_ALL_WORKSPACES */
   backgrounds.AddString( B_BACKGROUND_IMAGE, "/boot/home/nice.jpg" );
   backgrounds.AddInt32( B_BACKGROUND_WORKSPACES, ALMOST_ALL_WORKSPACES );
   backgrounds.AddInt32( B_BACKGROUND_MODE, B_BACKGROUND_MODE_TILED );
   backgrounds.AddPoint( B_BACKGROUND_ORIGIN, BPoint( 0.0, 0.0 ) );
   backgrounds.AddBool( B_BACKGROUND_ERASE_TEXT, true );
   
   /* Ajouter la seconde image à OTHER_WORKSPACE */
   backgrounds.AddString( B_BACKGROUND_IMAGE, "/boot/home/nicer.jpg" );
   backgrounds.AddInt32( B_BACKGROUND_WORKSPACES, OTHER_WORKSPACE );
   backgrounds.AddInt32( B_BACKGROUND_MODE, B_BACKGROUND_MODE_SCALED );
   backgrounds.AddPoint( B_BACKGROUND_ORIGIN, BPoint( 0.0, 0.0 ) );
   backgrounds.AddBool( B_BACKGROUND_ERASE_TEXT, true );
   ...

Ceci est incorrect et aboutit à quelque chose d'indéfini:

   ...
   const int32 ALL_WORKSPACES = 0xffffffff;
   ...
   BMessage backgrounds;
   
   backgrounds.AddString( B_BACKGROUND_IMAGE, "/boot/home/nice.jpg" );
   backgrounds.AddInt32( B_BACKGROUND_WORKSPACES, ALL_WORKSPACES );
   /* ... d'autre données B_BACKGROUND_* ici ... */
   
   backgrounds.AddString( B_BACKGROUND_IMAGE, "/boot/home/nicer.jpg" );
   backgrounds.AddInt32( B_BACKGROUND_WORKSPACES, ALL_WORKSPACES );
   /* ... d'autres données B_BACKGROUND_* ici ... */
   ...

Le contenu de l'attribut B_BACKGROUND_INFO pourrait bien, à l'avenir, être étendu (tout en restant compatible avec les attributs de donnée existants). Soyez prêts à utiliser les données que vous ne reconnaissez pas parmis les attributs existants de B_BACKGROUND_INFO (s'il en existe).


Dossiers spéciaux

Il existe deux dossiers particuliers sur lesquels l'application des attributs agissent différemment:

Répertoire Description
B_DESKTOP_DIRECTORY L'application de l'attribut B_BACKGROUND_INFO à B_DESKTOP_DIRECTORY (voir find_directory() dans le Kit de Stockage) changera l'image de fond du bureau (voir plus bas dans la page la manière de spécifier au Tracker la mise à jour de cette image).
Tracker/DefaultFolderTemplate à l'intérieur de B_USER_SETTINGS_DIRECTORY Appliquer l'attribut B_BACKGROUND_INFO à ce répertoire définit l'arrière plan par défaut des différents répertoires. Tout dossier qui ne comporte pas son propre attribut B_BACKGROUND_INFO affichera cette image.


Notification du Tracker

Une fois bien défini l'attribut B_BACKGROUND_INFO, vous voudrez sans doute le faire prendre en compte par le Tracker, afin d'afficher le nouvel arrière-plan.

Envoyez à la boucle principale d'éxécution du Tracker (se rappeler que la signature du Tracker est "application/x-vnd.Be-TRAK") un BMessage avec la propriété what fixée à B_RESTORE_BACKGROUND_IMAGE pour lui signaler de recharger l'image de fond du bureau.

Envoyer le même message à la boucle d'éxécution d'une fenêtre spécique du Tracker signalera à cette fenêtre de recharger son image d'arrière plan. Ceci est un peu moins évident du fait qu'il est nécessaire de retrouver la bonne fenêtre.

Rafraîchissement de toutes les fenêtres

De manière plus brutale, vous pouvez spécifier à toutes les fenêtres ouvertes du Tracker de mettre à jour leur arrière-plan en faisant usage des scripts du Tracker (voir l'usage des scripts dans le Kit d'Application). Vous aurez, en particuler, besoin de le faire si vous changez l'arrière-plan par défaut des répertoires.

Cette portion de code demande au Tracker les fenêtre possédant la propriété "Poses" et leur envoie un B_RESTORE_BACKGROUND_IMAGE, mettant à jour toutes les fenêtre affichant le contenu d'un répertoire.

   BMessenger tracker( "application/x-vnd.Be-TRAK" );
   
   int32 i = 0;
   BMessage reply;
   int32 err;
   
   do {
       /* message de script */
       BMessage msg( B_GET_PROPERTY );
   
       /* recherche "Poses" dans toutes les fenêtres du Tracker */
       msg.AddSpecifier( "Poses" );
       msg.AddSpecifier( "Window", i++ );
   
       reply.MakeEmpty();
   
       tracker.SendMessage( &msg, &reply );
   
       /* arrêt de la boucle lorsque toutes 
        * le fenêtres auront été vérifiées
        */
       if( reply.what == B_MESSAGE_NOT_UNDERSTOOD &&
           reply.FindInt32( "error", &err ) == B_OK &&
           err == B_BAD_INDEX )
           break;
   
       /* ne pas prendre en compte les fenêtres qui ne comprennent pas
        * la requête pour "Poses"; elles n'affichent pas
        * de dossiers.
        */
       if( reply.what == B_MESSAGE_NOT_UNDERSTOOD &&
           reply.FindInt32( "error", &err ) == B_OK &&
           err != B_BAD_SCRIPT_SYNTAX )
           continue;
   
       BMessenger m;
       if( reply.FindMessenger( "result", &m ) == B_OK) {
           /* m est le messager d'une fenêtre du Tracker affichant
            * le contenu d'un dossier
            */
   
           m.SendMessage( B_RESTORE_BACKGROUND_IMAGE );
       }
   
   } while( true );

Rafraîchir une fenêtre

Si vous voulez rafraîchir l'arrière-plan, que vous avez modifié, d'un dossier, vous pouvez scanner tous les dossiers ouvert en utilisant un code similaire à celui ci-dessus, jusqu'à trouver le bon dossier grâce à son "chemin". Une fois la fenêtre correspondante trouvée, il vous suffit de lui envoyer un message B_RESTORE_BACKGROUND_IMAGE . Utiliser cette technique est bien mieux (du point de vue de l'utilisateur) car seule une fenêtre du Tracker sera mise à jour.

Voici le même code, modifié pour cibler un chemin précis. On supposera que le chemin en question a déjà été obtenu et placé dans the_path (vous venez de l'utiliser pour définir un B_BACKGROUND_IMAGE):

   BMessenger tracker( "application/x-vnd.Be-TRAK" );
   
   /* CHANGEMENT: nous incrémenterons dorénavant "i" au début de la boucle;
    *         ceci nous permettra de l'utiliser plus tard, lorque nous
    *         aurons trouvé une fenêtre avec "Poses"
    */
   int32 i = -1;
   BMessage reply;
   int32 err;
   
   do {
       /* CHANGEMENT: */
       i++;
   
       /* message de script */
       BMessage msg( B_GET_PROPERTY );
   
       /* recherche de "Poses" dans chaque fenêtre du Tracker */
       msg.AddSpecifier( "Poses" );
       msg.AddSpecifier( "Window", i ); /* CHANGE */
   
       reply.MakeEmpty();
   
       tracker.SendMessage( &msg, &reply );
   
       /* fin de la bouclie lorsque toutes les fenêtres sont 
        * vérifiées
        */
       if( reply.what == B_MESSAGE_NOT_UNDERSTOOD &&
           reply.FindInt32( "error", &err ) == B_OK &&
           err == B_BAD_INDEX )
           break;
   
       /* ne pas prendre en compte les fenêtres qui ne comprennent pas
        * la requête pour "Poses"; elles n'affichent pas
        * de dossiers.
        */
       if( reply.what == B_MESSAGE_NOT_UNDERSTOOD &&
           reply.FindInt32( "error", &err ) == B_OK &&
           err != B_BAD_SCRIPT_SYNTAX )
           continue;
   
       /* CHANGEMENT: tout à partir d'ici est nouveau */
   
       /* make a messenger to this window */
       BMessenger m;
       if( reply.FindMessenger( "result", &m ) != B_OK) continue;
   
       /* Trouvé une fenêtre avec "Poses", demander son chemin ("Path") */
       msg.MakeEmpty();
       msg.what = B_GET_PROPERTY;
       msg.AddSpecifier( "Path" );
       msg.AddSpecifier( "Poses" );
       msg.AddSpecifier( "Window", i );
   
       reply.MakeEmpty();
       
       tracker.SendMessage( &msg, &reply );
   
       /* Continuons avec le prochain si celui-ci n'a pas de chemin */
       if( reply.what == B_MESSAGE_NOT_UNDERSTOOD ) continue;
   
       /* approfondissons sur ce chemin */
       entry_ref ref;
       if( reply.FindRef( "result", &ref ) == B_OK ) {
           BEntry ent( &ref );
           BPath path( &ent );
       
           /* Ce ne sont pas les chemins que nous recherchons */
           if( strcmp( the_path, path.Path() ) ) continue;
       }
   
       /* Arrivé à ce point, nous avons un messager vers une fenêtre
        * du Tracker valide, affichant un dossier avec le chemin initialement
        * trouvé, donc on va lui spécifier de rafraîchir son arrière-plan.
        */
       m.SendMessage( B_RESTORE_BACKGROUND_IMAGE );
   
   } while( true );


Le Be Book Table des Matières


The Be Book,
...in lovely HTML...
for BeOS Release 5.

Copyright © 2000 Be, Inc. All rights reserved.