terminal
    
    Tartalomjegyzék
    
    
    alapok
    
      - 
        Ez a leírás az xterm típusú terminálokról szól, vagyis azokról melyeknek "xterm..." a kimenete a 
        következő parancsra:
        
        Ezek a terminálok alapesetben normál módban vannak, de ha azt szeretnénk, hogy általunk 100%-ban kontrollálhatóak 
        legyenek, akkor át kell váltanunk RAW-módba, továbbá le kell tiltani a karakter ECHO-zást, 
        hiszen mi szeretnénk vezérelni, hogy egy billentyű lenyomáskor mi történjen, és mi jelenjen meg a terminálon. 
        Így akár terminálos játék, vagy egy Norton Commander is készülhet. 
        Lehet, hogy a cursor megjelenését is le kell tiltani.
      
- 
        RAW-mód bekapcsolása
 Ennek a módnak a bekapcsolását (és a program végén a kikapcsolását) régebben a java programban helyeztem el.
        A bekapcsolás így nézett ki:
        
        Azonban ez több problémát felvetett: bizonyos környezetben nincs "sh" parancs, és ez java exception-t okoz, 
        de "sh" nélkül sem működik egyes környezetekben. Van olyan terminál mely rossz karakter kódolással indul, 
        és még ezt is be kell állítani, ráadásul más-más paranccsal.
        A megoldás az, hogy a terminál beállítása nem a java kódban történik, hanem a java programot indító scriptben így:
        
        A példában látható, hogy a java program indítása előtt bekapcsoljuk a raw-módot, és kikapcsoljuk a karakterek
        echo-zását, majd a program befejeztével kikapcsoljuk a raw-módot, és bekapcsoljuk a karakterek echo-zását.
- 
        Terminál Osztályzat (TO)
 A terminálok minősítésére vezettem be, mely 1-től 5-ig terjedő osztályzattal leírja, mennyire használható, 
        átváltható-e RAW-módba, működnek-e a billentyűk, megfelelően támogatja-e az ansi escape szekvenciákat stb. 
        A legjobb osztályzat az 5-ös.
- 
        A xesj.java-17-tool project terminál támogatása
 Ez a project a terminál, és keyboard kezeléséhez tartalmaz egy xesj.xterm package-et, 
        ezt érdemes használni.
ansi escape codes
    
      - 
        Az ansi escape kódoknak a terminálra történő kiírásával vezérelhető a karakterek megjelenési helye, és kinézete.
      
- 
        Cursor eltolása
        
        Ha a cursor egy irányba eltolva eléri a terminál ablak szélét, akkor ott marad, nem mozog tovább.
 Így tehát elérhető a jobb-alsó sarok, ha a cursort a terminál méretét meghaladva eltoljuk jobbra, és lefelé.
- 
        Cursor pozícionálása
        
        Ha túl nagyok az értékek akkor az utolsó sorba, és/vagy az utolsó oszlopba megy a cursor.
 Valótlan érték esetén (0, negatív, nem szám) nem történik cursor mozgatás.
