De meeste mensen prefereren hun werk in een grafische omgeving te doen, en voor Unix-machines, betekent dat gewoonlijk het gebruik van X. Als je gewend bent aan de Macintosh of Microsoft Windows, dan duurt het even eer je aan het X Window Systeem gewend bent, vooral in hoe het wordt aangepast.
Bij de Macintosh of Microsoft Windows kun je de omgeving vanuit de omgeving aanpassen: als je bijvoorbeeld de omgeving wilt wijzigen, dan doe je dit door op de nieuwe kleur te klikken in een of ander speciaal grafisch setupprogramma. Onder X, worden de standaardsysteemwaarden bestuurd door tekstbestanden, die je op directe wijze bewerkt, m.a.w. je typt de daadwerkelijke kleurnaam in een bestand om je achtergrond op die kleur in te stellen.
Er valt niet te ontkennen dat deze methode niet zo handig is als een aantal commerciële venstersystemen. Ik denk dat deze neiging om zelfs in een grafische omgeving tekstgeöoriënteerd te blijven, te maken heeft met het feit dat X werd gecreëerd door een boel programmeurs die simpelweg niet trachtten software te schrijven die hun grootouders konden gebruiken. Deze neiging kan in toekomstige versies van X veranderen (tenminste ik hoop dat dit zo is), maar thans zul je moeten leren omgaan met nog meer tekstbestanden. Het geeft je in ieder geval op z'n minst een zeer flexibele en precieze controle over je configuratie.
Hier zijn de belangrijkste bestanden voor het configureren van X:
| .xinitrc | Een script dat door X wordt uitgevoerd wanneer het opstart |
| .twmrc | Wordt ingelezen door de X-Windowmanager twm |
| .fvwmrc | Wordt ingelezen door de X-Windowmanager fvwm |
Deze bestanden zouden als ze al bestaan allemaal in je homedirectory te vinden moeten zijn. .xinitrc is een simpel shellscript dat wordt uitgevoerd wanneer X wordt aangeroepen. Het kan alles wat een ander shellscript kan, maar natuurlijk is het zinvoller het te gebruiken voor het opstarten van diverse X-programma's en het instellen van parameters voor het venstersysteem. De laatste opdracht in .xinitrc bestaat gewoonlijk uit de naam van een uit te voeren window manager, zoals bijvoorbeeld /usr/bin/X11/twm.
Wat zou je willen plaatsen in het bestand .xinitrc? Misschien wat aanroepen naar het programma xsetroot om je rootvenster (de achtergrond) en muiscursor in te stellen op de wijze waarop je wilt dat ze eruit zien. Aanroepen naar xmodmap, die de server vertelt[1] hoe de signalen van je toetsenbord te interpreteren. Eventuele andere programma's die je elke keer dat je X uitvoert opgestart wilt hebben (zoals bijvoorbeeld xclock).
Hier is een deel van mijn .xinitrc; die van jou ziet er ongetwijfeld anders uit, dus dit is slechts bedoeld als een voorbeeld:
#!/bin/sh # Met de eerste regel wordt aan het besturingssysteem opgegeven welke # shell moet worden gebruikt om dit script te interpreteren. Het script # zelf wordt verondersteld te zijn gemarkeerd als uitvoerbaar; # je kunt dit instellen met de opdracht "chmod +x ~/.xinitrc". # xmodmap is een programma waarmee je de X-server duidelijk kunt maken # hoe de signalen van je toetsenbord moeten worden geïnterpreteerd. # Het is *beslist* de moeite waard hier iets over te leren. Je hebt # "man xmodmap", "xmodmap -help", "xmodmap -grammar", en meer. # Ik kan je niet garanderen dat onderstaande expressies op jouw systeem # iets zullen betekenen (ik kan zelfs niet garanderen dat ze op mijn # systeem van betekenis zijn): xmodmap -e 'clear Lock' xmodmap -e 'keycode 176 = Control_R' xmodmap -e 'add control = Control_R' xmodmap -e 'clear Mod2' xmodmap -e 'add Mod1 = Alt_L Alt_R' # xset is een programma voor het instellen van een aantal andere # parameters van de X-server: xset m 3 2 & # parameters voor de muis xset s 600 5 & # voorkeuren van de screensaver xset s noblank & # ditto xset fp+ /home/larry/x/fonts # voor cxterm # Geef de opdracht "xset -help" voor meer informatie. # Vertel de X server fish.cursor bovenop fish.mask te plaatsen en het # resulterende patroon te gebruiken als mijn muiscursor: xsetroot -cursor /home/lab/larry/x/fish.cursor /home/lab/larry/x/fish.mask & # Een plezierig achtergrondpatroon en kleur: xsetroot -bitmap /home/lab/larry/x/pyramid.xbm -bg tan # te doen: xrdb hier? Hoe zit het met het bestand .Xdefaults? # Geef de opdracht "man xsetroot", of "xsetroot -help" voor meer # informatie over bovenstaand gebruikt programma. # Een clientprogramma, de indrukwekkende ronde kleurenklok van # Jim Blandy: /usr/local/bin/circles & # Misschien dat je ten alle tijden een klok op je scherm wilt? /usr/bin/X11/xclock -digital & # Laat client X-programma's uitvoeren op occs.cs.oberlin.edu om ze daar # weer te geven, doe hetzelfde voor juju.mcs.anl.gov: xhost occs.cs.oberlin.edu xhost juju.mcs.anl.gov # Je kunt de X-server simpelweg laten weten clients op anders hosts # uit te laten voeren (een host als remote machine) om het daar # weer te geven, maar dit is een beveiligingslek; die clients zouden # door iemand anders uitgevoerd kunnen worden, en je toetsaanslagen # kunnen onderscheppen als je iets dergelijks als je wachtwoord # invoert! Als je het echter toch wilt, dan zou je een "+" kunnen # gebruiken, wat staat voor alle mogelijke hostnamen, in plaats # van gebruik te maken van specifieke hostnamen, zoals: # xhost + # En start als laatste de window manager: /usr/bin/X11/twm # Sommige mensen geven de voorkeur aan een andere window manager. Ik # gebruik twm, maar fvwm wordt ook vaak met Linux gedistribueerd: # /usr/bin/X11/fvwm |
Een aantal opdrachten wordt in de achtergrond uitgevoerd (d.w.z.: er staat een "&" achter de opdracht), terwijl weer andere niet. Het onderscheid is hier dat een aantal programma's zullen worden opgestart wanneer je X start en blijven draaien totdat je X weer verlaat, deze programma's worden in de achtergrond geplaatst. Andere programma worden slechts eenmaal uitgevoerd. xsetroot is hier een voorbeeld van; het stelt slechts het rootvenster of de cursor of iets dergelijks in en sluit dan weer af.
Zodra de window manager is opgestart, zal het zijn eigen init file inlezen, welke bestuurt hoe zaken zoals je menu's zijn ingesteld, op welke posities vensters naar voren komen, de besturing over ikonen, en andere belangrijke zaken. Maak je gebruik van twm, dan is dit het bestand .twmrc in je homedirectory. Gebruik je fvwm dan is het .fvwmrc, enz. Ik heb alleen maar iets met deze twee bestanden te maken, aangezien dat de window managers zijn die je naar alle waarschijnlijkheid aantreft onder Linux.
Het bestand .twmrc is geen shellscript. Het is in wezen geschreven in een taal die speciaal voor twm is ontworpen, geloof het of niet![2] Het belangrijkste waarmee mensen graag experimenteren in hun .twmrc is de stijl van de vensters (zoals kleuren en dergelijke) en het maken van gave menu's, dus hier een voorbeeld van een .twmrc waarin dat is gedaan:
# Stel kleuren in voor de diverse vensteronderdelen. Dit heeft
# een enorme impact op de "feel" van je omgeving.
Color
{
BorderColor "OrangeRed"
BorderTileForeground "Black"
BorderTileBackground "Black"
TitleForeground "black"
TitleBackground "gold"
MenuForeground "black"
MenuBackground "LightGrey"
MenuTitleForeground "LightGrey"
MenuTitleBackground "LightSlateGrey"
MenuShadowColor "black"
IconForeground "DimGray"
IconBackground "Gold"
IconBorderColor "OrangeRed"
IconManagerForeground "black"
IconManagerBackground "honeydew"
}
# Ik hoop dat je geen monochroom systeem hebt, maar
# mocht dit wel zo zijn...
Monochrome
{
BorderColor "black"
BorderTileForeground "black"
BorderTileBackground "white"
TitleForeground "black"
TitleBackground "white"
}
# Ik maakte beifang.bmp aan met het programma "bitmap".
# Hier geef ik twm op het te gebruiken als het standaard
# highlight patroon op titelbalken van vensters:
Pixmaps
{
TitleHighlight "/home/larry/x/beifang.bmp"
}
# Maak je hier niet druk om, is slechts voor vergevorderden :-)
BorderWidth 2
TitleFont "-adobe-new century schoolbook-bold-r-normal--14-140-75-75-p-87-iso8859-1"
MenuFont "6x13"
IconFont "lucidasans-italic-14"
ResizeFont "fixed"
Zoom 50
RandomPlacement
# Deze programma's krijgen standaard geen venstertitelbalk:
NoTitle
{
"stamp"
"xload"
"xclock"
"xlogo"
"xbiff"
"xeyes"
"oclock"
"xoid"
}
# "AutoRaise" betekent dat een venster naar voren wordt gebracht
# wanneer de muisaanwijzer binnen dit venster komt. Ik vind dit
# hinderlijk, dus heb ik het uitgezet. Zoals je kunt zien, nam
# ik mijn .twmrc over van mensen die autoraise ook maar niks vonden.
AutoRaise
{
"nothing" # Ik houd niet van auto-raise
# Geldt ook voor mij
# en mij
}
# Hier worden de muisknopfuncties gedefineerd. Let op het patroon:
# een muisknop ingedrukt op het rootvenster, zonder ingedrukte
# modifier toets, geeft altijd een menu. Andere lokaties resulteren
# gewoonlijk in een of andere vorm van venstermanipulatie, en modifier
# toetsen worden in combinatie met de muisknoppen gebruikt om bij de
# geavanceerdere venstermanipulaties te komen.
#
# Je hoeft dit patroon niet te volgen in je eigen .twmrc -- het is
# geheel aan jou hoe je je omgeving regelt.
# Button = KEYS : CONTEXT : FUNCTION
# ----------------------------------
Button1 = : root : f.menu "main"
Button1 = : title : f.raise
Button1 = : frame : f.raise
Button1 = : icon : f.iconify
Button1 = m : window : f.iconify
Button2 = : root : f.menu "stuff"
Button2 = : icon : f.move
Button2 = m : window : f.move
Button2 = : title : f.move
Button2 = : frame : f.move
Button2 = s : frame : f.zoom
Button2 = s : window : f.zoom
Button3 = : root : f.menu "x"
Button3 = : title : f.lower
Button3 = : frame : f.lower
Button3 = : icon : f.raiselower
# Je kunt eigen functies schrijven; deze wordt gebruikt in het menu
# "windowops" vrijwel aan het einde van dit bestand:
Function "raise-n-focus"
{
f.raise
f.focus
}
# Ok, hieronder staan de feitelijke menu's waarnaar wordt gerefereerd
# in het deel over de muisknoppen. Veel van deze menu-ingangen roepen
# submenu's aan. Je kunt gebruik maken van zoveel niveaus in het menu
# als je wilt, maar wees je ervan bewust dat recursieve menu's niet
# werken. Ik heb het geprobeerd.
menu "main"
{
"Vanilla" f.title
"Emacs" f.menu "emacs"
"Logins" f.menu "logins"
"Xlock" f.menu "xlock"
"Misc" f.menu "misc"
}
# Hiermee kan ik emacs op verschillende machines aanroepen. Zie het deel
# over .rhosts bestanden voor meer informatie hoe dit werkt:
menu "emacs"
{
"Emacs" f.title
"here" !"/usr/bin/emacs &"
"" f.nop
"phylo" !"rsh phylo \"emacs -d floss:0\" &"
"geta" !"rsh geta \"emacs -d floss:0\" &"
"darwin" !"rsh darwin \"emacs -d floss:0\" &"
"ninja" !"rsh ninja \"emacs -d floss:0\" &"
"indy" !"rsh indy \"emacs -d floss:0\" &"
"oberlin" !"rsh cs.oberlin.edu \"emacs -d floss.life.uiuc.edu:0\" &"
"gnu" !"rsh gate-1.gnu.ai.mit.edu \"emacs -d floss.life.uiuc.edu:0\" &"
}
# Hiermee kan ik xterms op verschillende machines aanroepen. Zie het
# deel over .rhosts bestanden voor meer bestanden over hoe dit werkt:
menu "logins"
{
"Logins" f.title
"here" !"/usr/bin/X11/xterm -ls -T `hostname` -n `hostname` &"
"phylo" !"rsh phylo \"xterm -ls -display floss:0 -T phylo\" &"
"geta" !"rsh geta \"xterm -ls -display floss:0 -T geta\" &"
"darwin" !"rsh darwin \"xterm -ls -display floss:0 -T darwin\" &"
"ninja" !"rsh ninja \"xterm -ls -display floss:0 -T ninja\" &"
"indy" !"rsh indy \"xterm -ls -display floss:0 -T indy\" &"
}
# De schermbeveiliging xlock, aangeroepen met diverse opties
# (waarvan elk zorgt voor een ander aardig plaatje):
menu "xlock"
{
"Hop" !"xlock -mode hop &"
"Qix" !"xlock -mode qix &"
"Flame" !"xlock -mode flame &"
"Worm" !"xlock -mode worm &"
"Swarm" !"xlock -mode swarm &"
"Hop NL" !"xlock -mode hop -nolock &"
"Qix NL" !"xlock -mode qix -nolock &"
"Flame NL" !"xlock -mode flame -nolock &"
"Worm NL" !"xlock -mode worm -nolock &"
"Swarm NL" !"xlock -mode swarm -nolock &"
}
# Diverse programma's die ik zo nu en dan uitvoer:
menu "misc"
{
"Xload" !"/usr/bin/X11/xload &"
"XV" !"/usr/bin/X11/xv &"
"Bitmap" !"/usr/bin/X11/bitmap &"
"Tetris" !"/usr/bin/X11/xtetris &"
"Hextris" !"/usr/bin/X11/xhextris &"
"XRoach" !"/usr/bin/X11/xroach &"
"Analog Clock" !"/usr/bin/X11/xclock -analog &"
"Digital Clock" !"/usr/bin/X11/xclock -digital &"
}
# Dit heb ik gekoppeld aan de middelste muisknop:
menu "stuff"
{
"Chores" f.title
"Sync" !"/bin/sync"
"Who" !"who | xmessage -file - -columns 80 -lines 24 &"
"Xhost +" !"/usr/bin/X11/xhost + &"
"Rootclear" !"/home/larry/bin/rootclear &"
}
# X functies die weleens van nut kunnen zijn:
menu "x"
{
"X Stuff" f.title
"Xhost +" !"xhost + &"
"Refresh" f.refresh
"Source .twmrc" f.twmrc
"(De)Iconify" f.iconify
"Move Window" f.move
"Resize Window" f.resize
"Destroy Window" f.destroy
"Window Ops" f.menu "windowops"
"" f.nop
"Kill twm" f.quit
}
# Submenu van het bovenstaande:
menu "windowops"
{
"Window Ops" f.title
"Show Icon Mgr" f.showiconmgr
"Hide Icon Mgr" f.hideiconmgr
"Refresh" f.refresh
"Refresh Window" f.winrefresh
"twm version" f.version
"Focus on Root" f.unfocus
"Source .twmrc" f.twmrc
"Cut File" f.cutfile
"(De)Iconify" f.iconify
"DeIconify" f.deiconify
"Move Window" f.move
"ForceMove Window" f.forcemove
"Resize Window" f.resize
"Raise Window" f.raise
"Lower Window" f.lower
"Raise or Lower" f.raiselower
"Focus on Window" f.focus
"Raise-n-Focus" f.function "raise-n-focus"
"Destroy Window" f.destroy
"Kill twm" f.quit
}
|
Wauw! Geloof me, dat is zelfs nog niet eens de meest ingewikkelde .twmrc die ik ooit heb gezien. Het is heel goed mogelijk dat er een aantal fraaie voorbeeldbestanden van .twmrc bij je X pakket werden geleverd. Kijk eens in de directory /usr/lib/X11/twm/ of /usr/X11/lib/X11/twm om erachter te komen wat daar staat.
Een fout waar je bij .twmrc voor uit moeten kijken is het vergeten de & achter een menuopdracht te plaatsen. Als je bemerkt dat X bij het uitvoeren van bepaalde opdrachten gewoon vastloopt, dan kan het zijn dat dit de oorzaak is. Ga met Ctrl-Alt-Backspace uit X, bewerk .twmrc, en probeer het nogeens.
| [1] | De "server" betekent gewoon het hoofdproces X op je machine, degene met wie alle andere X-programma's moeten communiceren om gebruik te kunnen maken van het display. Deze andere programma's staan bekend als "clients" en het geheel wordt een "client-server" systeem genoemd. |
| [2] | Dit is één van de hardvochtige feiten over init files: ze hebben gewoonlijk elk hun eigen karakteristieke opdrachttaal. Dit betekent dat gebruikers zeer snel erg goed worden in het leren van opdrachttalen. Ik veronderstel dat het aardig zou zijn geweest als eerdere Unix programmeurs een of ander standaardformaat voor init files overeen waren gekomen, zodat we niet elke keer weer een nieuwe syntax hoefden te leren, maar om eerlijk te zijn, is het moeilijk te voorspellen wat voor soort informatie programma's nodig zullen hebben. |