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.

Inhoudsopgave

1 Copyright en Licentie 1 2 Introductie 1 3 Speakerectomy 2 4 Per console Beep Configuratie 2 5 Basisconcepten van termcap en terminfo 3 6 Definiëren van een visuele beep 3 7 Deactiveren van de hoorbare beep op de tekstconsole 3 8 Applicaties opgeven beepen te voorkomen 4 9 De donkere kant van het probleem 4

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:

• ESC-[10;xx] selecteert de beepfrequency in Hertz. De waarde zou moeten liggen in het bereik, 21-32766, anders is het resultaat ongedefinieerd. Als het ‘xx’ argument ontbreekt, is de standaardwaarde (750Hz) van toepassing, zoals in ‘ESC-[10].

• ESC-[11;xx] selecteert de duur van de beep in milliseconden. Als je meer dan 2 seconden opgeeft, geldt de standaardwaarde (125ms). Wederom, als het ‘xx’ argument ontbreekt (ESC-[11]) zal de standaardwaarde worden gebruikt.

Om bijvoorbeeld een 50Hz toon voor de duur van één seconde te selecteren, gebruik je \\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 \\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):

• Bewaar de cursorpositie (gewoon een voorzorgsmaatregel).

• Wijzig de achtergrondkleur verscheidene malen tussen normaal en reverse.

• Herstel de cursorpositie.

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):
• De X server:  gebruik de opdracht "xset b"voor het selecteren van het functioneren
van de beep.  Aan de opdracht kunnen drie numerieke argumenten worden opgegeven:
volume, toon en duur.  "xset -b"deactiveert de beep in alle opzichten.  Het
configureren van de X-server heeft effect op alle applicaties die op het display
worden uitgevoerd.
• xterm:  xterm kan iedere beep converteren naar een visuele beep of hoorbaar signaal.
Als je de hoorbare beep gebruikt, zijn de instellingen van "xset"van toepassing.
De bel in xterm is standaard hoorbaar, maar je kunt de opdrachtregeloptie
"-vb"gebruiken en de "xterm*visualBell:  true"bron om het om te zetten naar een
visuele flits.  Je kunt tijdens de uitvoering schakelen tussen een visueel/hoorbaar
signaal door gebruik te maken van het menu, dat kan worden aangeroepen met de
control-linker-muisknop.  Als je X draait zal je de volgende informatie zeer
waarschijnlijk niet nodig hebben.
• tcsh (6.04 en later):  "set visiblebell".  De instructie kan worden geplaatst
in .cshrc of kan interactief worden aangeroepen.  Gebruik voor het resetten van
de hoorbare beep "unset visiblebell".  Gebruik voor het deactiveren van enige
bekendmaking in plaats daarvan "set nobeep".
• bash (iedere bash, zover als ik weet):  plaats "set bell-style visibleïn ˜ /.bashrc.
Mogelijke belstijlen zijn ook "noneën äudible".
• bash (met readline, als tevens andere op readline gebaseerde applicaties):  plaats
"set prefer-visible-bellïn ˜ /.inputrc.
• nvi en elvis:  plaats "set flashïn ˜ /.exrc of ":set flashïnteractief (merk de
dubbele punt op).  Gebruik noflash in plaats van flash?  om de visuele beep te
deactiveren.
• emacs:  plaats "(setq visible-bell t)ïn ˜ /.emacs.  Het wordt gedeactiveerd door
"(setq visible-bell nil)".
• less:  gebruik "-qöp de opdrachtregel om de visuele beep te gebruiken, gebruik
"-Q"voor het deactiveren van enige bekendmaking.
Standaardopties kunnen worden geplaatst in de omgevingsvariabele "LESS".
• screen:  gebruik de opdracht CtrlA-CtrlG. Het verandert het functioneren van alle
virtuele schermen.  Raadpleeg de man page onder "CUSTOMIZATION"voor het instellen
van de standaardwaarde.

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 älarm"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.