Visuele beep mini-Howto

Alessandro Rubini, rubini@linux.it,
Vertaald door: Ellen Bokhorst, bokkie@nl.linux.org

v2.3, 3-12-2001


In dit document wordt uitgelegd hoe termcap kan worden gebruikt om een visuele beep op een systeem te configureren en het beschrijft hoe een hoorbare beep op verzoek kan worden gedeactiveerd.

1. Copyright en Licentie

Dit document is auteursrechtelijk beschermd (c) door Alessandro Rubini.

Dit document wordt gedistribueerd onder de voorwaarden van de GNU Free Documentation License. Als het goed is heb je hiervan een kopie ontvangen. Zo niet, dan is het beschikbaar vanaf http://www.fsf.org/licenses/fdl.html.

2. Introductie

De Linux console driver laat de hoorbare beep klinken wanneer een BEL teken wordt uitgevoerd (ASCII-code 7). Alhoewel dit de juiste keuze is voor het standaard functioneren, houden veel gebruikers er niet van als hun computer deze beep laat horen. Deze mini-Howto is bedoeld om uit te leggen hoe aan applicaties te laten weten de BEL-code niet uit te voeren. Hierin wordt ook uitgelegd hoe de kernel en het X Window Systeem te instrueren het beepen te voorkomen wanneer een BEL wordt uitgevoerd. Houd in de gaten dat het meeste van dit document refereert naar de tekstconsole,aangezien het configureren van de X-server een eenvoudige vergaarbak is voor iedere gebruiker die in een grafische omgeving werkt.

Naar mijn mening is de beste manier om een lawaaiige computer het zwijgen op te leggen door er hardwarematig iets aan te veranderen, in mijn eigen computer zit zelfs geen luidspreker.

3. Speakerectomy

Speakerectomy is verreweg de briljantste oplossing voor het probleem met de hoorbare beep. Zoals de naam impliceert, bestaat het uit het verwijderen van de beeps door het verwijderen van de beeper. De bewerking is rechttoe rechtaan en je hebt zelfs geen verdoving nodig, maar als je dat wilt is er plaats voor enig raffinement.

PC's worden gewoonlijk uitgerust met een dwaze switch om de CPU klok te vertragen. Als je in een multitasking omgeving werkt, wordt de switch nooit gebruikt, aangezien je de computer zelfs niet hoeft te vertragen om spellen gebaseerd op software loops te draaien. Helaas kunnen we de switch niet gebruiken om de processor snelheid te verhogen, maar we kunnen het wel gebruiken om de luidspreker te activeren/deactiveren. Soms is de speaker wel handig zelfs al vind je een zwijgzame getallenkraker wel prettig, bijvoorbeeld om het einde van een langdurige compilatie te signaleren. Om de functionaliteit van de switch te veranderen, ontkoppel je het gewoon van het moederbord en verbind je de draden in serie met de luidspreker.

Bezitters van laptop boxen, hebben helaas niet zo eenvoudig toegang tot de luidspreker, noch hebben zij een vrije switch voor gebruik van een andere taak. De voorkeursoplossing voor die gebruikers is het configureren van de software om het beepen te voorkomen, zoals hieronder wordt beschreven.

4. Per console Beep Configuratie

Sinds Linux 1.3.43 voegde Martin Mares de mogelijkheid toe de toon en duur van de beep te configureren door het wijzigen van console.c. Iedere console kan zo worden geconfigureerd dat het voorziet in een andere duur en/of toon van het beepgeluid; de taak wordt bewerkstelligd door het gebruik van escape sequences voor het console device. Je kunt je eigen ~/.profile of ~/.login bestand configureren om een ander beepgeluid (of zonodig zonder enige beep) geassocieerd met een console te selecteren.

De escape sequences werken als volgt:

