· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
NCURSES-Programming-HOWTO

NCURSES Programming HOWTO




ù ¹ø¿ªÀÌ¶ó ¸¹ÀÌ ¹ÌÈíÇÕ´Ï´Ù ¸ðÀÚ¶õ Á¡ÀÌ ÀÖÀ¸¸é ÁöÀûÇØ Áֽñ⠹ٶø´Ï´Ù. --gsong


¹ø¿ª gsong



ÀÛ¼º Pradeep Padala



#!
 
v1.7.1, 2002-06-25
Revision History                                                             
Revision 1.7.1         2002-06-25          Revised by: ppadala               
Added a README file for building and instructions for building from source.  
Revision 1.7           2002-06-25          Revised by: ppadala               
Added "Other formats" section and made lot of fancy changes to the programs. 
Inlining of programs is gone.                                                
Revision 1.6.1         2002-02-24          Revised by: ppadala               
Removed the old Changelog section, cleaned the makefiles                     
Revision 1.6           2002-02-16          Revised by: ppadala               
Corrected lot of spelling mistakes, added ACS variables section              
Revision 1.5           2002-01-05          Revised by: ppadala               
Changed structure to present proper TOC                                      
Revision 1.3.1         2001-07-26          Revised by: ppadala               
Corrected maintainers paragraph, Corrected stable release number             
Revision 1.3           2001-07-24          Revised by: ppadala               
Added copyright notice(LDP license) to main document, Put copyright notice   
(GPL) for programs as well, Corrected printw_example.                        
Revision 1.2           2001-06-05          Revised by: ppadala               
Incorporated ravi's changes. Mainly to introduction, menu, form, justforfun  
sections                                                                     
Revision 1.1           2001-05-22          Revised by: ppadala               
Added "a word about window" section, Added scanw_example.                    



ÀÌ ¹®¼­´Â ncurses ¿Í ±× ÀڸжóÀ̺귯¸®·Î ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â µ¥ ÀÖ¾î "All in One" °¡À̵带 ÁöÇâÇϰí ÀÖ´Ù. °£´ÜÇÑ "Hello World" ÇÁ·Î±×·¥ ºÎÅÍ º¸´Ù ´õ º¹ÀâÇÑ Æû ó¸® ±îÁö ´Ù·é´Ù. ncurses ÀÇ ¼±Çà°æÇèÀº ÇÊ¿äÄ¡ ¾Ê´Ù. ÀÌ ¹®¼­ÀÇ ÃֽйöÀüÀº [http]³ªÀÇ À¥ »çÀÌÆ® ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. Mp_padala_at_yahoo.com ÀÌ ÁÖ¼Ò·Î ºñÆòÀ» º¸³»ÁÖ±æ ¹Ù¶õ´Ù.

¸ñÂ÷

1 NCURSES Programming HOWTO
1.1 Introduction
1.1.1 NCURSES ¶õ ¹«¾ùÀΰ¡?
1.1.2 NCURSES ·Î ¹«¾ùÀ» ÇÒ ¼ö Àִ°¡?
1.1.3 ¾îµð¼­ ±×°ÍÀ» ±¸Çϴ°¡?
1.1.4 ¹®¼­ÀÇ ¸ñÀû ¹× ¹üÀ§
1.1.5 ÇÁ·Î±×·¥µé¿¡ ´ëÇØ
1.1.6 ¹®¼­ÀÇ ´Ù¸¥ Æ÷¸Ëµé
1.1.6.1 tldp.org ¿¡ ÀÖ´Â Æ÷¸Ëµé
1.1.6.2 ¼Ò½º·Î ºÎÅÍ ºôµåÇϱâ
1.1.7 Å©·¹µðÆ®
1.1.8 Wish List
1.1.9 Copyright
1.2 The Hello World ÇÁ·Î±×·¥
1.2.1 Ncurses ¶óÀ̺귯¸®¿Í °°ÀÌ ÄÄÆÄÀÏ Çϱâ
1.2.2 ºÐ¼®
1.2.2.1 initscr() ¿¡ ´ëÇØ
1.2.2.2 ½Å±âÇÑ refresh()
1.2.2.3 endwin() ¿¡ ´ëÇØ
1.3 The Gory Details
1.4 ÃʱâÈ­
1.4.1 raw() µîÀÇ ÃʱâÈ­ ÇÔ¼ö¿¡ ´ëÇØ¼­
1.4.2 raw() ¿Í cbreak()
1.4.3 echo() ¿Í noecho()
1.4.4 keypad()
1.4.5 halfdelay()
1.4.6 ±×¿Ü Àâ´ÙÇÑ ÃʱâÈ­ ÇÔ¼öµé
1.4.7 ¿¹Á¦
1.5 À©µµ¿ì¿¡ °üÇØ
1.6 printw() °°Àº Ãâ·Â ÇÔ¼ö¿¡ ´ëÇØ
1.6.1 addch() ·ùÀÇ ÇÔ¼öµé
1.6.2 mvaddch(), waddch() ¿Í mvwaddch()
1.6.3 printw() ·ùÀÇ ÇÔ¼öµé
1.6.3.1 printw() ¿Í mvprintw
1.6.3.2 wprintw() ¿Í mvwprintw
1.6.3.3 vwprintw()
1.6.3.4 °£´ÜÇÑ printw ¿¹Á¦
1.6.4 addstr() ·ùÀÇ ÇÔ¼öµé
1.6.5 ÁÖÀÇ »çÇ×
1.7 scanw() °°Àº ÀÔ·ÂÇÔ¼ö¿¡ ´ëÇØ
1.7.1 getch() ·ùÀÇ ÇÔ¼öµé
1.7.2 scanw() ·ùÀÇ ÇÔ¼öµé
1.7.2.1 scanw() ¿Í mvscanw
1.7.2.2 wscanw() ¿Í mvwscanw()
1.7.2.3 vwscanw()
1.7.3 getstr() ·ùÀÇ ÇÔ¼öµé
1.7.4 ¸î¸î ¿¹Á¦
1.8 ¼Ó¼º
1.8.1 ¼¼ºÎ »çÇ×
1.8.2 attron() ´ë attrset()
1.8.3 attr_get()
1.8.4 attr_ ÇÔ¼öµé
1.8.5 wattr ÇÔ¼öµé
1.8.6 chgat() ÇÔ¼öµé
1.9 À©µµ¿ì ÇÔ¼öÀÇ ¸ðµç °Í
1.9.1 °³°ý
1.9.2 À©µµ¿ì°¡ ÀÖÀ¸¶ó !!!
1.9.3 ¼³¸í
1.9.4 ¿¹Á¦ÀÇ ´Ù¸¥ ºÎºÐ
1.9.5 ´Ù¸¥ Å׵θ® ÇÔ¼öµé
1.10 »ö»ó¿¡ ´ëÇØ¼­
1.10.1 °³°ý
1.10.2 »ö»ó Á¤ÀÇ ¹Ù²Ù±â
1.10.3 »ö»ó °ª
1.11 Ű ÀÔ·Â ´Ù·ç±â. Æã¼ÇŰ, ¹æÇâŰ µîÀ» ¾î¶»°Ô ÀԷ¹޴°¡.
1.11.1 °³°ý
1.11.2 °£´ÜÇÑ Å° »ç¿ë ¿¹Á¦
1.12 ¸¶¿ì½º ó¸®Çϱâ
1.12.1 °³°ý
1.12.2 À̺¥Æ® ¹Þ¾Æ¿À±â
1.12.3 ÀüºÎ ½Ç½ÀÇØº¸ÀÚ
1.12.4 ±×¿Ü Àâ´ÙÇÑ ÇÔ¼öµé
1.13 È­¸é Á¦¾î
1.13.1 getyx() ÇÔ¼öµé
1.13.2 È­¸é ´ýÇÁ
1.13.3 À©µµ¿ì ´ýÇÁ
1.14 ±×¿Ü ±â´Éµé
1.14.1 curs_set()
1.14.2 ÀϽÃÀûÀ¸·Î curses ¸ðµå ³ª°¡±â
1.14.3 ACS_ º¯¼öµé
1.15 ±×¿Ü ¶óÀ̺귯¸®µé
1.16 ÆÐ³Î ¶óÀ̺귯¸®
1.16.1 °³°ý
1.16.2 ÆÐ³Î ¶óÀ̺귯¸®¿Í ÄÄÆÄÀÏ Çϱâ
1.16.3 ÆÐ³Î À©µµ¿ì Ž»ö
1.16.4 »ç¿ëÀÚ Æ÷ÀÎÅÍ ¾²±â
1.16.5 ÆÐ³Î À̵¿ ¹× Å©±â º¯°æ
1.16.6 ÆÐ³Î ¼û±â±â ¹× º¸¿©ÁÖ±â
1.16.7 panel_above() ¿Í panel_below() ÇÔ¼öµé
1.17 ¸Þ´º ¶óÀ̺귯¸®
1.17.1 °³°ý
1.17.2 ¸Þ´º ¶óÀ̺귯¸®¿Í ÄÄÆÄÀÏ Çϱâ
1.17.3 Menu Driver: ¸Þ´º ½Ã½ºÅÛÀÇ Å« ÀϲÛ
1.17.4 ¸Þ´º À©µµ¿ì
1.17.5 ¸Þ´º ½ºÅ©·Ñ Çϱâ
1.17.6 ¿©·¯ ¿­À» °¡Áø ¸Þ´º
1.17.7 ¿©·¯ °ªÀ» °¡Áø ¸Þ´º
1.17.8 ¸Þ´º ¿É¼Çµé
1.17.9 À¯¿ëÇÑ »ç¿ëÀÚ Æ÷ÀÎÅÍ
1.18 Æû ¶óÀ̺귯¸®
1.18.1 °³°ý
1.18.2 Æû ¶óÀ̺귯¸®¿Í ÄÄÆÄÀÏ Çϱâ
1.18.3 ÇÊµå °¡Áö°í ³î±â
1.18.3.1 ÇʵåÀÇ À§Ä¡¿Í Å©±â °¡Á®¿À±â
1.18.3.2 Çʵå À̵¿Çϱâ
1.18.3.3 Çʵå Á¤·Ä
1.18.3.4 Çʵå Ç¥Çö ¼Ó¼º
1.18.3.5 ÇÊµå ¿É¼Ç ºñÆ®
1.18.3.6 ÇÊµå »óÅÂ
1.18.3.7 ÇÊµå »ç¿ëÀÚ Æ÷ÀÎÅÍ
1.18.3.8 Å©±â°¡ º¯ÇÏ´Â Çʵå
1.18.4 Æû À©µµ¿ì
1.18.5 Çʵå ÀÎÁõ
1.18.6 Æû µå¶óÀ̹ö: Æû ½Ã½ºÅÛÀÇ Å« ÀϲÛ
1.18.6.1 ÆäÀÌÁö Ž»ö ¸®Äù½ºÆ®
1.18.6.2 Çʵ尣 Ž»ö ¸®Äù½ºÆ®
1.18.6.3 ÇÊµå ³» Ž»ö ¸®Äù½ºÆ®
1.18.6.4 ½ºÅ©·Ñ ¸®Äù½ºÆ®
1.18.6.5 ¿¡µðÆ® ¸®Äù½ºÆ®
1.18.6.6 Order Requests
1.18.6.7 ¾îÇø®ÄÉÀÌ¼Ç ¸í·Éµé
1.19 Åø°ú À§Á¬ ¶óÀ̺귯¸®µé
1.19.1 CDK (Curses Development Kit)
1.19.1.1 À§Á¬ ¸®½ºÆ®
1.19.1.2 ¸î¸î ¸Å·ÂÀûÀÎ ±â´Éµé
1.19.1.3 °á·Ð
1.19.2 ´ÙÀ̾ó·Î±×
1.19.3 Perl Curses Modules CURSES::FORM and CURSES::WIDGETS
1.20 Just For Fun !!!
1.20.1 The Game of Life
1.20.2 Magic Square
1.20.3 Towers of Hanoi
1.20.4 Queens Puzzle
1.20.5 Shuffle
1.20.6 Typing Tutor


1.1 Introduction


¿¹Àü ¿ø°Å¸® Å͹̳ÎÀº ÄÄÇ»ÅͷκÎÅÍ ¶³¾îÁø ä ½Ã¸®¾ó ÄÉÀ̺íÀ» ÅëÇØ ¿¬°áµÇ¾î ÀÖ¾ú´Ù. ±× Å͹̳ε鿡 ¾î¶² ƯÁ¤ÇÑ ¹ÙÀÌÆ®µéÀ» º¸³¿À¸·Î½á Å͹̳ÎÀ» ¼³Á¤ÇÒ ¼ö ÀÖ¾ú´Ù. Å͹̳ÎÀÇ ÀÌ ¸ðµç ±â´Éµé (Ä¿¼­¸¦ »õ À§Ä¡·Î ¿Å±â°Å³ª, È­¸éÀÇ ÀϺθ¦ Áö¿ì°Å³ª, È­¸éÀ» ½ºÅ©·Ñ Çϰųª, ¸ðµå¸¦ ¹Ù²Ù°Å³ª, È­¸éÀÇ ÇüÅÂ, »ö, ¹à±â, ±ôºýÀÓ, ¹ØÁÙ, reverse video µîÀ» ¼³Á¤ÇÏ´Â µî) Àº ÈçÈ÷ escape sequences ¶ó ºÒ¸®´Â ¹ÙÀÌÆ®µé¿¡ ÀÇÇØ¼­ ÀÌ·ïÁ³´Ù. ÀÌ ¹ÙÀÌÆ®µéÀº escape(0x1B) ¹®ÀÚ·Î ½ÃÀÛÇϱ⠶§¹®¿¡ escape sequences ¶ó ºÒ¸°´Ù. ½ÉÁö¾î ¿À´Ã³¯¿¡µµ ÀûÀýÇÑ ¿¡¹Ä·¹ÀÌ¼Ç ±â´ÉÀÌ ÀÖÀ¸¸é, ¿ì¸®´Â escape sequences ¸¦ ¿¡¹Ä·¹ÀÌÅÍ¿¡ º¸³»¾î Å͹̳Πâ¿¡¼­ ¶È°°Àº È¿°ú¸¦ º¼ ¼ö ÀÖ´Ù. Ū ¸¸¾à ´ç½ÅÀÌ Ä÷¯·Î ÇÑ ÁÙÀ» Âï°í ½Í´Ù¸é, ´ÙÀ½À» ´ç½ÅÀÇ Äֿܼ¡¼­ ½ÇÇàÇØº¸¾Æ¶ó.

echo "^[[0;31;40mIn Color"


