Page 1 of 1

Im Terminal Cursor positionieren

Posted: 04. Dec 2008 19:14
by pcAlko
Hallo Leute!

Ich würde gerne im Terminal (mit C) einen Mehrzeiligen Text ausgeben
und diesen immer wieder aktualisieren.
So wie top oder htop

Also nicht dass ich immer Zeile für Zeile ausgebe
dann rauscht der text immer nach oben und wird unübersichtlich.

Also sagen wir mal ganz einfach die Cursorposition bestimmen
wo das ganze ausgegeben werden soll.

Hat da irgendjemand eine Idee?

Danke
8) pcAlko

Posted: 04. Dec 2008 21:59
by Janka
Dafür kannst du z.B. ncurses benutzen.

Quick&Dirty geht aber auch:

Code: Select all

$ infocmp
#       Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),
        am, bce, km, mc5i, mir, msgr, npc, xenl,
        colors#8, cols#80, it#8, lines#24, pairs#64,
        acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
        clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
        dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
        flash=\E&#91;?5h$<100/>\E&#91;?5l, home=\E&#91;H, hpa=\E&#91;%i%p1%dG,
        ht=^I, hts=\EH, ich=\E&#91;%p1%d@, il=\E&#91;%p1%dL, il1=\E&#91;L,
        ind=^J, indn=\E&#91;%p1%dS, invis=\E&#91;8m,
        is2=\E&#91;!p\E&#91;?3;4l\E&#91;4l\E>, kDC=\E&#91;3;2~, kEND=\E&#91;1;2F,
        kHOM=\E&#91;1;2H, kIC=\E&#91;2;2~, kLFT=\E&#91;1;2D, kNXT=\E&#91;6;2~,
        kPRV=\E&#91;5;2~, kRIT=\E&#91;1;2C, kb2=\EOE, kbs=\177, kcbt=\E&#91;Z,
        kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
        kdch1=\E&#91;3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E&#91;21~,
        kf11=\E&#91;23~, kf12=\E&#91;24~, kf13=\E&#91;2P, kf14=\E&#91;2Q,
        kf15=\E&#91;2R, kf16=\E&#91;2S, kf17=\E&#91;15;2~, kf18=\E&#91;17;2~,
        kf19=\E&#91;18;2~, kf2=\EOQ, kf20=\E&#91;19;2~, kf21=\E&#91;20;2~,
        kf22=\E&#91;21;2~, kf23=\E&#91;23;2~, kf24=\E&#91;24;2~, kf25=\E&#91;5P,
        kf26=\E&#91;5Q, kf27=\E&#91;5R, kf28=\E&#91;5S, kf29=\E&#91;15;5~,
        kf3=\EOR, kf30=\E&#91;17;5~, kf31=\E&#91;18;5~, kf32=\E&#91;19;5~,
        kf33=\E&#91;20;5~, kf34=\E&#91;21;5~, kf35=\E&#91;23;5~,
        kf36=\E&#91;24;5~, kf37=\E&#91;6P, kf38=\E&#91;6Q, kf39=\E&#91;6R,
        kf4=\EOS, kf40=\E&#91;6S, kf41=\E&#91;15;6~, kf42=\E&#91;17;6~,
        kf43=\E&#91;18;6~, kf44=\E&#91;19;6~, kf45=\E&#91;20;6~,
        kf46=\E&#91;21;6~, kf47=\E&#91;23;6~, kf48=\E&#91;24;6~, kf49=\E&#91;3P,
        kf5=\E&#91;15~, kf50=\E&#91;3Q, kf51=\E&#91;3R, kf52=\E&#91;3S,
        kf53=\E&#91;15;3~, kf54=\E&#91;17;3~, kf55=\E&#91;18;3~,
        kf56=\E&#91;19;3~, kf57=\E&#91;20;3~, kf58=\E&#91;21;3~,
        kf59=\E&#91;23;3~, kf6=\E&#91;17~, kf60=\E&#91;24;3~, kf61=\E&#91;4P,
        kf62=\E&#91;4Q, kf63=\E&#91;4R, kf7=\E&#91;18~, kf8=\E&#91;19~, kf9=\E&#91;20~,
        kfnd=\E&#91;1~, khome=\EOH, kich1=\E&#91;2~, kind=\E&#91;1;2B,
        kmous=\E&#91;M, knp=\E&#91;6~, kpp=\E&#91;5~, kri=\E&#91;1;2A, kslt=\E&#91;4~,
        mc0=\E&#91;i, mc4=\E&#91;4i, mc5=\E&#91;5i, meml=\El, memu=\Em,
        op=\E&#91;39;49m, rc=\E8, rev=\E&#91;7m, ri=\EM, rin=\E&#91;%p1%dT,
        rmacs=\E&#40;B, rmam=\E&#91;?7l, rmcup=\E&#91;?1049l, rmir=\E&#91;4l,
        rmkx=\E&#91;?1l\E>, rmm=\E&#91;?1034l, rmso=\E&#91;27m, rmul=\E&#91;24m,
        rs1=\Ec, rs2=\E&#91;!p\E&#91;?3;4l\E&#91;4l\E>, sc=\E7,
        setab=\E&#91;4%p1%dm, setaf=\E&#91;3%p1%dm,
        setb=\E&#91;4%?%p1%&#123;1&#125;%=%t4%e%p1%&#123;3&#125;%=%t6%e%p1%&#123;4&#125;%=%t1%e%p1%&#123;6&#125;%=%t3%e%p1%d%;m,
        setf=\E&#91;3%?%p1%&#123;1&#125;%=%t4%e%p1%&#123;3&#125;%=%t6%e%p1%&#123;4&#125;%=%t1%e%p1%&#123;6&#125;%=%t3%e%p1%d%;m,
        sgr=%?%p9%t\E&#40;0%e\E&#40;B%;\E&#91;0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
        sgr0=\E&#40;B\E&#91;m, smacs=\E&#40;0, smam=\E&#91;?7h, smcup=\E&#91;?1049h,
        smir=\E&#91;4h, smkx=\E&#91;?1h\E=, smm=\E&#91;?1034h, smso=\E&#91;7m,
        smul=\E&#91;4m, tbc=\E&#91;3g, u6=\E&#91;%i%d;%dR, u7=\E&#91;6n,
        u8=\E&#91;?1;2c, u9=\E&#91;c, vpa=\E&#91;%i%p1%dd,
Das sind die Codes für xterm. Jedes Terminal hat andere Codes zum Bewegen des Cursors etc.

Schreib dir die Codes für "cuu1" (Cursor hoch) und "cub1" (Cursor links) raus, z.B. mit

Code: Select all

$tput cuu1 | od -tx1
0000000 1b 5b 41
0000003
$ tput cub1 | od -tx1
0000000 08
0000001
und benutz diese in Strings in deinem C-Programm. Das funktioniert aber nur mit dem Terminal, das du bei "infocmp" angegeben hast. Wenn du ordentlich programmieren willst, nimm ncurses, das benutzt automatisch die terminfo-Datei, die zu dem jeweiligen Terminal passt und ist auch komfortabler und oft viel schneller, besonders auf "echten" seriell angeschlossenen Terminals.

$ man ncurses
$ man infocmp
$ man terminfo

Janka

Posted: 05. Dec 2008 18:16
by pcAlko
Danke,
dann werd ich mich mal mit dem ncurses beschäftigen.

8) pcAlko