Ncurses

Eyl 06, 2013

Ncurses metin tabanlı uç birimler için pencere oluşturmaya ve kullanmaya, işlev tuşlarını kullanmaya ve ekranı farklı renklerde boyamaya imkan veren bir kütüphanedir. Ncurses kütüphanesinin en önemli faydaları pencereler oluşturmak ve onları yönetmek, yazılıma fare ve klavyedeki işlev tuşlarının katkısını sağlamaktır. Ncurses kütüphanesinin kullanılabilir olması için "ncurses.h" başlık dosyasının öncelikle sistemde varolması ve "#include<ncurses.h>" deyimi ile programa eklenmesi gerekir. Derleme sırasında "-lncurses" seçeneğinin gcc derleyicisine eklenmesi gerekmektedir.

Standart Giriş/Çıkış (Standard Input/Output) kütüphanesinin (stdio.h) çıktısının "FILE *" türünde "stdout" adlı akımını temsil etmesi gibi Ncurses kütüphanesi de "WINDOW *" türünde stdscr (Standard Screen-Standart Ekran) adlı akımla temsil edilir. Ek olarak "stdscr" akımının yanında "curscr" adlı başka bir akım daha tanımlanır. "curscr" ekranın o anki görüntüsünü içerir, "stdscr" ise yapılmış yeni işlev çağrıları sonucunda farklı olabilir.

"stdscr" ile "curscr" ekranlarının örtüşmesi refresh (yenile) komutu sayesinde olur. Yenile komutu pencereyi yenileyerek yeni işlevlerin de görüntülenmesini sağlar. Yenile komutu pencerenin sadece değişen satırlarını yeniler geri kalanlarına dokunmaz bu sayede program hız kazanır. Ncurses kütüphanesinin kendine özgü komutları o satırın değiştiğini gösteren bayrağı doldururlar ve bu sayede yenile komutu satırı değiştirir; ancak "stdio.h" kütüphanesine ait komutlar bu işlevi yapmazlar bu nedenle Ncurses kütüphanesi içinde "stdio.h" kütüphanesinin desteklediği komutların kullanılması istenmeyen sonuçlar yaratabilir.

Ncurses kütüphanesinin etkin olduğu ve olmadığı yerlerin belli olmaması durumunda komut kullanımında sorunlar çıkabileceği için kütüphaneyi ilklendirici ve sonlandırıcı komutlar gerekmektedir. "initscr" komutu Ncurses kütüphanesini ilklendirmeyi, "endwin" komutu da Ncurses kütüphanesi sayesinde oluşan akımların sonlanmasını sağlar. "initscr" ve "endwin" komutları arasında Ncurses kütüphanesinin kodları, bu komutlar dışında da standart "giriş/çıkış" kütüphanesinin kodları rahatlıkla kullanılabilir.

Ncurses kütüphanesinin en önemli özelliği ekranda pencereler oluşturmasıdır. "newwin" komutu yeni bir pencere açmak, "subwin" komutu ise açılmış bir pencerede alt pencere oluşturmak için kullanılır. Oluşan alt pencereler ana pencerenin o anki tüm özelliklerini miras olarak alır ama istenilen özellik ana pencereden bağımsız olarak değiştirilebilir. Alt pencereler ana pencereyle aynı karakter dizisini kullandıkları için daha az bellek tüketilmiş olur, bu durumun dezavantajı ise iki pencerenin kesişim yerinde en son yazan pencere bi önceki yazılan karakterin üstüne karakterini yazmış olur.

Ncurses kütüphanesi pencerenin istenilen yerine yazı yazılabilmesi özelliğini fiziksel imlecin yanında mantıksal imlece sahip olmasına borçludur. Mantıksal imleç her açılan pencerede bir tane bulunur ve birden çok pencere olabileceği için birden çok mantıksal imleç de olabilir. Mantıksal imlecin görevi ise pencereye bir yazı yazılacağı zaman yazma işleminin başlayacağı ya da pencereden bir bilgi okunacağı zaman bu bilginin okunacağı kareyi göstermektir. İmleçlerin hareket etme işini yapan işlev "move" ya da "wmove" işlevleridir. İmleçlerin koordinasyonunu ise "leaveok" işlevi gerçekleştirmektedir. İşlev, pencerenin sahip olduğu "_leave" bayrağının değerine göre çalışmaktadır. Eğer "_leave" doğruysa, mantıksal imleç yazma işleminden sonra fiziksel imlecin üzerine getirilir. Eğer "_leave" yanlışsa, fiziksel imleç mantıksal imlecin bulunduğu kareye geri getirilir. Fiziksel imlecin hareket etmesini ise "mvcur" işlevi sağlamaktadır, yalnız bu işlev yenile komutunun yürütüldüğü anda değil, programın kodun yazıldığı satırı okuduğu anda etkili olur.

