Zápas s plasmou

Jednou z klíčových technologií prostředí KDE 4 je plasma. Přestože KDE 4 používám již asi rok, teprve nyní s OS 11.3 jsem je ohodnotil jako rozumně robustní a odvážil se je instalovat cizímu uživateli. Problém nastal právě s plasmou.

Ono je totiž velmi jednoduché tu plasmu doslova rozstřílet a bez dostatečných znalostí ji lze jen obtížně vrátit do použitelného stavu. Za takovou situaci lze označit stav, kdy si uživatel odstraní panel případně jeho součásti. Průšvih je, že BFUové se vyznačují prakticky absencí pudu počítačové sebezáchovy a většina z nich přímo okázale ignoruje technické záležitosti. Někteří jsou ještě navíc obstojní hračičkové. Pro takovéto uživatele je naprosto bezpodmínečné postavit systém tak, aby zůstal maximálně provozuschopný i pod "nejhorší uživatelovou palbou".

Tak jsem začal hledat způsoby, jak plasmu "vyfutrovat". Nic až tak zjevného nebylo vidět, jedinou výjimkou je položka "uzamknout widgety" v objektové nabídce plasmy. toto je však zabezpečení na úrovni "přihlášení do Win98" blahé paměti. Odemknout lze snadno bez jakéhokoliv hesla. Tedy zamítnuto.

Při hlubším průzkumu jsem našel konfigurační soubor ~/.kde/share/config plasma-desktop-appletsrc. А tak první pokus byl nastavit jej pouze ke čtení. To fungovalo výborně, plasmu jsem mohl libovolným způsobem rozstřílet a po odhlášení a přihlášení jsem se dostal do původního stavu. Ale... nešlo ani změnit tapetu na ploše a to se dá považovat za základní uživatelský komfort, nemluvě o vcelku oprávněnému požadavku na zapráskání plochy nějakými plasmoidy. Takže také zamítnuto.

