Nastrój świąteczny, siedzę sobie przy oknie i patrzę na tę odrobinkę śniegu za oknem. Ech.
Co zostało do przedstawienia? W zasadzie tylko polecenie "Style", to co jeszcze nie zostało powiedziane, i jakieś "luźne" polecenia które trudno do czegoś przyporządkować. OK, więc ciąg dalszy "Style".
Można go (Style) używać do przypisywania okienkom polityk przekazywania fokusu czy rozmieszczania na ekranie. Ale poza tym oferuje dużo innych opcji - w końcu jest to główne polecenie do manipulowania zachowaniem fvwm. Lista opcji:
BorderWidth i HandleWidth
Ustala się nimi szerokość "ramki" dookoła okna, w pikselach. Tutaj uwaga: FVWM rozpoznaje 2 rodzaje ramek. Ramka może albo posiadać "uchwyty" (handles) do zmiany rozmiaru, albo nie. I osobno ustawia się szerokość obramowania dla obu tych wariantów. Standardowo jest tak, że normalne okna posiadają "handles", a okna "transients" (czyli jakieś pop-ups, modalne itp.) nie posiadają "handles". Tutaj pojawia się dodatkowa opcja Handles/!Handles - można "wymusić" używanie, bądź też nie, uchwytów. Uchwyty standardowo są widoczne jako te nacięte fragmenty na narożnikach dekoracji, choć można je uczynić niewidzialnymi za pomocą osobnego polecenia BorderStyle... Handles decyduje o tym, czy można będzie zmieniać rozmiar okna przez kliknięcie i ciąganie za narożniki/boki okien.
NoIcon/Icon, MiniIcon, IconBox, IconGrid, IconFill, IconSize
Te polecenia "już były". Odnoszą się do ikonek na pulpicie, oprócz MiniIcon, bo ta opcja definiuje "małe" ikonki które można potem widzieć w WindowList, przeróżnych modułach Fvwm czy też po prostu w jakimś przycisku na pasku tytułowym. Ikonkę na pulpicie można wyłączyć za pomocą opcji NoIcon, robi się to zwykle gdy zamiast ikonek rysowanych na pulpicie zechcemy używać np. modułu FvwmIconBox czy (bardzo fajnego IMO) FvwmIconMan.
NoTitle/Title
Te dwie opcje decydują o tym, czy okno będzie posiadało pasek tytułowy, czy też jego dekoracje ograniczą się do samej ramki.
TitleAtBottom/TitleAtLeft/TitleAtRight/TitleAtTop
To decyduje o położeniu paska tytułowego: Nad oknem, pod oknem, po lewej lub po prawej stronie. Tutaj trzeba zaznaczyć, że obróceniu ulega w zasadzie tylko font (oraz oczywiście zmienia się położenie paska tytułowego), ale nie są obracane np. piksmapy przycisków czy tła. Co prowadzi do tego, że do "obróconych" tytułów trzeba by osobno projektować dekorację, żeby jakoś sensownie wyglądała.
LeftTitleRotatedCW/LeftTitleRotatedCCW, RightTitleRotatedCCW/RightTitleRotatedCW, TopTitleRotated/TopTitleNotRotated, BottomTitleRotated/BottomTitleNotRotated
Te opcje decydują o sposobie obracania fontu tytułu okna.
StippledTitle/StippledTitleOff
Ta opcja powstała, bo paru osobom podobały się "ozdóbki" które fvwm dodaje oknom "sticky" (takie poziome paski na pasku tytułowym). Tą opcją można wymusić rysowanie tych paseczków także na "zwykłych" (non-sticky) oknach.
IndexedWindowName/ExactWindowName, IndexedIconName/ExactIconName
Ta opcja powoduje dodawania numerku do każdego kolejnego okna o "identycznym" tytule. Np. gdy otworzy się 3 xtermy, to każdy będzie nazywał się "xterm". Ale gdy zrobi się "Style XTerm IndexedWindowName", to xtermy dostaną tytuły "xterm", "xterm (2)" i "xterm (3)". To samo dotyczy nazw ikon (druga para opcji). Notka: to wpływa tylko na wyświetlanie tytułów - nie można użyć np. "xterm (3)" jako określenia okna w poleceniu Style czy Next. Bo nie wpływa to w żaden sposób na wartości atrybutów Title/Class/Resource.
!Borders/Borders
Czy okno będzie posiadało ramkę. Jeśli zestawi się razem "Notitle, Noborders", to uzyskuje się okno bez jakichkolwiek dekoracji.
WindowListSkip/WindowListHit, CirculateSkip/CirculateHit, CirculateSkipShaded/CirculateHitShaded
WindowList* decyduje o tym, czy okno będzie się pojawiało w WindowList (alt-tab). Dodatkowo ta lista może być respektowana przez niektóre moduły, jak np. pager. Najczęściej można tym ustawić, by np. pager nie pokazywał sam siebie, albo żeby pod alt-tab nie widzieć pozycji gkrellm. Circulate* wpływa na przełączanie między oknami za pomocą funkcji kierunkowych, i być może ma jeszcze jakieś zastosowania. Ja używam np. czegoś takiego:
Key KP_Home A N Direction NorthWest (CurrentPage) focus Key KP_Left A N Direction West (CurrentPage) focus Key KP_End A N Direction SouthWest (CurrentPage) focus Key KP_Up A N Direction North (CurrentPage) focus Key KP_Down A N Direction South (CurrentPage) focus Key KP_Page_Up A N Direction NorthEast (CurrentPage) focus Key KP_Page_Down A N Direction SouthEast (CurrentPage) focus Key KP_Right A N Direction East (CurrentPage) focus Key KP_Begin A N Direction Center (CurrentPage) focus Key KP_5 W S Raise
Definiuje mi to "różę" na klawiaturze numerycznej, za pomocą której w prosty sposób przerzucam fokus na okno umieszczone na którymś z ośmiu wektorów. Za pomocą środkowego klawisza "5" przerzucam fokus na okno umieszczone najbliżej. Za pomocą shift-5 wydobywam aktualne okno na wierzch. Dla mnie jest to bardzo wygodne do przełączania się między oknami na aktywnej stronie, choć można by tego używać i do przełączania po całym biurku. Niektórzy pewnie mogą uznać za wygodniejszą zamianę "focus" na jakąś funkcję "focus–raise". Ale mam też na każdej stronie zwykle 2 okna na które nie chcę się przełączać z klawiatury - są to FvwmIconMan i gkrellm. I tutaj wchodzi CirculateSkip - okna z tą opcją nie będą uwzględniane przez moją różę.
Layer
Określa warstwę dla okna. Podaje się numerycznie, od zera w górę. Zero to oczywiście warstwa najniższa. Istnieje jeszcze specjalne polecenie "Layer", które robi to samo, tyle że dla pojedynczego okna.
StaysOnTop/StaysOnBottom/StaysPut
3 gotowe "presets" - coś jak makra na "Style xxx layer X". Powiązania "Stays*<>liczba" załatwia się za pomocą osobnego polecenia DefaultLayers.
Sticky/Slippery, StickyAcrossPages/!StickyAcrossPages, StickyAcrossDesks/!StickyAcrossDesks, StickyIcon/SlipperyIcon, StickyAcrossPagesIcon/!StickyAcrossPagesIcon, StickyAcrossDesksIcon/!StickyAcrossDesksIcon
Jeśli okno jest "sticky", to będzie widoczne na każdej stronie/biurku. Niedawno weszło rozszerzenie (a właściwie rozbicie) o dodatkowe StickyAcross*, dzięki którym można uczynić okno "sticky" tylko na jednym biurku, lub odwrotnie - okno widoczne na wszystkich biurkach, ale tylko na jednej stronie - np. gkrellm którego widać na każdym biurku, ale tylko na pierwszej stronie. Odpowiednie opcje istnieją także dla ikonek.
StartIconic/StartNormal
Proste. Czy okienko ma od razu startować jako zikonifikowane.
Color, ForeColor, BackColor, Colorset
To decyduje o kolorze fontu/tła przycisków w oknach nieaktywnych. Wszystkie 4 polecenia ustawiają to samo, tylko w nieco inny sposób. "Color" wymaga podania dwóch kolorów w dosłownej notacji "kolor1/kolor2" ForeColor/BackColor robią to samo, tylko że nie trzeba podawać pary kolorów, a pojedynczy kolor tła/fontu. Wygodne gdy chce się zmienić tylko kolor tytułu okna bez ingerowania w takie głupoty jak tło pod przyciskami. A Colorset ustawia te kolory używając kolorów fg/bg danego kolorsetu.
HilightFore, HilightBack, HilightColorset
To samo, tylko dla okien "hilighted" - czyli aktywnych. Tutaj jak widać brakuje odpowiednika dla opcji "Color".
* Tutaj uwaga: Te opcje, zmieniające kolor/tło, dotyczą również podpisów pod ikonkami na pulpicie.
BorderColorset, HilightBorderColorset
Ustawianie kolorów ramki nieaktywnej i aktywnej. Tutaj już w ogóle koderzy zapomnieli o takich głupotach jak pojedyncze kolory i możliwe jest tylko używanie kolorsetów. Widać tutaj, jak w miarę rozwoju fvwm priorytety przesuwały się ze starego schematu pojedynczych kolorów na rzecz kolorsetów.
Font, IconFont
Ustawianie fontu podpisom pod ikonkami na pulpicie.
IconTitle/NoIconTitle
Decyduje o tym, czy ikonka na pulpicie będzie miała podpis, czy też ograniczy się do samego obrazka.
StartsOnDesk/StartsOnPage/StartsAnyWhere, SkipMapping/ShowMapping, StartsOnScreen, StartsOnPageIncludesTransients/StartsOnPageIgnoresTransients, ManualPlacementHonorsStartsOnPage/ManualPlacementIgnoresStartsOnPage, CaptureHonorsStartsOnPage/CaptureIgnoresStartsOnPage, RecaptureHonorsStartsOnPage/RecaptureIgnoresStartsOnPage, ScatterWindowGroups/KeepWindowGroupsOnDesk
Te opcje decydują o tym, na jakim pulpicie startuje jakaś aplikacja, pozwalają przyczepić aplikację "na stałe" do określonego ekranu/biurka/strony, i określają też różne niuanse pracy rozłożonej na wielu biurkach. Trzeba je poznać jeśli sensownie myśli się o rozbijaniu swoich okien na poszczególne biurka czy ekrany Xineramy.
MwmButtons/FvwmButtons, MwmBorder/FvwmBorder, MwmDecor/NoDecorHint, MwmFunctions/NoFuncHint, HintOverride/NoOverride
Tutaj potrzebne jest trochę wyjaśnienia. Otóż X-y mają interesującą historię jeśli idzie o tzw. "WM hints". "Hinty" to, eee, coś w rodzaju "rozszerzonych atrybutów" okien. Nazwane pole zawierające jakąś wartość. Czasem bywało tak, że jeden toolkit/jeden WM dodawał nowe hinty, które potem były akceptowane przez resztę populacji. Np. to, że mamy przezroczyste *termy w KDE, Gnome czy innych takich w większości opiera się na dwóch hintach wprowadzonych przez Enlightenment - hinty te pozwalają aplikacji na pobranie obrazu "root window", i w oparciu o to generują "przezroczystość". Istnieją też odpowiednie "hints" które przekazują ikonki, pozwalają KDE czy Gnome umieszczać swoje aplikacje w trayach swoich paneli itp. Hinty często potrafią być specyficzne dla konkretnego środowiska (tutaj myślę akurat o GNOME/KDE, które wypracowały własne "standardy", choć w GNOME2/KDE3 doszło do wyznaczenia wspólnych norm E(xtended)WMH). Ale wróćmy do Mwm - Mwm wniósł sporo do światka hintów. I FVWM stara się te hinty respektować, jeśli mu nakażemy.
MwmButtons włącza obsługę przycisków w stylu "mwm". Pozwala to określonym przyciskom na paskach tytułowych przyjmować "specjalne" stany w zależności od tego, co się dzieje z oknem. Np. gdy okno jest zmaksymalizowane, to przycisk "maximize" wygląda inaczej niż zwykle. To samo z przyciskiem "stick", "menu" czy "shade". FvwmButtons (domyślne) wyłącza tę możliwość.
MwmBorder akurat nie dotyczy hintów, ale pozwala na emulowanie wyglądu ramki Mwm. Zainteresowani emulowaniem Mwm mogą obejrzeć też polecenie "Emulate" i stosowne opcje MenuStyle.
MwmDecor pozwala aplikacji określić, których przycisków nie chce mieć. Np. aplikacja może powiedzieć że nie chce przycisku minimalizacji i maksymalizacji, i wtedy nie pojawią się one na jej pasku tytułowym. Np. okna transient (kiedy włączy się im paski tytułowe) zwykle mają "okrojony" zestaw przycisków.
MwmFunctions ma podobną rolę, tyle że dotyczy nie przycisków, a operacji na oknie. Np. mam menu WindowOps, w którym mam opcje maksymalizacji czy zamykania. Jeśli zezwolę na MwmFunctions, to jakaś aplikacja może powiedzieć "mnie nie wolno zamykać", i w moim menu będę miał co prawda pozycję "Zamknij", ale pojawi się ona "wygaszona" - nieaktywna. Odpowiednie skróty klawiaturowe będą równie bezużyteczne. HintOverride to dodatek do tej funkcjonalności - funkcja co prawda będzie wygaszona w menu, ale będzie można jej użyć i zadziała (choć jest "not recommended")
NoButton/Button
To też interesujące, bo pozwala okroić zestaw przycisków okna dla grupy aplikacji. Mogę powiedzieć "Style foobar_windows NoButton 1" i wtedy okna z grupy foobar_windows nie będą posiadały przycisku 1. "Button" odkręca działanie "NoButton".
ResizeHintOverride/NoResizeOverride
Opcja "awaryjna" dla aplikacji, które nie pozwalają WM zmieniać rozmiaru swojego okna w sensownym zakresie (np. bez sensu limitują rozmiar okna wyboru plików)
OLDecor/NoOLDecor
Trochę jak MwmwDecor, tyle że dotyczy hintów OpenLook/XView WM. Ale takich aplikacji się już raczej nie spotyka.
GNOMEUseHints/GNOMEIgnoreHints
To samo, tyle że dotyczy hintów Gnome (prawdopodobnie dotyczy to Gnome 1.x, bo 2.x to już, przynajmniej częściowo, EWMH)
DecorateTransient/NakedTransient
Czy okna transient mają dostawać paski tytułowe? Warto to włączyć, jeśli np. denerwuje nas to, że w fvwm większość okien dialogowych i innych takich ma tylko cienką ramkę bez tytułu.
DontRaiseTransient/RaiseTransient, DontLowerTransient/LowerTransient, DontStackTransientParent/StackTransientParent
Te opcje dotyczą położenia okien "transient" względem innych okien, względem siebie i względem swoich okien macierzystych. Przydatne gdy trzeba obejść jakieś bugi w konkretnej aplikacji.
UseDecor
Nakazuje oknom używać określonej dekoracji. Prosty sposób, by nadać inne dekoracje poszczególnym klasom okien. Tutaj notka: Przypisania przycisków się nie zmieniają mięcy dekoracjami. Czyli jeśli mam ustawione, że przycisk 1 to "Close", to każda jedna dekoracja będzie miała takie ustawienia. Można oczywiście zmienić ilość pokazywanych przycisków (Button/Nobutton), i można kombinować z dublowaniem funkcjonalności między przyciskami, ale to nieco ogranicza pole manewru (choć nie tak znowu bardzo).
UseStyle
Tym poleceniem można kopiować style jednej grupy okien na inną.
NoPPosition/UsePPosition, NoUSPosition/UseUSPosition, NoTransientPPosition/UseTransientPPosition, NoTransientUSPosition/UseTransientUSPosition, NoIconPosition/UseIconPosition, FixedPosition/VariablePosition, FixedUSPosition/VariableUSPosition, FixedPPosition/VariablePPosition, FixedSize/VariableSize, FixedUSSize/VariableUSSize, FixedPSize/VariablePSize
Te opcje decydują o tym, gdzie umieszczone zostanie okno. Niektóre okna same określają swoją pozycję na ekranie (PPosition==Programme Postioned), niektórym to użytkownik nakazuje gdzieś się ustawić (USPositions==User Supplied P.) np. przekazując odpowiednią linijkę "--geometry" w wywołaniu. Czasem niektóre aplikacje ustawiają się przy starcie w debilnych miejscach, i lepiej jest gdy to fvwm je rozmieści. Opcje "Fixed*" decydują o tym, czy okno po zamapowaniu na ekranie będzie można przesuwać. Sporo tego, z reguły używanie jest bardzo "app-specific".
StartsLowered/StartsRaised
Wiadomo. To nie określa warstw, a po prostu ułożenie w obrębie jednej warstwy. Czy okno ma się pojawić pod innymi swojej warstwy, czy też nad nimi.
IgnoreRestack/AllowRestack
Można tym wyłączyć aplikacji możliwość samodzielnego zmieniania "głębi" na których pływają ich okna. Np. musiałem amputować taką możliwość oknom Opery i OpenOffice, bo próbowały po otworzeniu okien konfiguracyjnych "na chama" walczyć z fvwm i po kilkanaście razy odświeżały swoje okna (==denerwujące migotanie). Dostały IgnoreRestack i się od razu uspokoiły.
Closable/Unclosable, Iconifiable/Uniconifiable, Maximizable/Unmaximizable
To nowiutkie opcje (z wczoraj ;) Pozwalają zablokować możliwość zamknięcia/ikonifikacji/maksymalizacji jakiegoś okna. Nie ma to wpływu na dekorację okna, ale po prostu przycisk minimalizacji przestanie mieć jakikolwiek wpływ.
AllowMaximizeFixedSize/DisallowMaximizeFixedSize
Czy okna "fixedsized" można maksymalizować? (ale po co?)
IconOverride/NoIconOverride/NoActiveIconOverride
Czasem aplikacje oferują "własne" ikonki. Fvwm może je "przeładować". (w sensie "overload")
DepressableBorder/FirmBorder
Czy ramka okna się "wciska" gdy się na nią kliknie. To w ogóle się może komuś podobać?
MaxWindowSize
Można określić maksymalny rozmiar okna. Fajne, bo "siłowo" ogranicza to rozmiar dowolnego okna. Ja mam wszystkie okna ustawione na maks. 1024x768. Jeśli okno jakiejś aplikacji lubi wyskakiwać zbyt duże jak na nasz gust, to można je tutaj pieszczotliwie palnąć w czapę, a z pewnością mu przejdzie. Wielkość określa się albo w pikselach, albo w procentach ekranu. W przypadku naprawdę dziwnych aplikacji można to połączyć z FvwmScroll...
IconifyWindowGroups/IconifyWindowGroupsOff
Jeśli zikonifikuje się "lidera" grupy (czyli zwykle okno nadrzędne), to czy pozostali członkowie grupy mają podążyć za nim? Problem jest następujący - aplikacje rzadko kiedy poprawnie określają "lidera", więc opcja ta wywołuje więcej zamętu niż pożytku. Zresztą, do takich rzeczy można użyć "All [cośtam] Iconfify"
ResizeOpaque/ResizeOutline
Czy okno ma mieć rozmiar zmieniany w trybie Opaque czy Outline. Outline jest "lżejszy" na słabszych maszynach, ale ma jedną wadę - powoduje "X-server grab". Wystarczy uruchomić xmms i zacząć zmieniać rozmiar okna. Wystarczy utrzymać tryb "outline" wystarczająco długo i xmms skończy grać (gdy wyczerpie mu się bufor) - po prostu taki 'resize' blokuje xserwer (i wszystkie jego pochodne aplikacje).
BackingStore/BackingStoreOff/BackingStoreWindowDefault, SaveUnder/SaveUnderOff
Backing store support. To taka opcja która przydaje się przy pracy zdalnej, lokalny terminal buforuje wtedy to, co jest zakryte przez okna i przy np. przesuwaniu okien stara się używać własnego cache obrazu, a nie ciągnąć od nowa dane obrazu z sieci. Wymaga wsparcia w xserwerze itp., potrafi stroić fochy. Nie ma sensu włączać na "domowych" systemach.
Opacity/ParentalRelativity
Ma to związek z używaniem przezroczystych kolorestów i takimi tam.
WindowShadeShrinks/WindowShadeScrolls, WindowShadeSteps, WindowShadeAlwaysLazy/WindowShadeBusy/WindowShadeLazy
Opcje te decydują o sposobie zwijania okien (funkcja WindowShade). Zwrócę tylko uwagę, że zwijanie jest tylko domyślnie powiązane z paskiem tytułowym. Kto ma fvwm i paski tytułowe na górze okna (normalka :) niech uruchomi sobie FvwmConsole i wklepie linijkę "Pick WindowShade S", po czym wybierze jakieś okno. Albo "WindowShade SE" :) Oczywiście wygląda to sensownie dopiero po ustawieniu jakiejś sensownej animacji "shade" za pomocą powyższych opcji.
EWMHDonateIcon/EWMHDontDonateIcon, EWMHDonateMiniIcon/EWMHDontDonateMiniIcon, EWMHMiniIconOverride/EWMHNoMiniIconOverride, EWMHUseStackingOrderHints/EWMHIgnoreStackingOrderHints, EWMHIgnoreStateHints/EWMHUseStateHints, EWMHIgnoreStrutHints/EWMHUseStrutHints, EWMHMaximizeIgnoreWorkingArea/EWMHMaximizeUseWorkingArea/EWMHMaximizeUseDynamicWorkingArea, EWMHPlacementIgnoreWorkingArea/EWMHPlacementUseWorkingArea/EWMHPlacementUseDynamicWorkingArea
Opcje odnoszą się do EWMH, ustawień ikonek w pagerach zgodnych z EWMH, oraz rezerwowania obszarów po bokach ekranu - obszarów w których nie będą układane żadne aplikacje itp. (przydatne gdy mamy jakiś panel czy coś z boku, i nie chcemy by był kiedykolwiek zakrywany).
To by było "na tyle" co do Style. Pewnie pominąłem znowu kilka opcji, ale to nie jest takie ważne.
A na koniec - "jak zrobić w miarę wierną kopię dekoracji Kliin z IceWM".
Wziąłem sobie temat Kliin z IceWM, obejrzałem oryginał w działaniu, pomyślałem że powinno się udać. Gimpem pociąłem piksampy przycisków na potrzebne fragmenty, odpowiednim filtrem pozamieniałem kolor tła w piksmapach na przezroczystość. Wylądowałem z piksmapami o nazwach
close-down.png, close-up.png depth-down.png, depth-up.png max-down.png, max-toggled.png, max-up.png menu-down.png, menu-up.png min-down.png, min-up.png
Stany "down" to przyciski wciśnięte, "up" to "zwykłe" przyciski. "Toggled" który występuje tylko w "max" to wygląd przycisku w oknie zmaksymalizowanym.
Próbowałem z tego sklecić jakąś dekorację, ale szybko okazało się, że używanie przezroczystych piksmap (co pozwala na prostą zmianę kolorów dekoracji bez edycji piksmap) niosło ze sobą wiele problemów. Ale się uparłem, i jednak dopiąłem swego. Wrzuciłem wszystkie piksmapy (w załączniku) do katalogu "kl" w ~/.fvwm/images, a potem zacząłem klepać plik z regułkami.
DestroyDecor recreate kliin AddToDecor kliin
to "recreate" pozwala mi na wielokrotne parsowanie pliku regułek w jednej sesji fvwm, bez zagrożenia że coś się rozwali czy zafałszuje.
+ TitleStyle Height 16 Active (MultiPixmap Main Solid #ccccee) \ Inactive (MultiPixmap Main Solid #dddddd) -- flat
ustawiam wysokość paska tytułowego na 16 pikseli (tyle mają przyciski w Kliin), dodatkowo ustawiam kolor aktywnego i nieaktywnego paska - kolory przeklejone z pliku z opisem IceWM Kliin. A na koniec "flat" które spłaszcza pasek. Używam tutaj MultiPixmap do ustawienia koloru (zamiast prostego "TitleStyle Active Solid #rrggbb") bo "proste" przypisanie kolorów jakoś szwankuje w moim fvwm. Chyba nikt nie jest specjalnie zainteresowany utrzymywaniem przestarzałych mechanizmów.
+ ButtonStyle 1 AllUp (Pixmap kl/menu-up.png) \ AllDown (Pixmap kl/menu-down.png)
Ta linijka ustawia wszystkim stanom "Up" przycisku 1. piksmapę menu-up.png, a stanom "pressed" piksmapę menu-down.png. Używając tzw. SuperStates (jak AllUp czy AllDown) redukuję liczbę wpisów, gdyż odgórnie łapią mi się na to ActiveUp, InactiveUp etc. Dodatkowo za pomocą nawiasów () mogę w jednej linijce zadeklarować większą ilość stanów przycisku w jednym wywołaniu ButtonStyle. To, że łamię wiersze za pomocą "\" robię tylko na potrzeby netykiety :) Fvwm przełknie albo jeden długi wiersz, albo tak właśnie połamany
+ ButtonStyle 2 AllUp (Pixmap kl/close-up.png) \ AllDown (Pixmap kl/close-down.png) + ButtonStyle 6 AllUp (Pixmap kl/min-up.png) \ AllDown (Pixmap kl/min-down.png) + ButtonStyle 8 AllUp (Pixmap kl/depth-up.png) \ AllDown (Pixmap kl/depth-down.png)
To samo dla przycisków 2, 6 i 8.
Pominąłem maksymalizację (przycisk 4.), bo...
+ ButtonStyle 4 AllUp (Pixmap kl/max-up.png) \ AllDown (Pixmap kl/max-down.png) \ AllToggled (Pixmap kl/max-toggled.png) \ ToggledActiveDown (Pixmap kl/max-up.png) \ ToggledInactiveDown (Pixmap kl/max-up.png)
Ten przycisk musi zawierać definicje stanu "toggled" na potrzeby MwmHints - będzie przyjmował osobny wygląd gdy okno będzie w stanie "maximized". Za stany "specjalne" odpowiadają stany "Toggled". Najpierw za pomocą "AllToggled" przypisuję wszystkim stanom "specjalnym" jednakową piksmapę, a potem jeszcze poprawiam piksmapę która pojawia się, gdy ktoś kliknie na taki "specjalny" przycisk. Muszę to zrobić w dwóch wpisach, bo nie istnieje (jeszcze?) żaden SuperState "ToggledDown" który by obejmował ToggledActiveDown i ToggledInactiveDown.
Teraz:
+ BorderStyle -- HiddenHandles noinset flat
Usuwa z ramki okna "handles" (stają się niewidzialne), czyni ramkę "płaską" (w odróżnieniu od raised/sunken), a opcja "noinset" dodatkowo usuwa cieniutkie cieniowanie pomiędzy ramką a wnętrzem okna. Może to przesada, bo ramka w Kliin ma i tak tylko 1 piksel szerokości :)
+ ButtonStyle All - Clear + ButtonStyle 1 - MwmDecorMenu + ButtonStyle 4 - MwmDecorMax + ButtonStyle 6 - MwmDecorMin
Tutaj ustawiam skojarzenia pomiędzy przyciskami, a hintami MWM. Pierwsza linijka usuwa jakiekolwiek skojarzenia - ważne, straciłem na to pół godziny wyszukiwania nieistniejących błędów :( Kolejne 3 linijki kojarzą odpowiednio przyciski. Uwaga - nie ma to w ogóle związku z funkcjami, jakie przypiszemy przyciskom. Ale lepiej, gdy jest to w miarę spójne :)
+ ButtonStyle All -- usetitlestyle flat
Jedna linijka, ale ma gigantyczny wpływ na wygląd. Po pierwsze, przyciski stają się płaskie, po drugie używają stylu paska tytułowego. Pod przyciskami będzie rysowane tło bazujące na tle głównego paska tytułowego.
Mouse 1 1 N Menu WindowOpsMenu Mouse 1 2 N Close Mouse 1 4 N Maximize Mouse 1 6 N Iconify Mouse 1 8 N Lower
To bardzo prymitywne przypisanie podstawowych funkcji do tych przycisków. Działa, ale to tylko przykład. Chodzi o to, że jeśli np. nie ma się żadnej funkcji przybindowanej do przycisku nr. 8, to on się po prostu nie pojawi. Aby się pojawił, wystarczy mu cokolwiek przypisać, choćby "nop".
Teraz zostało tylko ustawienie ramki dookoła okna. W Kliin powinna być ona szeroka na 1 piksel, czarna. Identyczna i dla okien aktywnych, i dla nieaktywnych. Kolor ramki można ustawić tylko kolorsetem, więc najpierw zdefiniujmy odpowiedni kolorset - "czarny na czarnym":
Colorset 0 fg black, bg black
Teraz wystarczy to upchnąć w definicję ramki:
Style * BorderColorset 0, BorderWidth 1, HandleWidth 1, \
HilightBorderColorset 0, MwmDecor, MwmButtons \
UseDecor kliin
Ustawia to kolorset nr. 0 dla ramki nieaktywnej, grubość ramki z/bez uchwytów na 1 piksel, kolorset nr. 0 dla ramki aktywnej, włącza obsługę hintów dotyczących pokazywania/ukrywania przycisków według MwmHints oraz rysowanie przycisków "toggled". A na końcu ustawia ten dekor jako domyślny dla wszystkich okien. Warto dodać do tego jeszcze
Style * DecorateTransient
Co spowoduje, że każde okno (np. splash screen gimpa) będzie mieć tytuł - jak w IceWM.
I na koniec konieczny "bug-hack". Mianowicie z jakiegoś powodu przyciski w stanach "toggled" olewają sobie tło wynikające z "usetitlestyle". I mają szare tło zamiast tego niebieskawego.
Można to obejść albo generując piksmapy które nie polegają na przezroczystości, albo zredefiniować domyślne kolory tła przycisków. Wystarczy dodać linijkę:
Style * HilightBack #ccccee, BackColor #dddddd
I już będzie OK. Aby być już w 100% pewnym, można dodać jeszcze:
Style * ForeColor black, HilightFore black, font xft:Times-10:bold
A, jeszcze coś - można od razu zmienić kolory tego okienka w którym pojawiają się koordynaty przy move/resize.
DefaultColors black #ccccee
(DefaultColors/DefaultColorset robią jedno - ustawiają kolory wykorzystywane w wewnętrznie generowanych przez fvwm okienkach, jak np. właśnie okienko pozycji/geometrii)
PS. W załączniku jest katalog "kliin" - wystarczy wykonać "Read /ścieżka/kliin/theme" w FvwmConsole by obejrzeć efekt. Chyba. ;)