Om bijvoorbeeld een 50Hz toon voor de duur van één seconde te selecteren, gebruik je "echo -e "\\33[10;50]\\33[11;1000]"" met bash (waar "-e" betekent `ga uit van Escape sequences'. Als je gebruik maakt van tcsh luidt de opdracht hiervoor "echo "\\033[10;50]\\033[11;1000]"".

Alhoewel ik niet bekend ben met een versie van de opdracht setterm die een dergelijke configuratie ondersteunt, zou het goed kunnen dat een toekomstige versie een opdrachtregeloptie ondersteunt voor het configuren van het beepgeluid.

Als je Linux-1.3.43 of nieuwer draait, ben je wellicht tevreden met de escape sequences en hoef je niet verder te lezen. Als je een oudere kernel hebt, of je wilt de visuele beep, dan zal je in je schik zijn met de rest van het document.

5. Basisconcepten van termcap en terminfo

Het bestand /etc/termcap is een tekstbestand waarin de terminal capaciteiten worden opgesomd. Verscheidene applicaties maken gebruik van de termcap informatie om de cursor op het scherm te verplaatsen en het doen van andere op het scherm geöriënteerde taken. tcsh, bash, vi en alle op de curses library gebaseerde applicaties maken gebruik van de termcap database.

De database beschrijft verscheidene typen terminals. De omgevingsvariabele TERM selecteert tijdens de uitvoering het juiste functioneren, door het benoemen van een termcap veld dat door applicaties moet worden gebruikt.

In de database verschijnt iedere capaciteit van de terminal als een uit twee letters bestaande code en een representatie van de feitelijke escape sequence welke wordt gebruikt om het gewenste effect te krijgen. Het scheidingsteken tussen de verschillende capaciteiten is de dubbele punt (":"). Als een voorbeeld, verschijnt de hoorbare beep, met code "bl", gewoonlijk als "tt/bl=^G/". Deze sequence geeft aan dat het beepgeluid wordt verkregen door het afdrukken van het control-G teken, de ASCII bell.

In aanvulling op bl wordt de vb herkend. Het wordt gebruikt als representatie van de "visuele bel". vb ontbreekt gewoonlijk in het linux record van het termcap bestand.

De meeste moderne applicaties en library's maken gebruik van de terminfo database in plaats van termcap. Deze database gebruikt een bestand per type terminal en komt voor in /usr/lib/terminfo; ter voorkoming van zeer grote directory's wordt de beschrijving van ieder type terminal opgeslagen in een directory met de naam gelijk aan de eerste letter van de naam van het type terminal; het linux record is daarom te vinden in de directory /usr/lib/terminfo/l/linux. Om een terminfo record te bouwen ``compileer'' je de termcap beschrijving; refereer naar het programma tic en de manual page hiervan.

6. Definiëren van een visuele beep

Je kunt het veld vb in je eigen termcap bestand plaatsen, als het nog niet voor je is gedefinieerd. Dennis Henriksen (duke@diku.dk) deed de suggestie de volgende regel in het linux record van termcap te plaatsen (merk op dat het record in oude distributies console wordt genoemd):

:vb=\E7\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l\E8:\
De laatste backslash wordt gebruikt op de newline in de database te escapen. Dennis' code doet het volgende (in zijn eigen woorden):

7. Deactiveren van de hoorbare beep op de tekstconsole

Als je de visuele beep op je console wilt forceren dan kun je het "bl" veld in termcap gebruiken en het met dezelfde string definiëren als eerder aangegeven voor "vb". Deze benadering is handig als je iedere applicatie niet aan wilt passen (wat hoe dan ook hierna wordt beschreven). Ik gebruik deze optie op alle computers waar ik Linux op draai en waar ik de speaker niet kan ontkoppelen.

8. Applicaties opgeven beepen te voorkomen

Dit is een onvolledige lijst met applicaties die kunnen worden geïnstrueerd het veld vb te gebruiken voor het huidige type terminal (door gebruik van of de informatie in termcapr of die in terminfo):

9. De donkere kant van het probleem

Het slechte nieuws is dat niet iedere applicatie gebruik maakt van termcap of terminfo. In de meeste kleine programma's wordt gebruik gemaakt van de 'backslash-a' (alarm) tekens in de C-broncode. De "alarm" code wordt een letterlijke ASCII-BEL in de strings zoals opgeslagen in het uitvoerbare bestand. Echte applicaties behoren niet tot deze categorie, maar wees voorzichtig met C-beginnelingen die je hun eigen programma's geven. Studenten in de computerwetenschap zijn het ergste van iedereen, dat verzeker ik je.

De enige manier om van deze programma's zwijgzame applicaties te maken is speakerectomy, of het gebruik van de escape sequences door Martin Mares.