Ekran üzerinde renkler renk çifti (color pair) olarak yer alırlar, çünkü her karenin bir arkaplan rengi, bir de metin rengi vardır. Ncurses kütüphanesi de programcının kendi renk çiftlerini oluşturmasına olanak sağlar. Renk işlevlerinin kullanılabilir olmaları için "start_color" komutuyla çağırılmaları gerekir. İşlevler çağırıldıktan sonra "init_pair" komutu renk çifti oluşturmamızı sağlar. İşleve aktarılmış olunan ilk parametre olan sayı ile bu renk çifti ilişkilendirilmiş olur. Daha sonra "COLOR_PAIR" makrosuyla bu sayı çağırıldığında istenilen renk kullanılabilir. Ayrıca "attron" ve "wattron" komutları yazılanların pencerede seçilen renk çifti ile yazılmasını sağlar, bu işlevler "attroff" veya "wattroff" çağrıları yapılana kadar ilgili pencereye yazılacak her karakterin belirtilen renk çifti ile yazılmasını sağlarlar. "bkgd" ve "wbkgd" işlevleri çağırıldıkları zaman ise ilgili pencerenin renk çiftini istenen renk çifti olarak değiştirir ve  pencerenin tüm karelerinin artalan rengi ile tüm yazıların rengi otomatik olarak değişir. "box" komutu pencereye kutu içindeymiş görüntüsü verilmesini sağlar. Bu komut sadece pencereyi sınırlayan karelere kutuyu oluşturan karakterleri yazdığı için pencereye yazılan herhangi bir karakter bu kutuların üzerine yazılabilir. Bu durum programın çalışması esnasında istenmeyen görünüme sebep olabilir. Bu durumu önlemek için kutu görünümü eklenilen pencerenin içine "subwin" komutu yardımı ile yeni bir alt pencere eklenmelidir.

Klavyeden fonksiyon tuşlarının pencereyi etkilemesi istenildiğinde pencerenin "use_keypad" bayrağının değerinin doğrulanması gerekir. Bu işlev de "keypad" işlevidir. Fonksiyon tuşlarının değerleri "char" tipinde değişkenden daha büyük olduğu için bu tuşlar "getch" komutu ile alındığında "int" tipinde bir değişkenin içine atanmalıdır.