^ ¿Í [ ÀÇ µÎ°³ÀÇ ¹®ÀÚó·³ º¸À̴ ù¹øÂ° ij¸¯ÅÍ´Â À̽ºÄÉÀÌÇÁ ij¸¯ÅÍ ÀÌ´Ù. Àú°ÍÀ» Âï¾îº¼·Á¸é CTRL+V۸¦ ´©¸£°í³ª¼­ ESC ۸¦ ´©¸£¸é µÈ´Ù. ´Ù¸¥ ¸ðµç ¹®ÀÚµéÀº ÀϹÝÀûÀ¸·Î ÀÔ·ÂÇÏ´Â °Í°ú °°´Ù. ±×¸®°í ´ç½ÅÀº ¹®ÀÚµéÀÎ ºÓÀº»öÀ¸·Î ÂïÈ÷´Â °É º¸°Ô µÉ °Í ÀÌ´Ù. µû·Î º¯°æÀ» ÇÏÁö ¾ÊÀ¸¸é °è¼Ó ±× »óÅÂÀ̰í, ¿ø·¡´ë·Î µ¹¾Æ°¥·Á¸é ´ÙÀ½À» ÀÔ·ÂÇ϶ó.

echo "^[[0;37;40m"


ÀÚ, Àú ¸¶¼ú°°Àº ij¸¯Å͵éÀÌ ¹» ÀǹÌÇÒ±î? ÀÌÇØÇϱ⠾î·Á¿î°¡? °Ô´Ù°¡ Àú ¹®ÀÚµéÀº Å͹̳εéÀÌ ´Ù¸£´Ù¸é ¶Ç ´Þ¶óÁú ¼öµµ ÀÖ´Ù. ±×·¡¼­ UNIX ÀÇ µðÀÚÀ̳ʵéÀº termcap À̶ó ºÒ¸®´Â ¸ÅÄ¿´ÏÁòÀ» ¹ß¸íÇß´Ù. ±×°ÍÀº °¢°¢ÀÇ Å͹̳εéÀÇ ±â´É°ú °Å±â¿¡ µû¸¥ ƯÁ¤ÇÑ È¿°ú¸¦ ³»±âÀ§ÇÑ escape sequence µéÀ» ³ª¿­ÇØ ³õÀº ÆÄÀÏÀÌ´Ù. ÈÄ¿¡ À̰ÍÀº terminfo ¿¡ ÀÇÇØ ´ëüµÇ¾ú´Ù. ÀÌ ¸ÅÄ¿´ÏÁòÀÇ °³³äÀ» °£·«È÷ ¾ê±âÇÏÀÚ¸é, ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¥¿¡¼­ terminfo µ¥ÀÌÅͺ£À̽º¿¡ Äõ¸®¸¦ ÇÏ¿© Å͹̳ÎÀ̳ª Å͹̳Π¿¡¹Ä·¹ÀÌÅÍ¿¡ º¸³¾ control ¹®ÀÚµéÀ» ¾ò¾î¿À°Ô ÇÏ´Â °ÍÀÌ´Ù.


1.1.1 NCURSES ¶õ ¹«¾ùÀΰ¡?


¾Æ¸¶ ´ç½ÅÀº ÀÌ ¸ðµç ±â¼úÀûÀΠȾ¼öµéÀÌ ¹» ¾ê±âÇϰíÀÚ ÇÏ´Â °ÍÀÎÁö ±Ã±ÝÇÒ °ÍÀÌ´Ù. ¾Õ¼­¿¡¼­ ¸ðµç ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¥Àº terminfo ¸¦ Äõ¸®Çϰí ÇÊ¿äÇÑ ÀϵéÀ» ¼öÇàÇÑ´Ù°í ¾ê±âÇß¾ú´Ù(control ¹®ÀÚµéÀ» º¸³»´Â ÀÏ µîµî.). ÀÌ º¹ÀâÇÑ °ÍÀ» ´Ù·ç´Â °ÍÀº ±Ý¹æ ¾î·Á¿öÁö¸ç ÀÌ·Î ÀÎÇØ 'CURSES' °¡ ź»ýÇÏ°Ô µÈ´Ù. Curses ´Â "cursor optimization"À» Àç¹Õ°Ô ¹ßÀ½ÇÑ °ÍÀÌ´Ù. Curses ¶óÀ̺귯¸®´Â raw Å͹̳ÎÄÚµå À§¿¡ wrapper ¸¦ Çü¼ºÇϰí ÀÖÀ¸¸ç, »ó´çÈ÷ À¯¿¬Çϰí È¿À²ÀûÀÎ API(Application Programing Interface) ¸¦ Á¦°øÇÑ´Ù. ±×°ÍÀº Ä¿¼­¸¦ ¿òÁ÷À̰ųª, À©µµ¿ì¸¦ »ý¼ºÇϰí, »ö±òÀ» ¸¸µé°í, ¸¶¿ì½º¸¦ °¡Áö°í ³ë´Â°Í µîÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¥Àº ±× ±Ù°£À» ÀÌ·ç´Â Å͹̳ÎÀÇ ±â´É¿¡ ´ëÇØ¼­´Â °ÆÁ¤ÇÒ Çʿ䰡 ¾ø´Ù.

ÀÚ ±×·³ NCURSES ´Â ¹«¾ùÀΰ¡? NCURSES ´Â ¿ø·¡ÀÇ System V Release 4.0(SVr4) curses ÀÇ Å¬·ÐÀÌ´Ù. ±×°ÍÀº ÀÚÀ¯·Ó°Ô ¹èÆ÷µÉ¼ö ÀÖ´Â ¶óÀ̺귯¸®À̸ç, curses ÀÇ ±¸¹öÀü°ú ¿Ïº®È÷ ȣȯµÈ´Ù. ½±°Ô¸»ÇØ ¾îÇø®ÄÉÀ̼ÇÀÇ ¹®ÀÚÇ¥Çö -cell terminals À» ´Ù·ç´Â ÇÔ¼öµéÀÇ ¶óÀ̺귯¸®ÀÌ´Ù. ÀÌÁ¦ ÀÌÈķδ curses ¿Í ncurses ´Â °°Àº ¶æÀ¸·Î ¾²ÀÏ °ÍÀÌ´Ù.

ncurses ÆÐŰÁö´Â ¿ø·¡ Pavel Curtis ¿¡ ÀÇÇØ °³¹ßµÇ¾ú´Ù. ÀÌ ÆÐŰÁöÀÇ ¿ø °ü¸®ÀÚ´Â Zeyd Ben-Halim <Mzmbenhal_at_netcom.com> ÀÌ´Ù. Eric S. Raymond <Mesr_at_snark.thyrsus.com> ´Â 1.8.1 ¹öÀü¿¡¼­ ¸¹Àº »õ·Î¿î ±â´ÉÀ» Ãß°¡ÇÏ¿´´Ù. Jürgen Pfeifer ´Â menu ¿Í form ¿¡ °ü·ÃµÈ ¸ðµç ÄÚµå´Â ¹°·Ð [http]Ada95 ¿¡ ´ëÇÑ ¹ÙÀεùÀ» Ãß°¡ÇÏ¿´´Ù. ÇöÀç Thomas Dickey <Mdickey_at_herndon4.his.com> ¿Í Jürgen Pfeifer <Mjuergen.pfeifer_at_gmx.net> ¿¡ ÀÇÇØ °³¹ßÀÌ ÁøÇàµÇ°í ÀÖ´Ù. Florian La Roche <Mflorian_at_gnu.org> ´Â ncurses ÀÇ copyright ¸¦ °¡Áø Free Software Foundation ÀÇ °ü¸®ÀڷΠȰµ¿Çϰí ÀÖ´Ù. ÇöÀç °ü¸®ÀÚ¿¡°Ô ¸ÞÀÏÀ» º¸³»±â À§Çؼ­´Â Mbug-ncurses_at_gnu.org·Î ¿¬¶ôÇϱ⠹ٶõ´Ù.


1.1.2 NCURSES ·Î ¹«¾ùÀ» ÇÒ ¼ö Àִ°¡?


Ncurses ´Â Å͹̳Π±â´ÉÀÇ wrapper ¸¦ ¸¸µé¾îÁÙ »Ó¸¸ ¾Æ´Ï¶ó ÅØ½ºÆ®¸ðµå¿¡¼­ ¸ÚÁø UI (User Interface)¸¦ ¸¸µé¼ö Àִ ưưÇÑ ÇÁ·¹ÀÓ¿÷µµ Á¦°øÇÑ´Ù. ±×°ÍÀº À©µµ¿ìµîÀ» ¸¸µé ¼ö ÀÖ´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ±×°ÍÀÇ ÀڸжóÀ̺귯¸®ÀÎ ÆÐ³Î, ¸Þ´º, ÆûµîÀº ±âº»ÀûÀÎ curses ¶óÀ̺귯¸®¿¡ È®À强À» Á¦°øÇÑ´Ù. ÀÌ ¶óÀ̺귯¸®µéÀº º¸Åë curses ¿Í °°ÀÌ ¼³Ä¡µÈ´Ù. ´©±¸³ª ´ÙÁß À©µµ¿ì¿Í ¸Þ´º, ÆÐÅÐ ±×¸®°í ÆûÀ» Æ÷ÇÔÇϰí ÀÖ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. À©µµ¿ìµéÀº °¢°¢ µ¶¸³ÀûÀ¸·Î ´Ù·ïÁö¸ç, 'scrollability' ±â´Éµµ ÀÖ°í, ½ÉÁö¾î hidden µÉ ¼öµµ ÀÖ´Ù.

¸Þ´ºµéÀº »ç¿ëÀÚ¿¡°Ô ½¬¿î ¸í·É¼±ÅÃÀ» ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÆûÀº data entry ¸¦ »ç¿ëÇÏ´Â °Í°ú À©µµ¿ì¸¦ Ç¥ÇöÇÏ´Â °ÍÀ» ½±°Ô ÇØÁØ´Ù. ÆÐ³ÎµéÀº °ãÃÄÁö°Å³ª ½×ÀÎ À©µµ¿ìµéÀ» ´Ù·ê ¼ö ÀÖ°Ô ncurses ÀÇ ±â´ÉÀ» È®Àå½ÃÄÑ ÁØ´Ù.

À̰͵éÀº ¿ì¸®°¡ ncurses ·Î ÇÒ ¼ö ÀÖ´Â ±âº»ÀûÀÎ °Íµé¿¡ ºÒ°úÇÏ´Ù. ´ÙÀ½À¸·Î ³Ñ¾î°¥ ¼ö·Ï ¿ì¸®´Â ÀÌ ¶óÀ̺귯¸®µéÀÇ ¸ðµç ±â´ÉµéÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù.


1.1.3 ¾îµð¼­ ±×°ÍÀ» ±¸Çϴ°¡?


ÀÚ, ncurses·Î ¾î¶² ÀÏÀÌ °¡´ÉÇÑÁö ¾Ë¾ÒÀ¸´Ï, ½áº¸°í ½Í¾î ±ÙÁú±ÙÁúÇÏ½Ç °Í °°´Ù. ncurses ´Â º¸Åë ¼³Ä¡ÇÒ¶§ ÀÚµ¿À¸·Î ±ò¸°´Ù. ¸¸¾à ±×°ÍÀÌ ¾ø°Å³ª, ´ç½Å¸¸ÀÇ ¶óÀ̺귯¸®·Î ÄÄÆÄÀÏÇÏ°í ½Í´Ù¸é ¾Æ·¡¸¦ °è¼Ó Àо¾Æ¶ó.

ÆÐŰÁö ÄÄÆÄÀÏÇϱâ

ncurses ´Â [ftp]ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz ³ª [http]http://www.gnu.org/order/ftp.html ¿¡ ³ª¿ÍÀÖ´Â ¾Æ¹« ftp »çÀÌÆ®¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù. ÃÖ±Ù ¾ÈÁ¤È­ ¹öÀüÀº 5.2 20001021 ÀÌ´Ù.

¼³Ä¡ÇÏ´Â ¹æ¹ýÀ» ÀÚ¼¼È÷ ¾Ë°íÀÚ ÇÑ´Ù¸é README ¿Í INSTALL ÆÄÀÏÀ» Àо¾Æ¶ó. º¸Åë ´ÙÀ½°ú °°Àº ÀÛ¾÷µéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù.

    tar zxvf ncurses<version>.tar.gz  # unzip and untar the archive                  
    cd ncurses<version>               # cd to the directory                          
    ./configure                             # configure the build according to your  
                                            # environment                            
    make                                    # make it                                
    su root                                 # become root                            
    make install                            # install it                             


RPM À» ÀÌ¿ëÇÑ ¼³Ä¡

ncurses RPM Àº [http]http://rpmfind.net ¿¡¼­ ã¾Æ¼­ ´Ù¿î·ÎµåÇÏ¸é µÈ´Ù. RPM Àº ·çÆ® ±ÇÇÑÀ¸·Î ´ÙÀ½ÀÇ ¸í·ÉÀ» ½ÇÇàÇÏ¸é ¼³Ä¡°¡ µÈ´Ù.

    rpm -i <downloaded rpm>                                                  




1.1.4 ¹®¼­ÀÇ ¸ñÀû ¹× ¹üÀ§


ÀÌ ¹®¼­´Â ncurses ¿Í ±×°ÍÀÇ ÀڸжóÀ̺귯¸®·Î ÇÁ·Î±×·¡¹Ö ÇÏ´Â µ¥ ÀÖ¾î ÅëÇÕ °¡À̵尡 µÇ´Â °ÍÀ» ¸ñÇ¥·Î Çϰí ÀÖ´Ù. ´Ü¼øÇÑ "Hello World" ÇÁ·Î±×·¥ºÎÅÍ ´õ º¹ÀâÇÑ ±â´ÉÀÇ ÇÁ·Î±×·¥±îÁö ´Ù·ê °ÍÀÌ´Ù. ncurses ÀÇ ¼±Çà°æÇèÀ» ÇÊ¿ä·Î ÇÏÁö´Â ¾Ê´Â´Ù.


1.1.5 ÇÁ·Î±×·¥µé¿¡ ´ëÇØ


¹®¼­¿¡ ÀÖ´Â ¸ðµç ÇÁ·Î±×·¥µéÀº [http]¿©±â¿¡¼­ ¾ÐÃàµÈ ÇüÅ·Π¹ÞÀ» ¼ö ÀÖ´Ù. ±×°ÍµéÀÇ ¾ÐÃàÀ» Ç®°í tar ·Î ÆÄÀÏÀ» Ç®¸é µÈ´Ù. µð·ºÅ丮 ±¸Á¶´Â ¾Æ·¡¿Í °°´Ù.

#!
 ncurses                                                                      
   |                                                                         
   |----> <a class='nonexistent' href='/wiki.php/JustForFun'>?</a>JustForFun     -- just for fun programs                            
   |----> basics         -- basic programs                                   
   |----> demo           -- output files go into this directory after make   
   |          |                                                              
   |          |----> exe -- exe files of all example programs                
   |----> forms          -- programs related to form library                 
   |----> menus          -- programs related to menus library                
   |----> panels         -- programs related to panels library               
   |----> Makefile       -- the top level Makefile                           
   |----> README         -- the top level README file. contains instructions 
   |----> COPYING        -- copyright notice                                 


°¢°¢ÀÇ µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀϵé°ú ±× ¼³¸íÀº ´ÙÀ½°ú °°´Ù.


#!
 <a class='nonexistent' href='/wiki.php/JustForFun'>?</a>JustForFun                                                                       
    |                                                                            
    |----> hanoi.c   -- The Towers of Hanoi Solver                               
    |----> life.c    -- The Game of Life demo                                    
    |----> magic.c   -- An Odd Order Magic Square builder                        
    |----> queens.c  -- The famous N-Queens Solver                               
    |----> shuffle.c -- A fun game, if you have time to kill                     
    |----> tt.c      -- A very trivial typing tutor                              
                                                                                 
  basics                                                                         
    |                                                                            
    |----> acs_vars.c            -- ACS_ variables example                       
    |----> hello_world.c         -- Simple "Hello World" Program                 
    |----> init_func_example.c   -- Initialization functions example             
    |----> key_code.c            -- Shows the scan code of the key pressed       
    |----> mouse_menu.c          -- A menu accessible by mouse                   
    |----> other_border.c        -- Shows usage of other border functions apa    
    |                               -- rt from box()                             
    |----> printw_example.c      -- A very simple printw() example               
    |----> scanw_example.c       -- A very simple getstr() example               
    |----> simple_attr.c         -- A program that can print a c file with       
    |                               -- comments in attribute                     
    |----> simple_color.c        -- A simple example demonstrating colors        
    |----> simple_key.c          -- A menu accessible with keyboard UP, DOWN     
    |                               -- arrows                                    
    |----> temp_leave.c          -- Demonstrates temporarily leaving curses mode 
    |----> win_border.c          -- Shows Creation of windows and borders        
    |----> with_chgat.c          -- chgat() usage example                        
                                                                                 
  forms                                                                          
    |                                                                            
    |----> form_attrib.c     -- Usage of field attributes                        
    |----> form_options.c    -- Usage of field options                           
    |----> form_simple.c     -- A simple form example                            
    |----> form_win.c        -- Demo of windows associated with forms            
                                                                                 
  menus                                                                          
    |                                                                            
    |----> menu_attrib.c     -- Usage of menu attributes                         
    |----> menu_item_data.c  -- Usage of item_name() etc.. functions             
    |----> menu_multi_column.c    -- Creates multi columnar menus                
    |----> menu_scroll.c     -- Demonstrates scrolling capability of menus       
    |----> menu_simple.c     -- A simple menu accessed by arrow keys             
    |----> menu_toggle.c     -- Creates multi valued menus and explains          
    |                           -- REQ_TOGGLE_ITEM                               
    |----> menu_userptr.c    -- Usage of user pointer                            
    |----> menu_win.c        -- Demo of windows associated with menus            
                                                                                 
  panels                                                                         
    |                                                                            
    |----> panel_browse.c    -- Panel browsing through tab. Usage of user        
    |                           -- pointer                                       
    |----> panel_hide.c      -- Hiding and Un hiding of panels                   
    |----> panel_resize.c    -- Moving and resizing of panels                    
    |----> panel_simple.c    -- A simple panel example                           


¸ÞÀÎ µð·ºÅ丮¿¡ ÃÖ»óÀ§ Makefile ÀÌ ÀÖ´Ù. ±×°ÍÀº ¸ðµç ÆÄÀϵéÀ» ºôµåÇϰí, »ç¿ëÇÒ Áغñ°¡µÈ ½ÇÇàÆÄÀϵéÀ» demo/exe µð·ºÅ丮¿¡ ³Ö¾îµÐ´Ù. ¶Ç, °¢°¢ÀÇ µð·ºÅ丮¿¡¼­ ¼±ÅÃÀûÀ¸·Î ÆÄÀϵéÀ» ¸ÞÀÌÅ© ÇÒ ¼öµµ ÀÖ´Ù. °¢ µð·ºÅ丮´Â °Å±â¿¡ ÀÖ´Â ÆÄÀϵéÀÇ ¿ëµµ°¡ ¹«¾ùÀÎÁö ¼³¸íÇÏ´Â README ÆÄÀϵéÀÌ ÀÖ´Ù.

¸ðµç ¿¹Á¦¿¡¼­ ³ª´Â ncurses µð·ºÅ丮¿¡ ´ëÇÑ »ó´ë °æ·Î¸íÀ» ¾²°í ÀÖ´Ù.

¸¸¾à °¢°¢ÀÇ ÇÁ·Î±×·¥ º°·Î º¸±â¸¦ ¿øÇÑ´Ù¸é, [http]http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/ ¿¡¼­ º¼ ¼ö ÀÖ´Ù.

¸ðµç ÇÁ·Î±×·¥µéÀº [http]GPL ÇÏ¿¡ ¹èÆ÷µÇ¸ç ´ç½ÅÀº ±×°ÍÀ» ´ç½ÅÀÌ ¿øÇÏ´Â ´ë·Î ¾µ ¼ö ÀÖ´Ù.


1.1.6 ¹®¼­ÀÇ ´Ù¸¥ Æ÷¸Ëµé


ÀÌ ÇÏ¿ìÅõ ¹®¼­´Â tldp.org »çÀÌÆ®¿¡ ´Ù¾çÇÑ Æ÷¸ËÀÌ ÀÖ´Ù. ¾Æ·¡´Â ÀÌ ¹®¼­ÀÇ ´Ù¸¥ Æ÷¸Ëµé¿¡ ´ëÇÑ ¸µÅ©ÀÌ´Ù.


1.1.6.2 ¼Ò½º·Î ºÎÅÍ ºôµåÇϱâ


¸¸¾à À§ÀÇ ¸µÅ©µéÀÌ ±úÁ³°Å³ª sgml ÆÄÀÏ·Î ¹«¾ð°¡¸¦ ÇØº¸°í ½Í´Ù¸é ÀÌ ÀýÀ» Àо±â ¹Ù¶õ´Ù.

sgml ¹®¼­ ¼Ò½º¿Í tar ¿Í gzip À¸·Î ¹­ÀÎ ÇÁ·Î±×·¥À» ¾Æ·¡ÀÇ ¸µÅ©¿¡¼­ ´Ù¿î¹Þ´Â´Ù.

[http]http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/ NCURSES-HOWTO/NCURSES-Programming-HOWTO.sgml
[http]http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/ NCURSES-HOWTO/ncurses_programs.tar.gz

ncurses_programs.tar.gz ÆÄÀÏÀÇ ¾ÐÃàÀ» Ǭ´Ù
 tar zxvf ncurses_programs.tar.gz 

jade ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿© ´Ù¾çÇÑ Æ÷¸ËÀÇ ¹®¼­¸¦ ¸¸µé¾î ³½´Ù. ¿¹¸¦ µé¾î ¿©·¯ °³ÀÇ ¹®¼­·Î ³ª´©¾îÁø html ÆÄÀÏÀ» »ý¼ºÇÏ°í ½Í´Ù¸é ¾Æ·¡¿Í °°ÀÌ ÀÔ·ÂÇØ º¸ÀÚ.

jade -t sgml -i html -d <docbook html ½ºÅ¸ÀÏ ½ÃÆ®ÀÇ °æ·Î> 
NCURSES-Programming-HOWTO.sgml                                           

pdf ¹®¼­¸¦ »ý¼ºÇÏ·Á¸é ¸ÕÀú ÇϳªÀÇ ¹®¼­·Î µÈ html ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.

jade -t sgml -i html -d <docbook html ½ºÅ¸ÀÏ ½ÃÆ®ÀÇ °æ·Î> -V nochunks    
NCURSES-Programming-HOWTO.sgml > NCURSES-ONE-BIG-FILE.html               

then use htmldoc to get pdf file with ±×¸®°í htmldoc À» »ç¿ëÇÏ¿© pdf ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.

htmldoc --size universal -t pdf --firstpage p1 -f <output file name.pdf> 
NCURSES-ONE-BIG-FILE.html                                                

ps ÆÄÀÏÀ» »ý¼ºÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

htmldoc --size universal -t ps --firstpage p1 -f <Ãâ·Â ÆÄÀÏ À̸§>   
NCURSES-ONE-BIG-FILE.html                                                

ÀÚ¼¼ÇÑ »çÇ×Àº [http]http://www.tldp.org/LDP/LDP-Author-Guide/ ¹®¼­¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. ¸¸¾à ¹®¼­ »ý¼º¿¡ ½ÇÆÐÇÑ °æ¿ì¿¡´Â p_padala_at_yahoo.com À¸·Î ¸ÞÀÏÀ» º¸³»Áֱ⠹ٶõ´Ù.


1.1.7 Å©·¹µðÆ®


I thank Sharath <Msharath_1_at_usa.net> and Emre Akbas for helping me with few sections. The introduction was initially written by sharath. I rewrote it with few excerpts taken from his initial work. Emre helped in writing printw and scanw sections.

Then comes Ravi Parimi <Mparimi_at_ece.arizona.edu>, my dearest friend, who has been on this project before even one line was written. He constantly bombarded me with suggestions and patiently reviewed the whole text. He also checked each program on Linux and Solaris. See his notes to check on your problems.


1.1.8 Wish List


This is the wish list, in the order of priority. If you have a wish or you want to work on completing the wish, mail Mp_padala_at_yahoo.com me.

  • Add examples to last parts of forms section. (I am working on it)

  • Prepare a Demo showing all the programs and allow the user to browse

through description of each program. Let the user compile and see the program in action. A dialog based interface is preferred. (My friend Mashoknn_at_cisco.com N.N.Ashok is working on it)
  • Add debug info. _tracef, _tracemouse stuff.

  • Accessing termcap, terminfo using functions provided by ncurses package.

  • Working on two terminals simultaneously.

  • Add things in miscellaneous section.



1.1.9 Copyright


Copyright (c) 2001 by Pradeep Padala. This document may be distributed under the terms set forth in the LDP license at [[http]http://www.linuxdoc.org/ COPYRIGHT.html] linuxdoc.org/COPYRIGHT.html.

This HOWTO is free documentation; you can redistribute it and/or modify it under the terms of the LDP license. This document is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the LDP license for more details.


1.2 The Hello World ÇÁ·Î±×·¥


curses ÀÇ ¼¼°è¿¡ ¿Â °É ȯ¿µÇÑ´Ù. ¶óÀ̺귯¸®·Î ¶Ù¾îµé¾î ±×°ÍÀÇ ´Ù¾çÇÑ Æ¯Â¡µéÀ» »ìÆìº¸±â Àü¿¡, bells and whistles, ¼¼°è¿¡ ¾È³çÀ» Ç¥ÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾îº¸ÀÚ.


1.2.1 Ncurses ¶óÀ̺귯¸®¿Í °°ÀÌ ÄÄÆÄÀÏ Çϱâ


ncurses ¶óÀ̺귯¸®ÀÇ ÇÔ¼öµéÀ» ¾²±â À§Çؼ± ncurses.h °¡ ÀÎŬ·çµå µÇ¾î¾ß Çϰí ÇÁ·Î±×·¥À» ncurses ¿Í ¸µÅ©½ÃŰ´Â -lncurses Ç÷¡±×°¡ ´õÇØÁ®¾ß ÇÑ´Ù. ncurses.h ´Â stdio.h ¿¡ ÀÌ¹Ì ÀÎŬ·çµå µÇ¾î ÀÖ´Ù.

    #include <ncurses.h>                                                     
    .                                                                        
    .                                                                        
    .                                                                        
                                                                             
    compile and link: gcc <program file> -lncurses                           


Example 1. The Hello World !!! Program

#include <ncurses.h>                                                         
                                                                             
int main()                                                                   
{                                                                            
        initscr();                      /* Start curses mode              */ 
        printw("Hello World !!!");      /* Print Hello World              */ 
        refresh();                      /* Print it on to the real screen */ 
        getch();                        /* Wait for user input */            
        endwin();                       /* End curses mode                */ 
                                                                             
        return 0;                                                            
}  




1.2.2 ºÐ¼®


À§ ÇÁ·Î±×·¥Àº È­¸é¿¡ "Hello World !!!" ¸¦ Âï°í Á¾·áÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¾î¶»°Ô curses ¸¦ ÃʱâÈ­ Çϰí, ½ºÅ©¸°À» ´Ù·ç´ÂÁö ¶Ç ¾î¶»°Ô curses ¸ðµå¸¦ Á¾·áÇÏ´ÂÁö º¸¿©ÁØ´Ù. ÀÚ ÀÌÁ¦ ÇÑÁÙ ÇÑÁÙ ºÐ¼®Çغ¸ÀÚ.


1.2.2.1 initscr() ¿¡ ´ëÇØ


initscr() ÇÔ¼ö´Â curses mode ·Î Å͹̳ÎÀ» ÃʱâÈ­ ÇÑ´Ù. ¸î¸î ±¸Çö¿¡¼­´Â È­¸éÀ» Ŭ¸®¾îÇÏ°í ºó È­¸éÀ» º¸¿©Áֱ⵵ ÇÑ´Ù. curses ÆÐŰÁö¸¦ ÀÌ¿ëÇØ¼­ ½ºÅ©¸° 󸮸¦ ÇÒ·Á¸é ÀÌ ÇÔ¼ö¸¦ ¹Ýµå½Ã ¸ÕÀú ÄÝÇØ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â curses ½Ã½ºÅÛÀ» ÃʱâÈ­ Çϰí 'stdscr' À̶ó ºÒ¸®´Â ¿ì¸®ÀÇ ÇöÀç À©µµ¿ì¿Í ¸î¸î µ¥ÀÌÅ͵é-±¸Á¶Ã¼- µéÀ» À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. ¾ÆÁÖ ±ØÇÑ »óȲ¿¡¼­³ª ÀÌ ÇÔ¼ö´Â curses ¶óÀ̺귯¸®ÀÇ µ¥ÀÌÅÍ ±¸Á¶Ã¼¸¦ À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´ç½ÇÆÐ·Î ¿¡·¯´Â ³¾ °ÍÀÌ´Ù.

À̰ÍÀÌ ¼öÇàµÈ ÈÄ ¿ì¸®´Â curses ¼¼ÆÃÀ» ÆíÀÇ¿¡ ¸ÂÃß±âÀ§ÇÑ ´Ù¾çÇÑ ÃʱâÈ­¸¦ ÇÒ ¼ö ÀÖ´Ù. ¿©±â¿¡ ´ëÇÑ »ó¼¼ ¼³¸íÀº Â÷Â÷ ´Ù·ç±â·Î ÇÑ´Ù.


1.2.2.2 ½Å±âÇÑ refresh()


´ÙÀ½ ÁÙÀÇ printw ´Â "Hello World !!!" ¸¦ È­¸é¿¡ Âï´Â´Ù. ÀÌ ÇÔ¼ö´Â stdscr À̶ó ºÒ¸®´Â À©µµ¿ì ³»¿¡ (y,x)À§Ä¡¿¡ µ¥ÀÌÅ͸¦ Âï´Â´Ù´Â Á¡À» Á¦¿ÜÇϰí´Â printf ÇÔ¼ö¿Í ºñ½ÁÇÏ´Ù. À§ ÇÁ·Î±×·¥¿¡¼­´Â Ä¿¼­À§Ä¡°¡ 0,0 À̱⠶§¹®¿¡ À©µµ¿ìÀÇ ¿ÞÂÊ ¸Ç À§ ±¸¼®¿¡ ½ºÆ®¸µÀ» Âï°Ô µÈ´Ù.

´ÙÀ½Àº ½ÅºñÇÑ refresh() ÇÔ¼ö¸¦ º¼ Â÷·ÊÀÌ´Ù. ¿ì¸®°¡ printw ÇÔ¼ö¸¦ È£ÃâÇÏ¸é »ç½Ç»ó µ¥ÀÌÅÍ´Â stdscr À̶õ ºÒ¸®´Â °¡»óÀÇ À©µµ¿ì¿¡¸¸ ¾²¿©Áö°í È­¸é¿¡´Â ¾ÆÁ÷ ³ªÅ¸³ªÁö ¾Ê´Â´Ù. printw °¡ ÇÏ´Â ÀÏÀº ¸î¸î Ç÷¡±×µé°ú µ¥ÀÌÅÍ ±¸Á¶Ã¼µéÀ» °»½ÅÇϰí stdscr ¿¡ ÇØ´çÇÏ´Â ¹öÆÛ¿¡ µ¥ÀÌÅ͵éÀ» ¾²´Â °ÍÀÌ´Ù. ±×°ÍÀ» È­¸é¿¡ Ç¥½ÃÇϱâ À§Çؼ­´Â refresh() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© curses ½Ã½ºÅÛÀÌ ±× ¹öÆÛÀÇ ³»¿ëµéÀ» È­¸é¿¡ ³ªÅ¸³»µµ·Ï ÇØ¾ß ÇÑ´Ù.

¿©±â¿£ ÇÁ·Î±×·¡¸Ó°¡ °¡»óÀÇ ½ºÅ©¸°À̳ª À©µµ¿ì¿¡ ¿©·¯¹ø °»½ÅÀ» ÇÑ´ÙÀ½ ÇѹøÀÇ refresh ·Î È­¸éÀ» ÀüºÎ °»½ÅÇѴٴ öÇÐÀÌ ±ò·Á ÀÖ´Ù. refresh() ÇÔ¼ö´Â À©µµ¿ì¸¦ È®ÀÎÇÏ°í º¯È­µÈ ºÎºÐ¸¸ °»½ÅÇÑ´Ù. À̰ÍÀº ºü¸¥ ¹ÝÀÀ¼Óµµ¿Í ÈξÀ ÁÁÀº À¯¿¬ÇÔÀ» Á¦°øÇÑ´Ù. ±×·¯³ª Ãʺ¸ÀÚ¿¡°Ô´Â Á¶±Ý È¥¶õ½º·¯¿î ¸éÀÌ ÀÖ´Ù. Ãʺ¸ÀÚµéÀÌ ÇàÇÏ´Â ÀϹÝÀûÀÎ ½Ç¼ö´Â printw() ·ùÀÇ ÇÔ¼öµéÀ» ½á¼­ ÀÛ¾÷À» ÇÑ´ÙÀ½ refresh() ¸¦ ±î¸Ô°ï ÇÑ´Ù´Â °ÍÀÌ´Ù. ³ª ¶ÇÇÑ ¿©ÀüÈ÷ ÀÌ°É ¶§¶§·Î ±î¸Ô°ï ÇÑ´Ù


1.2.2.3 endwin() ¿¡ ´ëÇØ


±×¸®°í ÃÖÁ¾ÀûÀ¸·Î curses ¸ðµå¸¦ ³¡³»´Â °É Àؾ´Â ¾ÈµÈ´Ù. ±×·¸Áö¾ÊÀ¸¸é ÇÁ·Î±×·¥ Á¾·á ÈÄ¿¡ ´ç½ÅÀÇ Å͹̳ÎÀº ÀÌ»óÇÏ°Ô ÀÛµ¿ÇÒ °ÍÀÌ´Ù. endwin() ÇÔ¼ö´Â curses ÀÇ ÇÏÀ§ ½Ã½ºÅÛµé°ú µ¥ÀÌÅÍ ±¸Á¶Ã¼°¡ Á¡À¯Çß´ø ¸Þ¸ð¸®¸¦ ÇØÁ¦Çϰí Å͹̳ÎÀ» ÀϹÝÀûÀÎ ¸ðµå·Î ¹Ù²ã ³õ´Â´Ù. ÀÌ ±â´ÉÀº curses ¸ðµå¿¡¼­ ÀÛ¾÷À» ¸¶Ä¡°Ô µÇ¸é ¹Ýµå½Ã È£ÃâÇØ¾ß ÇÑ´Ù.


1.3 The Gory Details


ÀÚ ÀÌÁ¦ ¿ì¸®´Â °£´ÜÇÑ curses ÇÁ·Î±×·¥À» ¾î¶»°Ô ÀÛ¼ºÇÏ´ÂÁö »ìÆìº¸¾Ò´Ù. ÀÌÁ¦ Á» ´õ »ó¼¼ÇÑ °ÍµéÀ» ¾Ë¾Æº¸ÀÚ. ´ç½ÅÀÌ È­¸é¿¡¼­ º¸´Â °ÍµéÀ» ¹Ù²Ü ¼ö ÀÖ´Â ¸¹Àº ÇÔ¼öµéÀÌ ÀÖÀ¸¸é ¾ÕÀ¸·Î ¸¹ÀÌ »ç¿ëµÉ ´Ù¾çÇÑ Æ¯Â¡µéÀÌ ÀÖ´Ù.

ÀÚ ½ÃÀÛÇÕ´Ï´Ù...


1.4 ÃʱâÈ­


¿ì¸®´Â ÀÌÁ¦ curses ½Ã½ºÅÛÀ» ÃʱâÈ­ Çϱâ À§Çؼ­´Â initscr() ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ¾È´Ù. ÀÌ ÃʱâÈ­ ÀÌÈÄ¿¡ curses ¼¼¼ÇÀ» ¼³Á¤Çϱâ À§ÇØ È£ÃâÇÒ ¼ö ÀÖ´Â ÇÔ¼öµéÀÌ ´õ ÀÖ´Ù. ÀÌ°É ÅëÇØ ¿ì¸®´Â curses ½Ã½ºÅÛ¿¡ Å͹̳ÎÀ» raw ¸ðµå·Î ¼¼ÆÃÇØ´Þ¶ó°í Çϰųª »öÀ» ÃʱâÈ­ Çϰųª ¸¶¿ì½ºµîÀ» ÃʱâÈ­ ÇÒ ¼öµµ ÀÖ´Ù. ±×·³ initscr() ÇÔ¼ö ÀÌÈÄ¿¡ º¸Åë È£ÃâµÇ´Â ÇÔ¼öµé¿¡ ¾î¶²°ÍµéÀÌ ÀÖ´ÂÁö »ìÆìº¸µµ·Ï ÇÏÀÚ.


1.4.1 raw() µîÀÇ ÃʱâÈ­ ÇÔ¼ö¿¡ ´ëÇØ¼­




1.4.2 raw() ¿Í cbreak()


º¸Åë Å͹̳Πµå¶óÀ̹ö´Â new line À̳ª ij¸®Áö¸®ÅÏÀÌ µé¾î¿Ã ¶§±îÁö »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ³»¿ëÀ» ¹öÆÛ¸µÇÑ´Ù. ±×·¯³ª ´ëºÎºÐÀÇ ÇÁ·Î±×·¥µéÀº »ç¿ëÀÚ°¡ ŸÀÌÇÎÀ» ÇÏ°í³ª¼­ µÉ ¼ö ÀÖ´Â ÇÑ »¡¸® ±× ¹®ÀÚµéÀ» ÇÊ¿ä·Î ÇÑ´Ù. À§ÀÇ µÎ ÇÔ¼ö´Â ¶óÀÎ ¹öÆÛ¸µÀ» ºñȰ¼ºÈ­ ½ÃŰ´Â µ¥ ÀÚÁÖ »ç¿ëµÈ´Ù. ÀÌ µÎ ÇÔ¼öÀÇ Â÷ÀÌÁ¡Àº suspend (CTRL-Z) ³ª interrupt ±×¸®°í quit (CTRL-C) ¿Í °°Àº control ¹®ÀÚµéÀÌ ÇÁ·Î±×·¥¿¡ Àü´ÞµÇ´Â ¹æ¹ý¿¡ ÀÖ´Ù. raw() ¸ðµå¿¡¼­ ÀÌ control ¹®ÀÚµéÀº signal À» ¹ß»ý½ÃŰÁö ¾Ê°í ¹Ù·Î ÇÁ·Î±×·¥¿¡ Àü´ÞµÈ´Ù. cbreak() ¸ðµå¿¡¼­ ÀÌ control ¹®ÀÚµéÀº Å͹̳Πµå¶óÀ̹ö¿¡ ÀÇÇØ ´Ù¸¥ ¾î¶² ¹®ÀÚ·Î ¹ø¿ªµÈ´Ù. ³ª´Â °³ÀÎÀûÀ¸·Î »ç¿ëÀÚµéÀ» º¸´Ù ´õ Àß Á¦¾îÇÏ´Â ¿¬½ÀÀ» Çϱâ À§Çؼ­ raw() ¸¦ ¾Ö¿ëÇÏ´Â ÆíÀÌ´Ù.


1.4.3 echo() ¿Í noecho()


ÀÌ ÇÔ¼öµéÀº »ç¿ëÀÚµéÀÌ Å͹̳ο¡ ÀÔ·ÂÇÑ ¹®ÀÚµéÀ» echoing ÇÒ °ÍÀÎÁö Á¦¾îÇÑ´Ù. echoing ¿¡ ´ëÇÑ ´õ ¸¹Àº Á¦¾î¸¦ Çϱâ À§Çؼ­³ª ¶Ç´Â getch() µîÀÇ ÇÔ¼ö·Î »ç¿ëÀڵ鿡°Ô¼­ ÀÔ·ÂÀ» ¹Þ°í ÀÖÀ» ¶§ ºÒÇÊ¿äÇÑ echoing À» ¾ø¾Ö±â À§Çؼ­ ÀÌ ÇÔ¼öµéÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ´ëºÎºÐÀÇ ÀÎÅÍ·¢Æ¼ºêÇÑ ÇÁ·Î±×·¥µéÀº noecho() ¸¦ ÃʱâÈ­¶§ È£ÃâÇϰí ÇÊ¿äÇÒ¶§¸é Á¦¾î¸¦ ÅëÇØ echoing À» ÇÑ´Ù. ÀÌ·¸°Ô Çϸé ÇÁ·Î±×·¡¸Ó´Â À©µµ¿ìÀÇ (y,x) ÀÇ À§Ä¡¸¦ ±»ÀÌ °»½Å½ÃŰÁö ¾Ê´õ¶óµµ ÇÊ¿äÇÑ À§Ä¡¿¡ ¹®ÀÚµéÀ» echoing ÇÒ¼ö ÀÖ´Â À¶Å뼺À» °¡Áö°Ô µÈ´Ù.


1.4.4 keypad()


ÀÌ ÇÔ¼ö´Â ³»°¡ ÁÁ¾ÆÇÏ´Â ÃʱâÈ­ ÇÔ¼öÁß ÇϳªÀÌ´Ù. À̰ÍÀº F1, F2, ¹æÇâŰ °°Àº ±â´É۵éÀ» ÀԷ¹ÞÀ» ¼ö ÀÖ°Ô ÇÑ´Ù. ¹æÇâ۵éÀº ¾î¶°ÇÑ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¿¡¼­µµ Å« ºñÁßÀ» Â÷ÁöÇϵíÀÌ, °ÅÀÇ ¸ðµç ÀÎÅÍ·¢Æ¼ºêÇÑ ÇÁ·Î±×·¥µéÀº ÀÌ ±â´ÉµéÀ» ÇÊ¿ä·Î ÇÑ´Ù. keypad(stdscr, TRUE) ¸¦ È£ÃâÇÏ´Â °ÍÀº ÀÏ¹Ý È­¸éÀÎ (stdscr) ¿¡¼­ ÀÌ ±â´ÉÀ» ¾²°Ô ÇÑ´Ù. ÀÌ ¹®¼­ÀÇ Â÷ÈÄ ¼½¼Ç¿¡¼­ ´õ ¸¹Àº Ű »ç¿ë¹ýÀ» ¹è¿ì°Ô µÉ °ÍÀÌ´Ù.


1.4.5 halfdelay()


ÀÌ ÇÔ¼ö´Â ÀÚÁÖ ¾²ÀÌÁö´Â ¾ÊÁö¸¸ ¶§·Ð ¸Å¿ì À¯¿ëÇÏ°Ô ¾²ÀδÙ. halfdelay() ÇÔ¼ö´Â ŸÀÌÇÎµÈ ¹®ÀÚµéÀÌ ÇÁ·Î±×·¥¿¡¼­ ¹Ù·Î »ç¿ë°¡´ÉÇÏ°Ô ÇÏ´Â cbreak() ¸ðµå¿Í ºñ½ÁÇÑ half-delay ¸ðµå¸¦ ¾²°Ô ÇÑ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â ÀԷ¿¡ ´ëÇØ¼­ ½ÊºÐÀÇ 'X' ÃÊ ¸¸Å­ ±â´Ù¸®¸ç ¸¸¾à ¾Æ¹« ÀÔ·ÂÀÌ ¾ø´Ù¸é ERR À» ¸®ÅÏÇÑ´Ù. 'X' ´Â halfdelay() ÇÔ¼ö¿¡ Àü´ÞµÇ´Â ŸÀӾƿô °ªÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ´ç½ÅÀÌ »ç¿ëÀÚ¿¡°Ô ÀÔ·ÂÀ» ¿ä±¸ÇÏ°í ¸¸¾à ƯÁ¤ ½Ã°£ µ¿¾È ÀÔ·ÂÀÌ ¾ø´Ù¸é ´Ù¸¥ ¾î¶² ÀÛ¾÷À» ÇÒ¶§¿¡ »ç¿ëµÈ´Ù. ÆÐ½º¿öµå ÇÁ·ÒÇÁÆ® µî¿¡¼­ ŸÀӾƿôÀÌ ÀÖ´Â °ÍµîÀÌ ±× ÁÁÀº ¿¹ÀÌ´Ù.


1.4.6 ±×¿Ü Àâ´ÙÇÑ ÃʱâÈ­ ÇÔ¼öµé


À§¿¡¼­ ¾ê±âÇÑ °Í ¸»°íµµ Ä¿¼­ÀÇ ¿òÁ÷ÀÓÀ» ¼³Á¤ÇÏ´Â ÃʱâÈ­ ÇÔ¼öµéÀÌ Á» ´õ ÀÖ´Ù. ±×·¯³ª ±×°ÍµéÀº À§¿¡¼­ ¾ð±ÞÇÑ °Íµé¸¸Å­ Àß ¾²ÀÌÁö ¾Ê´Â´Ù. ÀÌ Áß ¸î¸îÀº ºÎ·Ï¿¡¼­ ¼³¸íÇÒ °ÍÀÌ´Ù.


1.4.7 ¿¹Á¦


ÀÌ ÇÔ¼öµéÀÇ »ç¿ë¹ýÀ» ¸íÈ®È÷ ÀÌÇØÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥À» Â¥º¸ÀÚ.

Example 2. Initialization Function Usage example

#include <ncurses.h>                                                           
                                                                               
int main()                                                                     
{       int ch;                                                                
                                                                               
        initscr();                      /* Start curses mode            */     
        raw();                          /* Line buffering disabled      */     
        keypad(stdscr, TRUE);           /* We get F1, F2 etc..          */     
        noecho();                       /* Don't echo() while we do getch */   
                                                                               
        printw("Type any character to see it in bold\n");                      
        ch = getch();                   /* If raw() hadn't been called         
                                         * we have to press enter before it    
                                         * gets to the program          */     
        if(ch == KEY_F(1))              /* Without keypad enabled this will */ 
                printw("F1 Key pressed");/*  not get to us either       */     
                                        /* Without noecho() some ugly escape   
                                         * charachters might have been printed 
                                         * on screen                    */     
        else                                                                   
        {       printw("The pressed key is ");                                 
                attron(A_BOLD);                                                
                printw("%c", ch);                                              
                attroff(A_BOLD);                                               
        }                                                                      
        refresh();                      /* Print it on to the real screen */   
        getch();                        /* Wait for user input */              
        endwin();                       /* End curses mode                */   
                                                                               
        return 0;                                                              
}                                                                              


ÀÌ ÇÁ·Î±×·¥Àº ÀÚü ÁÖ¼®ÀÌ µÇ¾î ÀÖ´Ù. ±×·¯³ª ¾ÆÁ÷ ¼³¸íÇÏÁö ¾ÊÀº ÇÔ¼ö°¡ Çϳª Àִµ¥, »ç¿ëÀڷκÎÅÍ ¹®ÀÚ¸¦ ÀԷ¹޴ getch() ÇÔ¼ö°¡ ±×°ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ÀÔ·ÂÈÄ <enter> ¸¦ ÇÇÇϱâ À§ÇØ ¶óÀÎ ¹öÆÛ¸µÀ» ÇØÁ¦ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» Á¦¿ÜÇϸé getchar() ÇÔ¼ö¿Í µ¿ÀÏÇÏ´Ù. getch() ÀÇ ´õ ¸¹Àº Á¤º¸¿Í ۸¦ ÀԷ¹޴ °Í¿¡ ´ëÇØ¼­´Â key management ¼½¼ÇÀ» Âü°íÇÏ±æ ¹Ù¶õ´Ù. attron °ú attroff ÇÔ¼ö´Â ¾î¶² Ư¼ºÀ» ²ô°í Äѱâ À§ÇØ »ç¿ëµÈ´Ù. ¿¹Á¦¿¡¼­´Â ¹®ÀÚ¸¦ bold ü·Î Âï±âÀ§ÇØ »ç¿ëÇÏ¿´´Ù. ÀÌ ÇÔ¼öµéµµ ÈÄ¿¡ ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù.


1.5 À©µµ¿ì¿¡ °üÇØ


ncurses ÀÇ ¹«¼öÇÑ ÇÔ¼öµé·Î ¶Ù¾îµé±â Àü¿¡, À©µµ¿ì ¿¡ ´ëÇØ ¸î°¡Áö¸¸ ¸íÈ®È÷ Çϵµ·Ï ÇÏÀÚ. À©µµ¿ìÀÇ ÀÚ¼¼ÇÑ »çÇ׿¡ ´ëÇØ¼­´Â ´ÙÀ½ ¼½¼Ç¿¡¼­ ¼³¸íÇÒ °ÍÀÌ´Ù.

À©µµ¿ì´Â curses ½Ã½ºÅÛ¿¡ ÀÇÇØ Á¤ÀÇµÈ °¡»ó È­¸éÀÌ´Ù. ±×·¯³ª À©µµ¿ì´Â ´ç½ÅÀÌ Win9X Ç÷§Æû¿¡¼­ ÈçÈ÷ º¸´ø Å׵θ®°¡ Àִ âÀ» ¶æÇÏÁö´Â ¾Ê´Â´Ù. curses °¡ ÃʱâÈ­µÉ ¶§, ´ç½ÅÀÇ 80x25 (¶Ç´Â ÇöÀç ½ÇÇàµÇ´Â âÀÇ Å©±â¸¸Å­) ½ºÅ©¸°À» ÀǹÌÇÏ´Â stdscr À̶ó´Â ±âº» À©µµ¿ì°¡ »ý¼ºµÈ´Ù. ¸¸¾à ´ç½ÅÀÌ ¸î¸î ½ºÆ®¸µÀ» Âï°Å³ª, ÀÔ·ÂÀ» ¹Þ´Â µîÀÇ °£´ÜÇÑ ÀÛ¾÷µéÀ» ÇÒ °ÍÀ̶ó¸é, ÀÌ ±âº» À©µµ¿ì¸¸ ½áµµ µÈ´Ù. ¹Ý¸é âÀ» »ý¼ºÇؼ­, ±× ƯÁ¤ À©µµ¿ì¿¡¼­ ±ò²ûÈ÷ ÀÛµ¿ÇÒ ÇÔ¼öµéÀ» È£ÃâÇØµµ µÈ´Ù.

¿¹¸¦ µé¾î, ¸¸¾à ´ç½ÅÀÌ ¾Æ·¡¸¦ È£ÃâÇÑ´Ù¸é

    printw("Hi There !!!");                                                  
    refresh();                                                               


À̰ÍÀº stdscr ÀÇ ÇöÀç Ä¿¼­ À§Ä¡¿¡ ½ºÆ®¸µÀ» ÂïÀ» °ÍÀÌ´Ù. ºñ½ÁÇÏ°Ô refresh() ÇÔ¼ö È£Ãâ ¶ÇÇÑ stdscr ¿¡¼­¸¸ ÀÛµ¿ÇÒ °ÍÀÌ´Ù.

´ç½ÅÀÌ ¸¸¾à À©µµ¿ì¸¦ ¸¸µé¾ú´Ù¸é, º¸ÅëÇÔ¼ö À̸§ ¾Õ¿¡ 'w' °¡ ºÙÀº ÇÔ¼öµéÀ» È£ÃâÇØ¾ß¸¸ ÇÑ´Ù.

    wprintw(win, "Hi There !!!");                                            
    wrefresh(win);                                                           


¹®¼­ÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­ ¹è¿ï °ÍÀÌÁö¸¸, ÇÔ¼öÀÇ À̸§Àº °°Àº ÀÛ¸í¹ýÀ» µû¸¥´Ù. °¢°¢ÀÇ ÇÔ¼ö¿¡´Â º¸Åë ºñ½ÁÇÑ ¼¼°³ÀÇ ÇÔ¼ö°¡ ´õ ÀÖ´Ù.

    printw(string);        /* Print on stdscr at present cursor position */     
    mvprintw(y, x, string);/* Move to (y, x) then print string     */           
    wprintw(win, string);  /* Print on window win at present cursor position */ 
                           /* in the window */                                  
    mvwprintw(win, y, x, string);   /* Move to (y, x) relative to window */     
                                    /* co-ordinates and then print         */   


º¸Åë w °¡ ºÙÁö ¾ÊÀº ÇÔ¼ö´Â À©µµ¿ì ÆÄ¶ó¸ÞÅÍ·Î stdscr À» »ç¿ëÇÏ´Â w °¡ ºÙÀº ÇÔ¼öµé¿¡ ´ëÇÑ ¸ÅÅ©·ÎÀÌ´Ù.


1.6 printw() °°Àº Ãâ·Â ÇÔ¼ö¿¡ ´ëÇØ


¾Æ¸¶ ´ç½ÅÀº ÀÌÁ¦ ¹«¾ð°¡¸¦ ÇÏ°í ½Í¾î ¾È´ÞÀÌ ³µÀ» °Í °°´Ù. curses ÇÔ¼öµéÀÇ ¸ðÇèÀ¸·Î ´Ù½Ã µ¹¾Æ°¡ÀÚ. ÀÚ ÀÌÁ¦ curses ´Â ÃʱâÈ­ µÇ¾ú´Ù¸é, ¼¼°è¿Í interact ¸¦ ÇØº¸ÀÚ.

È­¸é¿¡ Ãâ·ÂÀ» ÇÏ´Â ÇÔ¼ö¿¡´Â Å©°Ô ¼¼Á¾·ù°¡ ÀÖ´Ù.

  • addch() class: Print single character with attributes

  • printw() class: Print formatted output similar to printf()

  • addstr() class: Print strings

ÀÌ ÇÔ¼öµéÀº ¼­·Î ¹Ù²ã°¡¸ç ½áµµ µÇ°í, ¾î´À ÇÔ¼ö¸¦ ¾²´À³Ä´Â ½ºÅ¸ÀÏ¿¡ µû¸¥ ¹®Á¦´Ù. °¢°¢À» »ó¼¼È÷ ¾Ë¾Æº¸ÀÚ.


1.6.1 addch() ·ùÀÇ ÇÔ¼öµé


ÀÌ ÇÔ¼öµéÀº ÇöÀç Ä¿¼­ À§Ä¡¿¡ ÇÑ ¹®ÀÚ¸¦ Âï°í Ä¿¼­ÀÇ À§Ä¡¸¦ ´ÙÀ½À¸·Î ¿Å±ä´Ù. ´ç½ÅÀº ÀÌ°É ÅëÇØ ¹®ÀÚ¸¦ ÂïÀ» ¼öµµ ÀÖÁö¸¸, º¸Åë ÀÌ ÇÔ¼öµéÀº ¸î¸î ¼Ó¼ºÀÌ ÀÖ´Â ¹®ÀÚµéÀ» ÂïÀ» ¶§ ¾²ÀδÙ. ¼Ó¼º¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº µÚ¿¡ ´Ù·ç°í ÀÖ´Ù. ¸¸¾à ¹®ÀÚ¿¡ ¾î¶°ÇÑ ¼Ó¼ºµé (±½Àº ±Û¾¾, ¹ÝÀü»ö µîµî) ÀÌ °áÇյǾî ÀÖ´Ù¸é curses °¡ ±× ¹®ÀÚ¸¦ Ãâ·ÂÇÒ¶§ ±× ¼Ó¼º¿¡ ¸Â°Ô Ãâ·ÂÇÏ°Ô µÈ´Ù.

¹®ÀÚ¿¡ ƯÁ¤ ¼Ó¼ºµéÀ» ³ÖÀ¸·Á¸é ´ÙÀ½ÀÇ µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.

  • ÇÑ ¹®ÀÚ¿¡ ¿øÇÏ´Â ¼Ó¼º ¸ÅÅ©·ÎµéÀ» OR ÇØÁÖ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ¼Ó¼º ¸ÅÅ©·ÎµéÀº ncurses.h ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ±½°í ¹ØÁÙÀÌ ±×¾îÁø ¹®ÀÚ ch ¸¦ Âï°í ½Í´Ù¸é addch() ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ È£ÃâÇÏ¸é µÈ´Ù.
        addch(ch | A_BOLD | A_UNDERLINE);


  • attrset(), attron(), attroff() ¿Í °°Àº ÇÔ¼ö¸¦ ¾²´Â ¹æ¹ýÀÌ´Ù. ÀÌ ÇÔ¼öµéÀº Attributes ¼½¼Ç¿¡¼­ ¼³¸íÇÑ´Ù. °£´ÜÈ÷ ¸»Çϸé, À̰͵éÀº ÁÖ¾îÁø À©µµ¿ìÀÇ ¼Ó¼ºÀ» Á¶ÀýÇÑ´Ù. Çѹø ¼³Á¤µÇ¸é, ±×°ÍÀÌ ²¨Áö±â Àü±îÁö´Â ±× À©µµ¿ì ¾È¿¡¼­ ÂïÈ÷´Â ¹®ÀÚµéÀº ÁÖ¾îÁø ¼Ó¼º´ë·Î Ãâ·ÂµÈ´Ù.

ºÎ°¡ÀûÀ¸·Î curses ´Â ¹®ÀÚ ±â¹Ý ±×·¡ÇÈÀ» À§Çؼ­ ¸î¸î Ư¼öÇÑ ¹®ÀÚµéÀ» Á¦°øÇÑ´Ù. Å×ÀÌºí ¶Ç´Â ¼öÆò¼±, ¼öÁ÷¼± µîÀ» ±×¸± ¶§ ¾µ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ¾²Àϼö ÀÖ´Â ¹®ÀÚµéÀº ncurses.h ÆÄÀÏ ¾È¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. Çì´õÆÄÀÏ¿¡¼­ ACS_ ·Î ½ÃÀÛÇÏ´Â ¸ÅÅ©·Î¸¦ ã¾Æº¸µµ·Ï ÇØ¶ó.


1.6.2 mvaddch(), waddch() ¿Í mvwaddch()


mvaddch() ÇÔ¼ö´Â Ä¿¼­¸¦ ÁÖ¾îÁø À§Ä¡·Î ¿Å±â°í ¹®ÀÚ¸¦ Ãâ·ÂÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ ¾´´Ù.

    move(row,col);    /* moves the cursor to rowth row and colth column */   
    addch(ch);                                                               
can be replaced by
    mvaddch(row,col,ch);                                                     


waddch() ÇÔ¼ö´Â addch() ¿Í ºñ½ÁÇÏ´Ù. ´Ü ÁÖ¾îÁø À©µµ¿ì¿¡ ¹®ÀÚ¸¦ Âï´Â´Ù´Â Á¡À» Á¦¿ÜÇÏ°ï ¸»ÀÌ´Ù. (addch() ÇÔ¼ö´Â stdscr À©µµ¿ì¿¡ ¹®ÀÚ¸¦ Âï´Â´Ù´Â °Í¿¡ ÁÖÀÇÇ϶ó.)

ÀÌ¿Í À¯»çÇÏ°Ô mvwaddch() ÇÔ¼öµµ ÁÖ¾îÁø À©µµ¿ì³»¿¡¼­ ÁÖ¾îÁø À§Ä¡¿¡ ¹®ÀÚ¸¦ ÂïÀ» ¶§ »ç¿ëµÈ´Ù.

ÀÚ ¿ì¸®´Â ±âº»ÀûÀÎ Ãâ·Â ÇÔ¼öÀÎ addch() ¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù. ±×·±µ¥ ¸¸¾à ¿ì¸®°¡ ½ºÆ®¸µÀ» Âï±æ ¿øÇÑ´Ù¸é ÇѱÛÀÚ¾¿ Âï´Â °ÍÀº ¸Å¿ì ¹ø°Å·Î¿î ÀÏÀÌ µÉ °ÍÀÌ´Ù. ¿îÁÁ°Ôµµ ncurses ´Â printf ·ù³ª puts ·ùÀÇ ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù.


1.6.3 printw() ·ùÀÇ ÇÔ¼öµé


ÀÌ ÇÔ¼öµéÀº ½ºÅ©¸°ÀÇ ¾Æ¹« À§Ä¡¿¡³ª Ãâ·ÂÇÒ ¼ö ÀÖ´Â ±â´ÉÀÌ ´õÇØÁø printf() ÇÔ¼ö¶ó°í º¸¸é µÈ´Ù.


1.6.3.1 printw() ¿Í mvprintw


ÀÌ µÎ°³ÀÇ ÇÔ¼ö´Â printf() ¿Í ÀÛµ¿¹ýÀÌ À¯»çÇÏ´Ù. mvprintw() ´Â Ä¿¼­¸¦ ƯÁ¤À§Ä¡·Î ¿Å±â°í Ãâ·ÂÇÒ¶§ ¾²ÀδÙ. ¸¸¾à ´ç½ÅÀÌ Ä¿¼­¸¦ ÀÏ´Ü ¸ÕÀú ¿Å±â°í ±× ÈÄ¿¡ printw() ÇÔ¼ö·Î Ãâ·ÂÀ» ÇϰíÀÚ ÇÑ´Ù¸é, move() ÇÔ¼ö¸¦ ¸ÕÀú ¾²°í printw() ÇÔ¼ö¸¦ ¾²¸éµÈ´Ù. ÀÌ·± °æ¿ì¿£ mvprintw() ÇÔ¼ö¸¦ ¾²¸é µÇ°ÚÁö¸¸, ¾Æ¹«Æ° ´ç½ÅÀÌ ¿øÇÏ´Â ´ë·Î À¶Å뼺ÀÖ°Ô ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.


1.6.3.2 wprintw() ¿Í mvwprintw


ÀÌ µÎ ÇÔ¼ö´Â ÀÎÀÚ·Î ¹ÞÀº À©µµ¿ì¿¡ Ãâ·ÂÇÑ´Ù´Â Á¡À» Á¦¿ÜÇϰï À§ÀÇ µÎ ÇÔ¼ö¿Í µ¿ÀÏÇÏ´Ù.


1.6.3.3 vwprintw()


ÀÌ ÇÔ¼ö´Â vprintf() ¿Í ºñ½ÁÇÏ´Ù. ÇÔ¼ö ÀÎÀÚÀÇ Á¾·ù°¡ ´Ù¾çÇÑ °æ¿ì¸¦ Ãâ·ÂÇÒ¶§ ¾µ ¼ö ÀÖ´Ù.


1.6.3.4 °£´ÜÇÑ printw ¿¹Á¦


Example 3. A Simple printw example


#include <ncurses.h>                    /* ncurses.h includes stdio.h */                    
#include <string.h>                                                                         
                                                                                            
int main()                                                                                  
{                                                                                           
 char mesg[]="Just a string";           /* message to be appeared on the screen */          
 int row,col;                           /* to store the number of rows and *                
                                         * the number of colums of the screen */            
 initscr();                             /* start the curses mode */                         
 getmaxyx(stdscr,row,col);              /* get the number of rows and columns */            
 mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);                                            
                                        /* print the message at the center of the screen */ 
 mvprintw(row-2,0,"This screen has %d rows and %d columns\n",row,col);                      
 printw("Try resizing your window(if possible) and then run this program again");           
 refresh();                                                                                 
 getch();                                                                                   
 endwin();                                                                                  
                                                                                            
 return 0;                                                                                  
}                                                                                           



À§ ÇÁ·Î±×·¥Àº printw ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ¾ó¸¶³ª ½¬¿îÁö º¸¿©ÁÖ°í ÀÖ´Ù. ´ÜÁö À§Ä¡¿Í È­¸é¿¡ ³ªÅ¸³¯ ¸Þ¼¼Áö¸¦ ³Ñ°ÜÁֱ⸸ ÇÏ¸é µÈ´Ù.

À§ ÇÁ·Î±×·¥¿¡´Â ncurses.h ¿¡ Á¤ÀÇµÈ ¸ÅÅ©·Î ÇÔ¼ö getmaxyx() °¡ »ç¿ëµÇ¾ú´Ù. ÀÌ ÇÔ¼ö´Â ÁÖ¾îÁø À©µµ¿ìÀÇ Çà°ú ¿­ÀÇ ÃÖ´ë°ªÀ» ±¸Çؼ­ ¸®ÅÏÇÑ´Ù. getmaxyx() ÇÔ¼ö´Â ÁÖ¾îÁø º¯¼öÀÇ °ªÀ» °»½ÅÇÏ°Ô µÇ´Âµ¥, ÀÌÀ¯´Â ¿ì¸®°¡ ±× ÇÔ¼ö¿¡ º¯¼ö¿¡´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁØ °ÍÀÌ ¾Æ´Ï¶ó ´ÜÁö º¯¼ö¸¦ ³Ñ°ÜÁá±â ¶§¹®ÀÌ´Ù.


1.6.4 addstr() ·ùÀÇ ÇÔ¼öµé


addstr() ÇÔ¼ö´Â ÁÖ¾îÁø À©µµ¿ì¿¡ ¹®ÀÚ¿­À» ÂïÀ» ¶§ »ç¿ëÇÑ´Ù. À̰ÍÀº ÁÖ¾îÁø ¹®ÀÚ¿­ÀÇ °¢ ¹®ÀÚ¿¡ ´ëÇØ addch() ¸¦ ¸Å¹ø È£ÃâÇÏ´Â °Í°ú À¯»çÇѵ¥, ÀÌ´Â ¸ðµç Ãâ·Â ÇÔ¼öµé¿¡ ´ëÇØ¼­µµ ¸¶Âù°¡ÁöÀÌ´Ù. ¿©±â¿¡µµ curses ÀÇ ÀÛ¸í¹ýÀ» µû¸£´Â mvaddstr(), mvwaddstr(), waddstr() µîÀÇ À¯»çÇÔ¼öµéÀÌ ÀÖ´Ù.(e.g. mvaddstr() ÇÔ¼ö´Â move() ¸¦ È£ÃâÇÏ°í³ª¼­ addstr() À» È£ÃâÇÏ´Â °Í°ú °°´Ù.) À̿ܿ¡µµ Á¤¼ö ÀÎÀÚ(n À̶óÇÏÀÚ) ¸¦ Ãß°¡·Î ¹Þ´Â addnstr() À̶ó´Â ÇÔ¼ö°¡ Àִµ¥, ÀÌ ÇÔ¼ö´Â ÃÖ´ë n °³ÀÇ ¹®ÀÚ¸¦ È­¸é¿¡ Ãâ·ÂÇÑ´Ù. ¸¸¾à n ÀÌ À½¼ö¶ó¸é, ¹®ÀÚ¿­À» ¸ðµÎ Âï°ÔµÈ´Ù.


1.6.5 ÁÖÀÇ »çÇ×


ÀÌ ÇÔ¼öµéÀº ÀüºÎ y À§Ä¡ °ªÀ» ¸ÕÀú ÀÎÀÚ·Î ¹Þ°í ±× µÚ¿¡ x ¸¦ ¹Þ´Â´Ù. Ãʺ¸ÀÚ°¡ ÈçÈ÷ ÇÏ´Â ½Ç¼öÁß Çϳª°¡ x,y ¼ø¼­·Î °ªÀ» Àü´ÞÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ (y,x) ÁÂÇ¥·Î ¸¹Àº ÀÛ¾÷À» ÇØ¾ß ÇÑ´Ù¸é, ½ºÅ©¸°À» À©µµ¿ì·Î ³ª´²¼­ °¢°¢À» µû·Î ó¸®ÇÏ´Â ¹æ¹ýÀ» »ý°¢ÇØ º¸µµ·Ï ÇÏ¿©¶ó. À©µµ¿ìÁî´Â windows ¼½¼Ç¿¡¼­ ´Ù·ç°í ÀÖ´Ù.


1.7 scanw() °°Àº ÀÔ·ÂÇÔ¼ö¿¡ ´ëÇØ


ÀÔ·Â ¾øÀÌ Ãâ·Â¸¸ ÇÏ´Â °ÍÀº Áö·çÇÏÁö ¾ÊÀº°¡? ÀÌÁ¦ »ç¿ëÀڷκÎÅÍ ÀÔ·ÂÀ» ¹Þ´Â ÇÔ¼öµéÀ» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ÀÌ ÇÔ¼öµéµµ ¿ª½Ã ¼¼°³ÀÇ Å« ºÐ·ù·Î ³ª´­ ¼ö ÀÖ´Ù.

  • getch() class: Get a character

  • scanw() class: Get formatted input

  • getstr() class: Get strings



1.7.1 getch() ·ùÀÇ ÇÔ¼öµé


ÀÌ ÇÔ¼öµéÀº Å͹̳ηΠºÎÅÍ ¹®ÀÚ Çϳª¸¦ ÀԷ¹޴´Ù. ±×·¯³ª ¿©±â¿¡´Â ¹Ýµå½Ã ¤°í ³Ñ¾î°¡¾ßÇÒ ¸î¸î ¹®Á¦°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ¸¸¾à cbreak() ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é, curses ´Â ´ç½ÅÀÇ ÀԷ¹®ÀÚµéÀ» ¿¬¼ÓÀ¸·Î ÀÐÁö ¾Ê°í new line À̳ª EOF ¹®ÀÚ°¡ µé¾î¿ÔÀ» ¶§¸¸ ÀÔ·ÂÀ» Àб⠽ÃÀÛÇÒ °ÍÀÌ´Ù. À̰ÍÀ» ¸·±â À§Çؼ­´Â cbreak() ÇÔ¼ö¸¦ ¹Ýµå½Ã »ç¿ëÇØ¼­ ÇÁ·Î±×·¥¿¡¼­ ¹®ÀÚµéÀ» Áï°¢ Ȱ¿ëÇÏ°Ô ÇØ¾ßÇÑ´Ù. ¶Ç ´Ù¸¥ ³Î¸® »ç¿ëµÇ´Â ÇÔ¼ö´Â noecho() ÀÌ´Ù. À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ, ÀÌ ÇÔ¼ö°¡ ¼³Á¤µÇ¸é »ç¿ëÀÚµéÀÌ ´©¸¥ ŰÀÇ ¹®ÀÚ°¡ È­¸é¿¡ ³ªÅ¸³ªÁö ¾Ê´Â´Ù. cbreak() ¿Í noecho() µÎ ÇÔ¼ö´Â Ű °ü¸®ÀÇ ÀüÇüÀûÀÎ ¿¹ÀÌ´Ù. ÀÌ·± ·ùÀÇ ÇÔ¼öµéÀº key management ¼½¼Ç¿¡¼­ ¼³¸íÇϰí ÀÖ´Ù.


1.7.2 scanw() ·ùÀÇ ÇÔ¼öµé

ÀÌ ÇÔ¼öµéÀº ½ºÅ©¸°ÀÇ ¾Æ¹« À§Ä¡¿¡¼­³ª ÀÔ·ÂÀ» ¹ÞÀ» ¼ö ÀÖ´Â ±â´ÉÀÌ ´õÇØÁø scanf() ÇÔ¼ö¿Í À¯»çÇÏ´Ù.


1.7.2.1 scanw() ¿Í mvscanw


ÀÌ ÇÔ¼öµéÀÇ »ç¿ë¹ýÀº sscanf() ÇÔ¼ö¿Í ºñ½ÁÇѵ¥, ÀԷ¹ÞÀ» ÁÙÀÌ wgetstr() ÇÔ¼ö¿¡ ÀÇÇØ Á¦°øµÈ´Ù. Áï ÀÌ ÇÔ¼öµéÀº wgetstr() ÇÔ¼ö (¾Æ·¡¿¡¼­ ¼³¸íÇÔ) À» È£ÃâÇÏ°í ±× °á°ú·Î ¹ÞÀº ÁÙÀ» ½ºÄµ¿¡ »ç¿ëÇÑ´Ù.


1.7.2.2 wscanw() ¿Í mvwscanw()


ÀÌ ÇÔ¼öµéÀº ÀÔ·ÂÀ» ÀÎÀÚ·Î ¹ÞÀº À©µµ¿ì¿¡¼­ Àд´ٴ °Í ¸»°í´Â À§ÀÇ µÎ ÇÔ¼ö¿Í À¯»çÇÏ´Ù.


1.7.2.3 vwscanw()


ÀÌ ÇÔ¼ö´Â vscanf() ¿Í ºñ½ÁÇÏ´Ù. À̰ÍÀº ÀԷ¹ÞÀ» ÀÎÀÚÀÇ Á¾·ù°¡ ´Ù¾çÇÒ °æ¿ì »ç¿ëµÈ´Ù.


1.7.3 getstr() ·ùÀÇ ÇÔ¼öµé


ÀÌ ÇÔ¼öµéÀº Å͹̳ηΠºÎÅÍ ¹®ÀÚ¿­À» ÀԷ¹ÞÀ» ¶§ »ç¿ëµÈ´Ù. º»ÁúÀûÀ¸·Ð ÀÌ ÇÔ¼ö´Â getch() ÇÔ¼ö¸¦ newline, ij¸®Áö¸®ÅÏ, EOF ¸¦ ¹ÞÀ»¶§ ±îÁö °è¼Ó È£ÃâÇÏ´Â °Í°ú °°Àº ÀÏÀ» ÇÑ´Ù. °á°ú ¹®ÀÚ¿­Àº »ç¿ëÀÚ°¡ Á¦°øÇÑ ¹®ÀÚ¿­ Æ÷ÀÎÅÍÀÎ str º¯¼ö¿¡ ÀúÀåµÈ´Ù.


1.7.4 ¸î¸î ¿¹Á¦


Example 4. A Simple scanw example

#include <ncurses.h>                    /* ncurses.h includes stdio.h */                   
#include <string.h>                                                                        
                                                                                           
int main()                                                                                 
{                                                                                          
 char mesg[]="Enter a string: ";                /* message to be appeared on the screen */ 
 char str[80];                                                                             
 int row,col;                           /* to store the number of rows and *               
                                         * the number of colums of the screen */           
 initscr();                             /* start the curses mode */                        
 getmaxyx(stdscr,row,col);              /* get the number of rows and columns */           
 mvprintw(row/2,(col-strlen(mesg))/2,"%s",mesg);                                           
                                /* print the message at the center of the screen */        
 getstr(str);                                                                              
 mvprintw(LINES - 2, 0, "You Entered: %s", str);                                           
 getch();                                                                                  
 endwin();                                                                                 
                                                                                           
 return 0;                                                                                 
}                                                                                          




1.8 ¼Ó¼º


¿ì¸®´Â ¹®ÀÚ¸¦ Ãâ·ÂÇÒ¶§ Ưº°ÇÑ È¿°ú¸¦ ÁÖ±âÀ§Çؼ­ ¼Ó¼ºÀ» ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ÀÌ¹Ì ¾Ë¾Æº» ÀûÀÌ ÀÖ´Ù. ¼Ó¼ºÀº Àß »ç¿ëÇϱ⸸ Çϸé Á¤º¸¸¦ ½±°í ÀÌÇØÇϱâ ÁÁ°Ô Ç¥ÇöÇÒ ¼ö°¡ ÀÖ´Ù. ´ÙÀ½ ÇÁ·Î±×·¥Àº C ÆÄÀÏÀ» ÀÔ·ÂÀ¸·Î Àоî ÁÖ¼®µéÀ» ±½°Ô Ç¥ÇöÇÑ´Ù. Äڵ带 »ìÆìº¸µµ·Ï ÇÏÀÚ.

Example 5. A Simple Attributes example

#include <ncurses.h>                                                         
                                                                             
int main(int argc, char *argv[])                                             
{                                                                            
    int ch, prev;                                                            
    FILE *fp;                                                                
    int goto_prev = FALSE, y, x;                                             
                                                                             
    if(argc != 2)                                                            
    {   printf("Usage: %s <a c file name>\n", argv[0]);                      
        exit(1);                                                             
    }                                                                        
    fp = fopen(argv[1], "r");                                                
    if(fp == NULL)                                                           
    {   perror("Cannot open input file");                                    
        exit(1);                                                             
    }                                                                        
                                                                             
    initscr();                      /* Start curses mode            */       
                                                                             
    prev = EOF;                                                              
    while((ch = fgetc(fp)) != EOF)                                           
    {   if(prev == '/' && ch == '*')    /* If it is / and * then olny        
                                         * switch bold on */                 
        {   attron(A_BOLD);                                                  
            goto_prev = TRUE;       /* Go to previous char / and             
                                     * print it in BOLD */                   
        }                                                                    
        if(goto_prev == TRUE)                                                
        {   getyx(stdscr, y, x);                                             
            move(y, x - 1);                                                  
            printw("%c%c", '/', ch); /* The actual printing is done          
                                      * here */                              
            ch = 'a';                /* 'a' is just a dummy                  
                                      * character to prevent */              
                                     // "/*/" comments.                      
            goto_prev = FALSE;      /* Set it to FALSE or every              
                                     * thing from here will be / */          
        } else                                                               
            printw("%c", ch);                                                
        refresh();                                                           
        if(prev == '*' && ch == '/')                                         
                attroff(A_BOLD);        /* Switch it off once we got *       
                                           and then / */                     
        prev = ch;                                                           
    }                                                                        
    getch();                                                                 
    endwin();                       /* End curses mode                */     
    return 0;                                                                
}                                                                            


Àú ÃʱâÈ­µé°ú ´Ù¸¥ ¾µµ¥ ¾ø´Â °ÍµéÀº ½Å°æ¾²Áö ¸»°í, while ·çÇÁ ¿¡¸¸ ÁýÁßÇØ¶ó. ±×°ÍÀº ÆÄÀÏ¿¡¼­ ¹®ÀÚµéÀ» Àо /* ¿Í °°Àº ÆÐÅÏÀ» ã´Â´Ù. Çѹø ÆÐÅÏÀ» ã°ÔµÇ¸é attron() ÇÔ¼ö¸¦ ½á¼­ BOLD ¼Ó¼ºÀ» ÄÒ´Ù. ±× ÈÄ */ ÆÐÅÏÀ» ãÀ¸¸é attroff() ·Î ¼Ó¼ºÀ» ´Ù½Ã ²ô°Ô µÈ´Ù.

¶ÇÇÑ À§ ÇÁ·Î±×·¥Àº getyx() ¿Í move() ¶ó´Â À¯¿ëÇÑ ÇÔ¼öµéµµ ¼Ò°³ÇØÁÖ°í ÀÖ´Ù. ù¹øÂ° ÇÔ¼ö´Â ÇöÀç Ä¿¼­ÀÇ À§Ä¡¿¡ ÇØ´çÇÏ´Â °ªÀ» º¯¼ö y, x ¿¡ ÀúÀåÇÑ´Ù. getyx() ÇÔ¼ö´Â ¸ÅÅ©·Î ÇÔ¼öÀ̱⠶§¹®¿¡ º¯¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Àü´ÞÇÒ Çʿ䰡 ¾ø´Ù. move() ÇÔ¼ö´Â Ä¿¼­¸¦ ÁÖ¾îÁø À§Ä¡·Î ¿Å±â´Â ÇÔ¼öÀÌ´Ù.

À§ ÇÁ·Î±×·¥Àº ±×´ÙÁö ¸¹Àº ÀÏÀ» ÇÏÁö ¾Ê´Â Á¤¸» °£´ÜÇÑ °ÍÀÌ´Ù. ÀÌ ÄÚµå À§¿¡ C ÆÄÀÏÀ» ÀÐ°í ±×°ÍÀ» ÆÄ½ÌÇØ¼­ ¼­·Î ´Ù¸¥ »öÀ¸·Î Ãâ·ÂÇÏ´Â º¸´Ù ´õ À¯¿ëÇÑ ±â´ÉÀ» Ãß°¡ÇØ º¼ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ¶ÇÇÑ Àú°ÍÀ» ´Ù¸¥ ¾ð¾îµé¿¡ ´ëÇØ¼­µµ È®ÀåÇØ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


1.8.1 ¼¼ºÎ »çÇ×


¼Ó¼º¿¡ ´ëÇØ Á» ´õ ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. attron(), attroff(), attrset() ¹× ±×¿Ü attr_get() µîÀÇ ÇÔ¼öµéÀº ¼Ó¼ºÀ» ²ô°í ÄѰųª, ¼Ó¼ºÀ» °¡Á®¿À°í Ä÷¯Ç®ÇÑ È­¸éÀ» ¸¸µé¾î³»´Âµ¥ ¾²ÀδÙ.

attron °ú attroff ÇÔ¼ö´Â ¼Ó¼ºµé¿¡ ´ëÇÑ bit-mask ¸¦ °¡Áö°í ±×°ÍµéÀ» ²°´Ù Ä×´Ù ÇÑ´Ù. <curses.h> ¿¡ Á¤ÀǵǾî ÀÖ´Â ´ÙÀ½ÀÇ ºñµð¿À ¼Ó¼ºµéÀÌ ÀÌ ÇÔ¼ö¿¡ ¾²ÀÏ ¼ö ÀÖ´Ù.

#!
    A_NORMAL        Normal display (no highlight)                            
    A_STANDOUT      Best highlighting mode of the terminal.                  
    A_UNDERLINE     Underlining                                              
    A_REVERSE       Reverse video                                            
    A_BLINK         Blinking                                                 
    A_DIM           Half bright                                              
    A_BOLD          Extra bright or bold                                     
    A_PROTECT       Protected mode                                           
    A_INVIS         Invisible or blank mode                                  
    A_ALTCHARSET    Alternate character set                                  
    A_CHARTEXT      Bit-mask to extract a character                          
    COLOR_PAIR(n)   Color-pair number n                                      
                                                                             


¸¶Áö¸· °ÍÀÌ °¡Àå È­·ÁÇÑ °ÍÁß Çϳª´Ù. »ö»óµé(#color)Àº ´ÙÀ½ ¼½¼Ç¿¡¼­ ¼³¸íÇÑ´Ù.

¿©·¯ È¿°ú¸¦ °ãÃij¾·Á¸é À§ÀÇ ¾Æ¹« °ªµéÀ» OR(|) ¿¬»êÀ» ÇÏ¸é µÈ´Ù. ¸¸¾à ¹ÝÀüµÇ°í ±ôºýÀÌ´Â ¹®ÀÚµéÀ» ¿øÇÑ´Ù¸é ´ÙÀ½Ã³·³ ÇØ¶ó.

    attron(A_REVERSE | A_BLINK);                                             




1.8.2 attron() ´ë attrset()


±×·³ ´ëü attron() ÇÔ¼ö¿Í attrset() ÇÔ¼öÀÇ Â÷ÀÌ´Â ¹«¾ùÀϱî? attron ÀÌ ±×°Í¿¡ ÁÖ¾îÁø ¼Ó¼º¸¸À» ÄÓ ¼ö Àִµ¥ ¹ÝÇØ attrset Àº À©µµ¿ìÀÇ ¼Ó¼ºµéÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. Áï attset() ´Â À©µµ¿ì°¡ ÇöÀç ¾î¶² ¼Ó¼ºÀ» °¡Áö°í ÀÖ´ÂÁö »ó°ü¾øÀÌ »õ ¼Ó¼ºµéÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. attroff() ¶ÇÇÑ ±×°Í¿¡ ÀÎÀÚ·Î ÁÖ¾îÁø ¼Ó¼º¸¸À» ²ø ¼ö ÀÖ´Ù. ÀÌ·± ±â´ÉÀº ¼Ó¼ºÀ» ½±°Ô ´Ù·ê ¼ö ÀÖ´Â À¯¿ëÇÔÀ» Á¦°øÇÏ´Â ¹Ý¸é, ¸¸¾à ´ç½ÅÀÌ ÁÖÀDZí°Ô ±×°ÍÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é À©µµ¿ì°¡ ¾î¶² ¼Ó¼ºÀ» °¡Áö°í ÀÖ´ÂÁö ³õÄ¥ ¼öµµ ÀÖ°í È­¸éÇ¥½Ã¸¦ ¸ðµÎ ¸ÁÄ¥ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ°Í Æ¯È÷ ¸Þ´º¸¦ ´Ù·ê¶§¿¡ Àß ÀϾ´Â ¹®Á¦´Ù. ±×·¯´Ï ¹Ì¸® ¼Ó¼º¿¡ ´ëÇÑ Á¤Ã¥À» ¼¼¿ö³õ°í ±×°ÍÀ» °í¼öÇϵµ·Ï Ç϶ó. ¾Æ ¶ÇÇÑ ¸ðµç ¼Ó¼ºÀ» ²ô°í ÀÏ¹Ý ¸ðµå·Î µ¹·Á³õ´Â attrset(A_NORMAL) ÇÔ¼ö¿Í µ¿ÀÏÇÑ ±â´ÉÀÇ standend() ÇÔ¼ö¸¦ ¾ðÁ¦µçÁö È£ÃâÇÒ ¼öµµ ÀÖ´Ù.


1.8.3 attr_get()


attr_get() ÇÔ¼ö´Â À©µµ¿ìÀÇ ÇöÀç ¼Ó¼º°ú »ö»óµé °ªÀ» ¾ò¾î¿Â´Ù. ºñ·Ï À§ ÇÔ¼öµé¸¸Å­ ÀÚÁÖ ¾²Áö´Â ¾Ê°ÚÁö¸¸, À̰ÍÀº ½ºÅ©¸°ÀÇ ¿µ¿ªµéÀ» ½ºÄµÇϴµ¥ À¯¿ëÇÏ´Ù. ¿¹¸¦µé¾î ½ºÅ©¸°¿¡ º¹ÀâÇÑ º¯°æÀ» °¡ÇØ¾ß µÇ´Âµ¥, °¢°¢ÀÇ ¹®ÀÚµéÀÌ ¾î¶²¼Ó¼ºÀ» °¡Áö°í ÀÖ´ÂÁö È®½ÇÇÏÁö ¾Ê´Ù°í ÇÏÀÚ. ÀÌ °æ¿ì¿¡ attrset ¶Ç´Â attron µîÀÇ ¿øÇÏ´Â È¿°ú¸¦ ³»´Â ÇÔ¼öµé°ú ÇÔ²² ÀÌ ÇÔ¼ö¸¦ ½á¼­ ÇØ°áÇÒ ¼ö ÀÖ´Ù.


1.8.4 attr_ ÇÔ¼öµé


attr_set(), attr_on °ú °°Àº ·ùÀÇ ÇÔ¼öµéÀÌ ´õ ÀÖ´Ù. À̰͵éÀº attr_t ŸÀÔÀÇ ÀÎÀÚ¸¦ ¹Þ´Â´Ù´Â °É Á¦¿ÜÇϸé À§ÀÇ ÇÔ¼öµé°ú ºñ½ÁÇÏ´Ù.


1.8.5 wattr ÇÔ¼öµé


À§¿¡¼­ ¾ê±âÇÑ °¢°¢ÀÇ ÇÔ¼ö¿¡ ´ëÇØ¼­ ƯÁ¤ À©µµ¿ì¿¡¼­ ÀÛµ¿ÇÏ´Â À̸§¿¡ 'w' °¡ ºÙÀº ÇÔ¼öµéÀÌ ÀÖ´Ù. À§ÀÇ ÇÔ¼öµéÀº stdscr ¿¡¼­ ÀÛµ¿ÇÏ´Â °ÍµéÀÌ´Ù.


1.8.6 chgat() ÇÔ¼öµé


chgat() ÇÔ¼ö´Â curs_attr ÀÇ man ÆäÀÌÁöÀÇ ¸Ç ³¡¿¡ ³ª¿­µÇ¾î ÀÖ´Ù. ±×·¯³ª »ç½Ç ÀÌ°Ç À¯¿ëÇÑ ÇÔ¼öÁß Çϳª´Ù. ÀÌ ÇÔ¼ö´Â ¿òÁ÷ÀÌÁö ¾Ê°í ¹®ÀÚµéÀÇ ±×·ì¿¡ ¼Ó¼ºÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. Ä¿¼­ ¸»ÀÌ´Ù. ±×°ÍÀ» ¿òÁ÷ÀÌÁö ¾Ê°í °¡´ÉÇÏ´Ù. ÀÌ ÇÔ¼ö´Â ÇöÀç Ä¿¼­ À§Ä¡¿¡¼­ ½ÃÀÛÇÏ´Â ¹®Àڵ鿡¼­ ÁÖ¾îÁø ¼ö¸¸Å­ÀÇ ¼Ó¼ºÀ» º¯°æÇÑ´Ù.

ÁÙÀÇ ³¡±îÁö º¯°æÇÒ·Á¸é ¹®ÀÚÀÇ °¹¼ö¿¡ -1 À» ÁÖ¸éµÈ´Ù. ¸¸¾à ÇöÀç À§Ä¡¿¡¼­ ÁÙÀÇ ³¡±îÁö ¹®ÀÚµéÀÇ ¼Ó¼ºµé ¹Ù²Ù°íÀÚ ÇÑ´Ù¸é ´ÙÀ½ ó·³ ÇØ¶ó.

    chgat(-1, A_REVERSE, 0, NULL);                                           


ÀÌ ÇÔ¼ö´Â ÀÌ¹Ì È­¸é¿¡ ³ªÅ¸³ª ÀÖ´Â ±ÛÀÚµéÀÇ ¼Ó¼ºÀ» ¹Ù²Ù´Âµ¥ À¯¿ëÇÏ´Ù. ¹Ù²Ù°íÀÚ ÇÏ´Â °ÍÀÇ ½ÃÀÛÀ§Ä¡·Î Ä¿¼­¸¦ ¿Å±ä´ÙÀ½ ¼Ó¼ºÀ» ¹Ù²ã¶ó.

´Ù¸¥ wchgat(), mvchgat(), wchgat() ÀÌ·± ÇÔ¼öµéµµ w ·Î ½ÃÀÛÇÏ´Â ÇÔ¼öµéÀÌ Æ¯Á¤ À©µµ¿ì¿¡¼­ ÀÛµ¿ÇÑ´Ù´Â °ÍÀ» Á¦¿ÜÇϸé À§¿Í ºñ½ÁÇÏ°Ô µ¹¾Æ°£´Ù. mv ·Î ½ÃÀÛÇÏ´Â ÇÔ¼ö´Â ¸ÕÀú Ä¿¼­¸¦ ¿Å±â°í ÁÖ¾îÁø ÀÏÀ» ÇÑ´Ù. »ç½Ç chgat ÇÔ¼ö´Â wchgat() ÇÔ¼ö¿¡ stdscr À» À©µµ¿ì·Î ³Ñ°ÜÁÖ´Â ¸ÅÅ©·Î ÇÔ¼ö ÀÌ´Ù. ´ëºÎºÐÀÇ w ·Î ½ÃÀÛÇÏÁö ¾Ê´Â ÇÔ¼öµéÀº ¸ÅÅ©·Î ÇÔ¼öµéÀÌ´Ù.

Example 6. Chgat() Usage example

#include <ncurses.h>                                                          
                                                                              
int main(int argc, char *argv[])                                              
{       initscr();                      /* Start curses mode            */    
        start_color();                  /* Start color functionality    */    
                                                                              
        init_pair(1, COLOR_CYAN, COLOR_BLACK);                                
        printw("A Big string which i didn't care to type fully ");            
        mvchgat(0, 0, -1, A_BLINK, 1, NULL);                                  
        /*                                                                    
         * First two parameters specify the position at which to start        
         * Third parameter number of characters to update. -1 means till      
         * end of line                                                        
         * Forth parameter is the normal attribute you wanted to give         
         * to the charcter                                                    
         * Fifth is the color index. It is the index given during init_pair() 
         * use 0 if you didn't want color                                     
         * Sixth one is always NULL                                           
         */                                                                   
        refresh();                                                            
        getch();                                                              
        endwin();                       /* End curses mode                */  
        return 0;                                                             
}                                                                             


ÀÌ ¿¹Á¦´Â curses ÀÇ »ö»óµé¿¡ ´ëÇØ º¸¿©ÁÖ°í ÀÖ´Ù. »ö»ó¿¡ °üÇØ¼­´Â ÈÄ¿¡ ÀÚ¼¼È÷ ´Ù·é´Ù. »öÀ» »ç¿ëÇÏÁö ¾ÊÀ¸·Á¸é 0 °ªÀ» ³ÖÀ¸¸é µÈ´Ù.


1.9 À©µµ¿ì ÇÔ¼öÀÇ ¸ðµç °Í


À©µµ¿ì´Â curses ¿¡¼­ °¡Àå Áß¿äÇÑ °³³äÀÌ´Ù. ÀÌ¹Ì ´ç½ÅÀº ¸ðµç ÇÔ¼öµéÀÌ Àº¿¬Áß¿¡ ÀÛµ¿ÇÏ´Â stdscr À̶ó´Â Ç¥ÁØ À©µµ¿ì¿¡ ´ëÇØ ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ÀÚ ÀÌÁ¦ °¡Àå °£´ÜÇÑ GUI ¸¦ ¸¸µç´Ù°í ÇØµµ ´ç½ÅÀº À©µµ¿ì¸¦ ÇÊ¿ä·Î ÇÒ °ÍÀÌ´Ù. À©µµ¿ì¸¦ ½á¾ßÇÏ´Â ÁÖµÈ ÀÌÀ¯Áß Çϳª´Â ½ºÅ©¸°ÀÇ ÀϺθ¸ µû·Î ó¸®ÇÔÀ¸·Î¼­ ¹Ù²î¾î¾ßÇÒ Çʿ䰡 ÀÖ´Â À©µµ¿ìµé¸¸ º¯°æÇϰԵǾî È¿À²¼ºÀ» ³ôÀÏ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¶Ç º¸´Ù ´õ ³ªÀº µðÀÚÀÎÀÌ ÇÊ¿äÇÒ ¶§µµ ¸¶Âù°¡Áö ÀÌ´Ù. ³­ À©µµ¿ì¸¦ »ç¿ëÇÏ´Â Á¦ÀÏ Áß¿äÇÑ ÀÌÀ¯´Â ÈÄÀÚ¶ó°í ¸»ÇÏ°í ½Í´Ù. ´ç½ÅÀº ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼­ Ç×»ó ´õ ³´°í ´õ ´Ù·ç±â ½¬¿î µðÀÚÀÎÀ» °¥±¸ÇÒ °ÍÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ Å©°í º¹ÀâÇÑ GUI ¸¦ ¸¸µç´Ù¸é À̰ÍÀº ´Ù¸¥ ¹«¾ùº¸´Ù ¼±ÇàÇÏ´Â ÇÙ½ÉÀûÀÎ Áß¿ä ¿ä¼ÒÀÌ´Ù.


1.9.1 °³°ý


À©µµ¿ì´Â newwin() ÇÔ¼ö¸¦ È£ÃâÇØ¼­ ¸¸µé ¼ö°¡ ÀÖ´Ù. À̰ÍÀº »ç½Ç»ó È­¸é¿¡´Â ¾Æ¹«°Íµµ »ý¼ºÇÏÁö ¾Ê´Â´Ù. ÀÌ ÇÔ¼ö´Â À©µµ¿ì¸¦ ó¸®Çϱâ À§ÇÑ ±¸Á¶Ã¼ÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´ç¹Þ°í ±× À©µµ¿ì¿¡ ÇØ´çÇÏ´Â Å©±â, ½ÃÀÛxÀ§Ä¡, ½ÃÀÛyÀ§Ä¡ µîÀÇ Á¤º¸¸¦ °»½ÅÇÑ´Ù. ÀÌ·¸±â ¶§¹®¿¡ curses ¿¡¼­ À©µµ¿ì´Â ´ÜÁö È­¸éÀÇ ´Ù¸¥ ºÎºÐ°ú µ¶¸³ÀûÀ¸·Î ó¸®ÇÒ ¼ö ÀÖ´Â °¡»óÀÇ À©µµ¿ìÀÇ abstraction ÀÌ´Ù. newwin() ÇÔ¼ö´Â WINDOW ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ Æ÷ÀÎÅÍ´Â wprintw() µî°ú °°ÀÌ À©µµ¿ì¿Í °ü·ÃµÈ ÇÔ¼ö¿¡ ÀÎÀÚ·Î ³Ñ°ÜÁú ¼ö ÀÖ´Ù. ÃÖÁ¾ÀûÀ¸·Î À©µµ¿ì´Â delwin() ÇÔ¼ö¿¡ ÀÇÇØ ÆÄ±«µÉ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â À©µµ¿ì ±¸Á¶Ã¼¿¡ ÇÒ´çµÇ¾î ÀÖ´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ÇØÁ¦ÇÒ °ÍÀÌ´Ù.


1.9.2 À©µµ¿ì°¡ ÀÖÀ¸¶ó !!!


À©µµ¿ì°¡ »ý¼ºµÇ¾ú°í ¿ì¸®°¡ ±×°ÍÀ» º¼ ¼ö°¡ ¾ø´Ù¸é ¿ô±âÁö ¾ÊÀ»±î. ÀÌÁ¦ Àç¹Õ´Â À©µµ¿ì ³ªÅ¸³»±â°¡ ½ÃÀ۵ȴÙ. box() ÇÔ¼ö´Â À©µµ¿ìÀÇ Å׵θ®¸¦ ±×¸®´Âµ¥ ¾µ ¼ö ÀÖ´Ù. ¿¹Á¦¸¦ ÅëÇØ ÀÌ ÇÔ¼öµéÀ» º¸´Ù ÀÚ¼¼ÇÏ°Ô µÑ·¯º¸µµ·Ï ÇÏÀÚ.

Example 7. Window Border example

#include <ncurses.h>                                                                    
                                                                                        
                                                                                        
WINDOW *create_newwin(int height, int width, int starty, int startx);                   
void destroy_win(WINDOW *local_win);                                                    
                                                                                        
int main(int argc, char *argv[])                                                        
{       WINDOW *my_win;                                                                 
        int startx, starty, width, height;                                              
        int ch;                                                                         
                                                                                        
        initscr();                      /* Start curses mode            */              
        cbreak();                       /* Line buffering disabled, Pass on             
                                         * everty thing to me           */              
        keypad(stdscr, TRUE);           /* I need that nifty F1         */              
                                                                                        
        height = 3;                                                                     
        width = 10;                                                                     
        starty = (LINES - height) / 2;  /* Calculating for a center placement */        
        startx = (COLS - width) / 2;    /* of the window                */              
        printw("Press F1 to exit");                                                     
        refresh();                                                                      
        my_win = create_newwin(height, width, starty, startx);                          
                                                                                        
        while((ch = getch()) != KEY_F(1))                                               
        {       switch(ch)                                                              
                {       case KEY_LEFT:                                                  
                                destroy_win(my_win);                                    
                                my_win = create_newwin(height, width, starty,--startx); 
                                break;                                                  
                        case KEY_RIGHT:                                                 
                                destroy_win(my_win);                                    
                                my_win = create_newwin(height, width, starty,++startx); 
                                break;                                                  
                        case KEY_UP:                                                    
                                destroy_win(my_win);                                    
                                my_win = create_newwin(height, width, --starty,startx); 
                                break;                                                  
                        case KEY_DOWN:                                                  
                                destroy_win(my_win);                                    
                                my_win = create_newwin(height, width, ++starty,startx); 
                                break;                                                  
                }                                                                       
        }                                                                               
                                                                                        
        endwin();                       /* End curses mode                */            
        return 0;                                                                       
}                                                                                       
                                                                                        
WINDOW *create_newwin(int height, int width, int starty, int startx)                    
{       WINDOW *local_win;                                                              
                                                                                        
        local_win = newwin(height, width, starty, startx);                              
        box(local_win, 0 , 0);          /* 0, 0 gives default characters                
                                         * for the vertical and horizontal              
                                         * lines                        */              
        wrefresh(local_win);            /* Show that box                */              
                                                                                        
        return local_win;                                                               
}                                                                                       
                                                                                        
void destroy_win(WINDOW *local_win)                                                     
{                                                                                       
        /* box(local_win, ' ', ' '); : This won't produce the desired                   
         * result of erasing the window. It will leave it's four corners                
         * and so an ugly remnant of window.                                            
         */                                                                             
        wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');                          
        /* The parameters taken are                                                     
         * 1. win: the window on which to operate                                       
         * 2. ls: character to be used for the left side of the window                  
         * 3. rs: character to be used for the right side of the window                 
         * 4. ts: character to be used for the top side of the window                   
         * 5. bs: character to be used for the bottom side of the window                
         * 6. tl: character to be used for the top left corner of the window            
         * 7. tr: character to be used for the top right corner of the window           
         * 8. bl: character to be used for the bottom left corner of the window         
         * 9. br: character to be used for the bottom right corner of the window        
         */                                                                             
        wrefresh(local_win);                                                            
        delwin(local_win);                                                              
}                                                                                       




1.9.3 ¼³¸í


±«¼ºÀ» Áö¸£Áø¸¶¶ó. ³ªµµ ÀÌ°Ô ¾çÀÌ ¸¹Àº ¿¹Á¦¶õ°É ¾Ë°í ÀÖ´Ù. ±×·¯³ª ¿©±â¼­ ¸î¸î Áß¿äÇÑ °ÍµéÀ» ¼³¸íÇØ¾ß¸¸ ÇÑ´Ù :-). ÀÌ ÇÁ·Î±×·¥Àº »óÇÏÁ¿ìÀÇ ¹æÇâŰ·Î À̵¿ÇÒ ¼ö ÀÖ´Â Á÷»ç°¢ÇüÀÇ À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù. ±×¸®°í »ç¿ëÀÚ°¡ ۸¦ ´©¸¦¶§¸¶´Ù ¹Ýº¹ÀûÀ¸·Î À©µµ¿ì¸¦ ¾ø¾Ö°í ´Ù½Ã ¸¸µç´Ù. È­¸éÀÇ ÇÑ°è ³Ñ¾î±îÁø °¡Áö¸¶¶ó. ±× ÇѰèµéÀ» üũÇÏ´Â °ÍÀº µ¶ÀÚµéÀ» À§ÇÑ ¿¬½ÀÀ¸·Î ³²°ÜµÎ°Ú´Ù. ÀÌÁ¦ Àú°ÍÀ» ÇÑÁÙÇÑÁÙ ºÐ¼®ÇØ º¸ÀÚ.

create_newwin() ÇÔ¼ö´Â newwin() À» ÅëÇØ À©µµ¿ì¸¦ »ý¼ºÇϰí box ÇÔ¼ö·Î ±× Å׵θ®¸¦ º¸¿©ÁØ´Ù. destroy_win() ÇÔ¼ö´Â ¸ÕÀú À©µµ¿ìÀÇ Å׵θ®¸¦ ' ' ¹®ÀÚ·Î ±×¸²À¸·Î¼­ À©µµ¿ì¸¦ Áö¿ì°í ±× ÈÄ delwin() ÇÔ¼ö¸¦ È£ÃâÇØ¼­ °ü·ÃµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù. »ç¿ëÀÚ°¡ ´©¸£´Â Ű¿¡ µû¶ó starty ¶Ç´Â startx °ªÀÌ ¹Ù²î°í »õ À©µµ¿ì°¡ ¸¸µé¾îÁø´Ù.

º¸´Ù½ÃÇÇ destroy_win ¿¡¼­ box ÇÔ¼ö ´ë½Å¿¡ wborder À» »ç¿ëÇÏ¿´´Ù. ÀÌÀ¯´Â ÁÖ¼®¿¡ ¾²¿©ÀÖ´Ù. (ÀÐÁö ¾Ê¾ÒÀ» °ÍÀÌ´Ù. ¾È´Ù. Äڵ带 Àо¶ó :-)). wborder ÇÔ¼ö´Â ¾Æ·¡¿Í °°ÀÌ È£ÃâÇÒ °æ¿ì 4°³ÀÇ ÄÚ³Ê¿Í 4°³ÀÇ ÁÙ¿¡ ´ëÇØ ÁÖ¾îÁø ¹®ÀÚ·Î À©µµ¿ì¸¦ ±×¸°´Ù:

    wborder(win, '|', '|', '-', '-', '+', '+', '+', '+');                    