Byl jsem upozorněn na nástroj kiosktool. Ten umožňuje omezit lecjakou činnost uživatele, jako například zakázat používat tlačítka "zpět" a "vpřed" (což perfektně funguje u Konqueroru, ale u výchozího prohlížeče OpenSUSE - Firefoxu už ne... Na druhou stranu jsem nenašel způsob, jak zabránit rozstřílení plasmy - kiosktool ve verzi 1.99.svn1102156, jak je v repozitářích OpenSUSE 11.3 vypadá spíše jako nástroj pro KDE 3. Tedy toto asi také nebude to pravé.

Tak tedy ruční editování uvedeného konfiguráku, který tedy zrovna jako vzorový konfigurák nevypadá. Vše nasypané na jediné hromadě, popisky proměnných i možností voleb chybí a to dokonce i na Internetu. Ke všemu hrůznému se přidává skutečnost, že konfigurák se chvílemi sám od sebe mění v důsledku činnosti systému - typicky systemtray a jeho zprávy. Konfigurák má naprosto zoufalé rozčlenění, hlavičky sekcí jsou dost zmatené. Tak taková jednoduchá konfigurace pracovní plochy může vypadat asi takto:

[Containments][2]
...

[Containments][2][Wallpaper][image]
...

[Containments][3]
plugin=panel
...

[Containments][3][Applets][1]
plugin=launcher
...

[Containments][3][Applets][2][Shortcuts]
global=Alt+F1

[Containments][3][Applets][3]
plugin=showdashboard
...

[Containments][3][Applets][4]
plugin=pager
...

[Containments][3][Applets][5]
plugin=tasks
...

[Containments][3][Applets][6]
plugin=systemtray
...

[Containments][3][Applets][6][Configuration]
...

[Containments][3][Applets][6][Configuration][Applets][12]
plugin=notifier
...

[Containments][3][Applets][6][Configuration][Applets][12][PopupApplet]
...

[Containments][3][Applets][6][Configuration][ExtenderItems][5]
sourceAppletPluginName=systemtray
...

[Containments][3][Applets][6][Configuration][ExtenderItems][6]
sourceAppletPluginName=systemtray
...

[Containments][3][Applets][7][Configuration][Applets][13]
plugin=notifier
...

[Containments][3][Applets][8]
plugin=digital-clock
...

[Containments][3][Applets][8][Configuration]
...

[Containments][3][Applets][8][Configuration][ExtenderItems][3]
sourceAppletPluginName=digital-clock
...

[Containments][3][Applets][8][Configuration][ExtenderItems][4]
sourceAppletPluginName=digital-clock
...

[Containments][3][Applets][9]
plugin=lockout
...

[Containments][3][Applets][9][Configuration]
...

[General]
immutability=1

Ono z toho jakž takž vyplývá nějaká souvislost mezi položkami, ale celkově
děsivé - hlavička kontejneru, včleněného appletu, jejich vazeb i konfigurace jedno jest. No potěš koště. Jakýmsi vodítkem je stránka http://techbase.kde.org/Projects/Plasma/Kiosk a potom už jen zdroják kdelibs-4.4.4.

Pro daný účel se jako hlavní proměnná ukazuje immutability. Ta by zřejmě měla nabývat hodnot:
immutability
=Mutable=1 - kdy je povoleno s daným objektem manipulovat
=UserImmutable=2 - kdy je objekt uzamčen ale uživatel jej může bez problémů odemknout a editovat (zrušit)
=SystemImmutable=4 - kdy je objekt uzamčen a uživatel jej nemůže odemknout

Začal jsem zkoušet měnit hodnoty, nejprve jsem zkusil změnit na 2 ... a cvičně i na 0 - co to udělá. No, chová se to spíše divně. Pokud jsem nastavil ve všech [Containments][3] immutability=2, tak jsem dosáhl žádaného výsledku... ale to je vlastně špatně, protože toto bych měl být schopen ručně odemknout. Podrobnějším laborováním zjišťuji, že jediné, co nastavuje kliknutí na "uzamknout widgety", je onen poslední řádek v sekci [general]. Ať kliknu kdekoliv, mění se pouze tato položka - a ručně nastavené immutability se nepřestaví. Další pokus je nasazení nesprávné hodnoty immutability=0 - se stejným výsledkem, jako když tam byla 2. Samozřejmě, že první případ je nepřijatelný, protože se asi jedná o chybu (prozatímní zjednodušení?), která v dalších verzích může být opravena, ten druhý případ je asi testování na hodnotu "Mutable", což je vlastně také špatně, protože nedefinuje chování při chybném parametru.

Nastavení hodnoty immutability=4 vede ke správnému chování - alespoň to tak vypadá avšak vzhledem k celkově chybovému chování tomu zatím nelze příliš věřit, vše je ještě nezralé. Přesto lze tímto způsobem zvýšit odolnost prostředí proti uživatelům, za tímto účelem je nutné ve všech widgetech a panelech, které ve výšeuvedeném schématu mají hlavičku [Containments][3] změnit hodnotu immutability z 1 na 4.

Ve všech ostatních případech, tedy tam, kde hlavička obsahuje [Containments][2], immutability=1 zajistí možnost přidat další plasmoidy na plochu a i třeba změnit tapetu na pozadí. Pokud například u nějakého plasmoidu nastavíme immutability=4, nebude uživatel schopen bez ručního editování daný prvek změnit, nebo zrušit. V KDE 4.4.4 to ovšem platí i pro immutability=2, protože uživatel myší nastavuje pouze hodnotu immutability v sekci [general]. Výběr z konfiguráku může vypadat například takto:

[Containments][3]
activity=
desktop=-1
formfactor=2
geometry=0,-34,1920,28
immutability=4
location=4
plugin=panel
screen=0
zvalue=0

[Containments][3][Applets][1]
geometry=0,1,27,27
immutability=4
plugin=launcher
zvalue=0

[Containments][3][Applets][3]
geometry=31,1,27,27
immutability=4
plugin=showdashboard
zvalue=0

[Containments][3][Applets][4]
geometry=62,1,43,27
immutability=4
plugin=pager
zvalue=0

[Containments][3][Applets][5]
geometry=109,1,1516,27
immutability=4
plugin=tasks
zvalue=0

[Containments][3][Applets][6]
geometry=1629,1,175,27
immutability=4
plugin=systemtray
zvalue=0

[Containments][3][Applets][7][Configuration][Applets][13]
geometry=0,0,148,198
immutability=4
plugin=notifier
zvalue=0

[Containments][3][Applets][8]
geometry=1808,1,54,27
immutability=4
plugin=digital-clock
zvalue=0

[Containments][3][Applets][8][Configuration][ExtenderItems][3]
extenderIconName=view-pim-calendar
extenderItemName=calendar
extenderTitle=Kalendář
isCollapsed=false
sourceAppletId=11
sourceAppletPluginName=digital-clock

[Containments][3][Applets][9]
geometry=1866,1,54,27
immutability=4
plugin=lockout
zvalue=0

Celkově tedy KDE 4.4 musím hodnotit jako nedostatečně připravené pro ty běžné uživatele. Evidentně není odladěné chování plasmy a alespoň zatím jsem nenašel nástroje na její konfiguraci. Je možné, že KDE 4.5 a 4.6 představují v tomto směru pokrok, ale s KDE 4.5 jsem zatím měl příliš problémů a tak je zatím nepoužívám a i do zdrojáků jsem se ještě nedíval.

Autor: jik

Komentáře

Rax odpověděl -

Jestli chces aby uzivatel mohl menit wallpaper anic vic, nestacilo by zamknout vsechno krome wallpaperu? Nemyslim ted zamykani pomoci nastavovani hodnoty immutability, ale pomoci zamykani skupin.
Tedy neco jako:
---------------------------------------
[Containments][2][$i]
...

[Containments][2][Wallpaper][image]
...

[Containments][3][$i]
plugin=panel
...

[Containments][3][Applets][1][$i]
plugin=launcher
...

[Containments][3][Applets][2][Shortcuts][$i]
global=Alt+F1

[Containments][3][Applets][3][$i]
plugin=showdashboard
...

[Containments][3][Applets][4][$i]
plugin=pager
...

[Containments][3][Applets][5][$i]
plugin=tasks
...

[Containments][3][Applets][6][$i]
plugin=systemtray
...

[General][$i]
immutability=1
---------------------------------------------
Pridanim [$i] za nazev skupiny zamknes skupinu. To znamena, ze veskere zmeny, ktere uzivatel v dane skupine provede se neulozi, takze pri pristim prihlaseni by tam mely byt zase ty hodnoty tebou nadefinovane. Takto zamknout jdou i konkretni klice: "jmenoKlice[$i]=hodnota", nebo cely soubor pridanim [$i] na samostatny radek na zacatek (chova se to potom jako kdyby byl soubor pouze pro cteni, coz ty nechces). Pokud to nastavujes jednomu uzivateli, tak mu to udelas v homu a vpohode. Pokud to potrebujes nastavit vice uzivatelum, nacti si jak se vytvareji profily a prirazuji se uzivatelum/skupinam tady, sekce "Users can be associated with Profile(s)".

To, ze ti nesla zakazat tlacitka vpred/zpet ve firefoxu je logicke. Kiosk framework implementuji pouze KDE aplikace. Stejne jako treba KDE URL Restrictions krasne funguji v Dolphinovi, Konqueroru, ale ve firefoxu ani prd.

P.S.: Kiosktool je pro KDE 4 prakticky nepouzitelny. Uz kdyz ho srovnas s tim, jak vypadal a co umel ve verzi pro KDE 3, je ten ctyrkovy jenom takovy ubohy chudacek. Ja tedka pisu/vypracovavam bakalarku o tomhletom. Respektive se snazim dostat kiosktool aspon tam, kde byl v KDE 3. Zatim jsem v par sekcich implementoval tlacitka "setup" a "preview", ktere byly v KDE3 (settings otevre kcmshell4 odpovidajiciho modulu (treba sporic obrazovky), kde muzes nastavit treba onen sporic a nastaveni se ti ulozi do profilu misto do domovskeho adresare. Preview "ukaze" jak je nastaven profil.. tedy v pripade screensaveru spusti screensaver, ktery je nastaven v profilu). Uz jsem i zkousel koketovat s timhletim nastavovanim a nahledem plasmy, ale zatim bezuspesne, ale to se snad podda (bohuzel to nestihnu do odevzdani bakalarky).

Taky jsem do kiosktoolu implementval URL Restrictions (ty funguji vyborne), ktere nebyly ani v trojkove verzi.

P.P.S.: Ted me napadlo, ze si nejsem uplne jisty jak se chova zamykani s podskupinama. Jestli zamknuti skupiny zamkne i podskupinu, nebo ne.

jik odpověděl -

Moje minimální představa je, že uživatel může takřka cokoliv ... na ploše, ale nemůže zrušit panel. Ale to by nevadilo, protože teoreticky by stačilo nepřidat ten [$i] do "pracovní plochy". Ale mám s tím párek problémků:

  • Můj první pokus byl samozřejmě vložit [$i] do "hlavičky" panelu a ruční "odstřelení" panelu - funguje to, panel zmizí a to i z konfiguráku... tedy toto asi nebude to pravé.
  • Docela mě ten "zamykací" symbol [$i] vyděsil. Připomíná to všechno možné, ale proč to má být zrovna "zámek skupiny"? A dokumentace je také úsporná (tedy ano, zase zdá se, že se o tom píše kdesi v kdelibs). A proč je to v podstatě duplicitní k proměnné Immutability?

Ono stejně se mi zdá pitomé i to jméno proměnné Immutability, logičtější by bylo Mutability. Stejně tak mám výhrady k hodnotám, jakých může nabývat, tedy 1=Mutable, 2=UserImmutable, 4=SystemImmutable. Za rozumnější bych považoval využít bitů proměnné zhruba takto:
bit 0: User lock (panel+widget, ale v zásadě považuji tento bit za úlitbu historii, je myslím nesmyslný)
bit 1: System panel lock
bit 2: System widget lock
Takováto koncepce může dovolit znemožnit vložení dalšího panelu na pracovní plochu, aniž znemožní vložení widgetů a zároveň dovolí chránit samotný panel - to by byl ideální stav. K tomu ideálnímu stavu by to však ještě chtělo vlastní adresář(e) pro plasmu (KStandardDirs - asi ~/.kde4/share/plasma), přeházet do něj konfiguráky plasmy a potom je přeskládat - "živé" záležitosti dát kamsi do ~/.kde4/tmp..., ty stabilní ponechat v ~/.kde4/share/plasma.

Rax odpověděl -

On ten zamykací symbol [$i] neni jen zamek skupiny, ale lze s nim zamykat taky cely soubor, nebo i jednotlive klice.

A k tvoji predtave menit cokoliv, krome zniceni panelu. Nevim kde presne jsi to zamykal. Hadam ze v $KDEHOME/share/conf/plasma-desktop-appletsrc. Coz nevim jestli je ta volba co chces. Zkusil byt to zamknout "o uroven vys". Tedy podivat odkud se berou config zdroje: `kde4-config --path config`. Vystupem tohoto by mely byt cesty oddelene dvojteckou. Takze bych to zkusil nastavit a zamknout v te druhe ceste. Pokud je muj vystup takovyto:

rax@linux:~> kde4-config --path config
/home/rax/.kde4/share/config/:/etc/kde-profile/default/share/config/:/usr/share/kde4/config/:/etc/kde4/share/config/

zkopiroval bych si ten soubor plasma-desktop-appletsrc do adresare /etc/kde-profile/default/share/config a zamknul bych to tam. Ono kdyz se potom tvori klice, tak se jede zprava-doleva. Tedy, pokud bude v /usr/share/kde4/config/nejakysoubor nastaveny klic "Klic=hodnota1" a v /home/rax/.kde4/share/config/nejakysoubor nastaven stejny klic na jinou hodnotu "Klic=jinahodnota", aplikace uvidi pouze Klic=jinahodnota. Pokud ovsem uz v /usr/share/kde4/config/nejakysoubor zamknu ten klic "Klic[$i]=hodnota1", uz se hodnota klice neprepise podle toho co mam v /home/rax/.kde4/share/config/nejakysoubor.

Pokud by ona "uroven o jedna vys" byla nejaka, kam bys toto nastaveni nechtel zapsat da se to bud osetrit nastavenim promenne $KDEDIRS, pripadne pomoci profilu. To je popsano v tom odkazu co jsem postoval minule (kiosktool toto mapovani profilu umi).

jik odpověděl -

Ono kdyz se potom tvori klice, tak se jede zprava-doleva. Tedy, pokud bude v /usr/share/kde4/config/nejakysoubor nastaveny klic "Klic=hodnota1" a v /home/rax/.kde4/share/config/nejakysoubor nastaven stejny klic na jinou hodnotu "Klic=jinahodnota", aplikace uvidi pouze Klic=jinahodnota. Pokud ovsem uz v /usr/share/kde4/config/nejakysoubor zamknu ten klic "Klic[$i]=hodnota1", uz se hodnota klice neprepise podle toho co mam v /home/rax/.kde4/share/config/nejakysoubor.
To tedy znamená, že se nejprve bere konfigurace z adresáře vpravo a postupuje se doleva, kde se skončí s příslušným stavem hodnot. Případný zámek ovšem příslušnou část zamkne před dalšími změnami. A pokud tento zámek bude v posledním (úplně vlevo) adresáři, měl by tento zámek znemožnit manipulaci s daným objektem, tedy například tento objekt by nemělo jít smazat - a tedy ani jeho součásti. Takže:
[Containments][3][$i]
activity= desktop=-1
formfactor=2
geometry=0,-34,1920,28
immutability=1
location=4
plugin=panel
screen=0
zvalue=150

v adresáři "napravo" (u mě /etc/kde4/share/config/) by mělo zamknout tento panel ... a snad i vložené widgety. Pokus smazat takovýto panel dopadl zajímavě: Panel sice zůstal, ale jeho obsah zmizel. Kontrola konfiguráku v "levém" adresáři (~/.kde4/...) ukázala značky [$i] u všech klíčů tohoto panelu a značky [$d] u všech vložených widgetů a panelů - značí "smazáno". Případné ruční odmazání těchto částí opět panel zprovoznilo.
Toto jsou však drobnosti. Myslím, že hlavním problémem je, co a jak by měl konfigurák obsahovat, pořád mám pocit, že ke stejné záležitosti přistupuje několik lidí naprosto odlišným způsobem a celý ten b....l je potom dost obtížně zvládnutelný.