Spraakmaker user interface
Citation for published version (APA):Verstegen, J. F. H., & van Asten, A. C. M. (1992). Spraakmaker user interface. (IPO rapport; Vol. 865). Instituut voor Perceptie Onderzoek (IPO).
Document status and date: Gepubliceerd: 27/08/1992
Document Version:
Uitgevers PDF, ook bekend als Version of Record
Please check the document version of this publication:
• A submitted manuscript is the version of the article upon submission and before peer-review. There can be important differences between the submitted version and the official published version of record. People interested in the research are advised to contact the author for the final version of the publication, or visit the DOI to the publisher's website.
• The final author version and the galley proof are versions of the publication after peer review.
• The final published version features the final layout of the paper including the volume, issue and page numbers.
Link to publication
General rights
Copyright and moral rights for the publications made accessible in the public portal are retained by the authors and/or other copyright owners and it is a condition of accessing publications that users recognise and abide by the legal requirements associated with these rights. • Users may download and print one copy of any publication from the public portal for the purpose of private study or research. • You may not further distribute the material or use it for any profit-making activity or commercial gain
• You may freely distribute the URL identifying the publication in the public portal.
If the publication is distributed under the terms of Article 25fa of the Dutch Copyright Act, indicated by the “Taverne” license above, please follow below link for the End User Agreement:
www.tue.nl/taverne Take down policy
If you believe that this document breaches copyright please contact us at: openaccess@tue.nl
Instituut voor Perceptie Onderzoek
Postbus 513, 5600 MB Eindhoven
Rapport no. 865
Spraakmaker user interface
J.F.H.
Verstegen
en A.C.M. van Asten
Spraakmaker
User
Interface
verslag van het afstudeerwerk
1n samenwerking met Mw A. van Asten verricht op het
Instituut voor Perceptie Onderzoek
te
Eindhoven
1n het kader van
de deeltijdopleiding Hogere Informatica aan de
HOGESCHOOL EINDHOVEN
Bedrijfsmentor: Dr. Ir. H.C. van Leeuwen Studiementor: Ir. A.A.J.M. van den Hocven
J .F.H. Verstegen, Maasbree, juli 1991
Spraakmaker User Interface
Inhoud
Hoofdstuk 1: Inleiding . . . 1 1.1: Spraakonde:rzoek . . . 1 1.2: Uitgangssituatie . . . 2 1.2.1: Hardware . . . 2 1.2.2: Software . . . 21.2.2.1: Het prindpe va Spraakmaker ... 3
1.2.2.2: De Giid . . . 4 1.3: Onze taken . . . . . . 5 1.3.1: Tonen en manipuleren . . . 5 1.3.2: Plaatsin.gsalgolitme . . . 6 1.3.3: Giid-ed.itor . . . 6 1.3.4: Interface-besturing . . . 6 1.3.5: Koppeling . . . 7 1.4: Implementatie mogelijkheden . . . . . . 7 1.4.1: Systeemprogrammatuur ... 7 1.4.2: X-Wmdows . . . . . . . . . 7 1.5: Het verslag . . . . . . . 10 Hoofdstuk 2: De Grid-editor . . . 11 2.1: Theoretisch ontwerp . . . . . . . . 11 2.1.1: Gewenste mogelijkheden . . . . . . 11 2.1.2: Het gebru.ik . . . . . . . . 11 2. 1.2.1: Selecteren . . . . . 12 2.1.2.2: Tekstinvoer . . . . . . 13 2.1.2.3: Correcties . . . . . . . . . . . . . . . . . . . . . . 13 2.1.3: mogelijke oplossing . . . . . . . . . . . . 13 2.2: Ontwerpen Window . . . . . . 15
2.3: Tonen van de Grid . . . . . . 16
2.4: Evaluatie van events . . . 18
2.5: Reactie op de events . . . 19
2.5.1: Indrukken van muisknop . . . 20
2.5.1.1: Bepaal gewenste actie . . . 20
2.5.1.2: Herstel van de oude toestand ... 21
2.5.1.3: .A1maken eerder geselecteerde actie ... 21
2.5.2: Bewegen van de muis . . . 22
2.5.2.1: Wijziging van datum of token ... 22
2.5.2.2: (Ont)koppelen van syncmarker ... 23
Spraakmaker User Intertace Inhoud
2.5.3.1: Wijziging van datum of teken ... . 24
2.5.3.2: Invoeging van een teken ... . 25
2.5.3.3: (Ont)koppelen van syncmarkers ... . 25
2.5.4: Invoer vanaf toetsenbord 26 2.5.5: OVerige gebruikteevents ... . 28
2.5.5.1: Binnenkomen in window ... . 28
2.5.5.2: Verlaten window ... . 28
2.5.5.3: Verandering in zichtbaarheid van het window ... . 28
2.5.5.4: ConfigweNotify ... . 28
2.6: Verwerking van wijzigingen ... . 29
2.6.1: Wijziging van datum of token(s) ... . 29
2.6.2: Wijziging van syncmarkers ... . 30
Hoofdstuk 3: Koppeling ... . 31
3.1: User Interface modules onderling ... . 31
3.1.1: Dataoverdracht ... . 31
3.1.2: Coördinatie van events ... . 31
3.1. 3: Communicatie probleem ... . 33
3.2: Interface aan PROLOG ... . 34
3.2.1: Dataoverdracht ... . 34 3.2.2: Communicatie mechanisme ... . 35 Hoofdstuk 4: Conclusies . . . .. 36 4.1: Samenwerking ... . 36 4.2: Ervaringen ... . 36 4.3: Aanbevelingen ... . 38 Bijlagen 41 A: De opdracht 41 B: Het IPO ... . 42
C: Het X-Window pakket ... . 43
D: De events ... . 44
E: Termen ... . 46
Spraakmaker User Inter.face Inleicüng: spraakonderzoek
Hoofdstuk 1: Inleiding
1.1 SpraakonderzoekOnlangs •communiceerde• een oudere dame met een automatische telefoonbeantwoorder: "Kunt u (de beantwoorder) hem (de eigenaar) even zeggen, dat hij mij terug moet bellen•. Deze kennelijke :m1svatt:ing over de huidige mogelijkheden vcm zo'n apparaat is minder komisch dcm het lijkt. Als eenmaal gekozen is voor automaten van velerlei soort, dan is het de taak van de ontwerpers er voor te zorgen, dat de automaten zonder voorkennis gebruikt kunnen worden, dat zij zich dus gedragen zoals een leek op het gebied van de interne werking van zulke automaten mag verwachten.
De verwezenlijking van een dergelijke taak schept vele problemen. Voordat een automaat een persoon als communicatiepartner kan vervangen, moet onder andere een analyse plaatsvinden van de ontvangen spraak en een ter zake tekst weer in spraak omgezet worden.
Ten einde de kennis van spraak, en in het bijzonder het omzetten van geschreven tekst in spraak, een flinke stap voorwaarts te brengen, werd ruim 5 jaar geleden, geïnitieerd door SPIN (Stimulenngs Programma JNformaticaonderzoek), een landelijk gecoörcüneerd
onderzoekprogramma ASSP (Analyse en Synthese van SPraak) gestart. In dit programma werkten een zestal, meestal aan universiteiten verbonden, onderzoekinstituten samen. Elk instituut nam een deel van het noodzakelijke onderzoek voor zijn rekening. Als resultaat van deze onderzoeken zijn op de divezse instituten afgeronde gedeelten van
computerpro-gramma's (modules) gerealiseerd, die tezamen een systeem opleveren, Spraakmaker geheten, dat geschreven tekst omzet in verstaanbare spraak.
Een vcm de projecten in het ASSP programma is het samenvoegen van de diverse ontwikkelde modules tot een geheel, dat dan onder meer alS gereedschap voor verder onderzoek op het gebied van omzetting van tekst naar spraak dienst kan doen.
Het samenvoegen van de modules vindt plaats op het IPO (zie bijlage B voor een nadere beschrijving).
De reeds aanwezige hard- en software bood vele, tot dcm toe nog niet gebruJk:te,
mogelijkheden. Derhalve is besloten de samengevoegde modules tevens te voorzien van een grafisch, met de muis te besturen, gebruikezsinter.face. Het uiteindelijke
Spraakmaker User Inter.tace Inleiding: spraakondeiZoek
Samen met collega A. van Asten heb ik gewerkt aan het vormgeven van dit inter.tace.
1.2 Uitgangssituatie
1.2.1 Hardware
Als hardware is bij de aanvang van het ASSP project op alle instituten gekozen voor gebruik van V AX-machines van DEC (Digital Equipment Corporation). draaiend onder het VMS besturingssysteem.
Aangezien er tijdens het project veel ontwikkelde software tussen de diverse instituten zou worden uitgewisseld, was zo maximale zekerheid verkregen dat de op deze instituten ontwikkelde programmatuur op elkaar zou aansluiten.
1.2.2 Software
De mogelijkheid van VMS om in verschillende talen geschreven modules aan elkaar te koppelen. liet de instituten een zekere vrijheid in de keuze van de door hen gebruikte programmeertalen.
Zo zijn modules geschreven in de taal PASCAL. in FORTRAN en in PROLOG.
Voor het hier besproken werk is enkel van belang. dat het programma. dat al deze modules samenvoegt tot het Spraakmaker systeem, geschreven is in de taal PROLOG (Quintus
PROLOG versie 2.4 van Westmount).
Het bij de aanvang van ons werk aanwezige Spraakmaker raamwerk bood de mogelijkheid om tekst in te voeren, het resultaat van de analyse van de diverse modules op een tekst scherm te tonen en correcties in de resultaten van die analyses aan te brengen. De communicatie tussen gebruiker en programma geschiedde volledig door middel van commando's, die na vertoon van een prompt op regelniveau ingevoerd kunnen worden.
De mogelijkheden om bijvoorbeeld de muis te gebruiken, standaard (alS :fl.nnware) beschikbaar op de aanwezige VAXstation 3100, werden in het geheel niet gebruikt.
1.2.2.1 Het principe van Spraakmaker
Systemen om tekst naar spraak om te zetten gebruiken meestal meerdere, achtereenvolgens aangeroepen, modules om elk op hun niveau de aangeboden tekst te analyseren. Zo is er
Spraakmaker User Interface Inleiding: uitgangssituatie
meestal een module die de tekst in zinnen opdeelt, een module die zinnen tot woorden terugbrengt, woorden tot lettergrepen, lettergrepen tot letters, letters tot klankpatronen enzovoort. Iedere doorlopen module verandert de oorspronkelijk ingevoerde tekst in meer of mindere mate.
Tekst naar spraak systemen kennen doorgaans een lineaire voorstelling van de
geanalyseerde gegevens: de uitvoer van de achtereenvolgens aangeroepen modules is een gewijzigde kopie vcm de ontvcmgen gegevens, zodat uiteindelijk de oorspronkelijke invoer slechts moeilijk herkenbaar is.
Spraakmaker daarentegen maakt gebruik van een gesynchroniseerde data structum, die alle niveaus van analyse tot dat moment bevat. Elke module voegt zijn analyse van de ontvangen gegevens toe aan de structum en laat de resultaten van de voorafgaande analyses onverlet. Zodoende is op elk moment de volledige analyse vanaf de oorspron-kelijke invoer tot dat moment beschikbaar. Bovendien heeft iedere module desgewenst de mogelijkheid om terug te grijpen op alle uitkomsten vcm analyses, die voorheen hebben plaats gehad en deze zonodig alsnog te wijzigen. Deze opzet maakt het noodzakelijk, dat er een synchronisatie plaatsvindt tussen de verschillende analyses vcm de invoer. [vcm
Leeuwen & te Lindert, 1990]
De synchronisatie wordt grafisch weergegeven door verticale lijnen, syncmarks geheten. De analyses van de diverse modules worden onder elkaar weergegeven, zodat grafisch een twee-dimensionaal raster ontstaat. De totale structum heet dan ook GRID.
Spraakmaker User Interface Inleiding: uitgangssituatie
1.2.2.2
De
GRIDEen grid bestaat uit een eindig aantal streams, cüe elk een niveau van analyse van de tekst aangeven. Streams worden onder elkaar getoond en kunnen op hun beurt weer nader uitgewerkt zijn in substreams, die elk een apart facet van de analyse van die strearn weergeven.
Een stream bestaat uit een horizontale opeenvolging van tolcens, die een eenheid uit de onderzochte tekst aangeven. Tekens zijn te beschouwen als records met juist evenveel velden als er substreams in de stream aanwezig zijn. Deze velden, datum geheten, bevatten het kleinste informatie eenheid die in die strearn mogelijk is. Een teken moet in elke
substream over een (al dan niet gevuld) datum beschikken.
De scheiding tussen twee opeenvolgende tekens wordt gevormd door de als verticale lijnen weergegeven syncmarks. Deze bestaan intern als integers; syncmarks die in meerdere streams voorkomen, en daar dus dezelfde integerwaarde hebben, dienen bij de
representatie in elk van die streams dezelfde horizontale positie in te nemen (opgelijnd te zijn). Een voorbeeld: De interne structuur: word-type-l-lex-2
I
~class-l-noun-2 Laccent-l-+-2 graph-gra-l-k-3-a-4-a-S-s-2I
phon-pho-l-k-3-a-S-s-2wordt voor de gebruiker weergegeven als: word:type class accent graph:gra phon:pho lex noun + klala s k a s l 3 4 5 2 .A1b 1 Voorbeeld van de opbouw van een grid; hJerin zijn:
- word, graph en phon streams in de grid;
- type, class en accent substreams binnen de stream word; - gra en pho de enige substream van graph respectievelijk phon; - lex, noun en + samen 1 teken van de stream word;
- lex, noun en + elk een datum van de betreffende substream;
- k, a en s elk zowel datum als teken van de bijbehorende (sub)stream en
Spraakmaker User Intenace Inleiding: onze taken
1.3 Taakomschrijving
Het vervangen van de commandobesturing van Spraakmaker door een intenace, dat met de muis bestuurd kan worden, is een complexe taak. Het werk is dan ook uitgevoerd door twee personen, mijn collega en ik, elk verantwoordelijk voor afgescheiden onderdelen in de implementatie. Voor goed begrip zal ik, uitgaande van de eisen die aan het intenace gesteld worden, hierna de (deel)taken in het project kort noemen. Tevens wordt een korte motivatie gegeven van de taakscheiding in ons beider werk.
1.3.1 Tonen en manipuleren
Het is de bedoeling van het intenace dat
- de grid op het (grafische) scherm getoond kan worden; - streams in willekeurige volgorde getoond kunnen worden,
- een gedeelte van de grid getoond kan worden met weglating van het overige - een enkel datum gewijzigd kan worden
- een of meerdere tekens gewijzigd of verwijderd kan c.q. kunnen worden - een teken toegevoegd kan worden
- opgelijnde syncmarks (dus met hetzelfde volgnwnmer in de diverse streams) ontkoppeld kunnen worden, dus een verschillend volgnummer krijgen
- syncmarks met verschillend volgnwnmer gekoppeld (opgelijnd) kunnen worden en hetzelfde volgnwnmer krijgen
In het bestaande programma zijn hiervoor regelcommando's beschikbaar; in het te
ontwerpen programma dient het mogelijk te zijn deze commando's aan te geven door het op de juiste plaats aank.l.ikken van de muis.
Verder moeten diverse parameters, zoals bijvoorbeeld: - de soort invoer van tekst (vanaf toetsenbord of uit file),
- de selectie op welk moment van analyse de grid getoond moet worden, - het al dan niet tonen van de syncmarknummers
met behulp van de muis ingesteld kunnen worden.
Tijdens de werkzaamheden is het wenselijk gebleken dat:
- de vele lettertypes, die het VMS systeem beschikbaar heeft, op een makkelijke manier gekozen en gebruikt kunnen worden en
Spraakmaker User Interface Inleiding: onze taken
- de gedeelten van de grid waar wijzigingen plaatsvinden zo voordelig mogelijk op het scherm getoond worden, dus dat het scherm zo scrollt dat de relevante in1ormatie automatisch zichtbaar is.
Uit deze vereisten komen de volgende deeltaken voort:
1. 3.2 ·Plaatsingsalgoritme
Ten einde de syncmarks met hetzelfde volgnummer onder elkaar in de grid te kunnen plaatsen dient er een algoritme te bestaan, dat de posities van die syncmarks bepaalt. Bij de aanvang van ons werk waren daartoe twee, enigszins van elkaar afwijkende, in Prolog geschreven, algoritmen beschikbaar. Beiden gaven echter in sommige gevallen moeilijk interpreteerbare uitvoer en waren bovendien traag. Er dient dus een nieuw
(eventueel verbeterd) en in een snellere taal geïmplementeerd algoiitme te komen, dat aan deze bezwaren tegemoet komt.
De realisering van dit algoiitme is de taak van mijn collega.
1.3.3 Grid-editor
Tot nu toe werd de giid getoond in een normaal tekstscherm met behulp van
ASCII-karakters. Op deze manier is de grid niet toegankelijk voor besturing met de muis. Er is dus een representatie op het scherm noodzakelijk, die interactie met de muis wel mogelijk maakt.
Het onderzoek naar de mogelijkheden daartoe en de realisatie van de implementatie hiervan is mijn taak.
1.3.4 Interface-besturing
Naast de functies, die in de grid-editor gerealiseerd moeten worden, dienen in het project nog vele andere functies beschikbaar te komen (bijvoorbeeld om de vele mogelijke instellingen te kunnen kiezen en wijzigen). Het is zaak ook deze functies toegankelijk te maken voor muisbestwing. Gebeurt dit niet, dan wordt de gebruikSvriendelijkheid van het interface als geheel meer geschaad, dan indien helemaal van muisbesturing afgezien wordt.
Om redenen, die bij de bespreking van de gekozen implementatie duidelijk zullen worden
Spraakmaker User Interface Inleiding: onze taken
1.3.5 Koppeling
De eenmaal gerealiseerde modules zullen uiteraard tot een werkend geheel gekoppeld moeten worden, zowel de door ons beiden vezvaardigde modules aan elkaar als deze (gekoppelde) modules als geheel aan het bestaande Spraakmaker systeem.
Zoals zal blijken (hoofdstuk 3) geven deze koppelingen meer problemen dan redelijkerwijze verwacht mocht worden.
De eerste koppeling 1s grotendeels mijn taak, de tweede de taak van mijn collega, met dien verstande, dat er noodzakelijkerwijs een gezamenlijke inbreng bij beide zal moeten zijn, aangezien de koppelingen gevolgen in ons beider modules hebben.
Spraakmaker User Interface Inleiding: implementatie mogelijkheden
1.4 Implementatie mogelijkheden
1.4.1 Systeemprogrammatuur
De bij de aanvang van het ASSP project gemaakte keuze voor het V AXfVMS
bestu-ringssysteem en de aanwezigheid van VAX 3100 werkstations geeft bijna noodzakelijkerwijs de richting aan waarin de implementatie gezocht moet worden. De op de V AX 3100 als filmware meegeleverde applicaties zijn grotendeels met de muis bestuurbaar. Aangezien dit
een eis is van de door ons te ontwikkelen applicatie, ligt het voor de hand de bestaande
toepassingen als voorbeeld voor de onze te beschouwen. Bovendien garandeert deze aanpak bijna een 'lll"Uformiteit van de reeds bestaande toepassingen en de door ons te ontwikkelen, hetgeen voor de toekomstige gebruiker zeer welkom zal zijn.
De bestaande toepassingen, waarvan sommige in broncode als voorbeeld beschikbaar zijn, zijn geschreven in de taal
c
met behulp van een pakket extra functies, genaamdX-Windows, dat de mogelijkheden van het werkstation uitbuit en deze mogelijkheden voor de programmeur toegankelijk maakt.
1.4.2 X-Windows
Het X-Window pakket, aanvankelijk door het MIT (Massachusetts Instutute of Technology) in samenwerking met DEC ontwikkeld, wordt thans onder beheer van een consortium van vele hard- en software leveranciers als "public domain pakkef verspreid (zie ook bijlage C). Het is beschikbaar voor de meeste UNIX systemen alsmede V AXfVMS en maakt de
complexe besturingssystemen van vele werkstations makkelijk toegankelijk voor de gebruiker.
De architectuur van het X-Window systeem is gebaseerd op een elient-server model. Een proces, de server, controleert alle in- en uitvoer, onderhoudt de 'Windows, de tekst en de grafische voorstellingen op het scherm, en handelt alle invoer van toetsenbord en muis af. Een toepassing, die gebruik: maakt van de X server, heet een client.
Toepassingen worden op het scherm zichtbaar gemaakt binnen 'Windows, rechthoekige gedeelten van het scherm, voorzien van een achtergrondkleur en een rand, en vele mogelijkheden tot individuele aanpassing door middel van bijvoorbeeld nieuwe windows (children), die op het oorspronkelijke window (parent) liggen of van daaruit opgeroepen worden.
De elient maakt gebruik: van resources die de server beschikbaar houdt, zoals standaard windows, lettertypes, kleuren en datastructuren. De elient kan requests aan de server
Spraakmaker User Intartace Inleiding: implementatie mogelijkheden
zenden om bijvoorbeeld een window te openen, te wijzigen, te verwijderen of om de status van een window te vernemen. De comm1.lllicatie tussen server en elient geschiedt door middel van events, een soort intenupts als gevolg van een actie van de gebruiker
(toetsaanslag, mu.tsbeweging) of om de elient van een wijziging op de hoogte te brengen (bijvoorbeeld als het window (gedeeltelijk) bedekt wordt door een ander window of weer zichtbaar gemaakt moet worden).
Voor het realiseren van toepassingen is een bibliotheek beschikbaar, genaamd XLib, een uitgebreide set functies, die volledige toegang tot en controle over het gebruik van windows mogelijk maakt. Zo'n bibliotheek bestaat voor onder andere de talen LISP, .ADA, C en
VAXPASCAL.
Hoewel de Xlib bibliotheek al veel progrommeerwerk op systeemniveau overneemt van de programmeur, blijft het werken met alleen deze bibliotheek een complexe zaak op een Vlij
laag niveau. Er zijn dan ook diverse tooikits ontstaan, die deze complexe aanroepen van
XI.ib functies reduceren tot een of enkele nieuwe aanroepen uit de toolkit.
Als standaard tooikit geldt, en is ook op V AXjVMS aanwezig, de X Toolldt, bestaande uit de Xt Intrinsles laag, een stelsel van functies, die met behulp van Xlib functies op een hoog niveau en uitgaande van standaard waarden, veel details in de implementatie van de programmeur overnemen. Vanuit deze Xt Intrinsics zijn diverse Widget Sets ontwikkeld, die een aantal gebruiksklare componenten als scroll bars, menu's, buttons (knoppen) enzovoorts bevatten. De diverse
sets
zijn in wezen hetzelfde, doch vertonen op het scherm enigeuiterlijke verschillen. V AX/VMS gebruikt de X Widget set en noemt het gehele pakket DECWindow:s. Ten behoeve van de uniformiteit met de reeds op de V AX 3100 bestaande applicaties is het zaak deze set ook in onze applicatie te gebruiken.
Spraakmaker User Interface Inleiding: implementatie mogelijkheden
I
Widgetset
Xt Intrinsics
Xlib C Interface
Netwerkv
erbinding
I
X Server
1
AJb 2 OveiZicht
vcm
de opbouwvcm
het X "Window pakketHet gemak van het gebruik van een tooikit gaat ten koste van de flexibiliteit, zodat waar veel gemanipuleerd wordt met data in een window, de standaard XlJb de voorkeur verdient, terwijl waar veel met standaard attributen wordt gewerkt, een tooikit goed van pas komt.
Daarom is de grid-editor ontwlkkeld met behulp van uitsluitend XIJb. Het hele Tooikit pakket, waarvan, gezien de te verwachten opbouw van de editor toch slechts zeer weinig gebruikt zal kunnen worden, hoeft dan niet steeds meegesleurd te worden. Bij de interface besturing echter komen de Tooikit en de Widget set, gezien de vele menu's, knopjes, extra 'Windows enzovoorts, bijzonder goed van
pas.
Aangezien enerzijds het programmeren met behulp van de Tooikit een heel ander karakter heeft, dan het programmeren met alleen het XlJb pakket en anderzijds de opgedragen taken efficiênt verdeeld moesten worden, is besloten dat mijn collega de interface besturing zou realiseren.
In het vervolg van het verslag zijn functies, waarvan de naam begint met alleen een X afkomstig uit Xlib, terwijl functies, die beginnen met Xt behoren tot de Toolkit.
Spraakmaker User Intenace Inleiding: het verslag
1.5 Het verslag
Na de uitgebreide inleiding over hetgeen bij de aanvang van ons werk reeds aanwezig was, zal het vervolg van dit verslag, behoudens een afsluitend hoofdstuk, uitsluitend handelen over het ontwikkelen van de grid-editor en de malisering van de koppeling. De overige hiervoor reeds aangeduide werkzaamheden zijn verricht door mijn collega. Hiermee is een taakverdeling geschapen, waarbij mijn collega enerzijds in uitsluitend C
programmeert (plaatsingsalgoritme) en anderzijds met behulp van de Toolkit en Widget set de interface besturing ontwikkelt, terwijl ik in C met behulp van het XIJb pakket de editor zal implementeren.
Om een totaal beeld van ons werk te verkrijgen, verwijs ik dan ook uitdrukkelijk naar het verslag, dat mijn collega over de verrichte werkzaamheden heeft vervaardigd.[van Asten. 1991]
Het voert in dit verslag te ver uitgebreid in te gaan op de ongeveer 50 deels omvangrijke functies. die ten behoeve van de grid-editor en de koppeling geschreven zijn. Er zal voornamelijk aandacht besteed worden aan een beschrijving van het systeem van de events en aan de problemen, die de koppelingen tussen de diverse onderdelen met zich meebrengen.
Spraakmaker User Inte:dace De Griel-editor: theoretisch ontwerp
Hoofdstuk 2: De Grid-editor
2.1 Theoretisch ontwerp
2.1.1 Gewenste mogelijkheden
De grid-editor dient zo vormgegeven te worden, dat met uitsluitend het bewegen van de muis en het incirukken van de muisknop de verschillende mogelijkheden om wijzigingen aan te brengen geselecteerd kunnen worden.
Deze mogelijkheden zijn: - het wijzigen van 1 datum;
- het wijzigen van een of meer tokens;
- het invoegen of verwijderen van een token; - het ontkoppelen van opgelijnde syncmarks; - het koppelen van niet opgelijnde syncmarks.
De mogelijkheid om de grid in een tekstscherm te tonen en dus het intenace niet te gebruiken moet aanwezig blijven; zo kan het programma ook draaien op terminals met minder grafische mogelijkheden dan de V.AX. 3100 heeft.
Zowel in de grafische voorstelling op de V AX 3100 als in een tekstscherm dienen:
- de strearns, eventueel bestaande uit substrearns, boven elkaar weergegeven te worden, - de tekens van de betreffende stream van links naar rechts afgedrukt te worden; de tokens
dienen onderling gescheiden te zijn door lijnen, de syncmarks,
- onder de grid en juist onder de syncmarks de volgnummers van die syncmarks aangegeven te kunnen worden.
2.1.2 Het gebruik
In het verslag van mijn collega, dat onder meer de intenace besturing beschiijft, zal
aangegeven zijn, dat diverse instellingen gekozen kunnen worden, waaronder het
oproepen van de editor. Na een desbetreffend signaal dient de editor de grid op het scherm te brengen; daarna kunnen wijzigingen worden aangebracht.
Hiema volgt een beschrijving van de wijze waarop de editor gebruikt zou kunnen worden om wijzigingen aan te brengen.
Spraakmaker User Intelface De Grid-editor: theoretisch ontwerp
Door het indrukken van een muisknop (MB1)1 in de grid wordt het gewenste datum o1
teken geselecteerd:
- (ruim) in het midden van het datum is het een wijziging van dat datum (of token(s) - zie
ö•
hiema -); er verschijnt een rechthoek rond het datum;- minder dan een kwart van de totale breedte van het teken van een syncmark verwijderd is het een invoeging van een teken; een extra syncmark verschijnt;
- ma:ximaal enkele punten (pixelS) van de syncmark is het een (ont)koppeling van (een) syncmark(s); de syncmark wordt dikker en de muispunt wordt een open schaartje.
Behalve bij de keuze voor invoeging kan door het bewegen van de muis bij ingedrukte MBl de keuze nog nader bepaald worden:
- Bij selectie van een datum heeft bewegen van de muis het gevolg dat (alleen in de stream wacnin het datum staat) een of meerdere tekens als een geheel blok gekozen kunnen worden. Tijdens het bewegen van de muis geeft een rechthoek het op dat moment geselecteerde blok aan.
- Bij selectie op een syncmark verschijnt er bij het bewegen van de muis een 'elastiekje', dat de bewegingen van de muis volgt. De syncmark, die het dichtst bij de muispunt staat wordt, als hij voor koppeling in aanmerking zou kunnen komen gezien de opbouw van de grid, evenals de eerst aangeklikte, dik weergegeven.
zo
is steeds zichtbaar welke twee syncmarks bij loslaten van de muisknop gekoppeld zouden worden.Het loslaten van :M:Bl heeft bij selectie van een datum, van een of meerdere tekens en bij de invoeging van een teken tot gevolg, dat via het toetsenbord tekst ingevoerd kan worden.
Is een syncmark geselecteerd, dan betekent het loslaten van MBl, dat zo mogelijk twee aangewezen syncmarks gekoppeld worden. Is koppeling niet mogelijk, dan verdwijnt de hele selectie. Is (ondanks de mogelijkheid van muisbeweging) maar 1 syncmark
geselecteerd, dan heeft het loslaten van MBl voorlopig geen effect; er kunnen, door herhaald indrukken en loslaten van MBl op dezelfde syncmark in verschillende streams, meerdere streams geselecteerd worden, die ontkoppeld moeten worden van die syncmark in de niet geselecteerde streams. De feitelijke ontkoppeling geschiedt door het indrukken en weer loslaten van MB3.
1
Het X-W1ndow systeem ondersteunt het gebruik van maximaal 5 verschillende muisknoppen. De VAX 3100 kent er 3, zodat alleen de knoppen 1 tjm 3 <MB1, Ml32, MB3) gebruikt worden. Het VAX Operaling System maakt een keuze tussen rechts- en linkshandig gebru1k van de muis mogelijk. Bij rechtshandig gebruik ls Ml31 de linker muisknop, :MB2 de middelste en MB3 de rechter. Bij linkshandig gebru1k ls de aanduiding predes andersom (MB1 rechts, MB3links).
Spraakmaker User Interface De Grid-editor: theoretisch ontwerp
2.1.2.2 Tekstinvoer
Na het loslaten van lv1B 1 ontstaat er midden in het geselecteerde datum of in het bovenste datum van de gekozen token(s) een rechthoekje met daarin een liggend streepje als 'cursor'. Vanaf nu is invoer van tekst vanaf het toetsenbord mogelijk. Met behulp
van
[BACKSPACE] kunnen fouten in de ingevoerde tekst verwijderd worden, [RE'I'URN] sluit de invoer af. Is een enkel datum geselecteerd, dan is de wijziging hiermee voltooid. Bij selectievan
een of meerdere tekens echter, moeten vervolgens alle datums van dat (nieuwe) teken (eventueel als lege string) ingevoerd en met [RE'I'IJRN] afgesloten worden. Pas nadat in het laatste datum van het taken [RE'I'IJRN] iS gegeven, is de wijziging of de nieuwe invoer voltooid.2.1.2.3 Correcties
Indien in een datum geselecteerd wordt, dat geen of slechts een karakter bevat, kan het moeilijk zijn de juiste selectie (wijziging, invoeging of (ont)koppeling) kenbaar te maken. Daarom wordt in zo'n geval door middel van een windowtje met een aanwijzing in de grtd aangegeven wat geselecteerd is. Zo kan (overtgens ook indien dit windowtje niet verschijnt) een gemaakte selectie nog ongedaan gemaakt worden door MB2 in te drukken, ongeacht of MB 1 al iS losgelaten of niet.
Een ongedaan maken van een eerdere selectie na het loslaten van de muisknop vindt ook plaats als die selectie nog niet voltooid is (door middel
van
een afsluitende [RE'I'Ul<NJ) en opnieuw MB 1 wordt ingedrukt.2.1.3 Mogelijke oplossing
Met behulp van de in plaatsingsalgorttme
van
mijn collegae opgebouwde gegevens is het mogelijk elk datum en teken op de juiste plaats in het window te tonen.Tevens iS het enerzijds met behulp van de gegevens uit dat algorttme en anderzijds uit de muispositie mogelijk te achterhalen in welk datum of teken de muiS zich bevindt. Door nu na te gaan hoe groot de afstand is van de muispositie tot de rand
van
het aangewezen teken, kan onderscheid gemaakt worden in de door de gebruiker verlangde aCtie. Zo kunnen alle vereiste aCties aangegeven worden door middel van het indrukken van enkel MB1. De actie wordt enkel bepaald door de plaats van de muispunt bij indrukken.De data, die in de grtd getoond worden, worden uitgelezen uit een in andere mOdules opgebouwde en hier beschikbare database. Wijzigingen zullen zowel in de grtd in het window als in de database doorgevoerd moeten worden. Tevens moet een geSChikte
Spraakmaker User Interface De Grid-editor: theoretisch ontwerp
manier gevonden worden om wijzigingen door te geven aan het (PROLOG)programma, dat deze wijzigingen moet verwerken.
Het X-Window pakket maakt het mogelijk geb:n.tik te maken van vele, in grootte en
leesbaarheid vaiiêrende, lettertypes (fonts). Het zou jammer zijn deze mogelijkheden niet uit te buiten. Afhankelijk van het doel van het geb:n.tik (bijvoorbeeld demonstratie o1
ondezzoek) kan dan een geschikt tont gekozen worden. Bij de opzet van het programma zal hiermee rekening gehouden moeten worden.
Mb 3 Onderlinge samenhang tussen de onderdelen van het Spraakmaker pakket. 2.2 Ontwerpen window
De grtd-editor vindt zijn plaats in een window, dat op het scherm geopend moet worden. Voordat een window geopend kan worden, moeten eerst tal van voorbereidende
werkzaamheden uitgevoerd worden en kenmerken (attiibuten) voor dat window worden vastgelegd. Indien uitsluitend geb:n.tik gemaakt wordt van Xlib-:functies betekent dit de aanroep van vele :functies. Zo dient onder meer een verbinding tussen de nieuwe elient en de server tot stand te worden gebracht, dient het aanwezige screen (de achtergrond) bepaald te worden, het window gemaakt en op het scherm gebracht te worden (dit zijn twee verschillende acties).
In onze appliCatie echter is het window, waar de grid-editor zijn plaats vindt, een onderdeel van het totale ontwerp van het interface. Vele voorbereidingen en attrlbuten van het
Spraakmaker User Intenace De Grid-editor: ontwerpen window
window zijn dan ook al - met l::>ehulp van de Toolkit - uitgevoerd respectievelijk vastgelegd. Het verslag van mijn collega zal hierover l::>erichten. Slechts enkele attri.buten moeten bij het ontwerp
apart
aangegeven worden omdat die afwijken van de standaard waarden, zoals de Toolkit die kent. Zo dient aangegeven te worden welke van de mogelijke events door het window herkend moeten worden:I" geef events aan, die ten behoeve van het window doorgegeven moeten worden • I win_attr.event_mask • ButtonPressMask I I" indrukken van willekeurige muisknop • I
ButtonReleaseMask I I" loslaten van willekeurtge muisknop • I
ExposureMask I I" wijziging in zichtbaarheid van window • I
KeyPressMask I I" indrukken van toets op toetsenbord • I
LeaveWindowMask I I" verlaten van window door mulspunt • I ButtonlMotionMask I I" beweging van MBl "I
EnterWindowMask;l" binnenkomen in window van mulspunt • I
I" maak deze afwijkingen bekend aan het window • 1
XChangeW1ndowAttributes(dpy,win,attr_mask,8cwin_attr);
De overige events worden gewoon genegeerd, indien ze in het window optreden.
Er is een mogelijkheid opengehouden om de dikte van de lijnen te variëren, waarmee bijvoorl::>eeld syncmarks en rechthoeken getekend worden:
1· geef de breedte van (getekende) lijnen ... • 1
gcval.line_width • 1; I" .. door aan het display • 1
XChangeGC(dpy,GCC,GCLineWidth,Bcgcval);
Spraakmaker User Interlace De Grid-editor: tonen van de grid
2.3 Tonen van de Grid
Voordat de grid-editor gebruikt kan worden, zal de grid eerst op het scherm getoond moeten worden. Hiervoor is een :functie ontworpen (void showtexto), die verder altijd aangeroepen wordt als door wijzigingen, het vrij worden van voorheen bedekte gedeelten van het window, het scrollen binnen het window, enzovoort, (gedeelten van) de grid opnieuw getoond moet(en) worden.
Deze functie zoekt in de datal:xlse naar de eerst voorkomende stzeam en de eerste bij die stream horende substream en tekent hun namen in het window. Vervolgens tekent de functie doenachter achtereenvolgens alle datums, die bij die substream horen en wel zo, dat het datum midden tussen zijn linker en rechter syncmark komt. Tevens wordt de rechter syncmark getekend; de linker syncmark is de rechter van het volgende datum. Tenslotte wordt de laatste rechter syncmark getekend.
Als de stream meer substreams heeft, worden die achtereenvolgens opgezocht, wordt onder de vorige de naam van de actuele substream getekend - de naam van de stream kan nu weggelaten worden - en worden daarachter de bijbehorende datums en hun syncmarks getekend. Zijn er verder geen substreams, dan wordt een ruimte ter hoogte van een halve letterhoogte opengelaten en wordt verder gegaan met de volgende stream.
Tenslotte wordt naar een functie gesprongen,
;· doe wat nodig is betreffende syncmarks ·; void do_syncmarCS(n, ytext)
int n, ;• 2 • (opnieuw) berekenen van de hoogte van de glid; 1 • tevens tekenen van de syncmarks ·;
ytext; ;· hoogte van de grid zonder verdiscontering hoogte syncmarks •;
die nagaat of de volgnummers van de syncmarks getekend moeten worden - dit is ingesteld in de interlace besturing - en zonodig deze nummers tekent.
soms neemt het nummer zoveel plaats in, dat de nummers van twee opeenvolgende syncmarks elkaar zouden overlappen. In de functie cio_syncmarCS() is hierin voorzien door het nummer op de eerstvolgende regel te tekenen, waar wel plaats is. Aldus staat het nummer altijd precies onder de syncmark, waomaar het verwijst.
Afhankelijk van het gekozen tont en van de (vartabele) grootte van het window kan zich de situatie voordoen, dat niet de hele grid in het window getoond kan worden. Dit heeft voor de :functie showtexto geen gevolgen. Wordt op posities getekend, die buiten het window vallen, dan wordt gewoon getekend, zonder dat dit zichtbaar is.
Spraakmaker User Intenace De Grid-editor: tonen van de grtd
Indien gedeelten van de giid bereikt moeten worden die zich op dat moment voorbij de randen van window bevinden, dan dient de editor er voor
te
zorgen, dat deze gedeelten met uitsluitend het bewegen van de muis zichtbaar gemaakt kunnen worden. De inhoud van het window dient dus zonodig aan de hand van muisbewegingente
kunnen scrollen.5pra;duaallerU~ c - • - ~ -- t1
.. . - .
--·---~======~---I_EC-~•n-~•n-~·a-~n·~-~·~~S~e~tr~ln~9'~~0~h~ul~a~v--~M~o·~lil~v--~Sc~I~U~p~---;----~~~~---r---~~~
phl_dom.oin phl_domain phl_donaln ~ phi_dom.phh l.abei.Lyper word.L>"P•• .cl.assr .I eau .subc.au .ace• ..arnbisr subw.L)-pe: morpb.typer S)ioS)·h sr:~ph-!1•'"' phon.phor .SI.l'l .dun fr.omoo;.nn diph.dr lnt.o.freq: .declir pltch.type: .lr.omer .onset.: .dun Spraakmaker> I I I p1'0 [subsUnont-5&11
-s S)'lil
k:I
k -I I.,
[pr·e~O.ssl) [p .. st_p.utth,oO) -2 s •YI..
,
..
,
b~1~1
p -I I I I I I I I I I I I .odv [r,n,n) .oclv q 11 prop v[$) [Ie) lao5t:,cl [v:mo~>.r,u) [pas~_par1(b,u01
IJ
-
•
•
2 2 s s s•
s•
.,.1I
S)iI
S)i ~l•l"l"ltl•l n~ l~l~lil~l~l ~
syl syl S)i 1 S)i sy1 sylel r ulo
Is
wl .. lijnlil;: k!-•l.ols vl.ol n
nl
I -"lor
- 1 - - 1 - - - - 1 - - 1 -~~
y
I" I@ I
x
kl'"l
s
riAl
n
.Atb. 4 Een voorbeeld van een gedeelte van de griel in de editor.
0
Spraakmaker User Intertace De Grid-editor: evaluatie van events
2.4 Evaluatie van events
Als de griel eenmaal op het scherm staat, moeten alle wijzigingen met behulp van de muis
uitgevoerd kunnen worden. Hiertoe staat het middel van events ter beschikldng. Deze events geven aan of er met de muis, toetsenbord enz. iets gebeurd is.
Van de in totaal 33 verschillende even~ die kunnen optreden, worden er een achttal toegelaten tot het window (zie ook 2.2). Met behulp van een - in principe eindeloze - lus (is
het window eenmaal geopend, dan geschiedt de controle volledig van hieruit totdat het programma wordt verlaten) wordt, afhankelijk van de soort event, de nodige actie ondernomen:
while (ge_status I I pointer) 1 afgewerkt moet worden • 1
XNe:x:tEvent(dpy, &event); switch(event.type) I case ButtonPress: break; case MotionNotify: break:; case ButtonRelease: break:; case KeyPress: break; case EnterNotify: break:; case LeaveNotity: break:; case Expose:
/" hou cxmtrole zolang de muispunt in het window staat of er nog wat /" wacht tot er een event komt • I
I" selecteer op soort event • I
/" indrukken van een of andere muisknop • I
/" reageer op beweging van ingedrukte muisknop • 1
/" loslaten van muisknop: maakt de selectie feitelijk definitief • 1
I" evalueer aanslag van toets • 1 I" muispunt is in window gekomen • I I" muispunt heeft window verlaten • I
/" bericht ontvangen, dat 'iets' met window is gebeurd • 1
/"roer staat geen break: verder met de volgende "I
case ContigureNotify: /" test op deze event blijkt noodzakelijk te zijn • 1
j" controle moet afgegeven worden om andere controlelus in staat te stellen zijn taken te verrich,ten
NA VOL'IOOIING MOET HIJ ZELF EEN EVEN'I (XSendevent van :EnterNotify) GENEREREN n®IEN DE CONTROLE HIER TERUG MOET KOMEN • I
break;
I /" einde evaluatie van events ·I
In deze module wordt de lus onderbroken, omdat er ook in de inteliace besturing een lus bestaat, die de events evalueert. Die lus moet op geschikte momenten ook gelegenheid krijgen om zijn werk
te
doen. Zie voor de koppeling van en de interactie tussen beide lussen Hoofdstuk 3.2.5 Reactie op de events
2
Spraakmaker User Intenace De Grtd-ec:Utor: reactie op de events
Ten gevolge van het optreden van events kan de editor in verschUlende toestanden verkeren. Deze toestanden bepalen hoe de editor dient te reageren op de gebruiker en worden bijgehouden met behulp van drie vartabelen:
pointer: 0: muispunt bevindt zich buiten het wind.ow van de grid-editor 1: muispunt bevindt zich in dit window
ge_status: 0: wachten op het indrukken van de muisknop 1: wachten op het loslaten van de m\llsknop
2: wachten op invoer van het toetsenbeid type_select: 0: er is geen actie bezig of gewenst
1: wijziging van een datum is bezig of gewenst
2: wijziging van een of meer token(s) is bezig of gewenst 3: invoeging van een token links is bezig of gewenst 4: invoeging van een token rechts is bezig of gewenst 5: (ont)koppeling van syncmarks is bezig of gewenst
ZO kan de editor (• de lus die de optredende events test) alleen verlaten worden, indien zowel pointer ...
o
(muis buiten window) als ge_status --o
(wachten op nieuw te starten actie, dat wil zeggen er is op dit moment geen actie aan de gang).De ge_status verandert bijvoorbeeld na het 1n paragraaf 2.1.2 beschreven aanklikken van de muis van 0 in 1, na het eventueel bewegen en loslaten van de muis van 1 1n 2 en na voltooiing van tekstinvoer of koppeling van twee syncmarks weer in 0.
In type_select wordt bijgehouden welke actie aan de gang is.
Deze drie variabelen kunnen, samen met de acht events, (in theoiiel!) dus leiden tot 2·3·6·8 - 288 verschillende toestanden, waartn de editor kan verkeren!!
De diverse reële acties, die de optredende events oproepen, zullen hiema achtereenvolgens behandeld worden.
Spraakmaker User Interlace De Grid-editor: reactie op de events
2.5.1 Indrukken van muisknop (ButtonPress)
Deze event kan in diie situaties optreden:
1 er is niets van voorheen (ona1gemaakt) blijven liggen: bepaal, welke actie nu gewenst wordt
2 er was al eerder een (andere) muisknop ingedrukt, maar nog niet losgelaten: herstel de oude toestand (undo)
3 een eerder ingedrukte muisknop was al losgelaten, maar de bijbehorende actie is nog niet voltooid: doe dit nu, indien dit mogelijk is
2.5.1.1 Bepaal gewenste actie
Aan de hand van de exacte positie in het datum, waar de muispunt zich bevindt op het moment dat de muisknop wordt ingedrukt, wordt de actie bepaald:
De ruimte tussen twee syncmarks wordt in een instelbaar aantal (standaard 8) gelijke gedeelten verdeeld gedacht. Is de ruimte tussen de muispunt en een syncmark kleiner dan dat (8") gedeelte, dan is die syncmark gekozen; is deze ruimte groter, maar kleiner dan 3 maal dat gedeelte (met een maximum van twaalf maal de gemiddelde letterbreedte in het gekozen font), dan is een invoeging geselecteerd en in de oveiige gevallen is gekozen voor de wijziging van het aangewezen datum Oater eventueel teken).
Als de syncmarks erg dicht naast elkaar staan, kan het soms moellijk zijn, de muispunt zo te plaatsen, dat de gewenste actie ook inderdaad geselecteerd wordt. Ter controle verschijnt dan bij het indrukken van de muisknop op een geschikte plaats in het window een kadertje, dat met behulp van de woorden "change•, "insert" of "MB I couple MB3 decouple" aangeeft wat geselecteerd is. Is de geselecteerde actie, zoals aangegeven, niet de juiste, dan kan met een druk op een andere muisknop de selectie ongedaan gemaakt worden (zie 2.5.1.2).
3
1\.IBJ couplc J\IB3 dccouplc
lnsf
d
I
i kI \\'I
"j
p
I
s h 0 I \1 I s t. 0I
I' d.
~
H
I~ I~ I~ I~ I~ ~ l~l~ltl~l~l~
1:1
~
A!b 5a wijziging A1b Sb invoeging A1b 5c (ont)koppeling2.5.1.2 Herstel van de oude toestand (undo)
Spraakmaker User Intartace
De
Grid-editor: reactie op de eventsHet indrukken van een muisknop, terwijl een andere muisknop reeds is ingedrukt en nog niet is losgelaten, maakt de aangeduide actie ongedaan: een getekend kadertje om een datum of een toegevoegde syncmark wordt verwijderd.
Slechts indien bij het eerste indrukken van een muisknop op of zeer nabij een syncmark is geselecteerd en dus een (ont)koppeling is aangegeven (de muispunt is nu een open schaartje), kan het indrukken van lv!B3 een actie activeren:
Als tevens MB3 wordt ingedrukt, betekent dit het ontkoppelen van de syncmark: de muispunt wordt een dicht schaartje en de syncmark in deze stream krijgt een nieuw (nog niet bestaand) volgnummer; de syncmarks in de overige streams, die gelijk waren aan het vroegere volgnummer van de geselecteerde syncmark blijven ongewijzigd.
Wordt :MB2 ingedrukt, dan betekent dit, evenals bij de andere selecties, een herstel: het open schaartje wordt weer de gewone muispunt en de verdikking van de syncmark verdwijnt.
2.5.1.3 Afmaken eerder geselecteerde actie
Als een eerder ingedrukte muisknop reeds is losgelaten, maar de bijbehorende actie nog niet is afgemaakt, wordt bij het hernieuwd indrukken van een (willekeurige) muisknop de onderbroken - vorige - actie teniet gedaan. 3
Effectief is dus zo wederom een undo-functie gecreëerd, behalve bij -ook nu weer - selectie van een (ont)koppeling.
Is (ont)koppeling geselecteerd, dan heeft het indrukken van de middelste respectievelijk de rechter muisknop hetzelfde gevolg als hiervoor in paragraaf 2.5.1.2 is aangegeven (undo respectievelijk ontkoppelen).
2.5.2 Bewegen van de muis (MotionNotify)
Het bewegen van muis - bij ingedrukte muisknop - heeft gevolgen indien wijziging van een datum is geselecteerd of de (ont)koppeling van een syncmark. Is een invoeging aangeduid, dan heeft een muisbeweging geen effect.
3
In de module is een voomening aanwezig om een gedeeltelijk Ingevoerde wijziging van een datum als geldig te accepteren. In de praktijk bleek dit niet goed bruikbaar, ook omdat bij wijziging van een token alle datums In dat
Spraakmaker User Intertace De Gild-editor: reactie op de events
2.5.2.1 Wijziging van datum of token
Wijzigingen in de grid k:wmen bestaan uit:
"' wijzigen van 1 datum of wijzigen van een teken; in het laatste geval zullen alle datums in dit token gewijzigd moeten worden.
Bij het indrukken van de muisknop wordt om het geselecteerde datum een rechthoek getekend.
Deze
rechthoek volgt de bewegingen van de muispunt en wel zo, dat steeds het token, waarin, of ter breedte wacnvan, de muispnnt zich op zeker moment bevindt, wordt omvat. Keert de muispunt terug naar het aanvankelijk aangewezen datum, dan wordt alleen dit datum omrand. Pas bij het loslaten van de muisknop wordt beslist tussen wijziging van een datum of van een teken (zie 2.5.3).Iedere muisbeweging, hoe klein ook, genereert een event. Het zal duidelijk zijn, dat het bij elke beweging steeds opnieuw tekenen van de (ook ongewijzigde) rechthoek het systeem, ondanks zijn snelheid, hopeloos vertraagt. Daarom wordt met behulp van een array van 10(1) booleans beslist of de oude rechthoek verwijderd moet worden en een nieuwe moet worden getekend.
Het X-Window systeem plaatst alle events, ter verdere afwerking, in een lijst. Om het systeem verder te versnellen worden bovendien alle events ten gevolge van een
muisbeweging, op de laatste na, zonder meer uit deze lijst verwijderd. Zo wordt alleen de laatste beweging (op het moment dat het systeem weer een event kan evalueren) ondezzocht en is de rechthoek synchroon met de actuele muispositie.
Indien er door de muisbeweging een teken buiten de rand van het beschikbare window aangewezen dreigt te worden, wordt de inhoud van het window zo verschoven (gescrolld), dat dit laatst aangewezen teken zichtbaar is.
Daartoe wordt het gedeelte van het window, dat zowel voor als na verschuiven zichtbaar blijft, verplaatst en vervolgens wordt de hele grid op de juiste positie opnieuw getekend. Het tekenen van de hele giid geeft geen merkbare vertraging ten opzichte van het gedeeltelijk tekenen en is makkelijker te implementeren.
Spraakmaker User Interface De Grid-editor: reactie op de events
2.5.2.2 (Ont)koppelen van een syncmark
Vanaf het midden van de aanvankelijk geselecteerde syncmark wordt een 'elastiekje' (in X-Windows termen 'rubber band') getekend naar de positie waar de muispunt zich op dat
moment bevmdt.
.
.,
m
ctj.~kjwjljJjljsbje
~ ~ ~Ntl~ ~ ~J;
De twee syncmarks, die mogelijk voor koppeling in aanmerking komen, worden dik weergegeven. Wijzigingen in zowel
het elastiekje als het dik weergeven I 8 12 14 15 107 106 16 .
J~
1~~0 1J : . van de het laatst aangewezen syncmark 15 l3 109 111 113lOS 110
geschieden door tijdens de beweging op Afb 7 Koppeling van twee syncmcaks
de 'oude' positie opnieuw, maar dan geïnverteerd, te tekenen. Het getekende weer verdwijnt dan weer. Daarna worden met de nieuwe waarden de actuele posities aange-geven.
Ook hier geldt dat ten behoeve van de snelheid onnodige events ten gevolge van muisbewegingen uit de lijst van af te werkenevents verwijderd worden (zie 2.5.2.1). Het testen of een nieuw elastiekje getekend moet worden is niet nodig, omdat altijd de actuele muispositie aangegeven wordt.
Zodra de muis na het aanklikken beweegt, verandert de muispunt (die was een open schaartje) weer in de normale toestand. Komt de muispunt daarna weer in de buurt van de aanvankelijk aangewezen syncmark (in de aanvankelijk aangewezen stream), dan
verandert de muispunt weer in het open schaartje ten teken dat alsnog een ontkoppeling is geselecteerd. 2.5.3 Loslaten van muisknop (ButtonRelease)
Tijdens het bewegen van de muis geeft de editor voortdurend terugkoppeling aan de gebruiker over wat bij loslaten van de muisknop geselecteerd zou worden. Echter, pas bij het loslaten van de muisknop wordt bepaald welke actie daadwerkelijk uitgevoerd wordt: een wijziging, een invoeging of een (ont)koppeling.
2.5.3.1 Wijziging van datum of token
Ten gevolge van de mogelijkheid van het bewegen van de muis is tot op het laatste
moment onduidelijk of er een datum, 1 token of meerdere tekens gewijzigd moeten worden. Pas nadat de muisknop is losgelaten staat deze keuze vast. Derhalve wordt ook hier
nogmaals, aan de hand van de huidige positie van de muispunt ten opzichte van de oorspronkelijke, bepaald wat gewenst is.
Spraakmaker User Interface De Grid-editor: reactie op de events
Wordt thans weer het oorspronkelijk geselecteerde datum aangewezen, dan wordt alleen de wijziging van dat datum voorbereid.
syl 1 syl
g
/e
jg
/el
1-1 I
Afb 8 Selectie van een datum (het datum is hier tevens token)
Wordt in het oorspronkelijk aangewezen teken buiten het oorspronkelijke datum de
muisknop losgelaten, dan is de wijziging van een teken verlangd. Er wordt dan de wijziging van het bovenste datum in dat teken voorbereid.
Wordt buiten het aanvankelijk aan gewezen teken de muisknop losgelaten, dan is de vervanging van meerdere tekens door een teken gewenst. Ook dan wordt de invoer van het eerste datum in dit nieuwe teken voorbereid.
'Voorbereiden' wil hier zeggen, dat in het midden van het te wijzigen datum een klein rechthoekje verschijnt met daarin een liggend streepje als 'cursor'. Hiermee wordt
aangegeven, dat vanaf dit moment invoer van karakters via het toetsenbord mogelijk is.
syt 5)·t
1
njojg
wjoJtl
nOxwYn 1 1 -syl 11ltl;;
•l' '(syl ~·I syl
kj:~/:~
Is
vj
k_,
~fll
I-,
:'1I " !!In
~1
..
~ 1~
Afb 9 Selectie van meerdere tokens2.5.3.2 Invoeging van een token
Het gebied tussen de oorspronkelijke syncmark en de nieuwe, die verschenen Js bij het indrukken van de muisknop, wordt nu schoongemaakt, er wordt een rechthoekje omheen getekend en de invoer van het eerste datum wordt voorbereid. Dit voorbereiden is hier hetzelfde als bij de wijziging (paragraaf 2.5.3.1).
2.5.3.3 (Ont)koppelen van syncmarks
Indien de muispunt (weer) in de buurt van of op de oorspronkelijk geselecteerde syncmark staat, betekent dit de ontkoppeling van deze syncmark; dit gebeurt echter niet nu, maar
Spraakmaker User Interface De Grid-editor: reactie op de events
door het opnieuw indrukken van :tvm3. 'ZD kan tegelijk in meerdere strecnns de syncmark ontkoppeld worden van de syncmark in de niet geselecteerde strecnns. (Zie ook 2.5.1.2) Staat de muispunt niet bij de oorspronkelijk aangewezen syncmark dan betekent dit een koppeling. Het loslaten van de muisknop heeft tot gevolg dat het elastiekje verdwijnt en dat de twee syncmarks (in alle strecnns) aan elkaar gekoppeld worden. Dit geldt echter alleen, indien de laatst aangewezen syncmark dik weergegeven was (en dus ook gekoppeld kon worden). Was dit niet zo, dan heeft het loslaten van de muisknop verder geen gevolgen voor de grid.
lm dlilkl\\ m d tlklwliiJitls h m <ljljk!wji!Jjljs
l~l ~
1:
1~ ~
1·~
1~ n~ ~1~1:1~ ~
1'~
1~ 1:1~ ~·~~ 1~1~
•I syl srl syl :· ~·I syl
0 S 12 14 I 8 13 ]5 110 J] I 8 107 J.l 15 17 tJ
107 106 107
u
109 17 ~ ·100 106 16 lS OS 13 t5 lOS 16 IS I 15 13 109 111lOS 106 111 lOS 110
a voor de koppeling b na de koppeling c na de ontkoppeling
Mb 10 Wijzigingen in de grid ten gevolge van (ont)koppeling (let op sync::marks 12, 107 en 400)
2.5.4 Invoer vanaf toetsenbord (KeyPress)
Invoer vanaf het toetsenbord geschiedt in principe op gelijke wijze voor wijziging van een datum, een of meerdere token(s) en voor invoeging van een nieuw token; de beschrijving van de acties wordt daarom hieronder voor al deze situaties gegeven.
Na het loslaten van de muisknop wordt het inlezen van de toetsaanslagen voorbereid (zie hiervoor). Vanaf dit moment is invoer vanaf het toetsenbord mogelijk. Wordt op een ander moment een toets ingedrukt, dan wordt die niet verwerkt en geeft het systeem een
geluidssignaal.
Het X-Window systeem heeft de mogelijkheid een string als geheel in te lezen. Van deze mogelijkheid is hier geen gebruik gemaakt, omdat dan de invoer pas onderbroken kan worden door bijvoorbeeld een actie met de muis nadat de invoer Js afgesloten met
[RE'I'URN].
Hier gebeurt het inlezen toets-voor-toets:
Allereerst wordt gecontroleerd of het een geldige toets is (speciale toetsen zoals functietoetsen en dergelijke hebben in de editor geen functie) en vervolgens wordt
onderzocht of [BACKSPACE] Js ingedrukt en zo ja, dan wordt de laatste geldige toetsaanslag verwijderd.
Van de geldige toetsaanslagen wordt het corresponderende karakter in het rechthoekje met de cursor geplaatst, nadat het rechthoekje met de breedte van het karakter Js uitgebreid. De cursor wordt wederom rechts toegevoegd. De uitbreiding van het rechthoekje geschiedt zo,
Spraakmaker User Interface De Giid-editor: reactie op de events
dat zijn midden op de plaats blijft. De uitbreiding is in principe onbeperkt in omvang, zodat het kan voorkomen, dat een invoer zelfs over de randen van de op dat moment getoonde grid komt.
De invoer wordt afgesloten met [RE'I'URN].
Was voorheen alleen wijziging van een datum geselecteerd, dan bewerkstelligt het
indrukken van [RE'I'URN], dat de hele selectie wordt afgesloten en de gewijzigde grid in het window getoond wordt.
Was echter een teken geselecteerd, dan wordt na [RE'IURN] het inlezen van het volgende datwn (de volgende substream) voorbereid en uitgevoerd, totdat alle datwns van dat teken geweest zijn. Pas daarna wordt de selectie afgesloten en de gewijzigde grid getoond.
Was meer dan een teken geselecteerd, dan worden al deze tekens vervangen door het ene nu ingevoerde teken. syl syl
I
nlolg wHII
nOxwYn - 1 - - 1 -syl syl11 I
lig
"I·"I
:lIs!@.. x k _I s
-
-
- I -syl syl:tI
n ~I P.+
I . ·\ n x <lJ-
Ia na de selectie, voor invoer
b tijdens invoer
syl
sje
n x~
syl syl
I
sylI
srlI
syl sylnjolg wjelljnjljgkjaj.tlsvj:.l n gje
n 0 x w Y n
\'eJ·an
A - I - - I - derin!
Spraakmaker User Intertace De Grid-editor: reactie op de events
c na voltooiing van de invoer
Spraakmaker User Intertace De Grid~tor: reactie op de events
2.5.5 Overige gebruikte events
De overige events die in paragraaf 2.4 zijn vermeld hebben te maken met de interactie tussen de grid~tor en de intertace besturing. Later, bij de bespreking van de koppeling tussen beide, zullen ze nog uitgebreid aan de orde komen; hier volgt slechts een korte beschrijving van hun flmctie en de reactie in deze module op hun optreden.
2.5.5.1 Binnenkomen 1n window (EnterNotify)
Dit event treedt op als de muispunt het window van de gnd-editor binnenkomt: het programma signaleert dit door de variabele pointer op 1 (• true) te zetten.
2.5.5.2 Verlaten window (LeaveNotüy)
Evenzo wordt bij het verlaten van het window de variabele pointer op 0 (• 1alse) gezet.
2.5.5.3 Verandering L"l zichtbaarheid van het window (Expose)
Het kan voorkomen dat door een buiten de editor gelegen oorzaak (een gedeelte van) het window weer zichtbaar wordt, na bedekt te zijn geweest door bijvoorbeeld een ander window. Het systeem geeft dan deze event af, waarop de editor de op dat moment actuele grid opnieuw tekent.
zo
kan het gebeuren, dat vanuit de intertace besturing een menu optie opgeroepen wordt. Er verschijnt dan onder de menubalk een klein window met de diversekeuzemogelijkheden, dat een gedeelte van de editor bedekt. Na het maken van een keuze en het verwijderen van dit menu-window genereert het systeem een Expose, die in de editor gebruikt wordt als signaal om de (gedeeltelijk overschreven) inhoud van de editor opnieuw op het scherm te brengen.
2.5.5.4 ConfigureNotify
Deze event wordt gegenereerd als de intertace besturing de controle MOET overnemen, om welke reden dan ook; de editor moet dit dan dus ook zonder meer toestaan, hetgeen gebeurt door de controle variabelen (ge_status en pointer) zo'n waarde te geven dat de lus onmiddellijk verlaten wordt.
Spraakmaker User Intenace De Grid-editor: verwerking van wijzigingen
2.6 Verwerking van wijzigingen
De verwerking van de wijzigingen, die in de grid zijn aangebracht, zijn te onderscheiden in twee categorieën:
- wijziging met betrekking tot datums enjof token(s) - wijziging met betrekking tot syncmarks.
Beide categorieën wijzigmgen kunnen op drie niveaus beschouwd worden: - de gevolgen voor de in het window getoonde grid
- de gevolgen voor de database die aan de grid ten grondslag ligt - de gevolgen voor de verdere analyse van de tekst.
2.6.1 Wijziging van datum of token(s)
ZOlang niet [RE'I'URN] is ingedrukt bij de wijzigmg van een datum of bij wijziging van het laatste datum van het teken, worden de wijzigingen in een tijdelijke buffer bewaard. Deze buffer maakt het mogelijk de gewijzigde gegevens alvast in het window te tonen, maar maakt ook nog een herstel naar de oude waarden mogelijk.
Pas nadat de hiervoor bedoelde [RETIJRN] is afgegeven worden de wijzigingen in de
database opgenomen. Dit betekent dat alle waarden, nodig om de grid te tonen, gebaseerd zijn op de wijzigingen en een direct herstel niet meer mogelijk is.
Een herstel kan vanaf nu alleen geschieden door een hernieuwde invoer van de oude waarden.
De wijzigingen moeten tevens kenbaar gemaakt kunnen worden aan het spraakmaker systeem ten behoeve van verdere analyse. Daartoe worden de wijzigingen op het moment dat de hiervoor bedoelde [RE'I'U'RN] wordt ingedrukt, toegevoegd aan een tweetallijsten (een voor verwijderingen en een voor toevoeg1ngen). De gegevens die deze lijsten bevatten kunnen dan op een geschikt moment aan het spraakmaker systeem aangeboden worden, waarna de lijsten kunnen worden geleegd. Bij de bespreking van de koppeling (paragraaf 3.2) zal hierop nader worden ingegaan.
Spraakmaker User Inteliace De Grid-editor: verwerking vcm wijzigingen
2.6.2 Wijziging van syncmarks
ZOlang de muisknop is ingedrukt is een selectie nog niet definitief; een eventueel getoond
'elastiekje' en tweede syncmark kunnen nog gewijzigd worden. Deze wijzigingen worden
lokaal in het window aangebracht, zodat aan de data in de database niets verandert. Pas bij het loslaten van de muisknop kan aanpassing van de database nodig zijn:
Is in principe koppeling mogelijk dan volgt een procedure als hieronder beschreven. Kan er bij het loslaten van de muisknop niet gekoppeld worden, dan bestaat de mogelijkheid om dezelfde syncmark in andere streams te selecteren. Dit kan totdat MB3 ingedrukt wordt, waarna alle geselecteerde syncmarks losgekoppeld worden van de niet geselecteerde met hetzelfde nummer. Daartoe wordt een lijst van geselecteerde streams bijgehouden, totdat de ontkoppeling heeft plaats gevonden. Ook nu weer betekent het indrukken vcm de middelste muisknop {lvm2) een undo. Na voltooting of teniet doen wordt de lijst geleegd voor de volgende actie.
Ten behoeve van het testen of twee syncmarks inderdaad aan elkaar gekoppeld kunnen worden -ontkoppeling is altijd mogelijk -, bevat Spraakmaker een zeer complex algoritme. Het zou dubbelop zijn dit hele algoritme ook nog eens in het inteliace onder te brengen. Anderzijds moet tijdens muisbewegingen, dus snel, een reactie aan de gebruiker gegeven worden of koppeling mogelijk is. Daarom is besloten in het intartace een voorlopige test uit te voeren, die de beslist onmogelijke koppelingen alvast uitsluit. Dit houdt wel in, dat, nadat de gewijzigde integer waarden vcm de te koppelen syncmarks aan Spraakmaker zijn
aangeboden, Spraakmaker eerst een terugmelding met een al dan niet accoord bevinding aan het inteliace moet geven, voordat koppeling op het scherm zichtbaar gemaakt wordt. In paragraaf 3.2 zal bij de bespreking van de (problemen met de) koppeling van het Inteliace aan Spraakmaker blijken, dat vele problemen daarbij vooralsnog onopgelost zijn gebleven. De communicatie inzake de te koppelen syncmarks is een van deze problemen. In verband hiermee is nog geen aandacht besteed aan een (voorlopige) koppeling, dus een voorziening om te koppelen syncmarks tijdelijk op te slaan. In de plaats daarvan worden de data binnen het Intenace herberekend bij slagen van de (onvolkomen) test en wordt de gewijzigde grid getoond. Bij uitzondering kan dit leiden tot onbruikbare resultaten en een onleesbare grid.
Met een (hopelijk ooit geslaagde) koppeling in het vooruitzicht is dit op de koop toe genomen.
Spraakmaker User Intenace Koppeling: user intenace modules onderling
Hoofdstuk 3: Koppeling
De koppeling die in het project moet geschieden valt uiteen in twee onderdelen: - de koppeling tussen de modules van het User Interface onderling en
- de koppeling van het User Interface aan de in Prolog geschreven Spraakmaker
3.1 User Interface modules onderling
3.1.1 Dataoverdracht
De modules die ten behoeve van het User Intenace zijn ontworpen zijn alle geschreven in C. Als de data eenmaal van Prolog zijn ontvangen, kunnen die in deze modules probleemloos veiWerkt worden. Middels een opgebouwde datastructuur en enkele hulpstructuren zijn de noodzakelijke data in alle modules toegankelijk.
3.1.2 Coördinatie van events
zowel de grid-€Clitor als de interface besturing maken gebruik van muis, toetsenbord, en dus vanevents.
In de intenace besturing wordt daarbij gebruik gemaakt van de Toolkitfunctie:
;· Sit around forever waiting to process X-events. We never leave XtMainLoop. From here on, we only execute our callback routines. •;
XtMainLoop();
waarvan het commentaar terecht zegt, "dat we die nooit verlaten en van hier uit alleen "callback"routines aanroepen.
Het aanroepen van deze functie houdt impliciet in, dat alle in het window toegelaten events onderzocht worden. Met behulp van de functie:
void display _tekst()
{ I 1f (giid_displayed -- 0) { I XtAddEventHandler(widget_array[work_area],
StructureNotifyMask: I ButtonPressMask I EnterWindowMask, TRUE,WorkAreaEventHand.ler,O);
grid_displayed- 1;
wordt, zodra de grid-€Clitor wordt opgeroepen, het automatisch attesten van de events gedeeltelijk vervangen door een eigen test. De functie XtAddEventHandler<> staat toe dat voor
Spraakmaker User Intertace Koppeling: user intertace modules onderling
een nader opgegeven w:indow (hier widget_cmay[work_area] - het w:indow van de grtd-editor) nader opgegeven events (hier ButtonPressMask • indrukken mutsknoppen en EnterWindowMask •
birmenkomen in w:indow) door eigen routines verwerkt worden. De routine: XtEventHandler WorkAreaEventHandler(wkiget.tag,event) Widget widget; I char "tag; XEvent •event; switch (event->type) 1 case ButtonPress : it (giid_clisplayed. •• 1) usewindowO; break; case EnterNotify: I XSendEvent(dpy,win,False,EnterWindowMask,event); it (giid_clisplayed -- 1) usewindowO; break;
die deze verwerldng regelt, roept telkens bij het binnenkomen in het editorw:indow of het optreden van een muisindruk in dat w:indow (vanuit de interface besturlng) de (editor-)functie use_windowo aan, die leidt tot overname van de controle door de editor. De controle door de editor loopt dus als routine binnen de routine XtMainLoop().
In hoofdstuk 2 staat beschreven dat de grid-editor eveneens een lus bevat die in prindpe nooit verlaten wordt. Ter herinnering:
w.hile (ge_status I I pointer) {
XNe:r:tEvent(dpy, &event); ;·wacht tot ereenevent komt·;
event.type &• Ox7f; j" gebrujk ook een door het progromma gegenereerde event • 1
Slechts indien zowel ge_status 0 (is F ALSE) is -er is dan geen editor functie lopend - alsook
pointer 0 is muis is buiten het editor w:indow wordt de editor controle verlaten en is
-automatisch -XtMainLoop() weer actief.
Op deze manier is - op een hierna te bespreken probleem na - de interactie tussen beide lussen gerealiseerd.
3.1.3 Communicatie probleem
Het gebruik van de hiervoor gepresenteerde oplossing bleek vene van vlekkeloos te verlopen. Soms kreeg de editor de controle onverwacht niet, soms weer wel. Het probleem deed zich voor nadat vanuit de menubalk een optie opgeroepen was.
Spraakmaker User Inte:dace Koppeling: coördinatie van events
Zonder de hele theorie te hebben kunnen achterhalen, leek het probleem voort te komen uit
het feit, dat zowel
- de boven de editor aanwezige menubalk als
- elke (continu zichtbare) keuzemogelijkheid uit deze balk alsook
- elk bij aankl.ikken van een keuzemogelijkheid verschijnend window alsmede - elke keuzeregel in dit window
een apart widget (• eenvoudig window) bleek te zijn.
Zodra een window verlaten wordt geeft het systeem een event (LeaveNotify) af aan dat window en zijn parents. Evenzo geeft het systeem bij binnenkomen in een window een
EnterNotify af aan dat window en zijn parents.
Gezien de stapeling van de menu-windows leidt het met de muis bewegen over de diverse menu opties tot een massa events. Vele van deze events worden door XTMainLoopO binnen de intenace besturing ondervangen dan wel afgehandeld. Bij overschrijden van de randen van deze windows en tegelijkertijd binnenkomen in de editor dringen onvoorspelbare aantallen events echter tot de editor door.
Het is (vanwege bijvoorbeeld de noodzakelijke variabele pointer, die aangeeft of de muispunt zich in of buiten het window van de editor bevindt) beslist noodzakelijk zowel LeaveNotlty als EnterNotlty te gebnllken, zodat het niet tot het window laten doordringen van deze events niet
in aanmerking komt.
Een intensief gebruik van de 'try-and-error methode' leverde een oplossing:
- verwijder alle events, behalve de laatste, bij het afhandelen van LeaveNotify en Entemotify,
- laat de inte:dace besturing bij de overdracht van de controle aan de editor een EnterNotlty
generen en
- gebruik deze (programma-)event als signaal voor de editor, dat hij de grid moet tekenen en de controle moet overnemen.
Deze methode blijkt in de praktijk te werken; een intensievere bestudering van de theorie achter X-Windows, en met name de events, zal wellicht een betere oplossing aandragen. 3.2 Inte:dace aan PROLOG
Aangezien in het voorgaande vaker verwezen is naar deze koppeling, zal ik hier kort op ingaan, hoewel de realisatie ervan niet mijn werk is.
Hoewel het bij ons project gebruikte Prolog-systeem geen objectcode genereert, die
meegelinkt zou kunnen worden met in andere talen geschreven code, kent het systeem een goed bruikbaar inte:dace met derde generatie talen als FORTRAN, P.ASC.Al., C en dergelijke.