ÀÌ·¸°Ô »ý±ä âÀÌ »ý¼ºµÈ´Ù.

#!
     +-----------------------+                                                
    |            |                                                           
    |            |                                                           
    |            |                                                           
    |            |                                                           
    |            |                                                           
    |            |                                                           
    +-----------------------+                                                




1.9.4 ¿¹Á¦ÀÇ ´Ù¸¥ ºÎºÐ


¶ÇÇÑ À§ÀÇ ¿¹Á¦¿¡¼­ º¼ ¼ö ÀÖµíÀÌ, ³­ COLS, LINES ¶ó´Â º¯¼ö¸¦ »ç¿ëÇß´Ù. À̰͵éÀº initscr() ÀÌÈÄ¿¡ È­¸éÀÇ Å©±â¿¡ ¸Â°Ô °ªÀÌ ÃʱâÈ­µÈ´Ù. ÀÌ º¯¼öµéÀº È­¸éÀÇ ³ÐÀ̳ª À§ ¿¹Á¦Ã³·³ È­¸éÀÇ Á¤Áß¾ÓÀÇ À§Ä¡¸¦ ã´Âµ¥ À¯¿ëÇÏ´Ù. getch() ÇÔ¼ö´Â ÈçÈ÷ ¾²µí Űº¸µå·ÎºÎÅÍ ÀÔ·ÂÀ» ¹Þ´Â´Ù. ±×¸®°í ÀÔ·ÂµÈ Å°¿¡µû¶ó ÇØ´çÇÏ´Â ÀÏÀ» ÇÏ°Ô µÈ´Ù. ÀÌ·± ·ùÀÇ switch-case ¹®Àº GUI ±â¹Ý ÇÁ·Î±×·¥¿¡¼­ ¸Å¿î ÀϹÝÀûÀÎ ÇüÅÂÀÌ´Ù.