Ncurses Kütüphanesinde İşlevler aşağıdaki ana başlıklarda toplanabilir:

  • İlklendirme İşlevleri
  • Çıktı İşlevleri
  • Girdi İşlevleri
  • Öznitelikler
  • Pencere İşlevleri
  • Renkler İle İlgili İşlevler
  • Fare İle Etkileşim İşlevleri
  • Ekran düzenleme
  • Çeşitli Özellikler
  • İlklendirme İşlevleri
     
    "raw()" ve "cbreak()" komutları satır önbelleğini etkisizleştirir, bu sayede kullanıcının girdiği karakter önbellekte beklemeden ekrana aktarılır. İki işlev de karakterin yazıldığı anda ekrana yansımasını sağlamaktadır, aralarındaki fark ise duraklatma, kesme ve çıkış için kullanılan karakterlerin programa gönderiliş şeklidir. "cbreak()" komutunda uç birim bu karakterleri herhangi bir karaktermiş gibi sinyallerle alır. "raw()" komutunda ise karakterler herhangi bir sinyal üretilmeden programa yollanır.

    "noecho()" komutu kullanıcı tarafından yazılan karakterlerin ekrana yansıtılmasını önler bu sayede ekrana yazılması istenmeyen karakterler kontrol altına alınmış olur."echo()" işlevi ise karakter yazıldığı zaman ekrana yansıtılmasını sağlar.

    "keypad()" komutu da F1,F2,yön tuşları gibi tuşların program tarafındanalgılanabilmesini sağlar.

    "halfdelay()" kullanıcıdan bellirli bir süre zarfında girdi beklenildiği zaman kullanılabilir. Girilmesi beklenen girdi için zaman aşımı kontrolünü sağlar, zaman aşımına takıldığında "ERR" hatası döndürür.
     
  • Çıktı İşlevleri
     
    "addch()" sınıfı işlevler imlecin bulunduğu konuma tek bir karakter yazar bu karaktere değişik öz nitelikler "|" parametresi yardımıyla verilebilir. Örnek olarak bir karakter kalın yazdırılmak isteniyorsa "addch(karakter|A_BOLD);" komutu yazılmalı eğer hem kalın hem de altı çizili yazdırılmak isteniyorsa "addch(karakter|A_BOLD|A_UNDERLINE)" şeklinde yazılmalıdır.

    "mvaddch()" işlevi yazılan karakteri, imleci verilen konuma götürdükten sonra yazar, "mvaddch(satır,sütun,karakter);" şeklinde yazılır. "waddch()" ve "mvwaddch()"işlevleri de "addch()" ve "mvaddch()" işlevlerinin verilmiş bir pencere için geliştirilmiş makrolardır.

    "printw()" sınıfı işlevler "printf()" işlevi gibi ekrana birden çok karakter yazılmasına olanak sağlar. "printw()" işlevi standart kütüphanedeki "printf()" işlevi ile aynı özelliklere sahiptir. "mvprintw()" işlevi ise imleci belirtilen konuma getirdikten sonra verilen karakterleri yazar. "mvprintw(satır,sütun,"%s",string)"şeklinde yazılır. "wprintw()" ve "mvwprintw()" işlevleri de verilen alt pencerede "printw()" ve "mvprintw()" işlevlerinin yaptıkları işi yaparlar. "vwprintw" komutu da "vprintf() "komutuna benzenmektedir.

    NOT: Yazılacak pencerenin satır ve sütun sayısı bilinmiyorsa "getmaxyx(stdscr,satır,sütun)" işlevi ile "stdscr" penceresinin satır ve sütun sayıları daha önceden "int" türünde tanımlanan "satır" ve "sütun" değişkenlerine atanabilir.

    "addstr()" sınıfı işlevler "addch()" sınıfı işlevlerin tek karakter üzerine yaptığı işlemleri birden çok karakter için yaparlar. "mvaddstr()", "mvwaddstr()", "waddstr()" işlevleri de sırasıyla "mvaddch()", "mvwaddch()" ve "waddch()" işlevlerinin "string" üzerine uygulamalarıdır.
     
  • Girdi İşlevleri
     
    "getch()" sınıfı işlevler uç birimden tek bir karakter okumayı sağlar. Genelde ilklendirme işlevleri ile birlikte kullanılırlar. Örnek olarak "cbreak()" işlevi sayesinde program satır sonu ya da dosya sonu ile karşılaşana kadar değil art arda karakterleri okur, bu sayede performans artışı söz konusu olur. Aynı şekilde "getch()" işlevi ile "noecho()" işlevinin bir arada kullanılması karakterlerin ekrana yazılmasında kontrol sağlamış olur.

    "getstr()" işlevi ise satırsonu, satırbaşı veya dosyasonu karakterini görene kadar "getch()" işlevini art arda tekrarlar. Bu sayede kullanıcının girdiği karakterler topluluğu tutulmuş olur.

    "scanw()" işlevi "stdio.h" kütüphanesinin "scanf()" işlevi ile aynı görevi yapar. "mvscanw()" ise belirtilen konumdan itibaren "scanw()" işlevini başlatır. "wscanw()" ve "mvwscanw()" işlemleri de parametre olarak verilen pencerlerde "scanw()" ve "mvscanw()" işlevlerini gerçekleştiren makrolardır. "vwscanw()" işlevi de "vscanf()" işlevine benzer çalışmaktadır.
     
  • Öznitelikler
     
    Ekrana yazdırılan bir yazının öznitelikleri değiştirilmek istenirse "attron()", "attroff()", "attrset()" ve "attr_get()" gibi işlevlerin kullanılması gerekir."attron()" işlevi birçok özniteliği açar ve "attroff()" işlevi çağırılana kadar o öznitelikleri korur.

    "attron()" ve "attroff()" işlevlerinde paramatre olarak kullanılan bazı öznitelikler aşağıdadır:

      Öznitelik Açıklama  
    A_NORMAL  Normal görüntü (parlaklaştırma yok)
    A_STANDOUT Uçbirimin en iyi parlaklaştırma kipi.
    A_UNDERLINE Alt çizgili
    A_REVERSE  Ters video
    A_BLINK

    Yanıp sönme

    A_DIM   Yarım parlak
    A_BOLD

    Daha fazla parlak ve koyu

    A_PROTECT Korumalı kip
    A_INVIS

    Görünmez veya boş kip

    A_ALTCHARSET İlave karakter kümesi
    A_CHARTEXT

    Bir karakteri açığa çıkarmak için bit maskesi

    COLOR_PAIR(n) Renk çifti numarası n

    Bu parmetreler "|" imleci ile birlikte birleştirilebilir.

    "attron" kendisine parametre olarak verilen özniteliği etkin hale getirir. Pencerenin özniteliklerinin ayarlanmasında "attrset()" işlevi kullanılır. "attr_get()" işlevi ise o anki özniteliğin ve renk çiftinin bilgisini alır. "stdscr" dışında bir pencerede çalışılıyorsa yukarıdaki "attr" ile başlayan işlevlerin "wattr" şeklinde başlatılması gerekir.
     
  • Pencere İşlevleri
     
    Ncurses kütüphanesinde pencere oluşturmak için "newwin()" komutu kullanılır. Bu sayede program pencereyi değiştirecek yapılar için bellekten yer ayırır. Pencereyi silmek içinse "delwin()" komutu kullanılır. "box()" komutu da oluşturulan pencerenin ilk ve son karakterlerini çerçeve karakterleri ile değiştirir. "sub_win()" komutu alt pencerler açılmasını sağlar.
     
  • Renkler İle İlgili İşlevler
     
    "start_color()" işlevi ile pencere üzerindeki renklendirme kodları ilklendirilmiş olur. Pencereleri renklendirirken artalan ve karakter renkleri tanımlanmalıdır. Bu tanımlama ise "init_pair()" işlevi ile olur, bu işleve "COLOR_RED" vb. komutları parametre olarak eklenmelidir. Örneğin "init_pair(1,COLOR_RED, COLOR_BLACK)" şeklinde yazılan işlev, karakteri kırmızı, arka fonu da siyah olarak renklendirir. Kullanılmak istenildiğinde de "1" "COLOR_PAİR()" işlevinin içine parametre olarak yazılır ve öznitelik fonksiyonlarında parametre olarak kullanılarak pencere renklendirilir. Örneğin "attron(COLOR_PAİR(1))" yazıldığı andan itibaren pencere siyah olup yazılan karakterler kırmızı olacaktır. Bu durum "attroff(COLOR_PAİR(1))" yazılana kadar devam edecektir.

    Ncurses kütüphanesi aşağıda tablolanmış 8 adet rengi desteklemektedir:

    Renk Kodu Açıklama  
    COLOR_BLACK   0 (Siyah)
    COLOR_RED 1 (Kırmızı)
    COLOR_GREEN 2 (Yeşil)
    COLOR_YELLOW  3 (Sarı)
    COLOR_BLUE 

    4 (Mavi) 

    COLOR_MAGENTA 5 (Mor)
    COLOR_CYAN

    6 (Cam Göbeği)

    COLOR_WHITE 7 (Beyaz)

    Uç birimin renk özniteliklerine sahip olup olmadığını öğrenmek için "has_colors()" işlevi kullanılabilir. Uçbirimin renk desteği yoksa işlev "FALSE" değerini döner. Ncurses kütüphanesinde kullanılan bu 8 renge "init_color()" işlevi içine rgb(red-kırmızı,green-yeşi,blue-mavi) değerleri parametre olarak eklenerek tonlandırma yapılabilir. Uç birimin renk tonunu ayarlama özelliği yoksa "can_change_color()" işlevi "ERR" geri döndürür. Örnek olarak "init_color(COLOR_BLUE,500,400,300)" işlevinde mavi rengin rgb ton ayarları uç birim tarafından sırası ile "500-400-300" şeklinde ayarlanır.renk içeriğini bulmak için "color_content" renk çifti içeriğini bulmak için ise "pair_content()" işlevleri kullanılır.
     
  • Fare İle Etkileşim İşlevleri
     
    Fare ile verilen komutları etkinleştirmek için "mousemask()" işlevi kullanılmalıdır. "ALL_MOUSE_EVENTS" bit maskesi parametre olarak "mousemask()" işlevinde kullanıldığı zaman fare tarafından gönderilen bütün komutlar program tarafından alınır.

    Ayrıca aşağıdaki parametreler kullanılarak teker teker komutlar fareden alınabilir:

      İsim Açıklama  
    BUTTON1_PRESSED fare tuşu 1 basılı
    BUTTON1_RELEASED fare tuşu 1 serbest
    BUTTON1_CLICKED fare tuşu 1 tıklandı
    BUTTON1_DOUBLE_CLICKED  fare tuşu 1 iki kere tıklandı
    BUTTON1_TRIPLE_CLICKED

    fare tuşu 1 üç kere tıklandı 

    BUTTON2_PRESSED. fare tuşu 2 basılı
    BUTTON2_RELEASED

    fare tuşu 2 serbest

    BUTTON2_CLICKED fare tuşu 2 tıklandı
    BUTTON2_DOUBLE_CLICKED

    fare tuşu 2 iki kere tıklandı

    BUTTON2_TRIPLE_CLICKED fare tuşu 2 üç kere tıklandı
    BUTTON3_PRESSED

    fare tuşu 3 basılı

    BUTTON3_RELEASED fare tuşu 3 serbest
    BUTTON3_CLICKED

    fare tuşu 3 tıklandı

    BUTTON3_DOUBLE_CLICKED fare tuşu 3 iki kere tıklandı
    BUTTON3_TRIPLE_CLICKED fare tuşu 3 üç kere tıklandı
    BUTTON4_PRESSED fare tuşu 4 basılı
    BUTTON4_RELEASED

    fare tuşu 4 serbest

    BUTTON4_CLICKED fare tuşu 4 tıklandı
    BUTTON4_DOUBLE_CLICKED

    fare tulu 4 iki kere tıklandı

    BUTTON4_TRIPLE_CLICKED fare tuşu 4 üç kere tıklandı
    BUTTON_SHIFT

    tuş durumu değiştiğinde shift'e basılıydı

    BUTTON_CTRL tuş durumu değiştiğinde control'e basılıydı
    BUTTON_ALT

    tuş durumu değiştiğinde alt'a basılıydı

    ALL_MOUSE_EVENTS  tüm tuş durumu değişikliklerini bildir
    REPORT_MOUSE_POSITION

    fare hareketini bildir


    Fare tuşlarından gelen komutlar program tarafından "getch()" türü işlevler ile "KEY_MOUSE" değerine döndürülür. Bu değer daha sonra "getmouse()" komutu ile alınabilir. "bstate" değişkeni de farenin tuş durumunu verir örneğin "if()" işlevinde "even.bstate & BUTTON_PRESSED" şartı yazılırsa farenin sağ tuşuna basıldığı anda "if()" işlevine bağlı komut satırları aktif hale geçer. Fare koordinatlarını ekran koordinatlarına dönüştürmek için "mouse_trafo()" ve "wmouse_trafo()" işlevleri kullanılabilir. "mouseinterval" işlevi ise iki tıklama arasında geçen süreyi saniyenin binde biri cinsinden ayarlar. Öntanımlı değer saniyenin beşte biridir.
     
  • Ekran Düzenleme
     
    İmlecin o anki koordinatlarını bulmak için "x" ve "y" koordinat değerlerine atanacak değişkenler "getyx()" makrosuna parametre olarak atanmalıdır. Örneğin "getyx(win,y,x)" şeklinde kullanılırsa "win" isimli pencerede imlecin o anda bulunduğu koordinatlardaki ordinat degeri "y" değişkenine, apsis değeri de "x" değişkenine atanacaktır. Alt pencerler kullanan bir programda iç pencerenin başlangıç koordinatlarını dıştaki pencereye göre bulmak için "getparyx()" işlevi kullanılır. "getbegyx()" işlevi ise o anki pencerenin baslangıç koordinatlarını verir. "getmaxyx()" işlevi ise pencerenin en büyük koordinat değerlerini bulur. "scr_dump()" işlevi ekranın o anki konumuyla ilgili bilgileri kendisine parametre olarak verilen dosyaya yazar. "scr_restore" işlevi "scr_dump()" işlevinin verileri yazmış olduğu dosyadan ekranın durumunu geri yükler. "putwin()" işlevi "scr_dump()" işlevinin bir benzerini pencere için gerçekleştirir ve pencerenin komunumu yazıldığı dosya "getwin()" işlevine parametre olarak gösterilerek geri yüklenebilir. "copywin()" işlevi parametre olarak verilen iki pencereden birinin durumunu diğerine kopyalamayı sağlar.
     
  • Çeşitli Özellikler
     
    "curs_set()" işlevine "0" parametresi verildiği zaman imleci görünmez yapar, "1" parametresi imleci normal olarak gösterir (yanıp-söner) "2" parametresi ile birlikte de imleci çok görünür duruma getirir. Ncurses kipinden programın belli bir kısmında programdan çıkılması gerektiğinde öncelikle "def_prog_mode()" işlevi çağrılarak yapılanlar kaydedilmeli daha sonra "endwin()" komutu ile Ncurses kipinden çıkılmalıdır. Ncurses kipine geri dönmek için "reset_prog_mode()" işlevi çağırılmalı bu komut sayesinde "def_prog_mode()" ile kaydedilmiş kipe geri dönülür. "refresh()" işlevi ile yenileme yapıldıktan sonra tekrar Ncurses kipi ile programlamaya devam edilebilir. ACS(alternative character set-seçimlik karakter kümesi) değiskenleri de "printw()" işlevi ile kullanılabilir.

    Bazı seçimlik karakterler ve "printw()" işlevi ile kullanımları aşağıdaki gibidir:

     "ACS" değişkeni ve printw işlevi ile kullanımı
    printw("Sol üst köşe "); addch(ACS_ULCORNER); printw("\n");
    printw("Sol alt köşe "); addch(ACS_LLCORNER); printw("\n");
    printw("Sağ alt köşe "); addch(ACS_LRCORNER); printw("\n");
    printw("Sağı dönük T "); addch(ACS_LTEE); printw("\n");  
    printw("Sola dönük T "); addch(ACS_RTEE); printw("\n");
    printw("Yukarı dönük T "); addch(ACS_BTEE); printw("\n");
    printw("Aşağı dönük T "); addch(ACS_TTEE); printw("\n");
    printw("Yata çizgi "); addch(ACS_HLINE); printw("\n");
    printw("Dikey çizgi "); addch(ACS_VLINE); printw("\n");
    printw("Büyük artı "); addch(ACS_PLUS); printw("\n");
    printw("Tarama satırı 1 "); addch(ACS_S1); printw("\n");
    printw("Tarama satırı 3 "); addch(ACS_S3); printw("\n");
    printw("Tarama satırı 7 "); addch(ACS_S7); printw("\n");
    printw("Tarama satırı 9 "); addch(ACS_S9); printw("\n");
    printw("Eşkenar dörtgen "); addch(ACS_DIAMOND); printw("\n");
    printw("Noktalı onay kutusu "); addch(ACS_CKBOARD); printw("\n");
    printw("Derece sembolü "); addch(ACS_DEGREE); printw("\n");
    printw("Artı/Eksi işareti "); addch(ACS_PLMINUS); printw("\n"); 
    printw("Madde imi "); addch(ACS_BULLET); printw("\n");
    printw("Solu gösteren ok "); addch(ACS_LARROW); printw("\n");
    printw("Sağı gösteren ok "); addch(ACS_RARROW); printw("\n");
    printw("Aşağı gösteren ok "); addch(ACS_DARROW); printw("\n");
    printw("Yukarı gösteren ok "); addch(ACS_UARROW); printw("\n");  
    printw("Diyez işareti "); addch(ACS_BOARD); printw("\n");
    printw("İçi boş kare "); addch(ACS_LANTERN); printw("\n"); 
    printw("İçi dolu kare blok "); addch(ACS_BLOCK); printw("\n");
    printw("Küçük/Eşit işareti "); addch(ACS_LEQUAL); printw("\n");
    printw("Büyük/Eşit işareti "); addch(ACS_GEQUAL); printw("\n");
    printw("Pi "); addch(ACS_PI); printw("\n");
    printw("Eşit değil"); addch(ACS_NEQUAL); printw("\n");
    printw("UK ound sembolü "); addch(ACS_STERLING); printw("\n");