- 
        Cursor pozíciójának lekérdezése
 A funkció használata előtt ürítsük ki a keyboard buffert!
        
        Ezt a kódot kiadva, a cursor pozíciója kiolvasható a keyboard buffer-ből {esc}[{sor};{oszlop}R formában.
 A bufferből való olvasáskor olyan metódust használjunk, mely vár az adat megjelenésére a buffer-ben!
 Egy konkrét példa, ahogy a buffer-ből kiolvasható a bájt-sorozat:
        
        A példában a cursor a 31. sorban, és az 52. oszlopban áll, a bal felső sarok pedig mindig az 1;1 koordináta.
 Ezt a funkciót lehet felhasználni arra, hogy a terminál ablak méretét meghatározzuk.
 Előtte léptessük a cursort a jobb-alsó sarokba, majd kérdezzük le a pozícióját.
- 
        Terminál ablak teljes tartalmának, vagy egy részének törlése
        
        Ezeknél a műveleteknél a cursor pozíciója nem változik, és a cursor pozíciójában is megtörténik a törlés.
      
- 
        Reset
        
        Betűszín, betű háttérszín, betű dekorációs beállítások törlése, visszaállás a terminál ablak alap beállítására.
        A cursor pozíciójára nincs hatással.
      
- 
        Betűszín
 A 8 alap betűszín, és világos változata: 
        
        Megadható a 256 színű paletta egy színe is, egy 0 - 255 közötti színkóddal:
        
        Megadható a 16 millió színű paletta egy színe is, RGB színkódolással:
        
        A szín beállítás, az utána következő karakterek kiírásakor lesz látható.
 A szín beállítás addig marad érvényben amíg át nem állítjuk, vagy nem hajtunk végre reset-et.
- 
        Betű háttérszín
 A 8 alap betű háttérszín, és világos változata: 
        
        Megadható a 256 háttérszínű paletta egy színe is, egy 0 - 255 közötti színkóddal:
        
        Megadható a 16 millió háttérszínű paletta egy színe is, RGB színkódolással:
- 
        Betű dekoráció
        
        Elképzelhető, hogy ezek a dekorációk nem mind látszanak, 
        lehet hogy a terminál fontkészlete nem támogatja a bold, italic, underline megjelenést.
      
- 
        Scroll
        
        A scrollozás hatására az egyik oldalon kicsúszó sorok elvesznek, egy ellentétes irányú scroll sem hozza őket vissza.
        
 A másik oldalon új üres sorok jelennek meg.
 A cursor pozíciója változatlan marad.
- 
        Cursor elrejtése, megjelenítése
        
      
dokumentáció
    
    
    keyboard
    
      - 
        Amíg fut a program, folyamatosan gépelhetünk.
 A lenyomott billentyűk kódjai (bájt sorozata) sorban egymás után kerül be a keyboard buffer-be.
 A program ebből tud olvasni tetszőleges időpontban például a következő metódussal:
        
        Vigyázat! Ez a read() metódus vár (vagyis blokkol) ha a buffer üres.
        Ha nem célunk a várakozás, akkor előtte meg lehet vizsgálni van-e adat a buffer-ben:
        
        Ez a metódus viszont nem várakozik, rögtön visszaadja a buffer-ben lévő bájtok számát.
        A read() metódussal kiolvasott karakterek törlődnek a bufferből.
        Egy funkció billentyű akár 5-6 bájt-ot is betesz a buffer-be.
        A Shift, Alt, Ctrl, NumLock, CapsLock, ScrollLock billentyű lenyomások nem írnak a bufferbe.
- 
        Különböző terminálok a billentyűk lenyomásakor más-más billentyű kódot állíthatnak elő a keyboard bufferben, 
        ezért érdemes egy billentyű ➔ kód megfeleltetést csinálni, és ezt használni. 
        A megfeleltetést én egy keyboard.json fájlban tárolom. A legtöbb billentyű kódja egyezik, de pl. a Backspace,
        vagy az Fn billentyűk más kódot adhatnak, illetve egyes billentyűk kódja 5 bájt-ból, 
        más terminálon pedig 6 bájt-ból is állhat. Egyes terminálokon ráadásul ugyanazt a kódot kapjuk,
        ha egy funkció billentyűt (pl. nyilak) önmagában, vagy a Shift-tel együtt nyomjuk le.
      
macos iterm2
    
      - TO: 5
- 
        Java alkalmazás futtatás módja:
        
      
macos terminal
    
      - TO: 3
- 
        Java alkalmazás futtatás módja:
        
      
- 
        Néhány billentyűt lenyomva scroll történik, ami visszahozza az előző (nem kívánt) terminál ablak tartalmakat.
 Ezt úgy lehet kiküszöbolni, hogy a macOS terminal programban letiltjuk az ablak tartalom előzményeit:
- 
        Cursor pozíciójának mentése és visszaállítása nem működik.
      
- 
        Az RGB-vel megadott színek, és háttérszínek nem működnek.
      
- 
        Néhány betű dekoráció nem működik.
      
print
    
      - 
        A terminálra kiírni a következő parancsokkal lehet:
        
        Mindegyik előre lépteti a cursort (és lefelé ha szüksége + scroll ha szükséges), tehát egyformán működnek, 
        de a print() a kényelmesebb, mert azzal karaktereket lehet kiiratni, bájt-ok helyett. 
      
- 
        Ha a cursor a terminál ablak jobb szélén van, és oda egyetlen karaktert kiírunk,
        akkor szerencsére még nem megy át a cursor a következő sorba (és nem scrollozza fel az egész ablak tartalmát sem),
        csak akkor ha kiírnánk mégegy karaktert. Tehát a cursor pont azon a karakteren marad amit kiírtunk.
      
- 
        Ha a cursor nem a terminál ablak jobb szélén van, tehát van tőle jobbra még hely, akkor egy karakter kiírásakor
        a megjelenő karaktertől a cursor azonnal elmozdul egyet jobbra. 
      
- 
        Kiírási sebesség egy átlagos gépen:
 2500 karakter kiírás a terminál ablakba úgy, hogy minden karakter előtt cursor pozicionálás van, 
        majd egy karaktert kiírunk, az 40 - 50 ms alatt megtörténik, vagyis nagyon gyors a művelet.
- 
        Keret rajzolás:
 Sajnos nem találtam hozzá unicode karaktereket. 
        Helyette azt lehet csinálni, hogy betű háttérszínt állítunk, space karakterekkel telerakjuk a terminál szélét,
        vagyis felülre, alulra, balra, jobbra, így a héttérszín miatt látszik keretként.
windows cmd
    
      - TO: 1
- 
        Az stty parancsot nem ismeri, így RAW-módba sem tud váltani.
      
windows cygwin
    
      - TO: 1
- 
        A legfontosabb billentyűk nem működnek: Esc, nyilak, Fn.
 Tehát ezek lenyomásakor nem kerül adat a billentyűzet buffer-be.
- 
        Ugyanilyen cygwin alapú a Netbeans "terminal" ablaka.
      
windows git-bash
    
      - TO: 5
- 
        A java alkalmazás futtatásakor be kell állítani UTF-8 -ra (windows-on 65001) a karakter kódolást, hogy az ékezetes
        karakterek jól jelenjenek meg.
 A windows-os meghajtók /c és /d alatt látszódnak:
windows moba-xterm
    
      - TO: 5
- 
        Java alkalmazás futtatás módja, ha távoli szerverre jelentkezünk fel:
        
      
- 
        A Start local terminal gombbal lokális terminált indíthatunk.
 A windows-os meghajtók /drives/c és /drives/d alatt látszódnak.
 De a java alkalmazás, és paraméterei esetén már használhatjuk 
        a c: vagy d: meghajtót, tehát furcsa módon így kell futtatni a java alkalmazást:
windows powershell
    
      - TO: 1
- 
        Az stty parancsot nem ismeri, így RAW-módba sem tud váltani.