1.9.5 ´Ù¸¥ Å׵θ® ÇÔ¼öµé


À§ ÇÁ·Î±×·¥Àº ۰¡ ´­·ÁÁú¶§¸¶´Ù À©µµ¿ì°¡ ¾ø¾îÁö°í ´Ù¸¥°ÍÀÌ »ý±â±â ¶§¹®¿¡ ±²ÀåÈ÷ ºñÈ¿À²ÀûÀÌ´Ù. ÀÌÁ¦ ´Ù¸¥ Å׵θ®°ü·Ã ÇÔ¼ö¸¦ ½á¼­ ÇÁ·Î±×·¥À» Á» ´õ È¿À²ÀûÀ¸·Î ¸¸µé¾îº¸ÀÚ.

´ÙÀ½ÀÇ ÇÁ·Î±×·¥Àº mvhline() ¿Í mvvline() ÇÔ¼ö¸¦ ½á¼­ °°Àº È¿°ú¸¦ ³»¾ú´Ù. ÀÌ µÎ ÇÔ¼ö´Â ´Ü¼øÇÏ´Ù. À̰͵éÀº ¼öÆò ¶Ç´Â ¼öÁ÷ÀÇ ¼±À» ƯÁ¤ À§Ä¡¿¡¼­ ƯÁ¤ ±æÀ̸¸Å­ »ý¼ºÇÑ´Ù.

