Obrazy Tła

Zadeklarowane w:  be/be_apps/Tracker/Background.h

Tracker pozwala Ci umieścić obrazy tła w każdej przestrzeni roboczej na Twoim pulpicie i w tle poszczególnych okien katalogów Tracker'a.

Obecnie, Tracker maluje tło okna folderu tylko wtedy gdy okno jest w trybie widoku ikony (lub mini-ikony).


Atrybuty tła

Informacja o obrazie tła dla folderu jest przechowywana jako spłaszczony (ang. flattened) BMessage w atrybucie B_BACKGROUND_INFO pliku folderu. Katalog B_DESKTOP_FOLDER mieści informację tła dla przestrzeni roboczych (jeden spłaszczony komunikat na przestrzeń roboczą).

Dane atrybutu B_BACKGROUND_INFO są spłaszczonym obiektem BMessage z następującymi polami:

Nazwa Typ Opis
B_BACKGROUND_IMAGE B_STRING_TYPE Pełna ścieżka dostępu do obrazu. Obraz ten powinien być w formacie zrozumiałym przez jeden z translatorów (patrz Translation Kit) zainstalowanych w systemie.
B_BACKGROUND_MODE B_INT32_TYPE Określa jak tło jest rozmieszczone (sąsiadująco, wyśrodkowane, itp.). Patrz na listę stałch definiujących tryby poniżej tej tabeli.
B_BACKGROUND_ORIGIN B_POINT_TYPE Jeśli B_BACKGROUND_MODE jest B_BACKGROUND_MODE_USE_ORIGIN, obraz będzie rysowany od lewego górnego rogu w tym punkcie (który może być jakikolwiek, również ujemny).
B_BACKGROUND_ERASE_TEXT B_BOOL_TYPE Jeśli jest true etykieta ikony będzie mieć usunięte swoje tło do tła takiego jak kolor okna, w przeciwnym wypadku etykieta będzie rysowana na górze obrazu (który mógłby ją uczynić trudną do odczytania).
B_BACKGROUND_WORKSPACES B_UINT32_TYPE Maska bitowa wskazuje, które przestrzenie robocze powinny mieć narysowany obraz. Jest to stosowane tylko do obrazów Pulpitu.

Wartościami B_BACKGROUND_MODE są:

Możesz napisać wiele ustawień tych pól komunikatu wewnątrz komunikatu atrybutu B_BACKGROUND_INFO dla Pulpitu w kolejności układania różnych obrazów na różnych przestrzeniach roboczych. Te pola są powiązane przez indeks. Nie wstawiaj różnych ścieżek do B_BACKGROUND_IMAGE chociaż jest to ta sama przestrzeń robocza, to zachowanie jest nieokreślone.

Dla przykładu, to jest OK:

...
/* ALMOST_ALL_WORKSPACES jest każdą przestrzenią roboczą z wyjątkiem pierwszej */
const int32 ALMOST_ALL_WORKSPACES = 0xffffffff - 0x00000001;
const int32 OTHER_WORKSPACE = 0x00000001;
...
BMessage backgrounds;

/* Dodaje pierwszy obraz do 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 );

/* Dodaje drugi obraz do 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 );
...

To nie jest OK, a wynikiem jest nieokreślone zachowanie:

...
const int32 ALL_WORKSPACES = 0xffffffff;
...
BMessage backgrounds;

backgrounds.AddString( B_BACKGROUND_IMAGE, "/boot/home/nice.jpg" );
backgrounds.AddInt32( B_BACKGROUND_WORKSPACES, ALL_WORKSPACES );
/* ... inne dane B_BACKGROUND_* tutaj ... */

backgrounds.AddString( B_BACKGROUND_IMAGE, "/boot/home/nicer.jpg" );
backgrounds.AddInt32( B_BACKGROUND_WORKSPACES, ALL_WORKSPACES );
/* ... inne dane B_BACKGROUND_* tutaj ... */
...

Zawartość atrybutu B_BACKGROUND_INFO może być w przyszłości rozszerzona (ale będzie zachowana zgodność z istniejącmi danymi atrybutu). Bądź gotowany do zachowywania danych, których nie rozpoznasz przez czytanie w istniejącym atrybucie B_BACKGROUND_INFO (jeśli on istnieje).


Specjalne foldery

Możesz zastosować atrybuty do tych dwóch specjalnych folderów:

Katalog Opis
B_DESKTOP_DIRECTORY Zastosowanie atrybutu B_BACKGROUND_INFO do B_DESKTOP_DIRECTORY (patrz find_directory() w Storage Kit) będzie zmieniać obraz tła Pulpitu (ale patrz poniżej aby dowiedzieć się jak powiedzieć Tracker'owi o uaktualnieniu obrazu).
Tracker/DefaultFolderTemplate wewnątrz B_USER_SETTINGS_DIRECTORY Zastosowanie atrybutu B_BACKGROUND_INFO do tego katalogu ustawia domyślne tło folderu. Folder który nie ma swojego własnego B_BACKGROUND_INFO będzie wyświetlał ten obraz.


Powiadamianie Tracker'a

Kiedy masz napisany właściwy atrybut B_BACKGROUND_INFO, będziesz chciał powiedzieć Tracker'owi aby uaktualnił nowy obraz tła.

Wyślij BMessage ze stałą what równą B_RESTORE_BACKGROUND_IMAGE głównemu looper'owi Tracker'a (przypominamy, sygnatura Tracker'a to "application/x-vnd.Be-TRAK") mówiącą mu, żeby przeładował obraz tła pulpitu.

Wysłanie tego samego komunikatu do looper'a określonego okna Tracker'a będzie mówić które okno ma mieć przeładowany swój obraz tła. Jest to małe oszustwo, ponieważ potrzebujesz znaleźć właściwe okno.

Odświeżanie wszystkich okien

Działając w taki sposób jak śrutówka, możesz powiedzieć wszystkim otwartym oknom Tracker'a aby odświeżyły swoje tła przez użycie skryptowania Tracker'a (patrz Tworzenie skryptów w Application Kit). Będziesz potrzebował tak postąpić, jeśli zmieniasz domyślny obraz tła folderu.

Ten kod pyta Tracker'a o wszystkie okna które mają właściwość "Poses" i wysyła im B_RESTORE_BACKGROUND_IMAGE. Uaktualnia to każde okno Tracker'a, które wyświetla zawartość folderu.

BMessenger tracker( "application/x-vnd.Be-TRAK" );

int32 i = 0;
BMessage reply;
int32 err;

do {
   /* komunikat skryptowania */
   BMessage msg( B_GET_PROPERTY );

   /* patrzy na "Poses" w każdym oknie Tracker'a */
   msg.AddSpecifier( "Poses" );
   msg.AddSpecifier( "Window", i++ );

   reply.MakeEmpty();

   tracker.SendMessage( &msg, &reply );

   /* wychodzi z pętli gdy jesteśmy na końcu tych okien */
   if( reply.what == B_MESSAGE_NOT_UNDERSTOOD &&
      reply.FindInt32( "error", &err ) == B_OK &&
      err == B_BAD_INDEX )
      break;

   /* nie zatrzymuje się na oknach, które nie rozumieją
    * żądania "Poses"; nie wyświetlają one folderów */
   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 jest komunikatorem okna Tracker'a z folderem w środku */

      m.SendMessage( B_RESTORE_BACKGROUND_IMAGE );
   }

} while( true );

Odświeżanie jednego okna

Jeśli chcesz odświeżyć tło folderu, który był zmieniony, przeglądnij otwarte foldery używając kodu podobnego do powyższego, aż znajdziesz folder z parametrem "Path". Kiedy masz właściwe okno, wyślij mu komunikat B_RESTORE_BACKGROUND_IMAGE. Użycie tej techniki jest łatwiejsze (z punktu widzenia użytkownika) ponieważ tylko jedno okno Tracker'a zostało uaktualnione.

Jest to ten sam kod, zmodyfikowany do określonej ścieżki docelowej. Zakładam, że masz stałą ścieżkę zapytania w the_path (użytego właśnie jako B_BACKGROUND_IMAGE):

BMessenger tracker( "application/x-vnd.Be-TRAK" );

/* ZMIANA: będziemy teraz zwiększać "i" na początku pętli;
* pozwoli nam to użyć tego później gdy będziemy szukać
* Okna z Poses */
int32 i = -1;
BMessage reply;
int32 err;

do {
   /* ZMIANA: */
   i++;

   /* komunikat skryptowy */
   BMessage msg( B_GET_PROPERTY );

   /* patrzy na "Poses" w każdym oknie Tracker'a */
   msg.AddSpecifier( "Poses" );
   msg.AddSpecifier( "Window", i ); /* ZMIANA */

   reply.MakeEmpty();

   tracker.SendMessage( &msg, &reply );

   /* wychodzi z pętli gdy jesteśmy na końcu tych okien */
   if( reply.what == B_MESSAGE_NOT_UNDERSTOOD &&
      reply.FindInt32( "error", &err ) == B_OK &&
      err == B_BAD_INDEX )
      break;

   /* nie zatrzymuje się na oknach, które nie rozumieją
    * żądania "Poses"; nie wyświetlają one folderów */
   if( reply.what == B_MESSAGE_NOT_UNDERSTOOD &&
      reply.FindInt32( "error", &err ) == B_OK &&
      err != B_BAD_SCRIPT_SYNTAX )
      continue;

   /* ZMIANA: wszystko odtąd w dół jest nowe */

   /* tworzy komunikatora do tego okna */
   BMessenger m;
   if( reply.FindMessenger( "result", &m ) != B_OK) continue;

   /* znajduje okno z "Poses", pyta o jego "Path" */
   msg.MakeEmpty();
   msg.what = B_GET_PROPERTY;
   msg.AddSpecifier( "Path" );
   msg.AddSpecifier( "Poses" );
   msg.AddSpecifier( "Window", i );

   reply.MakeEmpty();
   
   tracker.SendMessage( &msg, &reply );

   /* przechodzi do następnego, jeśli ten nie ma "Path" */
   if( reply.what == B_MESSAGE_NOT_UNDERSTOOD ) continue;

   /* odgrzebuje "Path" */
   entry_ref ref;
   if( reply.FindRef( "result", &ref ) == B_OK ) {
      BEntry ent( &ref );
      BPath path( &ent );
   
      /* te nie są szukanymi "Path'ami" */
      if( strcmp( the_path, path.Path() ) ) continue;
   }

   /* jeśli dotarłeś tak daleko, to masz komunikatora do ważnego okna Trackera
    * wyświetlającego folder ze ścieżką mówiącą mu później o odświeżeniu swojego tła */
   m.SendMessage( B_RESTORE_BACKGROUND_IMAGE );

} while( true );

 



Be Book,
...w ślicznym HTML...
dla BeOS wydanie 5

Copyright © 2000 Be, Inc. Wszelkie prawa zastrzeżone.