Format skórki MPlayera Celem tego dokumentu jest opisanie formatu skórki MPlayera. Informacje zawarte tutaj mogą być niedokładne ponieważ Nie jestem tym, który pisał GUI. GUI nie jest ukończone. Mogę się mylić. A więc nie bądź zaskoczony jeśli coś nie będzie działać tak, jak przedstawiono tutaj. Podziękowania Zoltánowi Ponekkerowi za jego pomoc. András Mohari <mayday@freemail.hu> Wstęp W zasadzie nie ma to żadnego związku z formatem skórki, ale powinieneś wiedzieć, że MPlayer nie posiada wbudowanej skórki, w związku z tym co najmniej jedna skórka musi być zainstalowana, aby była możliwość używania GUI. Katalogi Skórki są szukane w następujących katalogach (w kolejności): $(DATADIR)/Skin/ $(PREFIX)/share/mplayer/Skin/ ~/.mplayer/Skin/ Zauważ, że pierwsza ścieżka może się różnić w zależności od sposobu w jaki MPlayer był skonfigurowany (zobacz argumenty oraz w skrypcie configure). Każda skórka jest instalowana w swoim własnym katalogu, w jednym z katalogów wyżej wymienionych, na przykład: $(PREFIX)/share/mplayer/Skin/default/ Formaty obrazków Obrazki muszą być w formacie PNG truecolor (24 lub 32 bpp). W głównym oknie oraz na panelu odtwarzania (zobacz niżej) możesz użyć obrazków z 'przezroczystością': obszary wypełnione kolorem #FF00FF (magenta) są w pełni przezroczyste dla MPlayera. Oznacza to, że możesz mieć okna o różnych kształtach jeśli Twój X Server posiada rozszerzenie XShape. Składniki skórki Skórki są całkowicie konfigurowalne (w odróżnieniu od skórek np. Winampa/XMMS), a więc zależy to od Ciebie, czy stworzysz coś wspaniałego. W chwili obecnej mamy trzy okna, które można ozdobić: okno główne (main window), okno ekranu (subwindow), panel odtwarzania (playbar), menu skórki (skin menu) (które może być aktywowane prawym przyciskiem myszy). Okno główne i/lub panel odtwarzania to miejsca, gdzie można sterować programem MPlayer. Tłem tego okna jest obrazek. Różne elementy mogą (i muszą) być umieszczone w tym oknie: przyciski, potencjometry (suwaki) i etykiety. Dla każdego elementu musisz określić ich pozycję oraz rozmiar. Przycisk ma trzy stany (wciśnięty, zwolniony, nieaktywny) , zatem jego obrazki muszą być podzielone na trzy części w pionie. Zobacz sekcję button, by dowiedzieć się więcej. Potencjometr (suwak) (wykorzystywany głównie jako pasek przewijania i kontrolka głośności/balansu) może składać się z każdej liczby stanów poprzez podzielenie jego obrazka na wiele części, z których jedna poprzedza drugą. Zobacz hpotmeter oraz potmeter, by dowiedzieć się więcej. Etykiety są nieco specyficzne: Znaki potrzebne do ich narysowania są pobierane z pliku graficznego, a znaki umieszczone w pliku graficznym są opisane przez plik opisu czcionek. Jest to plik, który za pomocą czystego tekstu określa współrzędne x, y oraz wielkość każdego znaku umieszczonego na obrazku (plik graficzny i jego plik opisu tworzą razem zestaw czcionek). Zobacz dlabel oraz slabel, by dowiedzieć się więcej. Wszystkie obrazki mogą być całkowicie przezroczyste - tak, jak to opisano w sekcji formaty plików graficznych. Jeżeli X Server nie obsługuje rozszerzenia XShape, to elementy oznaczone jako przezroczyste będą czarne. Jeśli chciałbyś wykorzystać taką możliwość, szerokość obrazka tła głównego okna musi być podzielna przez 8. Okno ekranu to miejsce odtwarzania filmu. Może ono wyświetlać określony obrazek jeśli żaden film nie jest uruchomiony (to dość nudne mieć puste okno :-)) Uwaga: przezroczystość nie jest tutaj dostępna. Menu skórki to po prostu jeden ze sposobów na kontrolowanie MPlayera poprzez wpisy w menu. Dwa obrazki są wymagane dla tego menu: pierwszy z nich jest obrazkiem podstawowym, który pokazuje zwykły stan menu, drugi zaś służy do wyświetlenia zaznaczonych obszarów. Gdy uaktywnisz menu, zostanie pokazany pierwszy obrazek. Jeśli przesuniesz mysz nad któryś z jego wpisów, wówczas zaznaczony element jest kopiowany z drugiego obrazka w miejsce, na które wskazuje kursor myszy (drugi obrazek nigdy nie jest wyświetlany jako całość). Wpis w menu jest określony przez jego pozycję oraz rozmiar na obrazku (zobacz sekcję menu skórki by dowiedzieć się więcej). Jedna ważna sprawa, która nie została jeszcze powiedziana: MPlayer musi wiedzieć co zrobić w momencie kliknięcia na przyciski, potencjometry i wpisy w menu, aby zadziałały. Zostało to zrobione za pomocą sygnałów (zdarzeń). Dla tych elementów musisz zdefiniować sygnały, które mają być generowane podczas ich kliknięcia. Pliki Potrzebne są następujące pliki podczas tworzenia skórki: Plik konfiguracyjny o nazwie skin, mówiący programowi MPlayer jak połączyć różne części skórki razem i co zrobić, gdy nastąpi kliknięcie w którymś obszarze okna. Plik graficzny tła w oknie głównym. Obrazki dla elementów w głównym oknie (zawierające jeden lub więcej plików opisu czcionek, potrzebnych do rysowania etykiet). Obrazek wyświetlany w oknie ekranu (opcjonalnie) Dwa obrazki dla menu skórki (potrzebne są tylko wtedy, gdy chcesz tworzyć takie menu). Za wyjątkiem pliku konfiguracyjnego skórki możesz nazwać wszystkie pliki tak, jak tego chcesz (ale weź pod uwagę, że pliki opisu czcionek muszą mieć rozszerzenie .fnt ). Plik skin Jak zostało powiedziane wcześniej, plik ten jest plikiem konfigurującym skórkę. Obsługuje różne rodzaje wierszy; komentarze zaczynają wiersz znakiem ';' (tylko spacje i znaki tabulacji są dopuszczone przed ';'). Plik podzielony jest na sekcje. Każda sekcja opisuje skórkę dla każdej aplikacji i ma następującą formę: section = nazwa sekcji . . . end Obecnie jest tylko jedna aplikacja, a więc potrzebujesz tylko jedną sekcję 'section': nazwa tej sekcji to movieplayer. Wewnątrz tej sekcji każde z okien jest opisane przez blok następującej postaci: window = nazwa okna . . . end gdzie nazwa oknamoże być jednym z poniższych łańcuchów: main - dla okna głównego sub - dla okna ekranu menu - dla menu skórki playbar - dla panelu odtwarzania (Bloki sub i menu są opcjonalne - nie musisz tworzyć menu czy elementów skórki dla okna ekranu) Wewnątrz bloku 'window' możesz definiować każdy element okna wpisując linijkę tej postaci: item = parametr Gdzie item jest łańcuchem, kóry identyfikuje typ elementu GUI, parametr jest wartością numeryczną lub tekstową (lub listą takich wartości oddzielonych od siebie znakiem przecinka). Złożenie powyższych elementów razem tworzy plik, który wygląda mniej więcej tak: section = movieplayer window = main ; ... elementy okna głównego ... end window = sub ; ... elementy okna ekranu ... end window = menu ; ... elementy menu skórki ... end window = playbar ; ... elementy panelu odtwarzania ... end end Nazwa pliku graficznego musi zostać podana bez żadnych nazw katalogów - obrazki są szukane w katalogu Skin. Możesz (ale nie musisz) określić rozszerzenia tego pliku. Jeśli plik taki nie istnieje, MPlayer próbuje wczytać plik <nazwa pliku>.<rozszerzenie>, gdzie png oraz PNG są próbowane jako <rozszerzenie> (w tej właśnie kolejności). Pierwszy pasujący plik będzie użyty. Na koniec kilka słów na temat pozycjonowania. Okno główne oraz okno ekranu może zostać umieszczone w różnych narożnikach ekranu poprzez ustawienie współrzędnych X i Y. 0 to góra lub lewa strona, -1 to środek, -2 to strona prawa lub dół, tak jak przedstawiono na poniższej ilustracji: (0, 0)----(-1, 0)----(-2, 0) | | | | | | (0,-1)----(-1,-1)----(-2,-1) | | | | | | (0,-2)----(-1,-2)----(-2,-2) Oto przykład wyjaśniający to lepiej. Przypuśćmy, że masz obrazek nazwany main.png, który został użyty dla okna głównego: base = main, -1, -1 MPlayer próbuje wczytać pliki main, main.png, main.PNG. Okno główne i panel odtwarzania Poniżej znajduje się lista wpisów, które mogą być użyte w blokach 'window = main'...'end', oraz 'window = playbar' ... 'end'. base = obrazek, X, Y Pozwala określić obrazek tła, który będzie używany w oknie głównym Okno będzie widoczne w pozycji X, Y na ekranie. Okno będzie wielkości tego obrazka. Współrzędne te nie działają na razie dla okna ekranu. Obszary przezroczystości obrazka (kolor #FF00FF) będą widoczne jako czarne pod X serwerami nieposiadającymi rozszerzenia XShape. Szerokość obrazka musi być podzielna przez 8. button = obrazek, X, Y, szerokość, wysokość, sygnał Umieszcza przycisk o rozmiarze szerokość * wysokość w pozycji X, Y. Określony sygnał jest generowany podczas kliknięcia na przycisk. Obrazek ten opisany przez obrazek musi składać się z trzech części jedna pod drugą (stosownie do możliwych stanów przycisku), w ten oto sposób: +---------------+ | wciśnięty | +---------------+ | zwolniony | +---------------+ | nieaktywny | +---------------+ decoration = enable|disable (włączona|wyłaczona) Włącza lub wyłącza dekorację menedżera okna w oknie głównym. Domyślnie jest wyłączona. Nie działa to w oknie ekranu, gdyż nie ma takiej potrzeby. hpotmeter = przycisk, szer_przycisku, wys_przycisku, faza, liczba_faz, domyślny, X, Y, szerokość, wysokość, sygnał vpotmeter = przycisk, szer_przycisku, wys_przycisku, fazy, liczba_faz, domyślny, X, Y, szerokość, wysokość, sygnał Umieszcza poziomo (hpotmeter) lub pionowo (vpotmeter) suwak o rozmiarze szerokość * wysokość i pozycji X,Y. Obrazek może być podzielony na różne części dla różnych faz suwaka (np. możesz mieć suwak głośności, który w zależności od położenia zmienia kolor z zielonego (minimum) na czerwony (maksimum)). hpotmeter może być przyciskiem umieszczonym poziomo. Jego parametry to: przycisk - obrazek użyty do przycisku (musi posiadać trzy części jedna pod drugą tak, jak w przypadku przycisku) szer_przycisku, wys_przycisku - wielkość przycisku fazy - obrazek używany do określenie faz dla hpotmeter. Wartość specjalna NULL może być użyta jeśli nie chcesz żadnego obrazka. Obrazek musi być podzielony w pionie na fragmenty poszczególnych faz tak, jak poniżej: +------------+ | faza #1 | +------------+ | faza #2 | +------------+ ... +------------+ | faza #n | +------------+ liczba_faz - liczba faz znajdująca się na obrazku z fazami domyślny - domyślne ustawienie dla hpotmeter (zakres od 0 do 100) X, Y - pozycja dla hpotmeter szerokość, wysokość - szerokość i wysokość dla hpotmeter sygnał - sygnał generowany podczas zmiany wartości hpotmeter potmeter = fazy, liczba_faz, domyślny, X, Y, szerokość, wysokość, sygnał hpotmeter bez przycisku. (domyślam się, że chodzi o to, aby nim kręcić, ale reaguje on tylko na poziome przesuwanie). Opis parametrów znajdziesz w części o hpotmeter. Parametr fazy może mieć wartość NULL, ale jest to zupełnie bezużyteczne, gdyż nie widać wtedy położenia potencjometru. font = plik_czcionek, id_czcionki Definiuje czcionki. plik_czcionek jest nazwą pliku opisu czcionek z rozszerzeniem .fnt (nie podawaj rozszerzenia w tym miejscu). id_czcionki jest używany do wskazywania konkretnej czcionki (zobacz dlabel oraz slabel). Można zdefiniować do 25 czcionek. slabel = X, Y, id_czcionki, "tekst" Umieszcza statyczną etykietę w pozycji X,Y. tekst jest wyświetlany za pomocą czcionek wskazywanych przez id_czcionki. Tekst jest po prostu zwykłym łańcuchem znaków (zmienne $x nie działają), które muszą być umieszczone pomiędzy podwójnym cudzysłowem (a znak " nie może być częścią tekstu). Etykieta wyświetlana jest za pomocą czcionek, na które wskazuje id_czcionki. dlabel = X, Y, długość, wyrównanie, id_czcionki, "tekst" Umieszcza dynamiczną etykietę w pozycji X,Y. Etykieta jest nazywana dynamiczną ponieważ jej tekst jest cyklicznie odświeżany. Maksymalna długość etykiety określa parametr długość (jej wysokość określa wysokość czcionek). Jeśli tekst jest szerszy niż zdefiniowana długość, będzie on przewijany, w przeciwnym wypadku będzie wyrównany w miejscu określonym przez wartość parametru wyrównanie: 0 oznacza do prawej, 1 to wyśrodkowanie, 2 to wyrównanie do lewej. Wyświetlany tekst jest określony przez zmienną tekst: musi być zawarty pomiędzy podwójnymi cudzysłowami (a znak " nie może być częścią tekstu). Etykieta wyświetlana jest za pomocą czcionek, na które wskazuje parametr id_czcionki. Możesz użyć następujących zmiennych w tekście: ZmiennaZnaczenie $1 czas odtwarzania w formacie hh:mm:ss $2 czas odtwarzania w formacie mmmm:ss $3 czas odtwarzania w formacie (godziny) hh $4 czas odtwarzania w formacie (minuty) mm $5 czas odtwarzania w formacie (sekundy) ss $6 długość filmu w formacie hh:mm:ss $7 długość filmu w formacie mmmm:ss $8 długość filmu w formacieh:mm:ss $v format głośności w %xxx.xx $V format głośności xxx.xx format $b format balansu w %xxx.xx $B format balansu xxx.xx $$ znak $ $a oznaczenie zgodne z rodzajem typu pliku audio (nic: n, mono: m, stereo: t) $t numer ścieżki (na liście odtwarzania) $o nazwa pliku $f nazwa pliku pisana małymi literami $F nazwa pliku pisana wielkimi literami $T oznaczenie zgodne z rodzajem strumienia (plik: f, Video CD: v, DVD: d, URL: u) $p znak p (gdy film jest odtwarzany i czcionka ma znak p) $s znak s (gdy film jest zatrzymany i czcionka ma znak s) $e znak e (gdy film jest wstrzymany (pauza) i czcionka ma znak e) $x rozdzielczość filmu (szerokość) $y rozdzielczość filmu (wysokość) $C nazwa używanego kodeka Zmienne $a, $T, $p, $s oraz $e zwracają znaki, które powinny być wyświetlane jako znaki specjalne (na przykład e jest symbolem pauzy, która z reguły wygląda mniej więcej tak ||). Powinieneś mieć czcionkę dla zwykłych znaków oraz osobną czcionkę dla symboli. Zobacz sekcję na temat symboli, by dowiedzieć się więcej. Okno ekranu Poniższe wpisy mogą być użyte w bloku 'window = sub' . . . 'end' . base = obrazek, X, Y, szerokość, wysokość Wyświetla obrazek w oknie. Okno będzie widoczne na ekranie w miejscu oznaczonym przez współrzędne X, Y (0,0 to lewy górny narożnik). Możesz użyć -1 dla środka, -2 dla prawej strony (X) i dołu (Y). Okno będzie mieć wielkość obrazka. szerokość oraz wysokość oznaczają wielkość okna; są one opcjonalne (jeśli nie są określone, okno będzie wielkości takiej, jak obrazek). background = R, G, B Pozwala ustawić kolor tła. Jest to użyteczne jeśli obrazek jest mniejszy niż okno. R, G oraz B określają składniki kolorów czerwonego, zielonego i niebieskiego (każdy z nich jest reprezentowany przez liczbę dziesiętną w zakresie od 0 do 255). Menu skórki Jak wspomniano wcześniej, menu jest wyświetlane przy użyciu dwóch obrazków. Zwykłe obszary menu są pobierane z obrazka określonego przez element base, podczas gdy obszary zaznaczone są pobierane z obrazka wskazywanego przez element selected. Musisz zdefiniować pozycję i rozmiar każdego obszaru menu poprzez element menu. Poniższe wpisy mogą być użyte w bloku: 'window = menu'. . .'end' . base = obrazek Obrazek dla zwykłych obszarów menu. selected = obrazek Obrazek pokazujący w menu wszystkie zaznaczone obszary. menu = X, Y, szerokość, wysokość, sygnał Definiuje pozycję i rozmiar obszarów menu na obrazku przy pomocy X,Y. sygnał to zdarzenie wygenerowane podczas zwolnienia przycisku myszy nad obszarem. Czcionki Jak wspomniano w sekcji na temat fragmentów skórki, czcionka jest definiowana przez obrazek i plik opisujący. Możesz umieścić znak gdziekolwiek na obrazku, ale miej pewność, że jego pozycja i rozmiar jest podana właściwie w pliku opisującym. Plik opisujący czcionki (o rozszerzeniu .fnt) może posiadać linie komentarzy zaczynające się znakiem ';'. Plik musi zawierać linie w postaci: image = obrazek Gdzie obrazek jest nazwą pliku graficznego, który zawiera czcionki (nie musisz dopisywać jego rozszerzenia). "char" = X, Y, szerokość, wysokość X oraz Y określają pozycję znaku char na obrazku (0,0 to górny lewy narożnik). szerokość i wysokość to rozmiar znaku w pikselach. Przykład: definiujemy znaki A, B, C przy użyciu pliku font.png. ; Może być "font" zamiast "font.png". image = font.png ; Trzy znaki wystarczą do tej demonstracji :-) "A" = 0,0, 7,13 "B" = 7,0, 7,13 "C" = 14,0, 7,13 Znaki specjalne (symbole) Niektóre znaki mają specjalne znaczenie, gdy są zwracane przez pewne zmienne używane w dlabel. Znaki te mogą być wyświetlane jako symbole w ten sposób, że np. podczas odtwarzania strumienia DVD widoczne jest ładne logo zamiast znaku 'd'. Poniższa tablica zawiera znaki używane do wyświetlania symboli (wymagają one oddzielnych czcionek). ZnakSymbol podtwarzanie sstop epauza nbez dźwięku mdźwięk mono tdźwięk stereo fstrumień z pliku vstrumień z Video CD dstrumień z DVD ustrumień z URL Sygnały GUI Tutaj znajdują się sygnały, które mogą być generowane przez przyciski, suwaki i elementy menu. Niektóre sygnały mogą nie działać w oczekiwany sposób (lub nie działać w ogóle). Jak wiadomo, GUI jest jeszcze w fazie rozwoju. Kontrola odtwarzania : evNext Przejdź do następnej pozycji na liście odtwarzania. evPause Tworzy przełącznik razem z evPlaySwitchToPause. Mogą być użyte do utworzenia wspólnego przycisku dla odtwarzania/pauzy. Oba sygnały powinny być powiązane z przyciskami wyświetlonymi w tej samej pozycji w oknie. Sygnał wstrzymuje wtedy odtwarzanie i wyświetlanty jest obrazek dla przycisku evPlaySwitchToPause (aby zaznaczyć, że przycisk ten może być użyty do kontynuowania odtwarzania). evPlay Rozpoczyna odtwarzanie. evPlaySwitchToPause Przeciwieństwo evPauseSwitchToPlay. Ten sygnał zaczyna odtwarzanie oraz wyświetlenie obrazka dla przycisku evPauseSwitchToPlay (aby zaznaczyć, że przycisk ten może być użyty ponownie do wstrzymania odtwarzania). evPrev Przejdź do poprzedniej pozycji na liście odtwarzania. evStop Zatrzymuje odtwarzanie. Przewijanie: evBackward10sec Przewija do tyłu o 10 sekund. evBackward1min Przewija do tyłu o 1 minutę. evBackward10min Przewija do tyłu o 10 minut. evForward10sec Przewija do przodu o 10 sekund. evForward1min Przewija do przodu o 1 minutę. evForward10min Przewija do przodu o 10 minut.. evSetMoviePosition Przewija do pozycji (może być wykorzystane przez suwak; użyte są względne wartości (0-100%) suwaka). Kontrola video: evDoubleSize Ustawia podwójny rozmiar okna z filmem. evFullScreen Włącza/wyłącza tryb pełnoekranowy. evNormalSize Ustawia typowy rozmiar okna z filmem. Kontrola dźwięku: evDecAudioBufDelay Zmniejsza opóźnienie bufora dźwięku. evDecBalance Zmniejsza balans. evDecVolume Zmniejsza głośność evIncAudioBufDelay Zwiększa opóźnienie bufora dźwięku. evIncBalance Zwiększa balans. evIncVolume Zwiększa głośność. evMute Wycisza/przywraca dźwięk. evSetBalance Ustawia balans (może być używane przez suwak; używana jest wartość względna (0-100%)). evSetVolume Ustawia głośność (może być używane przez suwak; używana jest wartość względna (0-100%)). Różne: evAbout Otwiera okno "o programie". evDropSubtitle Wyłącza aktualnie używane napisy. evEqualizer Włącza/wyłącza equalizer. evExit Wyłącza program. evIconify Minimalizuje okno. evLoad Wczytuje plik (poprzez otwarcie okna przeglądarki plików, gdzie możesz wybrać plik). evLoadPlay Robi to samo co evLoad, ale zaczyna automatycznie odtwarzać zaraz po wyborze pliku. evLoadSubtitle Wczytuje plik z napisami (z przeglądarki plików). evLoadAudioFile Wczytuje plik dźwiękowy (z przeglądarki plików). evNone Sygnał pusty - nic nie robi (może za wyjątkiem wersji z CVS:-)). evPlayList Otwórz/zamknij okno listy odtwarzania. evPlayDVD Próbuje odczytać płytę ze wskazanego czytnika DVD. evPlayVCD Próbuje odczytać płytę ze wskazanego czytnika CD. evPreferences Otwiera okno z ustawieniami. evSetAspect Ustawia proporcje obrazu. evSetURL Wyświetla okienko dialogowe URL. evSkinBrowser Otwiera okno przeglądarki skórek.