Example 8. More border functions

#include <ncurses.h>                                                         
                                                                             
typedef struct _win_border_struct {                                          
        chtype  ls, rs, ts, bs,                                              
                tl, tr, bl, br;                                              
}WIN_BORDER;                                                                 
                                                                             
typedef struct _WIN_struct {                                                 
                                                                             
        int startx, starty;                                                  
        int height, width;                                                   
        WIN_BORDER border;                                                   
}WIN;                                                                        
                                                                             
void init_win_params(WIN *p_win);                                            
void print_win_params(WIN *p_win);                                           
void create_box(WIN *win, int bool);                                         
                                                                             
int main(int argc, char *argv[])                                             
{       WIN win;                                                             
        int ch;                                                              
                                                                             
        initscr();                      /* Start curses mode            */   
        start_color();                  /* Start the color functionality */  
        cbreak();                       /* Line buffering disabled, Pass on  
                                         * everty thing to me           */   
        keypad(stdscr, TRUE);           /* I need that nifty F1         */   
        noecho();                                                            
        init_pair(1, COLOR_CYAN, COLOR_BLACK);                               
                                                                             
        /* Initialize the window parameters */                               
        init_win_params(&win);                                               
        print_win_params(&win);                                              
                                                                             
        attron(COLOR_PAIR(1));                                               
        printw("Press F1 to exit");                                          
        refresh();                                                           
        attroff(COLOR_PAIR(1));                                              
                                                                             
        create_box(&win, TRUE);                                              
        while((ch = getch()) != KEY_F(1))                                    
        {       switch(ch)                                                   
                {       case KEY_LEFT:                                       
                                create_box(&win, FALSE);                     
                                --win.startx;                                
                                create_box(&win, TRUE);                      
                                break;                                       
                        case KEY_RIGHT:                                      
                                create_box(&win, FALSE);                     
                                ++win.startx;                                
                                create_box(&win, TRUE);                      
                                break;                                       
                        case KEY_UP:                                         
                                create_box(&win, FALSE);                     
                                --win.starty;                                
                                create_box(&win, TRUE);                      
                                break;                                       
                        case KEY_DOWN:                                       
                                create_box(&win, FALSE);                     
                                ++win.starty;                                
                                create_box(&win, TRUE);                      
                                break;                                       
                }                                                            
        }                                                                    
        endwin();                       /* End curses mode                */ 
        return 0;                                                            
}                                                                            
void init_win_params(WIN *p_win)                                             
{                                                                            
        p_win->height = 3;                                                   
        p_win->width = 10;                                                   
        p_win->starty = (LINES - p_win->height)/2;                           
        p_win->startx = (COLS - p_win->width)/2;                             
                                                                             
        p_win->border.ls = '|';                                              
        p_win->border.rs = '|';                                              
        p_win->border.ts = '-';                                              
        p_win->border.bs = '-';                                              
        p_win->border.tl = '+';                                              
        p_win->border.tr = '+';                                              
        p_win->border.bl = '+';                                              
        p_win->border.br = '+';                                              
                                                                             
}                                                                            
void print_win_params(WIN *p_win)                                            
{                                                                            
#ifdef _DEBUG                                                                
        mvprintw(25, 0, "%d %d %d %d", p_win->startx, p_win->starty,         
                                p_win->width, p_win->height);                
        refresh();                                                           
#endif                                                                       
}                                                                            
void create_box(WIN *p_win, int bool)                                        
{       int i, j;                                                            
        int x, y, w, h;                                                      
                                                                             
        x = p_win->startx;                                                   
        y = p_win->starty;                                                   
        w = p_win->width;                                                    
        h = p_win->height;                                                   
                                                                             
        if(bool == TRUE)                                                     
        {       mvaddch(y, x, p_win->border.tl);                             
                mvaddch(y, x + w, p_win->border.tr);                         
                mvaddch(y + h, x, p_win->border.bl);                         
                mvaddch(y + h, x + w, p_win->border.br);                     
                mvhline(y, x + 1, p_win->border.ts, w - 1);                  
                mvhline(y + h, x + 1, p_win->border.bs, w - 1);              
                mvvline(y + 1, x, p_win->border.ls, h - 1);                  
                mvvline(y + 1, x + w, p_win->border.rs, h - 1);              
                                                                             
        }                                                                    
        else                                                                 
                for(j = y; j <= y + h; ++j)                                  
                        for(i = x; i <= x + w; ++i)                          
                                mvaddch(j, i, ' ');                          
                                                                             
        refresh();                                                           
                                                                             
}                                                                            




