From: Serdar Koylu (serdarkoylu@fisek.com.tr)
Date: Fri 12 Sep 2003 - 13:32:48 EDT
Selamlar..
11 Sep 2003 20:55 EEST tarihinde yazmışsınız:
>
> > Eski DOS/Windows programcilari...
>
> ** Bu ifadeye genel olarak katiliyorum. Yalniz,
> Linux konsol icin konu bence gorundugu kadar
> basit degil. Siz, diger terminal cesitlerinden
> CIKARSAMA yaparak Linux konsol icin de bunun
> gecerli olabilecegini varsaymissiniz sanirim.
Elbette. FrameBuffer, xterm vs. bir suru sey var. Ama burada sizin hangi uygulamayi yazdiginiz aslolan konu. Yazdiginiz program icin O/S kullaniyor olmanizin gayesi malum. Bu tur donanima yonelik isleri yaptirmak. Eger uygulama programi yaziyorsaniz donanimla dogrudan ugrasmaniz programinizin elini kolunu baglar, oylece kalirsiniz ilerde. Sizin eriseceginiz fonksiyonlar en fazla glibc icinde size sunulan man 3 ve 2 ile ulasabildiklerinizdir.
> Asagidaki satirlar Linux'un "resizecons" komutunun
> man sayfasinin baslangicindan :
>
> The resizecons command tries to change the videomode of
> the console. There are several aspects to this: (a) the
> kernel must know about it, (b) the hardware must know
> about it, (c) user programs must know about it, (d) the
> console font may have to be adapted.
>
> Yani konunun ;
>
> * Kernel boyutu var
> * Grafik karti boyutu var (register duzeyinde)
> * Fontla ilgili boyutu var
> * stty, termcap/terminfo boyutu var (cols 132)
> * O an konsolda calismakta olan uygulama
> programlarinin duruma uydurulmasi var
Iste bir uygulama programinin bunlari asmasi gerekiyor ki, bu programi bir uygulama olmaktan cikarir.
> Eger zamaniniz varsa ve onerdiginiz yontemi
> (ozellikle Linux konsol icin) komut bazinda
> somutlastirip, deneyip, sonucunu gorup, listeye
> yazarsaniz seviniriz. (En azindan ben ve Burak
> arkadasim sevinecegiz :)
Sizi sevindirmek benide sevindirir. ama bu defa uzebilirim belki :(
Linux kernelin console isini goren kodu /usr/src/linux/drivers/char/console.c olmasi lazim. Bir dakika bekleyin acip bakayim, hala oylemi duruyor ?
Hahh.. Evet aynen oyle duruyor:
for (i=0; i<=npar; i )
if (ques) switch(par[i]) { /* DEC private modes set/reset */
case 1: /* Cursor keys send ^[Ox/^[[x */
if (on_off)
set_kbd(decckm);
else
clr_kbd(decckm);
break;
case 3: /* 80/132 mode switch unimplemented */
deccolm = on_off;
#if 0
(void) vc_resize(video_num_lines, deccolm ? 132 : 80);
/* this alone does not suffice; some user mode
utility has to change the hardware regs */
#endif
break;
Bu setmode rutini. Goruldugu uzere Linux console setmode resize modunu desteklemiyor. Hatta bunu yapan bir bolum yazilmis ve bilhassa undef edilmis. Neden ? Cunku cesitli donanimlar cesitli sekillerde hic olmadik uyumsuzluklar cikarabiliyor.
Orada da yazdigi gibi bazi user space utility'ler kullanip bu isi cozebilirsiniz. Ama en basitinden UTF-8 destegi bile size olmadik dertler cikarabilir. Dahasi yazdiginiz makineden baska bir makinede calisabilir olmasi cok zor olur.
FrameBuffer moduna gecirebilirsiniz sistemi. Hatta X Server uzerinden dogrudan da yapabilirsiniz KDE vs. kullanmadan. Bunlar cok daha makul yontemler. Hemde Uygulama olarak yapmaniz gereken bu termcap dosyasinda varsa co#132 icin komut dizisini bulmaniz ve ekrana yazmaniz. Yoksa, yapilmasi gereken baska bir sey yokmu ? IOCTL'leri deneyebilirsiniz. Ama tavsiye etmem pek fazla.. Buyrun putty uzerinden resizecols ne yapabiliyor:
[root@kale char]# resizecons --help
Usage: resizecons COLSxROWS
resizecons COLS ROWS
resizecons -lines ROWS, with ROWS one of 25, 28, 30, 34, 36, 40, 44, 50, 60
[root@kale char]# resizecons 132 25
resizecons: bad number of arguments
[root@kale char]#
Hadi stty deneyelim:
stty cols 132
Hic bir sey yok.. Pencere ayni kaliyor, 80. kolondan sonrasi ortada yok :))
Ayni kod icinde vc_resize gibi bir fonksiyon bulacaksiniz. Bu fonksiyon fiziksel terminali resize etmez, vt'yi yani sanal terminali fiziksel terminal boyutlarina getirir. Yani siz fiziksel terminali bir sekilde ayarladiktan sonra bu fonksiyonla console'u ayarlarsiniz.
> Ben daha once bu is icin termcap/terminfo
> yontemlerini inceledim, yeterince zaman ayirdigimi
> dusunuyorum. Ama olmadi. Tabii ben becerememis de
> olabilirim. O yuzden sizden somut bir oneri gelirse,
> bunu denemek istiyorum. (Hem de Slackware'de :^))
Somut oneri nispeten kolay, hepsinin basinda bu termcap ile bogusmak bir derttir. ncurses gibi bir kutuphane kullanin en basta.. Linux terminali API uzerinden resize etmeye calismayin. Uygulamanizin yarin ssh uzerinden, telnet uzerinden vs. calismada sorun yasamasini istemiyorsaniz elbette. En guzeli virtual ekran olusturmaktir. Scroll fonksiyonlari ve ekrani saga sola kaydirma.. Ama bu isi birakip kacmak. Bir digeride mesela ANSI 3.64 veya VT220-w/VT200-w emulasyonu yapan bir program kullanmak olabilir.
Eger, yok biz illada TERM=linux iken konsolu resize edecegiz diyorsaniz acariz beraberce, linux/console.h ve digerlerini API isine bulasiriz. Ama bu bence aklinizdan cikarmaniz gereken sey. Ozetle:
Programiniz, telnet, ssh, framebuffer, xterm, linux term veya gidip bir vt220 uzerinde calisabilir. Bunu unutmayin. Bunlarin biri icin olan API cagrisi digeri icin garantili degildir. Dahasi dogal Linux terminali bir vt102 den ibarettir ki resize cagrilarini desteklemez. Sonucta uygulamaniz icinden bu tur bir sey yapmaya cikmaniz maceraya atilmak olabilir..
Saygi ve sevgiler..