1.10 »ö»ó¿¡ ´ëÇØ¼­


1.10.1 °³°ý


»öÀÌ ¾ø´Ù¸é »îÀº Âü ¿ì¿ïÇÒ °ÍÀÌ´Ù. curses ´Â »öÀ» ´Ù·ç´Â ¸ÚÁø ¸ÞÄ¿´ÏÁòÀ» °¡Áö°í ÀÖ´Ù. ÀÚ ±×·³ ªÀº ÇÁ·Î±×·¥À¸·Î õõÈ÷ Çѹø ½ÃÀÛÇØº¸ÀÚ.

Example 9. A Simple Color example

#include <ncurses.h>                                                                
                                                                                    
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string); 
int main(int argc, char *argv[])                                                    
{       initscr();                      /* Start curses mode            */          
        if(has_colors() == FALSE)                                                   
        {       endwin();                                                           
                printf("You terminal does not support color\n");                    
                exit(1);                                                            
        }                                                                           
        start_color();                  /* Start color                  */          
        init_pair(1, COLOR_RED, COLOR_BLACK);                                       
                                                                                    
        attron(COLOR_PAIR(1));                                                      
        print_in_middle(stdscr, LINES / 2, 0, 0, "Viola !!! In color ...");         
        attroff(COLOR_PAIR(1));                                                     
        getch();                                                                    
        endwin();                                                                   
}                                                                                   
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string)  
{       int length, x, y;                                                           
        float temp;                                                                 
                                                                                    
        if(win == NULL)                                                             
                win = stdscr;                                                       
        getyx(win, y, x);                                                           
        if(startx != 0)                                                             
                x = startx;                                                         
        if(starty != 0)                                                             
                y = starty;                                                         
        if(width == 0)                                                              
                width = 80;                                                         
                                                                                    
        length = strlen(string);                                                    
        temp = (width - length)/ 2;                                                 
        x = startx + (int)temp;                                                     
        mvwprintw(win, y, x, "%s", string);                                         
        refresh();                                                                  
}                                                                                   


º¸´Ù½ÃÇÇ, »öÀ» »ç¿ëÇÒ·Á¸é ¸ÕÀú start_color() ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ±× ÈÄ ´Ù¾çÇÑ ÇÔ¼öµéÀ» ÅëÇØ ´ç½ÅÀÇ Å͹̳ÎÀÇ »ö»ó±â´ÉµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. Å͹̳ÎÀÌ »ö»ó ±â´ÉÀÌ ÀÖ´ÂÁö ¾Æ´ÑÁö ¾Ë¾Æº¼·Á¸é, has_colors() ÇÔ¼ö¸¦ ½á¶ó. ¸¸¾à Å͹̳ÎÀÌ »öÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é FALSE °¡ ¸®Å쵃 °ÍÀÌ´Ù.

curses ´Â start_color() ÀÌ È£ÃâµÉ ¶§ Å͹̳ο¡¼­ Áö¿øµÇ´Â ¸ðµç »öµéÀ» ÃʱâÈ­ÇØ¼­ ÁغñÇÑ´Ù. ÀÌ »öµéÀº ¹Ì¸® Á¤ÀÇµÈ COLOR_BLACK µîµîÀÇ »ó¼ö¸¦ ÅëÇØ ¾µ ¼ö ÀÖ´Ù. ÀÚ ÀÌÁ¦ ½ÇÁ¦·Î »öÀ» ¾µ·Á¸é, »ö»ó¦À» Á¤ÀÇÇØ¾ß ÇÑ´Ù. »öµéÀº Ç×»ó »ö»ó¦ÀÇ ²Ã·Î ¾²¿©Áø´Ù. Áï, init_pair() ÇÔ¼ö¸¦ ÅëÇØ Àü°æ ¹× Èİæ»öÀ» Á¤ÀÇÇØ¾ß¸¸ ÀÌ »ö»ó¦ °ªÀ» ¾µ ¼ö ÀÖ´Ü ¸»ÀÌ´Ù. ÀÌ·¸°Ô ÇÑ´ÙÀ½¿¡¾ß »ö»ó¦ÀÇ °ªÀº COLOR_PAIR() ÇÔ¼ö¿Í ÇÔ²² ÀÏ¹Ý ¼Ó¼º ó·³ ¾²¿©Áú ¼ö ÀÖ´Ù. À̴ óÀ½¿£ Á» ¼º°¡¼Å º¸ÀÌ´Â ÀϵéÀ̳ª, ÀÌ ¹æ¹ýÀº ¿ì¸®°¡ »ö»ó¦µéÀ» ¸Å¿ì ½±°Ô ¾µ ¼ö ÀÖ´Â ¿ì¾ÆÇÑ ±â¹ýÀÌ´Ù. ½© ½ºÅ©¸³Æ®¿¡¼­ ´ÙÀ̾ó·Î±× »óÀÚ¸¦ º¸¿©ÁÖ´Â À¯Æ¿¸®Æ¼ÀÎ "dialog" ÀÇ ¼Ò½º Äڵ带 º¸°Ô µÇ¸é À̸¦ ¾Ë ¼ö ÀÖ´Ù. À̰ÍÀÇ °³¹ßÀÚ´Â ÇÊ¿äÇÑ ¸ðµç Àü°æ ¹× ÈÄ°æ »ö»ó¦¿¡ ´ëÇØ¼­ Á¤ÀǸ¦ ÇØ³õ°í, ÇÁ·Î±×·¥ ½ÃÀ۽ÿ¡ À̸¦ ÃʱâÈ­Çϰí ÀÖ´Ù. ÀÌ ¹æ¹ýÀº ¿ì¸®°¡ ¹Ì¸® »ó¼öó·³ Á¤ÀÇÇØ³õÀº »ö»ó¦À» ¾¸À¸·Î½á »ö»ó ¼Ó¼ºÀ» ¼³Á¤ÇÏ´Â °ÍÀ» ¸Å¿ì ½±°Ô ÇØÁØ´Ù.

´ÙÀ½ÀÇ »öµéÀº curses.h ¿¡ Á¤ÀǵǾî ÀÖ´Ù. ´ç½ÅÀº À̰͵éÀ» ´Ù¾çÇÑ »ö°ü·Ã ÇÔ¼öµé¿¡ ¾µ ¼ö ÀÖ´Ù.

#!
         COLOR_BLACK   0                                                      
        COLOR_RED     1                                                      
        COLOR_GREEN   2                                                      
        COLOR_YELLOW  3                                                      
        COLOR_BLUE    4                                                      
        COLOR_MAGENTA 5                                                      
        COLOR_CYAN    6                                                      
        COLOR_WHITE   7                                                      




1.10.2 »ö»ó Á¤ÀÇ ¹Ù²Ù±â


init_color() ÇÔ¼ö´Â curses ¿¡ ÀÇÇØ Á¤ÀÇµÈ »ö»óÀÇ rgb °ªÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ´ç½ÅÀÌ »¡°£»öÀÇ °­µµ¸¦ ¾ÆÁÖ ¾à°£ ÁÙÀÌ°í ½Í´Ù°í ÇÏÀÚ. ±×·¸´Ù¸é ÀÌ ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ È£ÃâÇÑ´Ù.

    init_color(COLOR_RED, 700, 0, 0);                                        
    /* param 1     : color name                                              
     * param 2, 3, 4 : rgb content min = 0, max = 1000 */                    


¸¸¾à ´ç½ÅÀÇ Å͹̳ÎÀÌ »ö»ó Á¤ÀǸ¦ º¯°æÇÏÁö ¸øÇÑ´Ù¸é, ÀÌ ÇÔ¼ö´Â ERR À» ¸®ÅÏÇÑ´Ù. can_change_color() ÇÔ¼ö´Â Å͹̳ÎÀÌ »ö»óÀ» ¹Ù²Ü ¼ö ÀÖ´Â ±â´ÉÀÌ ÀÖ´ÂÁö ¾ø´ÂÁö È®ÀÎÇÏ´Â ÇÔ¼öÀÌ´Ù. rgb °ªÀÇ ¹üÀ§´Â 0 ºÎÅÍ 1000 ±îÁöÀÌ´Ù. óÀ½¿¡ RED »öÀÌ 1000(r), 0(g), 0(b) ·Î Á¤ÀǵȴÙ.


1.10.3 »ö»ó °ª


color_content() ¿Í pair_content() ÇÔ¼ö´Â »ö»ó¦ÀÇ Àü°æ ¹× Èİæ»öµéÀ» ã´Âµ¥ »ç¿ëÇÑ´Ù.


1.11 Ű ÀÔ·Â ´Ù·ç±â. Æã¼ÇŰ, ¹æÇâŰ µîÀ» ¾î¶»°Ô ÀԷ¹