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

NCURSES Programming HOWTO



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


¹ø¿ª gsong Mgsong_at_hanmail.net

ÀÛ¼º Pradeep Padala Mp_padala_at_yahoo.com

v1.9, 2005-06-20
Revision History                                                             
Revision 1.9           2005-06-20          Revised by: ppadala               
ncurses´Â MIT ¶óÀ̼¾½º·Î º¯°æµÇ¾ú½À´Ï´Ù. ÇÁ·Î±×·¥Àº ÀÌ¿¡ µû¶ó Àç Çã°¡ µË´Ï´Ù.
Revision 1.8           2005-06-17          Revised by: ppadala               
Lots of updates. Added references and perl examples. Changes to examples.    
Many grammatical and stylistic changes to the content. Changes to NCURSES    
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 a 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 a 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 notices to main document (LDP license) and programs (GPL),   
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 ÀÌ ÁÖ¼Ò·Î ºñÆòÀ» º¸³»ÁÖ±æ ¹Ù¶õ´Ù.

Contents

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. 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.7. scanw() °°Àº ÀÔ·ÂÇÔ¼ö¿¡ ´ëÇØ
1.7.1. getch() ·ùÀÇ ÇÔ¼öµé
1.7.2. scanw() ·ùÀÇ ÇÔ¼öµé
1.7.2.1. scanw()¿Í mvscanw
1.7.2.2. wscanw() ¿Í mvwscanw()
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/ ¿¡¼­ º¼ ¼ö ÀÖ´Ù.

ncurses´Â MIT ¶óÀ̼¾½º·Î ¹èÆ÷µË´Ï´Ù. ÀÌ°ÍÀº ²Ï ¸¹Àº ÀÛ¾÷À» ¼öÇà ÇÒ ¼öÀÖ´Â ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. ÀûÀýÇÑ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇϽñ⠹ٶø´Ï´Ù.

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. 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 ÀÌ À½¼ö¶ó¸é, ¹®ÀÚ¿­À» ¸ðµÎ Âï°ÔµÈ´Ù.

=== ÁÖÀÇ »çÇ×===

ÀÌ ÇÔ¼öµéÀº ÀüºÎ 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()


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

==== 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. Å° ÀÔ·Â ´Ù·ç±â. Æã¼ÇÅ°, ¹æÇâÅ° µîÀ» ¾î¶»°Ô ÀԷ¹޴°¡.


1.11.1. °³°ý


»ç¿ëÀÚ¿ÍÀÇ ±³·ùÇϱâ À§ÇÑ °­·ÂÇÑ À¯ÀúÀÎÅÍÆäÀ̽º ¾øÀÌ´Â ¾î¶² GUI ÇÁ·Î±×·¥µµ ¿Ï¼ºµÇÁö ¾Ê´Â´Ù. curses ÇÁ·Î±×·¥Àº »ç¿ëÀÚ°¡ ÇÏ´Â Å°´­¸²À̳ª ¸¶¿ì½º ¿òÁ÷ÀÓ¿¡ ¹Î°¨Çؾ߸¸ ÇÑ´Ù. ¸ÕÀú Å°¿¡ ´ëÇؼ­ ´Ù·ïº¸ÀÚ.

¿©Å ³ª¿Â ´ëºÎºÐÀÇ ¿¹Á¦¿¡¼­ º¸µíÀÌ, »ç¿ëÀڷκÎÅÍ Å° ÀÔ·ÂÀ» ¹Þ´Â °ÍÀº ¸Å¿ì ½±´Ù. Å°ÀÔ·ÂÀ» ¾ò´Â ´Ü¼øÇÑ ¹æ¹ýÀº getch() ÇÔ¼ö¸¦ ¾²´Â °ÍÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ ¿Ïº®ÇÑ ÇÑÁÙÀÇ ÀÔ·Â (ÁַΠij¸®Áö ¸®ÅÏÀ¸·Î ³¡³­´Ù) º¸´Ù °³º° ¹®ÀÚ¸¦ ÀԷ¹ްíÀÚ ÇÑ´Ù¸é cbreak ¸ðµå°¡ ÄÑÁ® ÀÖ¾î¾ß ÇÑ´Ù. ¶ÇÇÑ Æã¼ÇÅ°³ª ¹æÇâÅ° µîÀ» »ç¿ëÇÒ·Á¸é keypad °¡ ÄÑÁ®ÀÖ¾î¾ß ÇÑ´Ù. ÀÚ¼¼ÇÑ °ÍÀº initialization ¼½¼ÇÀ» Âü°íÇϱ⠹ٶõ´Ù.

getch() ÇÔ¼ö´Â ´­·ÁÁø Å°¿¡ ÇØ´çÇÏ´Â Á¤¼ö¸¦ ¸®ÅÏÇÑ´Ù. ¸¸¾à º¸Åë ¹®ÀÚ¶ó¸é ±× ¹®ÀÚÀÇ Á¤¼ö °ªÀÌ ¸®ÅϵȴÙ. ±×·¸Áö ¾ÊÀº °æ¿ì¿¡´Â curses.h ¿¡ Á¤ÀǵǾî ÀÖ´Â »ó¼ö°ªÀ» ¸®ÅÏÇÑ´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ°¡ F1 Å°¸¦ ´©¸£¸é, 265 ¶ó´Â Á¤¼ö°¡ ¸®ÅϵȴÙ. ÀÌ°ÍÀº curses.h ¿¡ Á¤ÀǵǾî ÀÖ´Â KEY_F() ¶ó´Â ¸ÅÅ©·Î ÇÔ¼ö¸¦ ½á¼­ ¾Ë¾Æ¿Â´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ÀԷ¹ÞÀº Å°µéÀÌ À̽İ¡´ÉÇØÁö¸é ´Ù·ç±â ½¬¿öÁø´Ù.

¿¹¸¦µé¾î, getch() ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ È£ÃâÇϸé

    int ch;                                                                  
                                                                             
    ch = getch();                                                            

getch() ÇÔ¼ö´Â »ç¿ëÀÚ°¡ Å°¸¦ ´©¸£±â¸¦ °è¼Ó ±â´Ù¸®°ÔµÈ´Ù.(±×·¸°Ô µÇÁö ¾ÊÀ»·Á¸é ŸÀӾƿôÀ» ¸í½ÃÇؾßÇÑ´Ù.) ±×·¯´Ù »ç¿ëÀÚ°¡ Å°¸¦ ´©¸£°Ô µÇ¸é, °Å±â¿¡ ¸Â´Â Á¤¼ö °ªÀÌ ¸®ÅϵȴÙ. ¶ÇÇÑ ´ç½ÅÀº ¿øÇÏ´Â Å°°¡ ´­·ÁÁ³´ÂÁö curses.h ¿¡ Á¤ÀÇµÈ »ó¼ö¸¦ ÅëÇØ È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù.

´ÙÀ½ÀÇ ÀϺΠÄڵ尡 ±× ÀÛ¾÷À» ÇÏ´Â °ÍÀÌ´Ù.

    if(ch == KEY_LEFT)                                                       
        printw("Left arrow is pressed\n");                                   


ÀÚ ÀÌÁ¦ À§¾Æ·¡ ¹æÇâÅ°·Î À̵¿ÇÒ ¼ö ÀÖ´Â ¸Þ´º°¡ ÀÖ´Â ÀÛÀº ÇÁ·Î±×·¥À» ¸¸µé¾îº¸ÀÚ.

1.11.2. °£´ÜÇÑ Å° »ç¿ë ¿¹Á¦


Example 10. A Simple Key Usage example

#include <stdio.h>                                                                                                      
#include <ncurses.h>                                                                                                    
                                                                                                                        
#define WIDTH 30                                                                                                        
#define HEIGHT 10                                                                                                       
                                                                                                                        
int startx = 0;                                                                                                         
int starty = 0;                                                                                                         
                                                                                                                        
char *choices[] = {                                                                                                     
                        "Choice 1",                                                                                     
                        "Choice 2",                                                                                     
                        "Choice 3",                                                                                     
                        "Choice 4",                                                                                     
                        "Exit",                                                                                         
                  };                                                                                                    
int n_choices = sizeof(choices) / sizeof(char *);                                                                       
void print_menu(WINDOW *menu_win, int highlight);                                                                       
                                                                                                                        
int main()                                                                                                              
{       WINDOW *menu_win;                                                                                               
        int highlight = 1;                                                                                              
        int choice = 0;                                                                                                 
        int c;                                                                                                          
                                                                                                                        
        initscr();                                                                                                      
        clear();                                                                                                        
        noecho();                                                                                                       
        cbreak();       /* Line buffering disabled. pass on everything */                                               
        startx = (80 - WIDTH) / 2;                                                                                      
        starty = (24 - HEIGHT) / 2;                                                                                     
                                                                                                                        
        menu_win = newwin(HEIGHT, WIDTH, starty, startx);                                                               
        keypad(menu_win, TRUE);                                                                                         
        mvprintw(0, 0, "Use arrow keys to go up and down, Press enter to select a choice");                             
        refresh();                                                                                                      
        print_menu(menu_win, highlight);                                                                                
        while(1)                                                                                                        
        {       c = wgetch(menu_win);                                                                                   
                switch(c)                                                                                               
                {       case KEY_UP:                                                                                    
                                if(highlight == 1)                                                                      
                                        highlight = n_choices;                                                          
                                else                                                                                    
                                        --highlight;                                                                    
                                break;                                                                                  
                        case KEY_DOWN:                                                                                  
                                if(highlight == n_choices)                                                              
                                        highlight = 1;                                                                  
                                else                                                                                    
                                        ++highlight;                                                                    
                                break;                                                                                  
                        case 10:                                                                                        
                                choice = highlight;                                                                     
                                break;                                                                                  
                        default:                                                                                        
                                mvprintw(24, 0, "Charcter pressed is = %3d Hopefully it can be printed as '%c'", c, c); 
                                refresh();                                                                              
                                break;                                                                                  
                }                                                                                                       
                print_menu(menu_win, highlight);                                                                        
                if(choice != 0) /* User did a choice come out of the infinite loop */                                   
                        break;                                                                                          
        }                                                                                                               
        mvprintw(23, 0, "You chose choice %d with choice string %s\n", choice, choices[choice - 1]);                    
        clrtoeol();                                                                                                     
        refresh();                                                                                                      
        endwin();                                                                                                       
        return 0;                                                                                                       
}                                                                                                                       
                                                                                                                        
                                                                                                                        
void print_menu(WINDOW *menu_win, int highlight)                                                                        
{                                                                                                                       
        int x, y, i;                                                                                                    
                                                                                                                        
        x = 2;                                                                                                          
        y = 2;                                                                                                          
        box(menu_win, 0, 0);                                                                                            
        for(i = 0; i < n_choices; ++i)                                                                                  
        {       if(highlight == i + 1) /* High light the present choice */                                              
                {       wattron(menu_win, A_REVERSE);                                                                   
                        mvwprintw(menu_win, y, x, "%s", choices[i]);                                                    
                        wattroff(menu_win, A_REVERSE);                                                                  
                }                                                                                                       
                else                                                                                                    
                        mvwprintw(menu_win, y, x, "%s", choices[i]);                                                    
                ++y;                                                                                                    
        }                                                                                                               
        wrefresh(menu_win);                                                                                             
}                                                                                                                       

1.12. ¸¶¿ì½º ó¸®Çϱâ


ÀÚ ÀÌÁ¦ Å°¸¦ ¾î¶²½ÄÀ¸·Î ÀԷ¹޴ÂÁö´Â ¾Ë°ÍÀÌ´Ù. ¸¶¿ì½º ÀԷ¿¡ ´ëÇؼ­µµ ¾Ë¾Æº¸ÀÚ. ÈçÈ÷ ¸ðµç UI ´Â »ç¿ëÀÚ·Î ÇÏ¿©±Ý ¸¶¿ì½º³ª Å°º¸µå µÑ´Ù ¾µ ¼ö ÀÖ°Ô ¹è·ÁÇÏ°í ÀÖ´Ù.


1.12.1. °³°ý


´Ù¸¥ °ÍµéÀ» Çϱ⿡ ¾Õ¼­, mousemask() ÇÔ¼ö¸¦ ½á¾ß¸¸ ¸¶¿ì½º ÀÔ·ÂÀ» ¹ÞÀ» ¼ö ÀÖ´Ù.

    mousemask(  mmask_t newmask,    /* The events you want to listen to */   
                mmask_t *oldmask)    /* The old events mask                */


ÀÌ ÇÔ¼öÀÇ Ã¹¹ø° ÀÎÀÚ´Â ¹Þ¾ÆµéÀÌ°íÀÚ ÇÏ´Â À̺¥Æ®ÀÇ bit mask ÀÌ´Ù. ±âº»ÀûÀ¸·Î ¸ðµç À̺¥Æ®µéÀÌ ²¨Á®ÀÖ´Ù. ALL_MOUSE_EVENTS ¶ó´Â bit mask ´Â ¸ðµç À̺¥Æ®¸¦ ¾ò¾î¿À´Âµ¥ ¾µ ¼ö ÀÖ´Ù.

´ÙÀ½Àº À̺¥Æ® mask µéÀÌ´Ù:

     Name            Description                                              
       --------------------------------------------------------------------- 
       BUTTON1_PRESSED          mouse button 1 down                          
       BUTTON1_RELEASED         mouse button 1 up                            
       BUTTON1_CLICKED          mouse button 1 clicked                       
       BUTTON1_DOUBLE_CLICKED   mouse button 1 double clicked                
       BUTTON1_TRIPLE_CLICKED   mouse button 1 triple clicked                
       BUTTON2_PRESSED          mouse button 2 down                          
       BUTTON2_RELEASED         mouse button 2 up                            
       BUTTON2_CLICKED          mouse button 2 clicked                       
       BUTTON2_DOUBLE_CLICKED   mouse button 2 double clicked                
       BUTTON2_TRIPLE_CLICKED   mouse button 2 triple clicked                
       BUTTON3_PRESSED          mouse button 3 down                          
       BUTTON3_RELEASED         mouse button 3 up                            
       BUTTON3_CLICKED          mouse button 3 clicked                       
       BUTTON3_DOUBLE_CLICKED   mouse button 3 double clicked                
       BUTTON3_TRIPLE_CLICKED   mouse button 3 triple clicked                
       BUTTON4_PRESSED          mouse button 4 down                          
       BUTTON4_RELEASED         mouse button 4 up                            
       BUTTON4_CLICKED          mouse button 4 clicked                       
       BUTTON4_DOUBLE_CLICKED   mouse button 4 double clicked                
       BUTTON4_TRIPLE_CLICKED   mouse button 4 triple clicked                
       BUTTON_SHIFT             shift was down during button state change    
       BUTTON_CTRL              control was down during button state change  
       BUTTON_ALT               alt was down during button state change      
       ALL_MOUSE_EVENTS         report all button state changes              
       REPORT_MOUSE_POSITION    report mouse movement                        

1.12.2. À̺¥Æ® ¹Þ¾Æ¿À±â


Çѹø ¸¶¿ì½º À̺¥Æ®ÂÊÀÌ È°¼ºÈ­µÇ¸é, getch() ·ùÀÇ ÇÔ¼öµéÀº ¸¶¿ì½º À̺¥Æ®°¡ ÀϾ¶§ ¸¶´Ù KEY_MOUSE °ªÀ» ¸®ÅÏÇÏ°Ô µÈ´Ù. ±×¸®°í³ª¼­ getmouse() ÇÔ¼öµîÀ» ÅëÇØ ¸¶¿ì½º À̺¥Æ®¸¦ ¹ÞÀ» ¼ö ÀÖ°Ô µÈ´Ù.

Äڵ带 ½áº¸ÀÚ¸é ´ë·« ´ÙÀ½°ú °°´Ù:

    MEVENT event;                                                            
                                                                             
    ch = getch();                                                            
    if(ch == KEY_MOUSE)                                                      
        if(getmouse(&event) == OK)                                           
            .    /* Do some thing with the event */                          
            .                                                                
            .                                                                

getmouse() ÇÔ¼ö´Â ÁÖ¾îÁø Æ÷ÀÎÅÍ ¾È¿¡ ÀϾ À̺¥Æ®¸¦ ¸®ÅÏÇÑ´Ù. ±×°ÍÀÇ ±¸Á¶Ã¼´Â ¾Æ·¡¿Í °°´Ù.

    typedef struct                                                           
    {                                                                        
        short id;         /* ID to distinguish multiple devices */           
        int x, y, z;      /* event coordinates */                            
        mmask_t bstate;   /* button state bits */                            
    }                                                                        

¿ì¸®°¡ °¡Àå Èï¹ÌÀÖ´Â ÁÖ¿ä º¯¼ö´Â ¹Ù·Î bstate ÀÌ´Ù. ÀÌ°ÍÀº ¸¶¿ì½ºÀÇ ¹öÆ° »óŸ¦ ¸»ÇØÁØ´Ù.

´ÙÀ½°ú °°Àº ÄÚµåÀϺθ¦ º¸¸é ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

    if(event.bstate & BUTTON1_PRESSED)                                       
        printw("Left Button Pressed");                                       

1.12.3. ÀüºÎ ½Ç½ÀÇغ¸ÀÚ


¸¶¿ì½º¸¦ ´Ù·ç´Â µ¥´Â ÇؾßÇÒ °ÍÀÌ ²Ï ¸¹´Ù. ¾Õ¿¡¼­ Çß´ø °Í°ú °°Àº ¸Þ´º¸¦ ¸¶¿ì½º¸¦ ´Ù·ê ¼ö ÀÖ°Ô ÀÛ¼ºÇغ¸ÀÚ. ÇÁ·Î±×·¥À» °£°áÈ÷ Çϱâ À§Çؼ­ Å°¸¦ ´Ù·ç´Â °ÍÀº Á¦¿ÜÇß´Ù.

Example 11. Access the menu with mouse !!!

#include <ncurses.h>                                                                                                                   
                                                                                                                                       
#define WIDTH 30                                                                                                                       
#define HEIGHT 10                                                                                                                      
                                                                                                                                       
int startx = 0;                                                                                                                        
int starty = 0;                                                                                                                        
                                                                                                                                       
char *choices[] = {     "Choice 1",                                                                                                    
                        "Choice 2",                                                                                                    
                        "Choice 3",                                                                                                    
                        "Choice 4",                                                                                                    
                        "Exit",                                                                                                        
                  };                                                                                                                   
                                                                                                                                       
int n_choices = sizeof(choices) / sizeof(char *);                                                                                      
                                                                                                                                       
void print_menu(WINDOW *menu_win, int highlight);                                                                                      
void report_choice(int mouse_x, int mouse_y, int *p_choice);                                                                           
                                                                                                                                       
int main()                                                                                                                             
{       int c, choice = 0;                                                                                                             
        WINDOW *menu_win;                                                                                                              
        MEVENT event;                                                                                                                  
                                                                                                                                       
        /* Initialize curses */                                                                                                        
        initscr();                                                                                                                     
        clear();                                                                                                                       
        noecho();                                                                                                                      
        cbreak();       //Line buffering disabled. pass on everything                                                                  
                                                                                                                                       
        /* Try to put the window in the middle of screen */                                                                            
        startx = (80 - WIDTH) / 2;                                                                                                     
        starty = (24 - HEIGHT) / 2;                                                                                                    
                                                                                                                                       
        attron(A_REVERSE);                                                                                                             
        mvprintw(23, 1, "Click on Exit to quit (Works best in a virtual console)");                                                    
        refresh();                                                                                                                     
        attroff(A_REVERSE);                                                                                                            
                                                                                                                                       
        /* Print the menu for the first time */                                                                                        
        menu_win = newwin(HEIGHT, WIDTH, starty, startx);                                                                              
        print_menu(menu_win, 1);                                                                                                       
        /* Get all the mouse events */                                                                                                 
        mousemask(ALL_MOUSE_EVENTS, NULL);                                                                                             
                                                                                                                                       
        while(1)                                                                                                                       
        {       c = wgetch(menu_win);                                                                                                  
                switch(c)                                                                                                              
                {       case KEY_MOUSE:                                                                                                
                        if(getmouse(&event) == OK)                                                                                     
                        {       /* When the user clicks left mouse button */                                                           
                                if(event.bstate & BUTTON1_PRESSED)                                                                     
                                {       report_choice(event.x + 1, event.y + 1, &choice);                                              
                                        if(choice == -1) //Exit chosen                                                                 
                                                goto end;                                                                              
                                        mvprintw(22, 1, "Choice made is : %d String Chosen is \"%10s\"", choice, choices[choice - 1]); 
                                        refresh();                                                                                     
                                }                                                                                                      
                        }                                                                                                              
                        print_menu(menu_win, choice);                                                                                  
                        break;                                                                                                         
                }                                                                                                                      
        }                                                                                                                              
end:                                                                                                                                   
        endwin();                                                                                                                      
        return 0;                                                                                                                      
}                                                                                                                                      
                                                                                                                                       
                                                                                                                                       
void print_menu(WINDOW *menu_win, int highlight)                                                                                       
{                                                                                                                                      
        int x, y, i;                                                                                                                   
                                                                                                                                       
        x = 2;                                                                                                                         
        y = 2;                                                                                                                         
        box(menu_win, 0, 0);                                                                                                           
        for(i = 0; i < n_choices; ++i)                                                                                                 
        {       if(highlight == i + 1)                                                                                                 
                {       wattron(menu_win, A_REVERSE);                                                                                  
                        mvwprintw(menu_win, y, x, "%s", choices[i]);                                                                   
                        wattroff(menu_win, A_REVERSE);                                                                                 
                }                                                                                                                      
                else                                                                                                                   
                        mvwprintw(menu_win, y, x, "%s", choices[i]);                                                                   
                ++y;                                                                                                                   
        }                                                                                                                              
        wrefresh(menu_win);                                                                                                            
}                                                                                                                                      
                                                                                                                                       
/* Report the choice according to mouse position */                                                                                    
void report_choice(int mouse_x, int mouse_y, int *p_choice)                                                                            
{       int i,j, choice;                                                                                                               
                                                                                                                                       
        i = startx + 2;                                                                                                                
        j = starty + 3;                                                                                                                
                                                                                                                                       
        for(choice = 0; choice < n_choices; ++choice)                                                                                  
                if(mouse_y == j + choice && mouse_x >= i && mouse_x <= i + strlen(choices[choice]))                                    
                {       if(choice == n_choices - 1)                                                                                    
                                *p_choice = -1;                                                                                        
                        else                                                                                                           
                                *p_choice = choice + 1;                                                                                
                        break;                                                                                                         
                }                                                                                                                      
}                                                                                                                                      




1.12.4. ±×¿Ü Àâ´ÙÇÑ ÇÔ¼öµé


mouse_trafo() ¿Í wmouse_trafo() ÇÔ¼ö´Â ¸¶¿ì½ºÀÇ À§Ä¡ °ªÀ» È­¸éÀÇ À§Ä¡°ªÀ¸·Î ¹Ù²Ù´Â ÇÔ¼öÀÌ´Ù. ÀÚ¼¼ÇÑ °ÍÀº curs_mouse(3X) man ÆäÀÌÁö¸¦ Âü°íÇ϶ó.

¸¶¿ì½ºÀÎÅ͹ú ÇÔ¼ö´Â Ŭ¸¯À¸·Î ÀÎ½ÄµÉ ¼ö ÀÖ°Ô ¹öÆ°À» ´©¸£°í ¶¼´Â °Í »çÀÌÀÇ ÃÖ´ë°£°ÝÀ» ( õºÐÀÇ ÀÏÃÊ ´ÜÀ§) ·Î Á¶Á¤ ÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ÀÌÀüÀÇ °£°Ý °ªÀ» ¸®ÅÏÇÑ´Ù. ±âº» °ªÀº 5ºÐÀÇ 1ÃÊÀÌ´Ù.

1.13. È­¸é Á¦¾î


ÀÌ Àå¿¡¼± È­¸éÀ» È¿À²ÀûÀ¸·Î ´Ù·ç°í ¿¹»Û ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Â ÇÔ¼öµé¿¡ ´ëÇؼ­ »ìÆ캼 °ÍÀÌ´Ù. À̴ Ưº°È÷ °ÔÀÓµîÀ» ¸¸µé ¶§ Áß¿äÇÏ´Ù.

1.13.1. getyx() ÇÔ¼öµé


getyx() ÇÔ¼ö´Â ÇöÀç Ä¿¼­ À§Ä¡¸¦ ¾Ë¾Æ¿Ã ¼ö ÀÖ´Ù. ÀÎÀÚ·Î ¹ÞÀº º¯¼ö¿¡ x ¿Í y ÁÂÇ¥ÀÇ °ªÀ» Áý¾î ³ÖÀ» °ÍÀÌ´Ù. getyx() °¡ ¸ÅÅ©·Î ÇÔ¼öÀ̱⠶§¹®¿¡ º¯¼öÀÇ ÁÖ¼Ò¸¦ ³Ñ°ÜÁÙ ÇÊ¿ä´Â ¾ø´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¾´´Ù.

    getyx(win, y, x);                                                        
    /* win: window pointer                                                   
     *   y, x: y, x co-ordinates will be put into this variables             
     */                                                                      


getparyx() ÇÔ¼ö´Â ¸ÞÀÎ À©µµ¿ì¿¡ ´ëÇÑ ¼­ºê À©µµ¿ìÀÇ »ó´ëÀûÀÎ Ãʱâ À§Ä¡¸¦ ¾Ë¾Æ¿Â´Ù. ÀÌ ÇÔ¼ö´Â ¼­ºê À©µµ¿ì¸¦ °»½ÅÇϰųª ÇÒ¶§ À¯¿ëÇÏ´Ù. ¿©·¯ ¸Þ´º°¡ ÀÖ´Â ÀÌ»Û ÇÁ·Î±×·¥À» µðÀÚÀÎÇÒ¶§, ¸Þ´ºÀÇ Ã¹¹ø° ¿É¼ÇÀÇ À§Ä¡°°Àº °ÍµéÀ» ÀúÀåÇÏ´Â °ÍÀº ±î´Ù·Î¿î ÀÏÀÌ´Ù. ¿©±â¿¡ ´ëÇÑ °£´ÜÇÑ ÇØ°áÃ¥Àº ¸Þ´º¸¦ ¼­ºê À©¤§¿ì·Î »ý¼ºÇÏ°í ÈÄ¿¡ ¸Þ´ºÀÇ ½ÃÀÛ À§Ä¡¸¦ getparyx() ÇÔ¼öµîÀ¸·Î ¾ò¾î¿À´Â ¹æ¹ýÀÌ ÀÖ´Ù.

getbegyx() ¿Í getmaxyx() ÇÔ¼ö´Â ÇöÀç À©µµ¿ìÀÇ ½ÃÀÛ ¹× ÃÖ´ë ÁÂÇ¥ °ªÀ» ¸®ÅÏÇÑ´Ù. ÀÌ ÇÔ¼öµéµµ À§¿Í ¸¶Âù°¡Áö·Î À©µµ¿ì¿Í ¼­ºê À©µµ¿ì¸¦ È¿À²ÀûÀ¸·Î ´Ù·ç´Âµ¥ Àß ¾²ÀδÙ.

1.13.2. È­¸é ´ýÇÁ


°ÔÀÓÀ» ÀÛ¼ºÇÏ´Â µ¿¾È ¶§¶§·Î È­¸éÀÇ »óŸ¦ ÀúÀåÇØµÎ°í ±×°ÍÀ» ³ªÁß¿¡ ±×´ë·Î º¹¿øÇÏ´Â ÀÏÀÌ ÇÊ¿äÇÒ ¶§°¡ ÀÖ´Ù. scr_dump() ÇÔ¼ö´Â ÀÎÀÚ·Î ÁÖ¾îÁø ÆÄÀÏ¿¡ È­¸é Á¤º¸¸¦ ´ýÇÁÇÏ´Â ÇÔ¼öÀÌ´Ù. ±×¸®°í ³ªÁß¿¡ scr_restore ÇÔ¼ö·Î ±×°ÍÀ» º¹¿øÇÒ ¼ö ÀÖ´Ù. ÀÌ µÎ °£´ÜÇÑ ÇÔ¼ö´Â Àå¸éÀÌ ¹Ù²î¸ç »¡¸® ¿òÁ÷ÀÌ´Â °ÔÀӵ È¿°úÀûÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù.

1.13.3. À©µµ¿ì ´ýÇÁ


À©µµ¿ì¸¦ ÀúÀåÇÏ°í º¹¿øÇϴµ¥´Â putwin() °ú getwin() À̶ó´Â ÇÔ¼ö°¡ ÀÖ´Ù. putwin() ÇÔ¼ö´Â ÇöÀç À©µµ¿ìÀÇ »óŸ¦ ÆÄÀÏ·Î ÀúÀåÇϴµ¥, ±×°ÍÀº ³ªÁß¿¡ getwin() ÇÔ¼ö·Î º¹¿ø ÇÒ ¼ö ÀÖ´Ù.

copywin() ÇÔ¼ö´Â À©µµ¿ì¸¦ ¿Ïº®ÇÏ°Ô ´Ù¸¥ À©µµ¿ì·Î º¹»çÇÏ´Â ÇÔ¼öÀÌ´Ù. ÀÎÀÚ·Î ¿øº» À©µµ¿ì¿Í ´ë»óÀ©µµ¿ì¸¦ ¹ÞÀ¸¸ç ¿øº» À©µµ¿ì¿¡¼­ ¸í½ÃµÈ »ç°¢¿µ¿ª ¸¸Å­À» ´ë»ó À©µµ¿ì·Î º¹»çÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ ¸¶Áö¸· ÀÎÀÚ´Â ´ë»ó À©µµ¿ì¿¡ ³»¿ëµéÀ» µ¤¾î ¾µ °ÇÁö ¾Æ´Ï¸é °ãÃÄ ¾µ °ÇÁö °áÁ¤ÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à ÀÌ ÀÎÁö°¡ true À̸é, ±âÁ¸ °ÍÀ» ±×´ë·Î À¯ÁöÇÑä º¹»ç°¡ µÈ´Ù.

1.14. ±×¿Ü ±â´Éµé


ÀÚ ÀÌÁ¦ ´ç½ÅÀº ÁÁÀº curses ÇÁ·Î±×·¥ÀÇ Æ¯Â¡µéÀ» ÃæºÐÈ÷ ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. with all bells and whistles. ÀÌ ¿Ü¿¡µµ ´Ù¾çÇÑ °æ¿ì¿¡ À¯¿ëÇÏ°Ô »ç¿ëµÇ´Â ¾à°£ Àâ´ÙÇÑ ÇÔ¼öµéÀÌ ÀÖ´Ù. À̰͵éÀ» Á¶±Ý ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

1.14.1. curs_set()


ÀÌ ÇÔ¼ö´Â Ä¿¼­¸¦ º¸ÀÌÁö ¾Ê°Ô ÇÑ´Ù. ÀÌ ÇÔ¼ö¿¡ ´ëÇÑ ÀÎÀÚ´Â ´ÙÀ½°ú °°´Ù.

    0 : invisible      or                                                    
    1 : normal    or                                                         
    2 : very visible.                                                        

1.14.2. ÀϽÃÀûÀ¸·Î curses ¸ðµå ³ª°¡±â


¶§¶§·Î ´ç½ÅÀº Àá½Ãµ¿¾È cooked mode (º¸ÅëÀÇ ¶óÀÎ ¹öÆÛ¸µ ¸ðµå) ·Î µ¹¾Æ°¡±æ ¿øÇÒ °ÍÀÌ´Ù. ±×·± °æ¿ì ¸ÕÀú tty ¸ðµå¸¦ def_prog_mode() ÇÔ¼ö·Î ÀúÀåÇÏ°í endwin() ÇÔ¼ö¸¦ È£ÃâÇؼ­ curses ¸ðµå¸¦ ³¡³»¸é µÈ´Ù. ÀÌ·¸°Ô ÇÏ°ÔµÇ¸é ¿ø·¡ÀÇ tty ¸ðµå »óÅ°¡ µÈ´Ù. ±×·¯´Ù ±× Àü¿¡ ÀÛ¾÷ÇÏ´ø curses ¸ðµå·Î µ¹¾Æ°¥·Á¸é reset_prog_mode() ÇÔ¼ö¸¦ È£ÃâÇضó. ÀÌ ÇÔ¼ö´Â tty ¸¦ def_prog_mode() ÇÔ¼ö¿¡ ÀÇÇØ ÀúÀåµÈ »óÅ·Πµ¹·ÁÁØ´Ù. ±× ÈÄ refresh() ¸¦ ÇϰԵǸé curses ¸ðµå·Î ¿ÏÀüÈ÷ µ¹¾Æ¿Â °ÍÀÌ´Ù. ¿©±â¿¡ ÀÌ·± ÀýÂ÷¸¦ º¸¿©ÁÖ´Â ¿¹Á¦°¡ ÀÖ´Ù.

Example 12. Temporarily Leaving Curses Mode

#include <ncurses.h>                                                              
                                                                                  
int main()                                                                        
{                                                                                 
        initscr();                      /* Start curses mode              */      
        printw("Hello World !!!\n");    /* Print Hello World              */      
        refresh();                      /* Print it on to the real screen */      
        def_prog_mode();                /* Save the tty modes             */      
        endwin();                       /* End curses mode temporarily    */      
        system("/bin/sh");              /* Do whatever you like in cooked mode */ 
        reset_prog_mode();              /* Return to the previous tty mode*/      
                                        /* stored by def_prog_mode()      */      
        refresh();                      /* Do refresh() to restore the    */      
                                        /* Screen contents                */      
        printw("Another String\n");     /* Back to curses use the full    */      
        refresh();                      /* capabilities of curses         */      
        endwin();                       /* End curses mode                */      
                                                                                  
        return 0;                                                                 
}                                                                                 

1.14.3. ACS_ º¯¼öµé


´ç½ÅÀÌ DOS ¿¡¼­ ÇÁ·Î±×·¥ÇØ º»ÀûÀÌ ÀÖ´Ù¸é È®ÀåµÈ ij¸¯ÅͼÂÀÇ ±× ¸ÚÁø ¹®Àڵ鿡 ´ëÇØ ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ±×°ÍµéÀº ´ÜÁö ¸î¸î Å͹̳ο¡¼­¸¸ Ãâ·ÂÀÌ °¡´ÉÇÏ´Ù. box() ¿Í °°Àº NCURSES ÇÔ¼ö´Â ÀÌ ¹®ÀÚµéÀ» »ç¿ëÇÑ´Ù. ACS ·Î ½ÃÀÛÇÏ´Â ÀÌ º¯¼öµéÀÇ À̸§Àº Alternative Character Set À» ¶æÇÑ´Ù. À§¿¡ ³ª¿Ô´ø ÇÁ·Î±×·¥µé Áß¿¡¼­ ¸î¸î°³°¡ ÀÌ ¹®ÀÚµéÀ» ½è¾ú´Ù´Â °ÍÀ» ¾Æ¸¶ ¾Æ´Â µ¶ÀÚµµ ÀÖÀ» °ÍÀÌ´Ù. ¿©±â¿¡ ¸ðµç ¹®ÀÚµéÀ» º¸¿©ÁÖ´Â ¿¹Á¦°¡ ÀÖ´Ù.

Example 13. ACS Variables Example

#include <ncurses.h>                                                                
                                                                                    
int main()                                                                          
{                                                                                   
        initscr();                                                                  
                                                                                    
        printw("Upper left corner           "); addch(ACS_ULCORNER); printw("\n");  
        printw("Lower left corner           "); addch(ACS_LLCORNER); printw("\n");  
        printw("Lower right corner          "); addch(ACS_LRCORNER); printw("\n");  
        printw("Tee pointing right          "); addch(ACS_LTEE); printw("\n");      
        printw("Tee pointing left           "); addch(ACS_RTEE); printw("\n");      
        printw("Tee pointing up             "); addch(ACS_BTEE); printw("\n");      
        printw("Tee pointing down           "); addch(ACS_TTEE); printw("\n");      
        printw("Horizontal line             "); addch(ACS_HLINE); printw("\n");     
        printw("Vertical line               "); addch(ACS_VLINE); printw("\n");     
        printw("Large Plus or cross over    "); addch(ACS_PLUS); printw("\n");      
        printw("Scan Line 1                 "); addch(ACS_S1); printw("\n");        
        printw("Scan Line 3                 "); addch(ACS_S3); printw("\n");        
        printw("Scan Line 7                 "); addch(ACS_S7); printw("\n");        
        printw("Scan Line 9                 "); addch(ACS_S9); printw("\n");        
        printw("Diamond                     "); addch(ACS_DIAMOND); printw("\n");   
        printw("Checker board (stipple)     "); addch(ACS_CKBOARD); printw("\n");   
        printw("Degree Symbol               "); addch(ACS_DEGREE); printw("\n");    
        printw("Plus/Minus Symbol           "); addch(ACS_PLMINUS); printw("\n");   
        printw("Bullet                      "); addch(ACS_BULLET); printw("\n");    
        printw("Arrow Pointing Left         "); addch(ACS_LARROW); printw("\n");    
        printw("Arrow Pointing Right        "); addch(ACS_RARROW); printw("\n");    
        printw("Arrow Pointing Down         "); addch(ACS_DARROW); printw("\n");    
        printw("Arrow Pointing Up           "); addch(ACS_UARROW); printw("\n");    
        printw("Board of squares            "); addch(ACS_BOARD); printw("\n");     
        printw("Lantern Symbol              "); addch(ACS_LANTERN); printw("\n");   
        printw("Solid Square Block          "); addch(ACS_BLOCK); printw("\n");     
        printw("Less/Equal sign             "); addch(ACS_LEQUAL); printw("\n");    
        printw("Greater/Equal sign          "); addch(ACS_GEQUAL); printw("\n");    
        printw("Pi                          "); addch(ACS_PI); printw("\n");        
        printw("Not equal                   "); addch(ACS_NEQUAL); printw("\n");    
        printw("UK pound sign               "); addch(ACS_STERLING); printw("\n");  
                                                                                    
        refresh();                                                                  
        getch();                                                                    
        endwin();                                                                   
                                                                                    
        return 0;                                                                   
}                                                                                   

1.15. ±×¿Ü ¶óÀ̺귯¸®µé


curses ¶óÀ̺귯¸® ¸»°íµµ ¸¹Àº ±â´É¼º°ú ´Ù¾çÇÑ Æ¯Â¡µéÀÌ ÀÖ´Â ÅؽºÆ® ¸ðµå ¶óÀ̺귯¸®µéÀÌ ¸î°³ ÀÖ´Ù. ´ÙÀ½ ¼½¼Ç¿¡¼­ curses ¿Í ÇÔ²² ¹èÆ÷µÇ´Â ¼¼°³ÀÇ Ç¥ÁØ ¶óÀ̺귯¸®¿¡ ´ëÇØ ¼³¸íÇÒ °ÍÀÌ´Ù.

1.16. ÆгΠ¶óÀ̺귯¸®


ÀÚ ÀÌÁ¦ ´ç½ÅÀº curses ¿¡ Àͼ÷ÇØÁ³À¸´Ï, ¹º°¡ Å« °É Çϳª Çغ¸°í ½ÍÀ» °ÍÀÌ´Ù. ´ç½ÅÀº ¾Æ¸¶ Á»´õ ÇÁ·ÎÆä¼Å³¯ÇÑ À©µµ¿ì ²Ã·Î ¸¸µé±â À§Çؼ­ ¿©·¯ À©µµ¿ìµéÀ» °ãÃļ­ ¸¸µé¾úÀ» °ÍÀÌ´Ù. ±×·¯³ª ¿î³ª»Ú°Ôµµ À̰͵éÀ» ´Ù·ç´Â °ÍÀº ±Ý»õ ³­°ü¿¡ ºÎ´ÚÄ¥ °ÍÀÌ´Ù. ÀæÀº refresh ¿Í °»½ÅÀº ±×¾ß¸»·Î ¾Ç¸ùÀÌ´Ù. ´ç½ÅÀÌ ÀûÀýÇÑ ¼ø¼­·Î À©µµ¿ìµéÀ» refresh ÇØÁÖÁö ¾ÊÀ¸¸é °ãÃÄ ÀÖ´Â À©µµ¿ìµéÀº ±× ÈçÀûÀ» È­¸é¿¡ ¸¸µé¾î³¾ °ÍÀÌ´Ù.

±×·¸´Ù°í Àý¸ÁÇϱä À̸£´Ù. panels ¶óÀ̺귯¸®¿¡¼­ Á¦°øÇÏ´Â ÁÁÀº ÇØ°áÃ¥ÀÌ ÀÖ´Ù. ncurses ÀÇ °³¹ßÀÚµéÀÇ ¸»Çϱæ

´ç½ÅÀÇ ÀÎÅÍÆäÀ̽º µðÀÚÀÎÀÌ ¿©·¯ °ãÄ£ À©µµ¿ìÀÇ ¼Ó¿¡ ÀÖ´Ù°¡ ½ÇÇà½Ã¿¡ ¸ÇÀ§·Î ³ª¿Í¾ß µÇ´Â ±×·± À©µµ¿ì¶ó¸é ±×°ÍµéÀ» Á¦´ë·Î Ç¥½ÃÇؼ­ °ü¸®ÇÏ´Â °ÍÀº ¸Å¿ì Áö·çÇÏ°í ÈûµçÀÏÀÌ µÉ °ÍÀÌ´Ù. ±×·¡¼­ panels ¶óÀ̺귯¸®°¡ ÀÖ´Ù.

¸¸¾à °ãÄ¡´Â À©µµ¿ì°¡ ¸¹´Ù¸é, panels ¶óÀ̺귯¸®¸¦ ½á¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â wnoutrefresh(), doupdate() ÇÔ¼ö¸¦ °è¼Ó È£ÃâÇÏ°í ¶Ç Á¦´ë·Î (¸Ç ¹Ø¹Ù´ÚºÎÅÍ) È£ÃâÇؾßÇÏ´Â ºÎ´ãÀ» ¹Ì¿¬¿¡ ¹æÁöÇØÁØ´Ù. ÀÌ ¶óÀ̺귯¸®´Â À©µµ¿ìÀÇ ¼ø¼­¿Í °ãÄ£ °Í¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í¼­ È­¸éÀ» ÀûÀýÇÏ°Ô °»½ÅÇØÁØ´Ù. ±×·¯´Ï ¹» ÁÖÀúÇϳª? panels ¿¡ ´ëÇØ Á» ´õ Á¦´ë·Î ºÁº¸µµ·Ï ÇÏÀÚ.

1.16.1. °³°ý


ÆгΠ°´Ã¼´Â ³»ºÎÀûÀ¸·Î ´Ù¸¥ ÆгΠ°´Ã¼¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Â ÆÇÀÇ ÀϺηΠ´Ù·ïÁö´Â À©µµ¿ìÀÇ ÀÏÁ¾ÀÌ´Ù. ÀÌ ÆÇÀº ¸Ç À§ ÆгÎÀº ¿Ïº®ÇÏ°Ô º¸ÀÌ°í ±× ¿Ü ÆгÎÀº ±×°ÍÀÇ À§Ä¡¿¡ µû¶ó º¸ÀÏ ¼öµµ ÀÖ°í ¾È º¸ÀÏ ¼öµµ ÀÖ´Â ½ºÅÃó·³ ´Ù·ïÁø´Ù. ±×·¡¼­ ÀÌ°ÍÀÇ ±âº»Àº °ãÃÄÁø ÆгεéÀÇ ½ºÅÃÀ» ¸¸µé°í À̰͵éÀ» Ç¥½ÃÇØÁÖ±âÀ§ÇØ ÆгΠ¶óÀ̺귯¸®¸¦ Á¦´ë·Î »ç¿ëÇÏ´Â °ÍÀÌ´Ù. refresh() ¿Í ºñ½ÁÇÑ ÇÔ¼ö°¡ Àִµ¥, ÀÌ°ÍÀº È£ÃâµÇ¸é ¿Ã¹Ù¸¥ ¼ø¼­¿¡ µû¶ó ÆгεéÀ» º¸¿©ÁÖ°Ô µÈ´Ù. ÇÔ¼öµéÀº ÆгÎÀ» ¼û±â°Å³ª º¸¿©ÁÖ°í ¶Ç ÆгÎÀ» À̵¿ÇÏ°í ±×°ÍÀÇ Å©±â¸¦ ¹Ù²Ù´Â µîÀÇ ±â´ÉÀ» °¡Áø °ÍµéÀÌ Á¦°øµÈ´Ù. ÀÌ ÇÔ¼ö µéÀ» È£ÃâÇÏ´Â µ¿¾È °ãÃÄÁø °ÍµéÀÇ ¹®Á¦´Â panels ¶óÀ̺귯¸®¿¡ ÀÇÇØ ´Ù·ïÁø´Ù.

ÆгΠÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ È帧Àº ´ÙÀ½°ú °°´Ù:

  • Æгο¡ ºÙ¿©Áú À©µµ¿ì¸¦ »ý¼ºÇÑ´Ù. (newwin() »ç¿ë)

  • ÀÌÁ¦ º¸¿©Áö´Â ¼ø¼­´ë·Î ÆгÎÀ» »ý¼ºÇÑ´Ù. º¸¿©Áö±â ¿øÇÏ´Â ¼ø¼­´ë·Î ±×°ÍµéÀ» ½×¾Æ¶ó. new_panel() ÇÔ¼ö¸¦ ¾²¸é ÆгÎÀ» ¸¸µé ¼ö ÀÖ´Ù.

  • update_panels() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÆгεéÀ» °¡»óÀÇ È­¸é¿¡ ¸Â´Â ¼ø¼­´ë·Î º¸¿©Áöµµ·Ï ¾÷µ¥ÀÌÆ®ÇÑ´Ù. ±× ´ÙÀ½ doupdate() ¸¦ È£ÃâÇÏ¿© ½ÇÁ¦ È­¸é¿¡ ³ªÅ¸³ªµµ·Ï ÇÑ´Ù.

  • show_panel(), hide_panel(), move_panel() µîÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÆгεéÀ» ´Ù·é´Ù. panel_hidden() °ú panel_window() ¿Í °°Àº º¸Á¶ ÇÔ¼ö¸¦ »ç¿ëÇضó. Æгο¡ ¾²ÀÌ´Â ¼³Á¤ Á¤º¸µéÀ» ÀúÀåÇϱâ À§Çؼ­ »ç¿ëÀÚ Æ÷ÀÎÅÍ ¸¦ »ç¿ëÇ϶ó. set_panel_useptr() °ú panel_userptr() ÇÔ¼ö¸¦ Æгο¡ »ç¿ëÀÚ Æ÷ÀÎÅ͸¦ ¼³Á¤ÇÏ°í ¾ò¾î¿À´Âµ¥ ¾µ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

  • ÆгÎÀ» ´õ ÀÌ»ó ¾²Áö ¾Ê°ÔµÇ¸é, del_panel() À» »ç¿ëÇÏ¿© ±×°ÍÀ» Áö¿î´Ù.

ÀÌÁ¦ ¸î¸î ÇÁ·Î±×·¥µéÀ» ÅëÇØ °³³äÀ» ¸íÈ®È÷ Çغ¸ÀÚ. ´ÙÀ½Àº 3°³ÀÇ °ãÄ¡´Â ÆгÎÀ» ¸¸µé°í ±×°ÍÀ» È­¸é¿¡ º¸¿©ÁÖ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.

1.16.2. ÆгΠ¶óÀ̺귯¸®¿Í ÄÄÆÄÀÏ Çϱâ


ÆгΠ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ¾²·Á¸é, panel.h ¸¦ ÀÎŬ·çµåÇÏ°í -lncurses ´ÙÀ½¿¡ -lpanel Ç÷¡±×¸¦ ½á¼­ ÇÁ·Î±×·¥À» ¸µÅ©½ÃÄѾßÇÑ´Ù.

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

Example 14. Panel basics

#include <panel.h>                                                                
                                                                                  
int main()                                                                        
{       WINDOW *my_wins[3];                                                       
        PANEL  *my_panels[3];                                                     
        int lines = 10, cols = 40, y = 2, x = 4, i;                               
                                                                                  
        initscr();                                                                
        cbreak();                                                                 
        noecho();                                                                 
                                                                                  
        /* Create windows for the panels */                                       
        my_wins[0] = newwin(lines, cols, y, x);                                   
        my_wins[1] = newwin(lines, cols, y + 1, x + 5);                           
        my_wins[2] = newwin(lines, cols, y + 2, x + 10);                          
                                                                                  
        /*                                                                        
         * Create borders around the windows so that you can see the effect       
         * of panels                                                              
         */                                                                       
        for(i = 0; i < 3; +++i)                                                   
                box(my_wins[i], 0, 0);                                            
                                                                                  
        /* Attach a panel to each window */     /* Order is bottom up */          
        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */     
        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */   
        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */ 
                                                                                  
        /* Update the stacking order. 2nd panel will be on top */                 
        update_panels();                                                          
                                                                                  
        /* Show it on the screen */                                               
        doupdate();                                                               
                                                                                  
        getch();                                                                  
        endwin();                                                                 
}                                                                                 

º¸´Ù½ÃÇÇ, À§ ÇÁ·Î±×·¥Àº ¾Õ¿¡¼­ ¼³¸íÇß´ø °£´ÜÇÑ È帧À» ±×´ë·Î µû¸£°í ÀÖ´Ù. newwin() À» ÅëÇØ À©µµ¿ì¸¦ »ý¼ºÇÑ ÈÄ ±×°ÍµéÀ» new_panel() ·Î Æгο¡ ºÙÀδÙ. ¿ì¸®°¡ ÆгÎÀ» Çϳª¾¿ ºÙÀÌ°í Àֱ⠶§¹®¿¡ ÆгÎÀÇ ½ºÅÃÀÌ °»½ÅµÈ´Ù. À̰͵éÀ» È­¸é¿¡ Ãâ·ÂÇϱâ À§Çؼ­ update_panels() ¿Í doupdate()°¡ È£ÃâµÇ¾ú´Ù.

1.16.3. ÆгΠÀ©µµ¿ì Ž»ö


¾à°£ ´õ º¹ÀâÇÑ ¿¹Á¦°¡ ¾Æ·¡¿¡ ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ÅÇÅ°¸¦ ÀÌ¿ëÇØ ÀüȯµÉ ¼ö ÀÖ´Â ¼¼°³ÀÇ À©µµ¿ì¸¦ ¸¸µç´Ù. Äڵ带 ÀÚ¼¼È÷ º¸µµ·Ï ÇÏÀÚ.

Example 15. Panel Window Browsing Example

#include <panel.h>                                                                                
                                                                                                  
#define NLINES 10                                                                                 
#define NCOLS 40                                                                                  
                                                                                                  
void init_wins(WINDOW **wins, int n);                                                             
void win_show(WINDOW *win, char *label, int label_color);                                         
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color); 
                                                                                                  
int main()                                                                                        
{       WINDOW *my_wins[3];                                                                       
        PANEL  *my_panels[3];                                                                     
        PANEL  *top;                                                                              
        int ch;                                                                                   
                                                                                                  
        /* Initialize curses */                                                                   
        initscr();                                                                                
        start_color();                                                                            
        cbreak();                                                                                 
        noecho();                                                                                 
        keypad(stdscr, TRUE);                                                                     
                                                                                                  
        /* Initialize all the colors */                                                           
        init_pair(1, COLOR_RED, COLOR_BLACK);                                                     
        init_pair(2, COLOR_GREEN, COLOR_BLACK);                                                   
        init_pair(3, COLOR_BLUE, COLOR_BLACK);                                                    
        init_pair(4, COLOR_CYAN, COLOR_BLACK);                                                    
                                                                                                  
        init_wins(my_wins, 3);                                                                    
                                                                                                  
        /* Attach a panel to each window */     /* Order is bottom up */                          
        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */                     
        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */                   
        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */                 
                                                                                                  
        /* Set up the user pointers to the next panel */                                          
        set_panel_userptr(my_panels[0], my_panels[1]);                                            
        set_panel_userptr(my_panels[1], my_panels[2]);                                            
        set_panel_userptr(my_panels[2], my_panels[0]);                                            
                                                                                                  
        /* Update the stacking order. 2nd panel will be on top */                                 
        update_panels();                                                                          
                                                                                                  
        /* Show it on the screen */                                                               
        attron(COLOR_PAIR(4));                                                                    
        mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");             
        attroff(COLOR_PAIR(4));                                                                   
        doupdate();                                                                               
                                                                                                  
        top = my_panels[2];                                                                       
        while((ch = getch()) != KEY_F(1))                                                         
        {       switch(ch)                                                                        
                {       case 9:                                                                   
                                top = (PANEL *)panel_userptr(top);                                
                                top_panel(top);                                                   
                                break;                                                            
                }                                                                                 
                update_panels();                                                                  
                doupdate();                                                                       
        }                                                                                         
        endwin();                                                                                 
        return 0;                                                                                 
}                                                                                                 
                                                                                                  
/* Put all the windows */                                                                         
void init_wins(WINDOW **wins, int n)                                                              
{       int x, y, i;                                                                              
        char label[80];                                                                           
                                                                                                  
        y = 2;                                                                                    
        x = 10;                                                                                   
        for(i = 0; i < n; ++i)                                                                    
        {       wins[i] = newwin(NLINES, NCOLS, y, x);                                            
                sprintf(label, "Window Number %d", i + 1);                                        
                win_show(wins[i], label, i + 1);                                                  
                y += 3;                                                                           
                x += 7;                                                                           
        }                                                                                         
}                                                                                                 
                                                                                                  
/* Show the window with a border and a label */                                                   
void win_show(WINDOW *win, char *label, int label_color)                                          
{       int startx, starty, height, width;                                                        
                                                                                                  
        getbegyx(win, starty, startx);                                                            
        getmaxyx(win, height, width);                                                             
                                                                                                  
        box(win, 0, 0);                                                                           
        mvwaddch(win, 2, 0, ACS_LTEE);                                                            
        mvwhline(win, 2, 1, ACS_HLINE, width - 2);                                                
        mvwaddch(win, 2, width - 1, ACS_RTEE);                                                    
                                                                                                  
        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));                        
}                                                                                                 
                                                                                                  
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)  
{       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;                                                                   
        wattron(win, color);                                                                      
        mvwprintw(win, y, x, "%s", string);                                                       
        wattroff(win, color);                                                                     
        refresh();                                                                                
}                                                                                                 

1.16.4. »ç¿ëÀÚ Æ÷ÀÎÅÍ ¾²±â


À§ ¿¹Á¦¿¡¼­ ³ª´Â ¼øȯ½Ã ´ÙÀ½ÀÇ À©µµ¿ì°¡ ¾î´À °ÍÀÎÁö¸¦ ã±âÀ§ÇØ »ç¿ëÀÚ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇÏ¿´´Ù. ¿ì¸®´Â ¿øÇÏ´Â ¾î¶² Á¤º¸µç ±×°ÍÀ» ÀúÀåÇϱâ À§ÇØ »ç¿ëÀÚ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇÏ¿© Æгο¡ ±×°ÍÀ» ºÙÀÏ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì¿£ ³ª´Â ¼øȯ¿¡¼­ ´ÙÀ½Æгο¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀúÀåÇص״Ù. Æгο¡ ´ëÇÑ »ç¿ëÀÚ Æ÷ÀÎÅÍ´Â set_panel_userptr() ÇÔ¼ö¸¦ ÅëÇØ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. panel_userptr() ÇÔ¼ö¸¦ È£ÃâÇϸé ÀÎÀÚ·Î ÁÖ¾îÁø Æгο¡ ´ëÇÑ »ç¿ëÀÚ Æ÷ÀÎÅ͸¦ ¸®ÅÏ¹Þ¾Æ ¾µ ¼ö ÀÖ´Ù. ¼øȯ¿¡¼­ ´ÙÀ½ÀÇ ÆгÎÀ» ãÀº ÈÄ top_panel() ÇÔ¼ö¿¡ ÀÇÇØ ¸Ç À§·Î ¿Ã¶ó¿À°Ô µÈ´Ù. ÀÌ ÇÔ¼ö´Â ÀÎÀÚ·Î ÁÖ¾îÁø ÆгÎÀ» ÆгΠ½ºÅÃÀÇ ÃÖ»óÀ§·Î ¿Å±ä´Ù.

1.16.5. ÆгΠÀ̵¿ ¹× Å©±â º¯°æ


move_panel() ÇÔ¼ö´Â ÆгÎÀ» ¿øÇÏ´Â À§Ä¡·Î ¿Å±â´Âµ¥ »ç¿ëÇÑ´Ù. ±×·¯³ª ÀÌ°ÍÀº ½ºÅþÈÀÇ ÆгΠÀ§Ä¡¸¦ ¹Ù²ÙÁö´Â ¾Ê´Â´Ù. Æгο¡ ºÙ¾î ÀÖ´Â À©µµ¿ì¸¦ ¿Å±â±â À§Çؼ­´Â mvwin() ÇÔ¼ö¸¦ ¾²´Â °ÍÀÌ ¾Æ´Ï¶ó move_panel() ÇÔ¼ö¸¦ ½á¾ß ÇÔÀ» ¸í½ÉÇ϶ó.

ÆгΠũ±â¸¦ ÀçÁ¶Á¤ ÇÏ´Â °ÍÀº ¾à°£ º¹ÀâÇÏ´Ù. Æгο¡ ºÙ¾î ÀÖ´Â À©µµ¿ìÀÇ Å©±â¸¦ Çѹø¿¡ ÀçÁ¶Á¤ÇØÁÖ´Â ÇÔ¼ö´Â ¾ø´Ù. ÆгÎÀ» ¸®»çÀÌÁîÇÏ´Â ¹æ¹ýÀº ¿øÇÏ´Â Å©±âÀÇ »õ À©µµ¿ì¸¦ ¸¸µé°í replace_panel() ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© Æгΰú °áÇյǾî ÀÖ´Â À©µµ¿ì¸¦ º¯°æÇÏ´Â °ÍÀÌ´Ù. ÀÌÀü À©µµ¿ì¸¦ Áö¿ö¾ß ÇÑ´Ù´Â °ÍÀ» ÀØÁö¸¶¶ó. Æгο¡ ºÙ¾î ÀÖ´Â À©µµ¿ì´Â panel_window() ÇÔ¼ö·Î ãÀ» ¼ö ÀÖ´Ù.

´ÙÀ½ ÇÁ·Î±×·¥Àº ÀÌ °³³äÀ» º¸¿©ÁØ´Ù. ¾Æ¸¶ °£´ÜÇÒ °ÍÀÌ´Ù. ¿ª½Ã <TAB> Å°¸¦ ÅëÇØ À©µµ¿ì¸¦ ¼øȯÇغ¼ ¼ö ÀÖ°í, È°¼ºÈ­µÈ Æгο¡ ´ëÇØ 'r' Å°¸¦ ´©¸£¸é Å©±âº¯°æÀ», 'm' Å°¸¦ ´©¸£¸é À̵¿ÀÌ °¡´ÉÇÏ´Ù. ¹æÇâÅ°¸¦ ´­·¯¼­ ÀçÁ¶Á¤ÇÒ Å©±â³ª ¿øÇÏ´Â À§Ä¡·Î À̵¿½ÃŲ ´ÙÀ½ ¿£ÅÍÅ°¸¦ ´­·¯¼­ ÀÛ¾÷À» ¸¶Ä¡¸é µÈ´Ù. ÀÌ ¿¹Á¦´Â ÀÛ¾÷À» À§ÇØ ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ¾ò±âÀ§Çؼ­ »ç¿ëÀÚ µ¥ÀÌÅ͸¦ ¾î¶²½ÄÀ¸·Î ½á¾ß ÇÏ´ÂÁö º¸¿©ÁÖ°í ÀÖ´Ù.

Example 16. Panel Moving and Resizing example

#include <panel.h>                                                                                                                      
                                                                                                                                        
typedef struct _PANEL_DATA {                                                                                                            
        int x, y, w, h;                                                                                                                 
        char label[80];                                                                                                                 
        int label_color;                                                                                                                
        PANEL *next;                                                                                                                    
}PANEL_DATA;                                                                                                                            
                                                                                                                                        
#define NLINES 10                                                                                                                       
#define NCOLS 40                                                                                                                        
                                                                                                                                        
void init_wins(WINDOW **wins, int n);                                                                                                   
void win_show(WINDOW *win, char *label, int label_color);                                                                               
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);                                       
void set_user_ptrs(PANEL **panels, int n);                                                                                              
                                                                                                                                        
int main()                                                                                                                              
{       WINDOW *my_wins[3];                                                                                                             
        PANEL  *my_panels[3];                                                                                                           
        PANEL_DATA  *top;                                                                                                               
        PANEL *stack_top;                                                                                                               
        WINDOW *temp_win, *old_win;                                                                                                     
        int ch;                                                                                                                         
        int newx, newy, neww, newh;                                                                                                     
        int size = FALSE, move = FALSE;                                                                                                 
                                                                                                                                        
        /* Initialize curses */                                                                                                         
        initscr();                                                                                                                      
        start_color();                                                                                                                  
        cbreak();                                                                                                                       
        noecho();                                                                                                                       
        keypad(stdscr, TRUE);                                                                                                           
                                                                                                                                        
        /* Initialize all the colors */                                                                                                 
        init_pair(1, COLOR_RED, COLOR_BLACK);                                                                                           
        init_pair(2, COLOR_GREEN, COLOR_BLACK);                                                                                         
        init_pair(3, COLOR_BLUE, COLOR_BLACK);                                                                                          
        init_pair(4, COLOR_CYAN, COLOR_BLACK);                                                                                          
                                                                                                                                        
        init_wins(my_wins, 3);                                                                                                          
                                                                                                                                        
        /* Attach a panel to each window */     /* Order is bottom up */                                                                
        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */                                                           
        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */                                                         
        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */                                                       
                                                                                                                                        
        set_user_ptrs(my_panels, 3);                                                                                                    
        /* Update the stacking order. 2nd panel will be on top */                                                                       
        update_panels();                                                                                                                
                                                                                                                                        
        /* Show it on the screen */                                                                                                     
        attron(COLOR_PAIR(4));                                                                                                          
        mvprintw(LINES - 3, 0, "Use 'm' for moving, 'r' for resizing");                                                                 
        mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");                                                   
        attroff(COLOR_PAIR(4));                                                                                                         
        doupdate();                                                                                                                     
                                                                                                                                        
        stack_top = my_panels[2];                                                                                                       
        top = (PANEL_DATA *)panel_userptr(stack_top);                                                                                   
        newx = top->x;                                                                                                                  
        newy = top->y;                                                                                                                  
        neww = top->w;                                                                                                                  
        newh = top->h;                                                                                                                  
        while((ch = getch()) != KEY_F(1))                                                                                               
        {       switch(ch)                                                                                                              
                {       case 9:         /* Tab */                                                                                       
                                top = (PANEL_DATA *)panel_userptr(stack_top);                                                           
                                top_panel(top->next);                                                                                   
                                stack_top = top->next;                                                                                  
                                top = (PANEL_DATA *)panel_userptr(stack_top);                                                           
                                newx = top->x;                                                                                          
                                newy = top->y;                                                                                          
                                neww = top->w;                                                                                          
                                newh = top->h;                                                                                          
                                break;                                                                                                  
                        case 'r':       /* Re-Size*/                                                                                    
                                size = TRUE;                                                                                            
                                attron(COLOR_PAIR(4));                                                                                  
                                mvprintw(LINES - 4, 0, "Entered Resizing :Use Arrow Keys to resize and press <ENTER> to end resizing"); 
                                refresh();                                                                                              
                                attroff(COLOR_PAIR(4));                                                                                 
                                break;                                                                                                  
                        case 'm':       /* Move */                                                                                      
                                attron(COLOR_PAIR(4));                                                                                  
                                mvprintw(LINES - 4, 0, "Entered Moving: Use Arrow Keys to Move and press <ENTER> to end moving");       
                                refresh();                                                                                              
                                attroff(COLOR_PAIR(4));                                                                                 
                                move = TRUE;                                                                                            
                                break;                                                                                                  
                        case KEY_LEFT:                                                                                                  
                                if(size == TRUE)                                                                                        
                                {       --newx;                                                                                         
                                        ++neww;                                                                                         
                                }                                                                                                       
                                if(move == TRUE)                                                                                        
                                        --newx;                                                                                         
                                break;                                                                                                  
                        case KEY_RIGHT:                                                                                                 
                                if(size == TRUE)                                                                                        
                                {       ++newx;                                                                                         
                                        --neww;                                                                                         
                                }                                                                                                       
                                if(move == TRUE)                                                                                        
                                        ++newx;                                                                                         
                                break;                                                                                                  
                        case KEY_UP:                                                                                                    
                                if(size == TRUE)                                                                                        
                                {       --newy;                                                                                         
                                        ++newh;                                                                                         
                                }                                                                                                       
                                if(move == TRUE)                                                                                        
                                        --newy;                                                                                         
                                break;                                                                                                  
                        case KEY_DOWN:                                                                                                  
                                if(size == TRUE)                                                                                        
                                {       ++newy;                                                                                         
                                        --newh;                                                                                         
                                }                                                                                                       
                                if(move == TRUE)                                                                                        
                                        ++newy;                                                                                         
                                break;                                                                                                  
                        case 10:        /* Enter */                                                                                     
                                move(LINES - 4, 0);                                                                                     
                                clrtoeol();                                                                                             
                                refresh();                                                                                              
                                if(size == TRUE)                                                                                        
                                {       old_win = panel_window(stack_top);                                                              
                                        temp_win = newwin(newh, neww, newy, newx);                                                      
                                        replace_panel(stack_top, temp_win);                                                             
                                        win_show(temp_win, top->label, top->label_color);                                               
                                        delwin(old_win);                                                                                
                                        size = FALSE;                                                                                   
                                }                                                                                                       
                                if(move == TRUE)                                                                                        
                                {       move_panel(stack_top, newy, newx);                                                              
                                        move = FALSE;                                                                                   
                                }                                                                                                       
                                break;                                                                                                  
                                                                                                                                        
                }                                                                                                                       
                attron(COLOR_PAIR(4));                                                                                                  
                mvprintw(LINES - 3, 0, "Use 'm' for moving, 'r' for resizing");                                                         
                mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");                                           
                attroff(COLOR_PAIR(4));                                                                                                 
                refresh();                                                                                                              
                update_panels();                                                                                                        
                doupdate();                                                                                                             
        }                                                                                                                               
        endwin();                                                                                                                       
        return 0;                                                                                                                       
}                                                                                                                                       
                                                                                                                                        
/* Put all the windows */                                                                                                               
void init_wins(WINDOW **wins, int n)                                                                                                    
{       int x, y, i;                                                                                                                    
        char label[80];                                                                                                                 
                                                                                                                                        
        y = 2;                                                                                                                          
        x = 10;                                                                                                                         
        for(i = 0; i < n; ++i)                                                                                                          
        {       wins[i] = newwin(NLINES, NCOLS, y, x);                                                                                  
                sprintf(label, "Window Number %d", i + 1);                                                                              
                win_show(wins[i], label, i + 1);                                                                                        
                y += 3;                                                                                                                 
                x += 7;                                                                                                                 
        }                                                                                                                               
}                                                                                                                                       
                                                                                                                                        
/* Set the PANEL_DATA structures for individual panels */                                                                               
void set_user_ptrs(PANEL **panels, int n)                                                                                               
{       PANEL_DATA *ptrs;                                                                                                               
        WINDOW *win;                                                                                                                    
        int x, y, w, h, i;                                                                                                              
        char temp[80];                                                                                                                  
                                                                                                                                        
        ptrs = (PANEL_DATA *)calloc(n, sizeof(PANEL_DATA));                                                                             
                                                                                                                                        
        for(i = 0;i < n; ++i)                                                                                                           
        {       win = panel_window(panels[i]);                                                                                          
                getbegyx(win, y, x);                                                                                                    
                getmaxyx(win, h, w);                                                                                                    
                ptrs[i].x = x;                                                                                                          
                ptrs[i].y = y;                                                                                                          
                ptrs[i].w = w;                                                                                                          
                ptrs[i].h = h;                                                                                                          
                sprintf(temp, "Window Number %d", i + 1);                                                                               
                strcpy(ptrs[i].label, temp);                                                                                            
                ptrs[i].label_color = i + 1;                                                                                            
                if(i + 1 == n)                                                                                                          
                        ptrs[i].next = panels[0];                                                                                       
                else                                                                                                                    
                        ptrs[i].next = panels[i + 1];                                                                                   
                set_panel_userptr(panels[i], &ptrs[i]);                                                                                 
        }                                                                                                                               
}                                                                                                                                       
                                                                                                                                        
/* Show the window with a border and a label */                                                                                         
void win_show(WINDOW *win, char *label, int label_color)                                                                                
{       int startx, starty, height, width;                                                                                              
                                                                                                                                        
        getbegyx(win, starty, startx);                                                                                                  
        getmaxyx(win, height, width);                                                                                                   
                                                                                                                                        
        box(win, 0, 0);                                                                                                                 
        mvwaddch(win, 2, 0, ACS_LTEE);                                                                                                  
        mvwhline(win, 2, 1, ACS_HLINE, width - 2);                                                                                      
        mvwaddch(win, 2, width - 1, ACS_RTEE);                                                                                          
                                                                                                                                        
        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));                                                              
}                                                                                                                                       
                                                                                                                                        
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)                                        
{       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;                                                                                                         
        wattron(win, color);                                                                                                            
        mvwprintw(win, y, x, "%s", string);                                                                                             
        wattroff(win, color);                                                                                                           
        refresh();                                                                                                                      
} 


¸ÞÀÎ while ·çÇÁ¿¡ ÁýÁßÇÏÀÚ. ¸ÕÀú ÀԷ¹ÞÀº Å°ÀÇ Á¾·ù¸¦ ¾Ë¾Æ³»¸é °Å±â¿¡ ¸Â´Â ÀûÀýÇÑ Ã³¸®¸¦ ÇÏ°Ô µÇ¾î ÀÖ´Ù. ¸¸¾à 'r' Å°°¡ ´­·ÁÁö¸é Å©±âÁ¶Á¤ ¸ðµå°¡ ½ÃÀ۵ȴÙ. ±× ÈÄ »ç¿ëÀÚ°¡ ¹æÇâÅ°¸¦ ´©¸§¿¡ µû¶ó ¹Ù²ï Å©±â°¡ °»½ÅµÈ´Ù. »ç¿ëÀÚ°¡ <ENTER> ¸¦ ´©¸£°Ô µÇ¸é ÇöÀç ¼±ÅÃÀÌ ³¡³ª°Ô µÇ°í ¼³¸íÇßµíÀÌ ÆгÎÀÌ ¹Ù²ï Å©±â·Î ÀçÁ¶Á¤ µÈ´Ù. Å©±â º¯°æ ¸ðµå¿¡ ÀÖ´Â µ¿¾È ÇÁ·Î±×·¥Àº À©µµ¿ì Å©±â°¡ ¾î¶»°Ô º¯°æµÇ°í ÀÖ´ÂÁö º¸¿©ÁÖÁö ¾Ê´Â´Ù. »õ À§Ä¡·Î Å©±â°¡ ¹Ù²î´Â µ¿¾È Á¡À¸·ÎµÈ Å׵θ®¸¦ Ãâ·ÂÇÏ´Â °ÍÀº µ¶ÀÚµéÀÇ ¿¬½ÀÀ¸·Î ³²°ÜµÐ´Ù.

»ç¿ëÀÚ°¡ 'm' Å°¸¦ ´©¸£¸é À̵¿ ¸ðµå°¡ ½ÃÀ۵ȴÙ. ÀÌ°ÍÀº Å©±âº¯°æº¸´Ù ¾à°£Àº ´õ ´Ü¼øÇÏ´Ù. ¹æÇâÅ°°¡ ´­·ÁÁü¿¡ µû¶ó »õ À§Ä¡°¡ °»½ÅµÇ°í <ENTER> À» ´©¸£°ÔµÇ¸é ÆгÎÀÌ move_panel() ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î¼­ À̵¿ÇÏ°Ô µÈ´Ù.

ÀÌ ÇÁ·Î±×·¥¿¡¼­ PANEL_DATA ·Î Ç¥½ÃµÈ »ç¿ëÀÚ µ¥ÀÌÅÍ´Â Æгο¡ °áÇÕµÈ Á¤º¸¸¦ ã¾Æ³»´Âµ¥ ¸Å¿ì Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù. ÁÖ¼®¿¡¼­µµ ½èµíÀÌ PANEL_DATA ¿¡´Â ÆгÎÀÇ Å©±â, ·¹À̺í, ·¹ÀÌºí »ö ±×¸®°í ¼øȯÇؾßÇÒ ´ÙÀ½ Æгο¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ°í ÀÖ´Ù.

1.16.6. ÆгΠ¼û±â±â ¹× º¸¿©ÁÖ±â


ÆгÎÀº hide_panel() ÇÔ¼ö¸¦ ½á¼­ ¼û±æ ¼öµµ ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ´Ü½Ã ÆгÎÀÇ ½ºÅÿ¡¼­ ±×°ÍÀ» Á¦°ÅÇÔÀ¸·Î¼­ ´ç½ÅÀÌ update_panels() ¿Í doupdate() ¸¦ È£ÃâÇϰԵǸé È­¸é¿¡¼­ ±× ÆгÎÀ» º¸¿©ÁÖÁö ¾Ê°Ô µÈ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â ¼û°ÜÁø ÆгÎÀÇ PANEL ±¸Á¶Ã¼¸¦ ÇØÁ¦ÇÏÁö´Â ¾Ê´Â´Ù. show_panel() ÇÔ¼ö¸¦ ¾¸À¸·Î¼­ ´Ù½Ã È­¸é¿¡ º¼¿©ÁÙ ¼öµµ ÀÖ´Ù.

´ÙÀ½ ÇÁ·Î±×·¥Àº ÆгÎÀ» ¼û±â´Â °ÍÀ» º¸¿©ÁÖ°í ÀÖ´Ù. 'a' ³ª 'b' ³ª 'c' Å°¸¦ ´©¸£°Ô µÇ¸é °¢°¢ ù¹ø° µÎ¹ø° ¼¼¹øÀç À©µµ¿ì¸¦ ¼û±â°Å³ª º¸¿©ÁØ´Ù. ¿©±â¿¡´Â À©µµ¿ì°¡ ¼û°ÜÁ³´ÂÁö ¿©ºÎ¸¦ ¾Ë±â À§Çؼ­ hide ¶ó´Â ÀÛÀº º¯¼ö¸¦ »ç¿ëÀÚ µ¥ÀÌÅÍ·Î ¾²°í ÀÖ´Ù. ¸î¸î ƯÁ¤ÇÑ ÀÌÀ¯·Î ÆгÎÀÌ È÷µç»óÅÂÀÎÁö ¾Æ´ÑÁö¸¦ ¾Ë·ÁÁÖ´Â panel_hidden() ÇÔ¼ö°¡ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù. Michael Andres ¿¡ ÀÇÇØ ¹ö±×¸®Æ÷Æ®µµ [http]¿©±â(http://www.geocrawler.com/archives/3/344/1999/9/0/2643549/)¿¡ Á¦ÃâµÇ¾ú´Ù.

Example 17. Panel Hiding and Showing example

#include <panel.h>                                                                                                     
                                                                                                                       
typedef struct _PANEL_DATA {                                                                                           
        int hide;       /* TRUE if panel is hidden */                                                                  
}PANEL_DATA;                                                                                                           
                                                                                                                       
#define NLINES 10                                                                                                      
#define NCOLS 40                                                                                                       
                                                                                                                       
void init_wins(WINDOW **wins, int n);                                                                                  
void win_show(WINDOW *win, char *label, int label_color);                                                              
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);                      
                                                                                                                       
int main()                                                                                                             
{       WINDOW *my_wins[3];                                                                                            
        PANEL  *my_panels[3];                                                                                          
        PANEL_DATA panel_datas[3];                                                                                     
        PANEL_DATA *temp;                                                                                              
        int ch;                                                                                                        
                                                                                                                       
        /* Initialize curses */                                                                                        
        initscr();                                                                                                     
        start_color();                                                                                                 
        cbreak();                                                                                                      
        noecho();                                                                                                      
        keypad(stdscr, TRUE);                                                                                          
                                                                                                                       
        /* Initialize all the colors */                                                                                
        init_pair(1, COLOR_RED, COLOR_BLACK);                                                                          
        init_pair(2, COLOR_GREEN, COLOR_BLACK);                                                                        
        init_pair(3, COLOR_BLUE, COLOR_BLACK);                                                                         
        init_pair(4, COLOR_CYAN, COLOR_BLACK);                                                                         
                                                                                                                       
        init_wins(my_wins, 3);                                                                                         
                                                                                                                       
        /* Attach a panel to each window */     /* Order is bottom up */                                               
        my_panels[0] = new_panel(my_wins[0]);   /* Push 0, order: stdscr-0 */                                          
        my_panels[1] = new_panel(my_wins[1]);   /* Push 1, order: stdscr-0-1 */                                        
        my_panels[2] = new_panel(my_wins[2]);   /* Push 2, order: stdscr-0-1-2 */                                      
                                                                                                                       
        /* Initialize panel datas saying that nothing is hidden */                                                     
        panel_datas[0].hide = FALSE;                                                                                   
        panel_datas[1].hide = FALSE;                                                                                   
        panel_datas[2].hide = FALSE;                                                                                   
                                                                                                                       
        set_panel_userptr(my_panels[0], &panel_datas[0]);                                                              
        set_panel_userptr(my_panels[1], &panel_datas[1]);                                                              
        set_panel_userptr(my_panels[2], &panel_datas[2]);                                                              
                                                                                                                       
        /* Update the stacking order. 2nd panel will be on top */                                                      
        update_panels();                                                                                               
                                                                                                                       
        /* Show it on the screen */                                                                                    
        attron(COLOR_PAIR(4));                                                                                         
        mvprintw(LINES - 3, 0, "Show or Hide a window with 'a'(first window)  'b'(Second Window)  'c'(Third Window)"); 
        mvprintw(LINES - 2, 0, "F1 to Exit");                                                                          
                                                                                                                       
        attroff(COLOR_PAIR(4));                                                                                        
        doupdate();                                                                                                    
                                                                                                                       
        while((ch = getch()) != KEY_F(1))                                                                              
        {       switch(ch)                                                                                             
                {       case 'a':                                                                                      
                                temp = (PANEL_DATA *)panel_userptr(my_panels[0]);                                      
                                if(temp->hide == FALSE)                                                                
                                {       hide_panel(my_panels[0]);                                                      
                                        temp->hide = TRUE;                                                             
                                }                                                                                      
                                else                                                                                   
                                {       show_panel(my_panels[0]);                                                      
                                        temp->hide = FALSE;                                                            
                                }                                                                                      
                                break;                                                                                 
                        case 'b':                                                                                      
                                temp = (PANEL_DATA *)panel_userptr(my_panels[1]);                                      
                                if(temp->hide == FALSE)                                                                
                                {       hide_panel(my_panels[1]);                                                      
                                        temp->hide = TRUE;                                                             
                                }                                                                                      
                                else                                                                                   
                                {       show_panel(my_panels[1]);                                                      
                                        temp->hide = FALSE;                                                            
                                }                                                                                      
                                break;                                                                                 
                        case 'c':                                                                                      
                                temp = (PANEL_DATA *)panel_userptr(my_panels[2]);                                      
                                if(temp->hide == FALSE)                                                                
                                {       hide_panel(my_panels[2]);                                                      
                                        temp->hide = TRUE;                                                             
                                }                                                                                      
                                else                                                                                   
                                {       show_panel(my_panels[2]);                                                      
                                        temp->hide = FALSE;                                                            
                                }                                                                                      
                                break;                                                                                 
                }                                                                                                      
                update_panels();                                                                                       
                doupdate();                                                                                            
        }                                                                                                              
        endwin();                                                                                                      
        return 0;                                                                                                      
}                                                                                                                      
                                                                                                                       
/* Put all the windows */                                                                                              
void init_wins(WINDOW **wins, int n)                                                                                   
{       int x, y, i;                                                                                                   
        char label[80];                                                                                                
                                                                                                                       
        y = 2;                                                                                                         
        x = 10;                                                                                                        
        for(i = 0; i < n; ++i)                                                                                         
        {       wins[i] = newwin(NLINES, NCOLS, y, x);                                                                 
                sprintf(label, "Window Number %d", i + 1);                                                             
                win_show(wins[i], label, i + 1);                                                                       
                y += 3;                                                                                                
                x += 7;                                                                                                
        }                                                                                                              
}                                                                                                                      
                                                                                                                       
/* Show the window with a border and a label */                                                                        
void win_show(WINDOW *win, char *label, int label_color)                                                               
{       int startx, starty, height, width;                                                                             
                                                                                                                       
        getbegyx(win, starty, startx);                                                                                 
        getmaxyx(win, height, width);                                                                                  
                                                                                                                       
        box(win, 0, 0);                                                                                                
        mvwaddch(win, 2, 0, ACS_LTEE);                                                                                 
        mvwhline(win, 2, 1, ACS_HLINE, width - 2);                                                                     
        mvwaddch(win, 2, width - 1, ACS_RTEE);                                                                         
                                                                                                                       
        print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));                                             
}                                                                                                                      
                                                                                                                       
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)                       
{       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;                                                                                        
        wattron(win, color);                                                                                           
        mvwprintw(win, y, x, "%s", string);                                                                            
        wattroff(win, color);                                                                                          
        refresh();                                                                                                     
} 

1.16.7. panel_above() ¿Í panel_below() ÇÔ¼öµé


panel_above() ¿Í panel_below() ÇÔ¼ö´Â ±× ÆгÎÀÇ À§¿Í ¾Æ·¡¿¡ ÀÖ´Â ÆгÎÀ» ã±â À§ÇØ ¾´´Ù. ¸¸¾à ÀÌ ÇÔ¼öµé¿¡ ÀÎÀÚ°¡ NULL ·Î µé¾î°¡°Ô µÇ¸é °¢°¢ Á¦ÀÏ À§ÀÇ Æгΰú Á¦ÀÏ ¹ØÀÇ Æгο¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ°Ô µÈ´Ù.

1.17. ¸Þ´º ¶óÀ̺귯¸®


menus ¶óÀ̺귯¸®´Â ¸Þ´º¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Â ¸ÚÁø È®ÀåÀ» ±âº» curses ¿¡ Á¦°øÇÑ´Ù. ÀÌ°ÍÀº ¸Þ´º¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Â ÇÔ¼öµéÀÇ ÁýÇÕÀÌ´Ù. ±×·¯³ª º¸´Ù ¸ÚÁø ¿Ü¾çÀ» °®Ãß·Á¸é »ö»óµîÀ» ¼³Á¤ÇØÁà¾ß¸¸ ÇÑ´Ù. Á» ´õ ÀÚ¼¼È÷ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

¸Þ´º´Â »ç¿ëÀÚ·Î ÇÏ¿©±Ý ÁÖ¾îÁø ¾ÆÀÌÅ۵鿡 ´ëÇؼ­ ±× ¼±ÅÃÀ» ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â È­¸é Ç¥½ÃÀÌ´Ù. °£´ÜÈ÷ ¸»Çϸé, ¸Þ´º´Â Çϳª ¶Ç´Â ¿©·¯°³ÀÇ ¾ÆÀÌÅÛµéÀÌ ¼±ÅÃµÉ ¼ö ÀÖ´Â ¾ÆÀÌÅÛµéÀÇ ÁýÇÕÀÌ´Ù. ¸î¸î µ¶ÀÚµéÀº ¸Þ´º¿¡¼­ÀÇ ¿©·¯°³ÀÇ ¾ÆÀÌÅÛµéÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¸ð¸¦ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ¸Þ´º ¶óÀ̺귯¸®´Â »ç¿ëÀÚÀÇ ±âÈ£¿¡ µû¶ó Çϳª ÀÌ»óÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Â ¸Þ´º¸¦ ¸¸µé ¼öµµ ÀÖ´Ù. ÀÌ°Í¿¡ °üÇؼ­´Â µÚÀÇ ¼½¼Ç¿¡¼­ ´Ù·é´Ù. ÀÚ ÀÌÁ¨ ±âÃʸ¦ °øºÎÇغ¼ ½Ã°£ÀÌ´Ù.

1.17.1. °³°ý


¸Þ´º¸¦ ¸¸µé·Á¸é ¸ÕÀú ¾ÆÀÌÅÛµéÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ±×ÈÄ ¸Þ´º¸¦ È­¸é¿¡ Ç¥½ÃÈù´Ù. ÀÌ·¸°Ô ÇÑ ÈÄ »ç¿ëÀÚ ÀÀ´äÀÇ ¸ðµç 󸮴 ¾î¶² ¸Þ´º ÇÁ·Î±×·¥¿¡¼­µµ ±× ÀϲÛÀÌ µÇ´Â menu_driver() ¶ó´Â °í»óÇÑ ÇÔ¼ö ¾È¿¡¼­ ÇàÇØÁø´Ù.

¸Þ´º ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ È帧Àº ´ÙÀ½°ú °°´Ù.

  • curses ¸¦ ÃʱâÈ­ ÇÑ´Ù.

  • new_item() À» ½á¼­ ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. °¢ ¾ÆÀÌÅÛ¿¡ ´ëÇØ À̸§°ú ¼³¸íÀ» ¸í½ÃÇÒ ¼öµµ ÀÖ´Ù.

  • new_menu() ¿¡ °áÇÕµÉ ¾ÆÀÌÅÛÀ» ¸í½ÃÇؼ­ ¸Þ´º¸¦ ¸¸µç´Ù.

  • menu_post() ÇÔ¼ö·Î ¸Þ´º¸¦ ºÙÀÌ°í È­¸éÀ» ¸®ÇÁ·¹½¬ ÇÑ´Ù.

  • ·çÇÁ¸¦ µ¹¸ç »ç¿ëÀÚ ¿äûÀ» ó¸®ÇÏ°í menu_driver ¸¦ ÅëÇØ ¸Þ´º¿¡ ÇÊ¿äÇÑ °»½ÅÀ» ÇÑ´Ù.

  • menu_unpost() ÇÔ¼ö·Î ¸Þ´º¸¦ ¶¼¾î³½´Ù.

  • free_menu() ·Î ¸Þ´º¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù.

  • free_item() À¸·Î ¾ÆÀÌÅÛ¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù.

  • curses ¸¦ Á¾·áÇÑ´Ù.

ÀÌÁ¦ °£´ÜÇÑ ¸Þ´º¸¦ Ãâ·ÂÇÏ°í »óÇÏ ¹æÇâÅ°·Î ¼±ÅÃÀÌ ¹Ù²î´Â ¸Þ´º°¡ ÀÖ´Â ÇÁ·Î±×·¥À» »ìÆ캸µµ·Ï ÇÏÀÚ.


1.17.2. ¸Þ´º ¶óÀ̺귯¸®¿Í ÄÄÆÄÀÏ Çϱâ


¸Þ´º ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ¾²·Á¸é, menu.h ¸¦ ÀÎŬ·çµå ÇؾßÇÏ°í ÇÁ·Î±×·¥À» ¸µÅ©ÇÒ¶§ -lncurses µÚ¿¡ -lmenu Ç÷¡±×¸¦ ´õÇؼ­ ¸µÅ©ÇØ¾ß ÇÑ´Ù.

#!
     #include <menu.h>                                                        
    .                                                                        
    .                                                                        
    .                                                                        
                                                                             
    compile and link: gcc <program file> -lmenu -lncurses                    


Example 18. Menu Basics

#include <curses.h>                                                          
#include <menu.h>                                                            
                                                                             
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))                             
#define CTRLD   4                                                            
                                                                             
char *choices[] = {                                                          
                        "Choice 1",                                          
                        "Choice 2",                                          
                        "Choice 3",                                          
                        "Choice 4",                                          
                        "Exit",                                              
                  };                                                         
                                                                             
int main()                                                                   
{       ITEM **my_items;                                                     
        int c;                                                               
        MENU *my_menu;                                                       
        int n_choices, i;                                                    
        ITEM *cur_item;                                                      
                                                                             
                                                                             
        initscr();                                                           
        cbreak();                                                            
        noecho();                                                            
        keypad(stdscr, TRUE);                                                
                                                                             
        n_choices = ARRAY_SIZE(choices);                                     
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));           
                                                                             
        for(i = 0; i < n_choices; ++i)                                       
                my_items[i] = new_item(choices[i], choices[i]);              
        my_items[n_choices] = (ITEM *)NULL;                                  
                                                                             
        my_menu = new_menu((ITEM **)my_items);                               
        mvprintw(LINES - 2, 0, "F1 to Exit");                                
        post_menu(my_menu);                                                  
        refresh();                                                           
                                                                             
        while((c = getch()) != KEY_F(1))                                     
        {   switch(c)                                                        
            {   case KEY_DOWN:                                               
                        menu_driver(my_menu, REQ_DOWN_ITEM);                 
                                break;                                       
                        case KEY_UP:                                         
                                menu_driver(my_menu, REQ_UP_ITEM);           
                                break;                                       
                }                                                            
        }                                                                    
                                                                             
        free_item(my_items[0]);                                              
        free_item(my_items[1]);                                              
        free_menu(my_menu);                                                  
        endwin();                                                            
}                                                                            


ÀÌ ÇÁ·Î±×·¥Àº ¸Þ´º¸¦ ¸¸µé°í ¸Þ´º ¶óÀ̺귯¸® »ç¿ë¿¡ ÇÊ¿äÇÑ ±âº» °³³äÀÇ ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ¸ÕÀú ¿ì¸®´Â new_item() ÇÔ¼ö·Î ¾ÆÀÌÅÛÀ» »ý¼ºÇÏ°í new_menu() ÇÔ¼ö¸¦ ½á¼­ ±×°ÍÀ» ¸Þ´º¿¡ ºÙÀδÙ. ¸Þ´º¸¦ Æ÷½ºÆÃÇÏ°í È­¸éÀ» ¸®ÇÁ·¹½¬ ÇÑ ´ÙÀ½ ¸ÞÀΠó¸® ·çÇÁ°¡ ½ÃÀ۵ȴÙ. ±×°ÍÀº »ç¿ëÀÚ ÀÔ·ÂÀ» ¹Þ¾Æ¼­ ÀûÀýÇÑ Ã³¸®¸¦ ÇÑ´Ù. menu_driver() ÇÔ¼ö°¡ ¸Þ´º ½Ã½ºÅÛÀÇ ÁÖµÈ ÀÏÀ» ÇÏ´Â ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼öÀÇ µÎ¹ø° ÀÎÀÚ´Â ¸Þ´º¿¡ ¾î¶²ÀÏÀ» Çß´ÂÁö¸¦ ³ªÅ¸³½´Ù. ÀÎÀÚ¿¡ µû¶ó menu_driver() ÇÔ¼ö´Â °Å±â¿¡ ¸Â´Â ÀÛ¾÷À» ÇÑ´Ù. ÀÌ °ª¿¡´Â ¹°·Ð ¸Þ´º Ž»ö ¿äû, ¾Æ½ºÅ° ¹®ÀÚ, ¸¶¿ì½º À̺¥Æ®¿¡ µû¸¥ KEY_MOUSE ¶ó´Â Ư¼ö Å°µµ ÀÖÀ» ¼ö ÀÖ´Ù.

menu_driver ´Â ´ÙÀ½ÀÇ Å½»ö ¿äûÀ» ¹ÞÀ» ¼ö ÀÖ´Ù.

#!
      REQ_LEFT_ITEM         Move left to an item.                                  
     REQ_RIGHT_ITEM      Move right to an item.                                   
     REQ_UP_ITEM         Move up to an item.                                      
     REQ_DOWN_ITEM       Move down to an item.                                    
     REQ_SCR_ULINE       Scroll up a line.                                        
     REQ_SCR_DLINE          Scroll down a line.                                   
     REQ_SCR_DPAGE          Scroll down a page.                                   
     REQ_SCR_UPAGE         Scroll up a page.                                      
     REQ_FIRST_ITEM     Move to the first item.                                   
     REQ_LAST_ITEM         Move to the last item.                                 
     REQ_NEXT_ITEM         Move to the next item.                                 
     REQ_PREV_ITEM         Move to the previous item.                             
     REQ_TOGGLE_ITEM     Select/deselect an item.                                 
     REQ_CLEAR_PATTERN     Clear the menu pattern buffer.                         
     REQ_BACK_PATTERN      Delete the previous character from the pattern buffer. 
     REQ_NEXT_MATCH     Move to the next item matching the pattern match.         
     REQ_PREV_MATCH     Move to the previous item matching the pattern match.     


¿É¼ÇÀÇ Á¾·ù¿¡ °Ì¸ÔÁö ¸¶¶ó. ¿©±â¿¡ ´ëÇØ ÇϳªÇϳª õõÈ÷ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ÀÌ ¿¹Á¦¿¡¼­ °ü½ÉÀ» °¡Áø ¿É¼ÇÀº REQ_UP_ITEM °ú REQ_DOWN_ITEM ÀÌ´Ù. ÀÌ µÎ¿É¼ÇÀÌ menu_driver ¿¡ ³Ñ°ÜÁö¸é menu_driver ´Â ÇöÀç ¾ÆÀÌÅÛ¿¡¼­ À§·Î Çϳª ¿Ã¸®°Å³ª ¾Æ·¡·Î Çϳª ³»¸®°Å³ª ÇÑ´Ù.


1.17.3. Menu Driver: ¸Þ´º ½Ã½ºÅÛÀÇ Å« ÀϲÛ


À§ÀÇ ¿¹Á¦¿¡¼­ º¸¾ÒµíÀÌ, menu_driver ´Â ¸Þ´º °»½Å¿¡ Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù. ¿©±â¿¡ ¾²ÀÌ´Â ´Ù¾çÇÑ ¿É¼Ç°ú ±× ±â´ÉÀ» ÀÌÇØÇÏ´Â °ÍÀº ¸Å¿ì Áß¿äÇÏ´Ù. À§¿¡¼­ ¼³¸íÇßµíÀÌ, menu_driver() ÀÇ µÎ¹ø° ÀÎÀڴ Ž»ö ¿äûÀ̳ª Ãâ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ, KEY_MOUSE Å° µîÀÌ µÉ ¼ö ÀÖ´Ù. ÀÌÁ¦ °¢°¢ÀÇ ´Ù¸¥ Ž»ö ¿äû¿¡ ´ëÇؼ­ ÆÄÇìÃÄ º¸ÀÚ.

  • REQ_LEFT_ITEM and REQ_RIGHT_ITEM

¸Þ´º´Â ÇÑ°¡Áö ¾ÆÀÌÅÛ ÀÌ»óÀÇ ¿©·¯ ¿­·Î º¸¿©Áú ¼ö ÀÖ´Ù. menu_format() ÇÔ¼ö¸¦ ½á¼­ ÀÌ°ÍÀ» ÇÒ ¼ö Àִµ¥, ¿©·¯ ¿­·Î µÈ ¸Þ´º°¡ Ç¥½ÃµÉ ¶§, ÀÌ ¿äûµéÀÌ ¸Þ´º µå¶óÀ̹ö·Î ÇÏ¿©±Ý ÇöÀç ¼±ÅÃÀ» Á¿ì·Î ¿Å±â°Ô ÇÑ´Ù.

  • REQ_UP_ITEM and REQ_DOWN_ITEM

À§ÀÇ ¿¹Á¦¿¡¼­ º» µÎ°³ÀÇ ¿É¼ÇÀÌ´Ù. ÀÌ ¿É¼ÇµéÀÌ ÁÖ¾îÁö¸é menu_driver °¡ ÇöÀçÀÇ ¼±ÅÃÀ» ÇÑ ¾ÆÀÌÅÛ À§ ¶Ç´Â ¾Æ·¡·Î À̵¿ÇÏ°Ô µÈ´Ù.

  • REQ_SCR_* options

REQ_SCR_ULINE, REQ_SCR_DLINE, REQ_SCR_DPAGE, REQ_SCR_UPAGE ÀÇ ³×°¡Áö ¿É¼ÇÀº ½ºÅ©·Ñ°ú °ü·ÃÀÌ ÀÖ´Ù. ¸¸¾à ¸Þ´ºÀÇ ¸ðµç ¾ÆÀÌÅÛÀÌ ¸Þ´º ¼­ºê À©µµ¿ì¿¡¼­ ÀüºÎ Ç¥½ÃµÇÁö ¸øÇÏ¸é ¸Þ´º¿¡ ½ºÅ©·Ñ ±â´ÉÀÌ »ý±â°Ô µÈ´Ù. ÀÌ ¿äûµéÀº menu_driver ·Î ÇÏ¿©±Ý °¢°¢ ÇÑÁÙ À§·Î, ¾Æ·¡·Î ¶Ç´Â ÇÑÆäÀÌÁö À§·Î, ¾Æ·¡·Î ½ºÅ©·Ñ ÇÏ°Ô ÇÑ´Ù.

  • REQ_FIRST_ITEM, REQ_LAST_ITEM, REQ_NEXT_ITEM and REQ_PREV_ITEM

ÀÌ ¿äûµéÀº ±»ÀÌ ¼³¸íÇÏÁö ¾Ê¾Æµµ ¾Ë °ÍÀÌ´Ù.

  • REQ_TOGGLE_ITEM

ÀÌ ¿äûÀÌ ÁÖ¾îÁö¸é ÇöÀç ¼±ÅÃÀ» Çϳª¾¿ ¹Ù²ãº¼ ¼ö ÀÖ´Ù. ÀÌ ¿É¼ÇÀº ¿©·¯°³ÀÇ ¼±ÅÃÀÌ ÀÖ´Â ¸Þ´º¿¡¸¸ ¾µ ¼ö ÀÖ´Ù. ±×·¡¼­ ÀÌ °ªÀ» ¾µ·Á¸é O_ONEVALUE °ªÀÌ ²¨Á® ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ °ªÀº set_menu_opts() ÇÔ¼ö·Î ²°´Ù Ä×´Ù ÇÒ ¼ö ÀÖ´Ù.

  • Pattern Requests

¸ðµç ¸Þ´º´Â ÆÐÅÏ ¹öÆÛ¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ°ÍÀº »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ¾Æ½ºÅ° ¹®ÀÚ¿¡ °¡Àå ±ÙÁ¢ÇÑ ¾ÆÀÌÅÛÀ» ã´Â´Ù. menu_driver ¿¡ ¾Æ½ºÅ° ¹®ÀÚ°¡ ÁÖ¾îÁú¶§¸é Ç×»ó ±× ¹®ÀÚ¸¦ ÆÐÅÏ ¹öÆÛ¿¡ ³Ö´Â´Ù. ±×¸®°í ¾ÆÀÌÅÛ ¸®½ºÆ®¿¡¼­ °¡Àå ±ÙÁ¢ÇÑ ÆÐÅÏÀ» ã¾Æ¼­ ±× ¾ÆÀÌÅÛÀ¸·Î ¼±ÅÃÀ» À̵¿ÇÑ´Ù. REQ_CLEAR_PATTERN ¿äûÀº ÆÐÅÏ ¹öÆÛ¸¦ Ŭ¸®¾îÇÑ´Ù. REQ_BACK_PATTERN Àº ÆÐÅÏ ¹öÆÛÀÇ ÀÌÀü ¹®ÀÚ¸¦ »èÁ¦ÇÑ´Ù. ¸¸¾à Çϳª ÀÌ»óÀÇ ¸ÅĪµÈ ¾ÆÀÌÅÛÀ» ã°ÔµÇ¸é REQ_NEXT_MATCH ¿Í REQ_PREV_MATCH ¸¦ ÅëÇØ ÇöÀç ¼±ÅÃÀ» ´ÙÀ½ À̳ª ÀÌÀüÀÇ °á°ú·Î À̵¿ ÇÒ ¼ö ÀÖ´Ù.

  • Mouse Requests

KEY_MOUSE ¿äûÀº ¸¶¿ì½ºÀÇ À§Ä¡¿¡ µû¶ó¼­ ÀϾ´Â ¹ÝÀÀÀÌ ´Ù¸£´Ù. ¸Ç ÆäÀÌÁö¿¡ ¼³¸íµÈ ¹ÝÀÀÀº,

¸¸¾à µÎ¹ø° ÀÎÀÚ°¡ KEY_MOUSE ¶ó´Â Ư¼ö Å° À̸é, ÀϾ ¸¶¿ì½º À̺¥Æ®°¡ À§¿¡¼­ ÀÌ¹Ì Á¤ÀǵǾî ÀÖ´Â ¿äûµé Áß Çϳª·Î ¹ø¿ªµÈ´Ù. ÇöÀç·Î¼­´Â ´ÜÁö »ç¿ëÀÚ À©µµ¿ì (¸Þ´º ¿µ¿ª ¾ÈÀ̳ª ±×¿Ü Ç¥½Ã¿ë À©µµ¿ì ¾È°ú °°Àº) ¿¡¼­ÀÇ Å¬¸¯ ¸¸ÀÌ ´Ù·ïÁö°í ÀÖ´Ù. ¸¸¾à ¸Þ´º Ç¥½Ã ¿µ¿ªÀÇ À§¿¡ ÇѹøÀÇ Å¬¸¯À» ÇÑ´Ù¸é, REQ_SCR_ULINE °¡ ¹ß»ýµÇ°í, µÎ¹ø Ŭ¸¯À» ÇÏ°Ô µÇ¸é, REQ_SCR_UPAGE °¡ ¹ß»ýÇÑ´Ù. ¶Ç ¼¼¹ø Ŭ¸¯À» ÇÏ°Ô µÇ¸é REQ_FIRST_ITEM ÀÌ ¹ß»ýÇÑ´Ù. ¸¸¾à ¸Þ´º Ç¥½Ã ¿µ¿ªÀÇ ¾Æ·¡¿¡ ÇѹøÀÇ Å¬¸¯À» ÇÑ´Ù¸é REQ_SCR_DLINE °¡ ¹ß»ýÇÏ°í, µÎ¹ø Ŭ¸¯½Ã´Â REQ_SCR_DPAGE °¡ ¹ß»ý, ¼¼¹ú Ŭ¸¯ ½Ã¿¡´Â REQ_LAST_ITEM ÀÌ ¹ß»ýÇÑ´Ù. ¸¸¾à ´ç½ÅÀÌ ¸Þ´º ¾ÈÀÇ ¾ÆÀÌÅÛÀ» Ŭ¸¯ÇÏ°Ô µÇ¸é ¸Þ´º Ä¿¼­°¡ ±× ¾ÆÀÌÅÛÀ¸·Î À̵¿ÇÏ°Ô µÈ´Ù.

À§ ¿äûµé °¢°¢Àº ´ÙÀ½ÀÇ ¿©·¯ ¿¹Á¦¿¡¼­ ÀûÀýÇÏ°Ô ¼³¸íÀ» ÇÏ°Ô µÉ °ÍÀÌ´Ù.


1.17.4. ¸Þ´º À©µµ¿ì


»ý¼ºµÈ ¸ðµç ¸Þ´º¿¡´Â À©µµ¿ì¿Í ±× ÇÏÀ§ À©µµ¿ì°¡ ÀÖ´Ù. ¸Þ´º À©µµ¿ì´Â ¸Þ´ºÀÇ Å׵θ®³ª Á¦¸ñµîÀ» Ç¥½ÃÇÑ´Ù. ¸Þ´º ÇÏÀ§ À©µµ¿ì´Â ÇöÀç ¼±Åÿ¡ ¸Â´Â ¸Þ´º ¾ÆÀÌÅÛµéÀ» Ç¥½ÃÇÑ´Ù. ±×·¯³ª ¿ì¸®´Â ªÀº ¿¹Á¦¿¡¼­ ¾î¶² À©µµ¿ì³ª ÇÏÀ§ À©µµ¿ìµµ ¸í½ÃÇÏÁö ¾Ê¾Ò´Ù. À©µµ¿ì°¡ ¸í½ÃµÇÁö ¾ÊÀ¸¸é, stdscr ÀÌ ÁÖ À©µµ¿ì·Î ¾²ÀÌ°í ¸Þ´º ½Ã½ºÅÛ¿¡¼­ ¾ÆÀÌÅÛµéÀ» Ç¥½ÃÇϱâ À§ÇÑ ÇÏÀ§ À©µµ¿ìµéÀ» °è»êÇس½´Ù. ±×ÈÄ ÀÌ °è»êµÈ ÇÏÀ§ À©µµ¿ì¿¡¼­ ¾ÆÀÌÅÛµéÀÌ Ç¥½ÃµÇ°Ô µÈ´Ù. ÀÚ ÀÌÁ¦ ÀÌ À©µµ¿ìµéÀ» Á» °¡Áö°í ³î¾Æº¸ÀÚ. ±×¸®°í ¸Þ´º¿¡ Å׵θ®¿Í Á¦¸ñµµ Ç¥½ÃÇØ º¸ÀÚ.

Example 19. Menu Windows Usage example

#include <menu.h>                                                                                 
                                                                                                  
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))                                                  
#define CTRLD   4                                                                                 
                                                                                                  
char *choices[] = {                                                                               
                        "Choice 1",                                                               
                        "Choice 2",                                                               
                        "Choice 3",                                                               
                        "Choice 4",                                                               
                        "Exit",                                                                   
                        (char *)NULL,                                                             
                  };                                                                              
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color); 
                                                                                                  
int main()                                                                                        
{       ITEM **my_items;                                                                          
        int c;                                                                                    
        MENU *my_menu;                                                                            
        WINDOW *my_menu_win;                                                                      
        int n_choices, i;                                                                         
                                                                                                  
        /* Initialize curses */                                                                   
        initscr();                                                                                
        start_color();                                                                            
        cbreak();                                                                                 
        noecho();                                                                                 
        keypad(stdscr, TRUE);                                                                     
        init_pair(1, COLOR_RED, COLOR_BLACK);                                                     
                                                                                                  
        /* Create items */                                                                        
        n_choices = ARRAY_SIZE(choices);                                                          
        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));                                    
        for(i = 0; i < n_choices; ++i)                                                            
                my_items[i] = new_item(choices[i], choices[i]);                                   
                                                                                                  
        /* Crate menu */                                                                          
        my_menu = new_menu((ITEM **)my_items);                                                    
                                                                                                  
        /* Create the window to be associated with the menu */                                    
        my_menu_win = newwin(10, 40, 4, 4);                                                       
        keypad(my_menu_win, TRUE);                                                                
                                                                                                  
        /* Set main window and sub window */                                                      
        set_menu_win(my_menu, my_menu_win);                                                       
        set_menu_sub(my_menu, derwin(my_menu_win, 6, 38, 3, 1));                                  
                                                                                                  
        /* Set menu mark to the string " * " */                                                   
        set_menu_mark(my_menu, " * ");                                                            
                                                                                                  
        /* Print a border around the main window and print a title */                             
        box(my_menu_win, 0, 0);                                                                   
        print_in_middle(my_menu_win, 1, 0, 40, "My Menu", COLOR_PAIR(1));                         
        mvwaddch(my_menu_win, 2, 0, ACS_LTEE);                                                    
        mvwhline(my_menu_win, 2, 1, ACS_HLINE, 38);                                               
        mvwaddch(my_menu_win, 2, 39, ACS_RTEE);                                                   
        mvprintw(LINES - 2, 0, "F1 to exit");                                                     
        refresh();                                                                                
                                                                                                  
        /* Post the menu */                                                                       
        post_menu(my_menu);                                                                       
        wrefresh(my_menu_win);                                                                    
                                                                                                  
        while((c = wgetch(my_menu_win)) != KEY_F(1))                                              
        {       switch(c)                                                                         
                {       case KEY_DOWN:                                                            
                                menu_driver(my_menu, REQ_DOWN_ITEM);                              
                                break;                                                            
                        case KEY_UP:                                                              
                                menu_driver(my_menu, REQ_UP_ITEM);                                
                                break;                                                            
                }                                                                                 
                wrefresh(my_menu_win);                                                            
        }                                                                                         
                                                                                                  
        /* Unpost and free all the memory taken up */                                             
        unpost_menu(my_menu);                                                                     
        free_menu(my_menu);                                                                       
        for(i = 0; i < n_choices; ++i)                                                            
                free_item(my_items[i]);                                                           
        endwin();                                                                                 
}                                                                                                 
                                                                                                  
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)  
{       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;                                                                   
        wattron(win, color);                                                                      
        mvwprintw(win, y, x, "%s", string);                                                       
        wattroff(win, color);                                                                     
        refresh();                                                                                
}                                                                                                 


ÀÌ ¿¹Á¦´Â ŸÀÌƲ°ú Å׵θ® ±×¸®°í ŸÀÌƲ°ú ¾ÆÀÌÅÛÀ» ±¸ºÐÇÏ´Â ¿¹»Û ¼±ÀÌ ÀÖ´Â ¸Þ´º¸¦ ¸¸µç´Ù. º¸´Ù½ÃÇÇ À©µµ¿ì¸¦ ¸Þ´º¿¡ ºÙÀÌ·Á¸é set_menu_win() ÇÔ¼ö¸¦ ½á¾ß¸¸ ÇÑ´Ù. ±×·¯°í³ª¼­ ÇÏÀ§ À©µµ¿ìµµ ¿ª½Ã ºÙÀδÙ. ÀÌ°ÍÀº ÇÏÀ§ À©µµ¿ì¿¡ ÀÖ´Â ¾ÆÀÌÅÛµéÀ» Ç¥½ÃÇØÁØ´Ù. ¶ÇÇÑ set_menu_mark() ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ¼±ÅÃµÈ ¾ÆÀÌÅÛÀÇ ¿ÞÂÊ¿¡ Ç¥½Ã°¡ ³ªÅ¸³ª°Ô ÇÒ ¼öµµ ÀÖ´Ù.


1.17.5. ¸Þ´º ½ºÅ©·Ñ Çϱâ


¸¸¾à À©µµ¿ì¿¡ ÁÖ¾îÁø ÇÏÀ§ À©µµ¿ì°¡ ¾ÆÀÌÅÛµéÀ» ÀüºÎ º¸¿©ÁÙ ¸¸Å­ Å©Áö ¾Ê´Ù¸é, ¸Þ´º´Â ½ºÅ©·Ñ µÈ´Ù. ´ç½ÅÀÌ ÇöÀç º¸¿©Áö´Â ¸®½ºÆ®ÀÇ ¸¶Áö¸· ¾ÆÀÌÅÛÀ» º¸°í ÀÖÀ» ¶§ ¸¸¾à REQ_DOWN_ITEM À» º¸³»¸é, ÀÌ°ÍÀº REQ_SCR_DLINE ·Î ¹ø¿ªµÇ¾î ÇÑ ¾ÆÀÌÅÛ ¸¸Å­ ¸Þ´º°¡ ½ºÅ©·Ñ µÈ´Ù. ´ç½ÅÀº ½ºÅ©·ÑÀ» Çϱâ À§ÇØ REQ_SCR_ À» ¼öµ¿ÀûÀ¸·Î ³Ñ°ÜÁ൵ µÈ´Ù. ¾î¶»°Ô ÇÏ´ÂÁö Çѹø ¾Ë¾Æº¸ÀÚ.

Example 20. Scrolling Menus example

#include <curses.h>                                                                               
#include <menu.h>                                                                                 
                                                                                                  
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))                                                  
#define CTRLD   4                                                                                 
                                                                                                  
char *choices[] = {                                                                               
                        "Choice 1",                                                               
                        "Choice 2",                                                               
                        "Choice 3",                                                               
                        "Choice 4",                                                               
                        "Choice 5",                                                               
                        "Choice 6",                                                               
                        "Choice 7",                                                               
                        "Choice 8",                                                               
                        "Choice 9",                                                               
                        "Choice 10",                                                              
                        "Exit",                                                                   
                        (char *)NULL,                                                             
                  };                                                                              
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color); 
                                                                                                  
int main()                                                                                        
{       ITEM **my_items;                                                                          
        int c;                                                                                    
        MENU *my_menu;                                                                            
        WINDOW *my_menu_win;                                                                      
        int n_choices, i;                                                                         
                                                                                                  
        /* Initialize curses */                                                                   
        initscr();                                                                                
        start_color();                                                                            
        cbreak();                                                                                 
        noecho();                                                                                 
        keypad(stdscr, TRUE);                                                                     
        init_pair(1, COLOR_RED, COLOR_BLACK);                                                     
        init_pair(2, COLOR_CYAN, COLOR_BLACK);                                                    
                                                                                                  
        /* Create items */                                                                        
        n_choices = ARRAY_SIZE(choices);                                                          
        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));                                    
        for(i = 0; i < n_choices; ++i)                                                            
                my_items[i] = new_item(choices[i], choices[i]);                                   
                                                                                                  
        /* Crate menu */                                                                          
        my_menu = new_menu((ITEM **)my_items);                                                    
                                                                                                  
        /* Create the window to be associated with the menu */                                    
        my_menu_win = newwin(10, 40, 4, 4);                                                       
        keypad(my_menu_win, TRUE);                                                                
                                                                                                  
        /* Set main window and sub window */                                                      
        set_menu_win(my_menu, my_menu_win);                                                       
        set_menu_sub(my_menu, derwin(my_menu_win, 6, 38, 3, 1));                                  
        set_menu_format(my_menu, 5, 1);                                                           
                                                                                                  
        /* Set menu mark to the string " * " */                                                   
        set_menu_mark(my_menu, " * ");                                                            
                                                                                                  
        /* Print a border around the main window and print a title */                             
        box(my_menu_win, 0, 0);                                                                   
        print_in_middle(my_menu_win, 1, 0, 40, "My Menu", COLOR_PAIR(1));                         
        mvwaddch(my_menu_win, 2, 0, ACS_LTEE);                                                    
        mvwhline(my_menu_win, 2, 1, ACS_HLINE, 38);                                               
        mvwaddch(my_menu_win, 2, 39, ACS_RTEE);                                                   
                                                                                                  
        /* Post the menu */                                                                       
        post_menu(my_menu);                                                                       
        wrefresh(my_menu_win);                                                                    
                                                                                                  
        attron(COLOR_PAIR(2));                                                                    
        mvprintw(LINES - 2, 0, "Use PageUp and PageDown to scoll down or up a page of items");    
        mvprintw(LINES - 1, 0, "Arrow Keys to navigate (F1 to Exit)");                            
        attroff(COLOR_PAIR(2));                                                                   
        refresh();                                                                                
                                                                                                  
        while((c = wgetch(my_menu_win)) != KEY_F(1))                                              
        {       switch(c)                                                                         
                {       case KEY_DOWN:                                                            
                                menu_driver(my_menu, REQ_DOWN_ITEM);                              
                                break;                                                            
                        case KEY_UP:                                                              
                                menu_driver(my_menu, REQ_UP_ITEM);                                
                                break;                                                            
                        case KEY_NPAGE:                                                           
                                menu_driver(my_menu, REQ_SCR_DPAGE);                              
                                break;                                                            
                        case KEY_PPAGE:                                                           
                                menu_driver(my_menu, REQ_SCR_UPAGE);                              
                                break;                                                            
                }                                                                                 
                wrefresh(my_menu_win);                                                            
        }                                                                                         
                                                                                                  
        /* Unpost and free all the memory taken up */                                             
        unpost_menu(my_menu);                                                                     
        free_menu(my_menu);                                                                       
        for(i = 0; i < n_choices; ++i)                                                            
                free_item(my_items[i]);                                                           
        endwin();                                                                                 
}                                                                                                 
                                                                                                  
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)  
{       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;                                                                   
        wattron(win, color);                                                                      
        mvwprintw(win, y, x, "%s", string);                                                       
        wattroff(win, color);                                                                     
        refresh();                                                                                
}                                                                                                 


ÀÌ ÇÁ·Î±×·¥Àº µû·Î ¼³¸íÇÒ ÇÊ¿ä°¡ ¾ø¾î º¸ÀδÙ. ÀÌ ¿¹Á¦¿¡¼­ ¼±ÅÃÀÇ °¹¼ö°¡ ÇÏÀ§ À©µµ¿ì°¡ °¨´çÇÒ ¼ö ÀÖ´Â 6°³º¸´Ù ¸¹Àº 10°³·Î ´Ã¾î³µ´Ù. ÀÌ°ÍÀº set_menu_format() ÇÔ¼ö¸¦ ÅëÇØ ¸Þ´º ½Ã½ºÅÛ¿¡ ¸íÈ®È÷ ÇØµÑ ÇÊ¿ä°¡ ÀÖ´Ù. ¿©±â¼­ ¿ì¸®´Â ÇÑ ÆäÀÌÁö¿¡ Ç¥½ÃµÇ±æ ¿øÇÏ´Â Çà°ú ¿­ÀÇ ¼ö¸¦ ¸í½ÃÇÑ´Ù. ÀÌ ¿­ÀÇ °ª¿¡´Â ÇÏÀ§ À©µµ¿ìÀÇ ³ôÀ̺¸´Ù ÀÛ´Ù¸é ¾î¶²°ªÀÌ ¿Íµµ ¹«¹æÇÏ´Ù. ¶Ç ¸¸¾à »ç¿ëÀÚ°¡ ´©¸¥ Å°°¡ PAGE UP À̳ª PAGE DOWN À̸é menu_driver() ¿¡ ÁÖ¾îÁø ¿äû (REQ_SCR_DPAGE ¿Í REQ_SCR_UPAGE) ¿¡ µû¶ó ¸Þ´º°¡ ÆäÀÌÁöº°·Î ½ºÅ©·Ñ µÈ´Ù.


1.17.6. ¿©·¯ ¿­À» °¡Áø ¸Þ´º


À§ ¿¹Á¦¿¡¼­ set_menu_format() ÇÔ¼ö¸¦ ¾î¶»°Ô ¾²´ÂÁö ¾Ë ¼ö ÀÖ¾úÀ» °ÍÀÌ´Ù. ³ª´Â cols º¯¼ö (¼¼¹ø° ÀÎÀÚ) °¡ ¹«¾ùÀ» ÇÏ´ÂÁö¿¡ ´ëÇؼ­´Â ¾ð±ÞÇÏÁö ¾Ê¾Ò´Ù. À½, ¸¸¾à ´ç½ÅÀÇ ÇÏÀ§ À©µµ¿ì°¡ ÃæºÐÈ÷ ³Ð´Ù¸é ÇÑ ¿­¿¡ Çϳª ÀÌ»óÀÇ ¾ÆÀÌÅÛÀ» Ç¥½ÃÇϵµ·Ï ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ÀÌ °ªÀÌ cols º¯¼ö¿¡ ¸í½ÃµÈ´Ù. °£´ÜÈ÷ ÇϱâÀ§ÇØ ´ÙÀ½¿¹Á¦¿¡¼­´Â ¾ÆÀÌÅÛ¿¡ ´ëÇÑ ¼³¸íÀº º¸¿©ÁÖÁö ¾Êµµ·Ï Çß´Ù.

Example 21. Milt Columnar Menus Example

#include <curses.h>                                                                      
#include <menu.h>                                                                        
                                                                                         
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))                                         
#define CTRLD   4                                                                        
                                                                                         
char *choices[] = {                                                                      
                        "Choice 1", "Choice 2", "Choice 3", "Choice 4", "Choice 5",      
                        "Choice 6", "Choice 7", "Choice 8", "Choice 9", "Choice 10",     
                        "Choice 11", "Choice 12", "Choice 13", "Choice 14", "Choice 15", 
                        "Choice 16", "Choice 17", "Choice 18", "Choice 19", "Choice 20", 
                        "Exit",                                                          
                        (char *)NULL,                                                    
                  };                                                                     
                                                                                         
int main()                                                                               
{       ITEM **my_items;                                                                 
        int c;                                                                           
        MENU *my_menu;                                                                   
        WINDOW *my_menu_win;                                                             
        int n_choices, i;                                                                
                                                                                         
        /* Initialize curses */                                                          
        initscr();                                                                       
        start_color();                                                                   
        cbreak();                                                                        
        noecho();                                                                        
        keypad(stdscr, TRUE);                                                            
        init_pair(1, COLOR_RED, COLOR_BLACK);                                            
        init_pair(2, COLOR_CYAN, COLOR_BLACK);                                           
                                                                                         
        /* Create items */                                                               
        n_choices = ARRAY_SIZE(choices);                                                 
        my_items = (ITEM **)calloc(n_choices, sizeof(ITEM *));                           
        for(i = 0; i < n_choices; ++i)                                                   
                my_items[i] = new_item(choices[i], choices[i]);                          
                                                                                         
        /* Crate menu */                                                                 
        my_menu = new_menu((ITEM **)my_items);                                           
                                                                                         
        /* Set menu option not to show the description */                                
        menu_opts_off(my_menu, O_SHOWDESC);                                              
                                                                                         
        /* Create the window to be associated with the menu */                           
        my_menu_win = newwin(10, 70, 4, 4);                                              
        keypad(my_menu_win, TRUE);                                                       
                                                                                         
        /* Set main window and sub window */                                             
        set_menu_win(my_menu, my_menu_win);                                              
        set_menu_sub(my_menu, derwin(my_menu_win, 6, 68, 3, 1));                         
        set_menu_format(my_menu, 5, 3);                                                  
        set_menu_mark(my_menu, " * ");                                                   
                                                                                         
        /* Print a border around the main window and print a title */                    
        box(my_menu_win, 0, 0);                                                          
                                                                                         
        attron(COLOR_PAIR(2));                                                           
        mvprintw(LINES - 3, 0, "Use PageUp and PageDown to scroll");                     
        mvprintw(LINES - 2, 0, "Use Arrow Keys to navigate (F1 to Exit)");               
        attroff(COLOR_PAIR(2));                                                          
        refresh();                                                                       
                                                                                         
        /* Post the menu */                                                              
        post_menu(my_menu);                                                              
        wrefresh(my_menu_win);                                                           
                                                                                         
        while((c = wgetch(my_menu_win)) != KEY_F(1))                                     
        {       switch(c)                                                                
                {       case KEY_DOWN:                                                   
                                menu_driver(my_menu, REQ_DOWN_ITEM);                     
                                break;                                                   
                        case KEY_UP:                                                     
                                menu_driver(my_menu, REQ_UP_ITEM);                       
                                break;                                                   
                        case KEY_LEFT:                                                   
                                menu_driver(my_menu, REQ_LEFT_ITEM);                     
                                break;                                                   
                        case KEY_RIGHT:                                                  
                                menu_driver(my_menu, REQ_RIGHT_ITEM);                    
                                break;                                                   
                        case KEY_NPAGE:                                                  
                                menu_driver(my_menu, REQ_SCR_DPAGE);                     
                                break;                                                   
                        case KEY_PPAGE:                                                  
                                menu_driver(my_menu, REQ_SCR_UPAGE);                     
                                break;                                                   
                }                                                                        
                wrefresh(my_menu_win);                                                   
        }                                                                                
                                                                                         
        /* Unpost and free all the memory taken up */                                    
        unpost_menu(my_menu);                                                            
        free_menu(my_menu);                                                              
        for(i = 0; i < n_choices; ++i)                                                   
                free_item(my_items[i]);                                                  
        endwin();                                                                        
}                                                                                        


set_menu_format() È£ÃâÀ» ÀÚ¼¼È÷ º¸¶ó. °Å±â¿¡´Â Ä÷³ÀÇ ¼ö°¡ 3À̶ó°í ¸í½ÃÇß´Ù. Áï ÇÑ ¿­¿¡ 3°³ÀÇ ¾ÆÀÌÅÛÀ» Âï´Â´Ù. ¶Ç ¿ì¸®´Â ÀÌ¹Ì menu_opts_off() ÇÔ¼ö¸¦ ÅëÇØ ¾ÆÀÌÅÛ »ó¼¼ ¼³¸íÀ» º¸¿©ÁÖ´Â ±â´ÉÀº ²°´Ù. set_menu_opts(), menu_opts_on() °ú menu_opts() µîÀÇ ¸Þ´º ¿É¼ÇÀ» Á¶ÀýÇÏ´Â µ¥ ¾²ÀÌ´Â ÇÔ¼öµéÀÌ Á» ´õ ÀÖ´Ù. ´ÙÀ½ÀÇ ¸Þ´º ¿É¼ÇÀÌ ¼³Á¤ °¡´ÉÇÏ´Ù.

#!
        O_ONEVALUE                                                            
            Only one item can be selected for this menu.                     
                                                                             
       O_SHOWDESC                                                            
            Display  the  item  descriptions  when  the  menu  is            
            posted.                                                          
                                                                             
       O_ROWMAJOR                                                            
            Display the menu in row-major order.                             
                                                                             
       O_IGNORECASE                                                          
            Ignore the case when pattern-matching.                           
                                                                             
       O_SHOWMATCH                                                           
            Move the cursor to within the item  name  while  pat¡©            
            tern-matching.                                                   
                                                                             
       O_NONCYCLIC                                                           
            Don't   wrap   around  next-item  and  previous-item,            
            requests to the other end of the menu.                           


±âº»ÀûÀ¸·Î ¸ðµç ¿É¼ÇÀÌ ÄÑÁ® ÀÖ´Ù. menu_opts_on() °ú menu_opts_off() ÇÔ¼ö¸¦ ÅëÇØ °¢°¢ÀÇ ¼Ó¼ºµéÀ» ²ô°í ÄÓ ¼ö ÀÖ´Ù. ¶ÇÇÑ set_menu_opts() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ Á÷Á¢ÀûÀ¸·Î ¿É¼ÇÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼öÀÇ ÀÎÀÚ´Â À§ »ó¼öµéÀÇ ¸î°³¸¦ OR ¿¬»ê ÇÑ °ªÀÌ´Ù. menu_opts() ÇÔ¼ö´Â ¸Þ´ºÀÇ ÇöÀç ¿É¼Ç »óŸ¦ ¾Ë¾Æ¿À´Â µ¥ ¾´´Ù.


1.17.7. ¿©·¯ °ªÀ» °¡Áø ¸Þ´º


´ç½ÅÀº ¾Æ¸¶ O_ONEVALUE ¿É¼ÇÀ» ²ô¸é ¾î¶»°Ô µÇ´ÂÁö ±Ã±ÝÇßÀ» °ÍÀÌ´Ù. ±×°ÍÀ» ²ô¸é ¸Þ´º°¡ multi-valued °¡ µÈ´Ù. ÀÌ ¸»Àº ´ç½ÅÀÌ Çϳª ÀÌ»óÀÇ ¾ÆÀÌÅÛÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù. ¿©±â¼­ REQ_TOGGLE_ITEM ¿äûÀ» ¾²°Ô µÈ´Ù. ½ÇÁ¦ ÀÛµ¿¹ýÀ» »ìÆ캸ÀÚ.

Example 22. Multi Valued Menus example

#include <curses.h>                                                                    
#include <menu.h>                                                                      
                                                                                       
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))                                       
#define CTRLD   4                                                                      
                                                                                       
char *choices[] = {                                                                    
                        "Choice 1",                                                    
                        "Choice 2",                                                    
                        "Choice 3",                                                    
                        "Choice 4",                                                    
                        "Choice 5",                                                    
                        "Choice 6",                                                    
                        "Choice 7",                                                    
                        "Exit",                                                        
                  };                                                                   
                                                                                       
int main()                                                                             
{       ITEM **my_items;                                                               
        int c;                                                                         
        MENU *my_menu;                                                                 
        int n_choices, i;                                                              
        ITEM *cur_item;                                                                
                                                                                       
        /* Initialize curses */                                                        
        initscr();                                                                     
        cbreak();                                                                      
        noecho();                                                                      
        keypad(stdscr, TRUE);                                                          
                                                                                       
        /* Initialize items */                                                         
        n_choices = ARRAY_SIZE(choices);                                               
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));                     
        for(i = 0; i < n_choices; ++i)                                                 
                my_items[i] = new_item(choices[i], choices[i]);                        
        my_items[n_choices] = (ITEM *)NULL;                                            
                                                                                       
        my_menu = new_menu((ITEM **)my_items);                                         
                                                                                       
        /* Make the menu multi valued */                                               
        menu_opts_off(my_menu, O_ONEVALUE);                                            
                                                                                       
        mvprintw(LINES - 3, 0, "Use <SPACE> to select or unselect an item.");          
        mvprintw(LINES - 2, 0, "<ENTER> to see presently selected items(F1 to Exit)"); 
        post_menu(my_menu);                                                            
        refresh();                                                                     
                                                                                       
        while((c = getch()) != KEY_F(1))                                               
        {       switch(c)                                                              
                {       case KEY_DOWN:                                                 
                                menu_driver(my_menu, REQ_DOWN_ITEM);                   
                                break;                                                 
                        case KEY_UP:                                                   
                                menu_driver(my_menu, REQ_UP_ITEM);                     
                                break;                                                 
                        case ' ':                                                      
                                menu_driver(my_menu, REQ_TOGGLE_ITEM);                 
                                break;                                                 
                        case 10:        /* Enter */                                    
                        {       char temp[200];                                        
                                ITEM **items;                                          
                                                                                       
                                items = menu_items(my_menu);                           
                                temp[0] = '\0';                                        
                                for(i = 0; i < item_count(my_menu); ++i)               
                                        if(item_value(items[i]) == TRUE)               
                                        {       strcat(temp, item_name(items[i]));     
                                                strcat(temp, " ");                     
                                        }                                              
                                move(20, 0);                                           
                                clrtoeol();                                            
                                mvprintw(20, 0, temp);                                 
                                refresh();                                             
                        }                                                              
                        break;                                                         
                }                                                                      
        }                                                                              
                                                                                       
        free_item(my_items[0]);                                                        
        free_item(my_items[1]);                                                        
        free_menu(my_menu);                                                            
        endwin();                                                                      
}                                                                                      


ÈÞ, óÀ½ º¸´Â ÇÔ¼öµéÀÌ ¸¹À» °ÍÀÌ´Ù. ÇϳªÇϳª »ìÆ캸µµ·Ï ÇÏÀÚ. Á¦ÀÏ ¸ÕÀú REQ_TOGGLE_ITEM ºÎÅÍ´Ù. ¿©·¯ °ªÀ» °¡Áú ¼ö ÀÖ´Â ¸Þ´º¿¡¼­ »ç¿ëÀÚ´Â Çϳª ÀÌ»óÀÇ ¾ÆÀÌÅÛÀ» ¼±ÅÃÇϰųª ¶Ç´Â ¼±ÅÃÀ» Ãë¼ÒÇÒ ¼ö ÀÖ´Ù. REQ_TOGGLE_ITEM ¿äûÀº ÇöÀç ¼±ÅÃÀ» º¯°æÇÑ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â ½ºÆäÀ̽º°¡ ´­·ÁÁö¸é REQ_TOGGLE_ITEM ¿äûÀÌ menu_driver ·Î º¸³»Á®¼­ °á°ú°¡ ¸¸µé¾îÁø´Ù.

±×¸®°í³ª¼­ »ç¿ëÀÚ°¡ <ENTER> À» ´©¸£°Ô µÇ¸é ¿ì¸®´Â ±×°¡ À̶§±îÁö ¼±ÅÃÇß´ø ¾ÆÀÌÅÛµéÀ» º¸¿©ÁÖ°Ô µÈ´Ù. ¸ÕÀú ¸Þ´º¿Í ¿¬°áµÈ ¾ÆÀÌÅÛµéÀ» menu_items() ÇÔ¼ö¸¦ ÅëÇؼ­ ã¾Æ³½´Ù. ±×ÈÄ ±× ¾ÆÀÌÅÛµéÀÇ ¼±Åÿ©ºÎ¸¦ ·çÇÁ¸¦ µ¹¸ç ã°ÔµÈ´Ù. item_value() ÇÔ¼ö´Â ¾ÆÀÌÅÛÀÌ ¼±ÅõȰÍÀ̸é TRUE ¸¦ ¸®ÅÏÇÑ´Ù. item_count() ÇÔ¼ö´Â ¸Þ´º¿¡ ÀÖ´Â ¾ÆÀÌÅÛµéÀÇ °³¼ö¸¦ ¸®ÅÏÇÑ´Ù. ¾ÆÀÌÅÛ À̸§Àº item_name() ÇÔ¼ö·Î ãÀ» ¼ö ÀÖ´Ù. ¶ÇÇÑ ¾ÆÀÌÅÛÀÇ ¼³¸í ¿ª½Ãµµ item_description() ÇÔ¼ö·Î ãÀ» ¼ö ÀÖ´Ù.


1.17.8. ¸Þ´º ¿É¼Çµé


¾Æ¸¶ ¿©Å²¯ ´ç½ÅÀÇ ¸Þ´º´Â ¿©·¯ ±â´ÉÀûÀÎ ¸é¿¡¼­ Á» ÂóÂóÇßÀ» °ÍÀÌ´Ù. ÀÌÇØÇÑ´Ù. ´ç½ÅÀº Ä÷¯¸¦ ¿øÇÏ°í ÀÖ´Ù!!! ´ç½ÅÀº Àú ÅؽºÆ® ¸ðµå [http]µµ½º°ÔÀÓ(http://www.jersey.net/~debinjoe/games/)°ú ºñ½ÁÇÑ ¸Þ´º¸¦ ¸¸µé±æ ¿øÇÏ°í ÀÖ´Ù. set_menu_fore() ¿Í set_menu_back() ¶ó´Â ÇÔ¼ö°¡ ¼±ÅÃµÈ ¾ÆÀÌÅÛ°ú ±×·¸Áö ¾ÊÀº °ÍÀÇ ¼Ó¼ºÀ» º¯°æÇÒ ¶§ ¾²ÀδÙ. À̸§¿¡ ¿ÀÇØÀÇ ¼ÒÁö°¡ Àִµ¥, ÀÌ ÇÔ¼öµéÀº ¸Þ´ºÀÇ Àü°æ»öÀ̳ª ¹è°æ»öÀ» º¯°æÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù. ¹°·Ð ÀÌ·± ÀÛ¾÷µéÀº ¹«¿ëÇÏÁö¸¸ ¸»ÀÌ´Ù.

set_menu_grey() ÇÔ¼ö´Â ¸Þ´º¿¡¼­ ¼±Åà ºÒ°¡´ÉÇÑ ¾ÆÀÌÅÛµéÀÇ Ç¥Çö¼Ó¼ºÀ» ¼³Á¤ÇÑ´Ù. ¿©±â¿¡´Â ¾ÆÀÌÅÛÀÇ Èï¹Ì·Î¿î ¿É¼ÇÀÎ ´Ü Çϳª»ÓÀÎ O_SELECTABLE ÀÌ µîÀåÇÑ´Ù. item_opts_off() ÇÔ¼ö·Î ÀÌ ¼Ó¼ºÀ» ²ø ¼ö ÀÖ°í ±×·¸°Ô µÇ¸é ±× ¾ÆÀÌÅÛÀº ¼±Åà ºÒ°¡´ÉÇØÁø´Ù. Àú ¿¹»Û À©µµ¿ì ¸Þ´ºÁß¿¡ ȸ»öÀ¸·Î 󸮵Ǿî ÀÖ´Â ¾ÆÀÌÅÛµé°ú °°´Ù. ÀÌ °³³äµéÀ» ¿¹Á¦¿Í ÇÔ²² ¿¬½ÀÇغ¸ÀÚ.

Example 23. Menu Options example

#include <menu.h>                                                                  
                                                                                   
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))                                   
#define CTRLD   4                                                                  
                                                                                   
char *choices[] = {                                                                
                        "Choice 1",                                                
                        "Choice 2",                                                
                        "Choice 3",                                                
                        "Choice 4",                                                
                        "Choice 5",                                                
                        "Choice 6",                                                
                        "Choice 7",                                                
                        "Exit",                                                    
                  };                                                               
                                                                                   
int main()                                                                         
{       ITEM **my_items;                                                           
        int c;                                                                     
        MENU *my_menu;                                                             
        int n_choices, i;                                                          
        ITEM *cur_item;                                                            
                                                                                   
        /* Initialize curses */                                                    
        initscr();                                                                 
        start_color();                                                             
        cbreak();                                                                  
        noecho();                                                                  
        keypad(stdscr, TRUE);                                                      
        init_pair(1, COLOR_RED, COLOR_BLACK);                                      
        init_pair(2, COLOR_GREEN, COLOR_BLACK);                                    
        init_pair(3, COLOR_MAGENTA, COLOR_BLACK);                                  
                                                                                   
        /* Initialize items */                                                     
        n_choices = ARRAY_SIZE(choices);                                           
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));                 
        for(i = 0; i < n_choices; ++i)                                             
                my_items[i] = new_item(choices[i], choices[i]);                    
        my_items[n_choices] = (ITEM *)NULL;                                        
        item_opts_off(my_items[3], O_SELECTABLE);                                  
        item_opts_off(my_items[6], O_SELECTABLE);                                  
                                                                                   
        /* Create menu */                                                          
        my_menu = new_menu((ITEM **)my_items);                                     
                                                                                   
        /* Set fore ground and back ground of the menu */                          
        set_menu_fore(my_menu, COLOR_PAIR(1) | A_REVERSE);                         
        set_menu_back(my_menu, COLOR_PAIR(2));                                     
        set_menu_grey(my_menu, COLOR_PAIR(3));                                     
                                                                                   
        /* Post the menu */                                                        
        mvprintw(LINES - 3, 0, "Press <ENTER> to see the option selected");        
        mvprintw(LINES - 2, 0, "Up and Down arrow keys to naviage (F1 to Exit)");  
        post_menu(my_menu);                                                        
        refresh();                                                                 
                                                                                   
        while((c = getch()) != KEY_F(1))                                           
        {       switch(c)                                                          
                {       case KEY_DOWN:                                             
                                menu_driver(my_menu, REQ_DOWN_ITEM);               
                                break;                                             
                        case KEY_UP:                                               
                                menu_driver(my_menu, REQ_UP_ITEM);                 
                                break;                                             
                        case 10: /* Enter */                                       
                                move(20, 0);                                       
                                clrtoeol();                                        
                                mvprintw(20, 0, "Item selected is : %s",           
                                                item_name(current_item(my_menu))); 
                                pos_menu_cursor(my_menu);                          
                                break;                                             
                }                                                                  
        }                                                                          
        unpost_menu(my_menu);                                                      
        for(i = 0; i < n_choices; ++i)                                             
                free_item(my_items[i]);                                            
        free_menu(my_menu);                                                        
        endwin();                                                                  
}                                                                                  




1.17.9. À¯¿ëÇÑ »ç¿ëÀÚ Æ÷ÀÎÅÍ


¿ì¸®´Â ¸Þ´ºÀÇ °¢°¢ÀÇ ¾ÆÀÌÅÛ¿¡ »ç¿ëÀÚ Æ÷ÀÎÅ͸¦ ºÙ¿©µÑ ¼ö ÀÖ´Ù. ±×°ÍÀº Æгο¡¼­ÀÇ ±×°Í°ú ÀÛµ¿ÇÏ´Â ¹æ¹ýÀÌ °°´Ù. ¸Þ´º ½Ã½ºÅÛÀº ¿©±â¿¡ °ü¿©ÇÏÁö ¾Ê´Â´Ù. ´ç½ÅÀÌ ÀúÀåÇÏ°íÀÚ ÇÏ´Â ¹«¾ùÀ̵çÁö ±× ¾È¿¡ ÀúÀåÇØ µÑ ¼ö ÀÖ´Ù. ³ª´Â ÁÖ·Î ±× ¸Þ´º ¿É¼ÇÀÌ ¼±ÅõǾúÀ» ¶§ (±×°ÍÀÌ ¼±ÅÃµÇ°í ¾Æ¸¶ »ç¿ëÀÚ°¡ <ENTER> À» ´­·¶À» ¶§) ½ÇÇàµÉ ÇÔ¼ö¸¦ ÀúÀåÇÏ´Â µ¥ ¾´´Ù;

Example 24. Menu User Pointer Usage

#include <curses.h>                                                               
#include <menu.h>                                                                 
                                                                                  
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))                                  
#define CTRLD   4                                                                 
                                                                                  
char *choices[] = {                                                               
                        "Choice 1",                                               
                        "Choice 2",                                               
                        "Choice 3",                                               
                        "Choice 4",                                               
                        "Choice 5",                                               
                        "Choice 6",                                               
                        "Choice 7",                                               
                        "Exit",                                                   
                  };                                                              
void func(char *name);                                                            
                                                                                  
int main()                                                                        
{       ITEM **my_items;                                                          
        int c;                                                                    
        MENU *my_menu;                                                            
        int n_choices, i;                                                         
        ITEM *cur_item;                                                           
                                                                                  
        /* Initialize curses */                                                   
        initscr();                                                                
        start_color();                                                            
        cbreak();                                                                 
        noecho();                                                                 
        keypad(stdscr, TRUE);                                                     
        init_pair(1, COLOR_RED, COLOR_BLACK);                                     
        init_pair(2, COLOR_GREEN, COLOR_BLACK);                                   
        init_pair(3, COLOR_MAGENTA, COLOR_BLACK);                                 
                                                                                  
        /* Initialize items */                                                    
        n_choices = ARRAY_SIZE(choices);                                          
        my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));                
        for(i = 0; i < n_choices; ++i)                                            
        {       my_items[i] = new_item(choices[i], choices[i]);                   
                /* Set the user pointer */                                        
                set_item_userptr(my_items[i], func);                              
        }                                                                         
        my_items[n_choices] = (ITEM *)NULL;                                       
                                                                                  
        /* Create menu */                                                         
        my_menu = new_menu((ITEM **)my_items);                                    
                                                                                  
        /* Post the menu */                                                       
        mvprintw(LINES - 3, 0, "Press <ENTER> to see the option selected");       
        mvprintw(LINES - 2, 0, "Up and Down arrow keys to naviage (F1 to Exit)"); 
        post_menu(my_menu);                                                       
        refresh();                                                                
                                                                                  
        while((c = getch()) != KEY_F(1))                                          
        {       switch(c)                                                         
                {       case KEY_DOWN:                                            
                                menu_driver(my_menu, REQ_DOWN_ITEM);              
                                break;                                            
                        case KEY_UP:                                              
                                menu_driver(my_menu, REQ_UP_ITEM);                
                                break;                                            
                        case 10: /* Enter */                                      
                        {       ITEM *cur;                                        
                                void (*p)(char *);                                
                                                                                  
                                cur = current_item(my_menu);                      
                                p = item_userptr(cur);                            
                                p((char *)item_name(cur));                        
                                pos_menu_cursor(my_menu);                         
                                break;                                            
                        }                                                         
                        break;                                                    
                }                                                                 
        }                                                                         
        unpost_menu(my_menu);                                                     
        for(i = 0; i < n_choices; ++i)                                            
                free_item(my_items[i]);                                           
        free_menu(my_menu);                                                       
        endwin();                                                                 
}                                                                                 
                                                                                  
void func(char *name)                                                             
{       move(20, 0);                                                              
        clrtoeol();                                                               
        mvprintw(20, 0, "Item selected is : %s", name);                           
}                                                                                 




1.18. Æû ¶óÀ̺귯¸®


¸¸¾à ´ç½ÅÀÌ »ç¿ëÀڷκÎÅÍ À¥ÆäÀÌÁö¿¡¼­ ÀÔ·ÂÀ» ¹Þ°í ´Ù¾çÇÑ Á¾·ùÀÇ ÀÏÀ» ÇÏ´Â Æû À̶ó´Â °ÍÀ» ÀÌ¹Ì º» ÀûÀÌ ÀÖ´Ù¸é, ¾Æ¸¶ ´ç½ÅÀº ÅؽºÆ® ¸ðµåÈ­¸é¿¡¼­´Â ±×·± ÆûÀ» ¾î¶»°Ô ¸¸µé ¼ö ÀÖ´ÂÁö ±Ã±ÝÇÒ °ÍÀÌ´Ù. º¸ÅëÀÇ ncurses ¿¡¼­ ±×·± ¸ÚÁø ÆûÀ» ¸¸µå´Â °ÍÀº ²Ï³ª ¾î·Á¿î ÀÏÀÌ´Ù. Æû ¶óÀ̺귯¸®´Â ½±°Ô ÆûÀ» ÀÛ¼ºÇÏ°í À¯ÁöÇÒ ¼ö ÀÖ´Â ±âº»ÀûÀΠƲÀ» Á¦°øÇÒ·Á°í ³ë·ÂÇÑ´Ù. ±×°ÍÀº È®ÀÎÀ» ¹Þ°Å³ª ÇʵåÀÇ µ¿Àû È®ÀåµîÀÇ ¾Æ¹« ¸¹Àº ´Ù¾çÇÑ ±â´É(ÇÔ¼öµé)À» °¡Áö°í ÀÖ´Ù. ±×°ÍµéÀ» Çѹø Âß »ìÆ캸µµ·Ï ÇÏÀÚ.

ÆûÀº ÇʵåÀÇ ¸ðÀ½ÀÌ´Ù; °¢°¢ÀÇ Çʵå´Â ·¹À̺í(Á¤ÀûÀÎ ÅؽºÆ®) À̰ųª µ¥ÀÌÅÍ°¡ ÀԷµǴ À§Ä¡µéÀÌ´Ù. ¶ÇÇÑ Æû¶óÀ̺귯¸®´Â ¿©·¯ ÆäÀÌÁö¿¡ ÆûÀ» ³ª´©´Â ÇÔ¼öµµ Á¦°øÇÑ´Ù.


1.18.1. °³°ý


ÆûÀº ¸Þ´º¶û ¾ÆÁÖ ºñ½ÁÇÏ°Ô ¸¸µé¾îÁø´Ù. ¸ÕÀú Æû¿¡ °ü·ÃµÈ Çʵ带 new_field() ÇÔ¼ö·Î »ý¼ºÇÑ´Ù. ¹°·Ð ´ç½ÅÀº Çʵ忡 ¿É¼ÇÀ» ¼³Á¤ÇÏ¿© ¾ÆÁÖ ¿¹»Ú°Ô ¸¸µé¾î Çʵ尡 Æ÷Ä¿½º¸¦ ÀÒ±âÀü¿¡ È®ÀÎµÇ°Ô ÇÏ´Â µîÀÇ Àϵµ ÇÒ ¼ö ÀÖ´Ù. ±× ÈÄ ÇʵåµéÀ» Æû¿¡ °áÇÕ½ÃÅ°°Ô µÈ´Ù. ÀÌ°ÍÀ» ÇÑ ÈÄ ÆûÀº È­¸é¿¡ Àü´ÞµÇ°í ÀÔ·ÂÀ» ¹ÞÀ» Áغñ¸¦ ÇÏ°Ô µÈ´Ù. menu_driver() ¿Í ºñ½ÁÇÑ °³³äÀ¸·Î ÆûÀº form_driver() ÇÔ¼ö¿¡ ÀÇÇØ ´Ù·ïÁø´Ù. ¿ì¸®´Â form_driver ¿¡ ¿äûÀ» º¸³»¼­ ƯÁ¤ Çʵå·Î Æ÷Ä¿½º¸¦ ¿Å±â°Å³ª, ÇʵåÀÇ ³¡À¸·Î Ä¿¼­¸¦ ¿Å±â´Â µîÀÇ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. »ç¿ëÀÚ°¡ Çʵ忡 °ªÀ» ÀÔ·ÂÇÏ°í È®ÀÎÀ» ÇÏ°Ô µÇ¸é ÆûÀº ¶¼¾î³»°í ÇÒ´ç¹ÞÀº ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÒ ¼ö ÀÖ´Ù.

Æû ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ È帧Àº ´ÙÀ½°ú °°´Ù.

  • curses ¸¦ ÃʱâÈ­ ÇÑ´Ù.

  • new_field() ¸¦ ½á¼­ Çʵ带 »ý¼ºÇÑ´Ù. ÇʵåÀÇ ³ÐÀÌ ¿Í ³ôÀÌ ¹× Æû¿¡¼­ÀÇ À§Ä¡¸¦ ¸í½ÃÇÒ ¼ö ÀÖ´Ù.

  • new_form() ¿¡ ºÙ¿©³ÖÀ» Çʵ带 ¸í½ÃÇؼ­ ÆûÀ» »ý¼ºÇÑ´Ù.

  • form_post() ·Î ÆûÀ» Àü´ÞÇÏ°í È­¸éÀ» ¸®ÇÁ·¹½¬ÇÑ´Ù.

  • ·çÇÁ¸¦ µ¹¸ç »ç¿ëÀÚ ¿äûÀ» ó¸®ÇÏ°í form_driver ·Î form ¿¡ ÇÊ¿äÇÑ °»½ÅµîÀ» ÇÑ´Ù.

  • form_unpost() ÆûÀ» ¶¼¾î³½´Ù.

  • free_form() ÇÔ¼ö·Î Æû¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù.

  • free_field() ÇÔ¼ö·Î ¾ÆÀÌÅÛ¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù.

  • curses ¸¦ Á¾·áÇÑ´Ù.

º¸´Ù½ÃÇÇ Æû ¶óÀ̺귯¸®¸¦ ¾²´Â °ÍÀº ¸Þ´º ¶óÀ̺귯¸®¸¦ ´Ù·ç´Â °Í°ú À¯»çÇÏ´Ù. ´ÙÀ½ÀÇ ¿¹Á¦´Â Æû ó¸®ÀÇ ´Ù¾çÇÑ ¸éµéÀ» º¸¿©ÁÙ °ÍÀÌ´Ù. ¸ÕÀú °£´ÜÇÑ ¿¹Á¦·Î ¿©ÇàÀ» ½ÃÀÛÇغ¸ÀÚ.


1.18.2. Æû ¶óÀ̺귯¸®¿Í ÄÄÆÄÀÏ Çϱâ


Æû¶óÀ̺귯¸® ÇÔ¼ö¸¦ ¾²·Á¸é, form.h ¸¦ ÀÎŬ·çµå ÇÏ°í -lncurses µÚ¿¡ -lform Ç÷¡±×¸¦ ºÙ¿©¼­ ÇÁ·Î±×·¥À» ¸µÅ©½ÃÄÑ¾ß ÇÑ´Ù.

#!
     #include <form.h>                                                        
    .                                                                        
    .                                                                        
    .                                                                        
                                                                             
    compile and link: gcc <program file> -lform -lncurses                    


Example 25. Forms Basics

#include <form.h>                                                                      
                                                                                       
int main()                                                                             
{       FIELD *field[3];                                                               
        FORM  *my_form;                                                                
        int ch;                                                                        
                                                                                       
        /* Initialize curses */                                                        
        initscr();                                                                     
        cbreak();                                                                      
        noecho();                                                                      
        keypad(stdscr, TRUE);                                                          
                                                                                       
        /* Initialize the fields */                                                    
        field[0] = new_field(1, 10, 4, 18, 0, 0);                                      
        field[1] = new_field(1, 10, 6, 18, 0, 0);                                      
        field[2] = NULL;                                                               
                                                                                       
        /* Set field options */                                                        
        set_field_back(field[0], A_UNDERLINE);  /* Print a line for the option  */     
        field_opts_off(field[0], O_AUTOSKIP);   /* Don't go to next field when this */ 
                                                /* Field is filled up           */     
        set_field_back(field[1], A_UNDERLINE);                                         
        field_opts_off(field[1], O_AUTOSKIP);                                          
                                                                                       
        /* Create the form and post it */                                              
        my_form = new_form(field);                                                     
        post_form(my_form);                                                            
        refresh();                                                                     
                                                                                       
        mvprintw(4, 10, "Value 1:");                                                   
        mvprintw(6, 10, "Value 2:");                                                   
        refresh();                                                                     
                                                                                       
        /* Loop through to get user requests */                                        
        while((ch = getch()) != KEY_F(1))                                              
        {       switch(ch)                                                             
                {       case KEY_DOWN:                                                 
                                /* Go to next field */                                 
                                form_driver(my_form, REQ_NEXT_FIELD);                  
                                /* Go to the end of the present buffer */              
                                /* Leaves nicely at the last character */              
                                form_driver(my_form, REQ_END_LINE);                    
                                break;                                                 
                        case KEY_UP:                                                   
                                /* Go to previous field */                             
                                form_driver(my_form, REQ_PREV_FIELD);                  
                                form_driver(my_form, REQ_END_LINE);                    
                                break;                                                 
                        default:                                                       
                                /* If this is a normal character, it gets */           
                                /* Printed                                */           
                                form_driver(my_form, ch);                              
                                break;                                                 
                }                                                                      
        }                                                                              
                                                                                       
        /* Un post form and free the memory */                                         
        unpost_form(my_form);                                                          
        free_form(my_form);                                                            
        free_field(field[0]);                                                          
        free_field(field[1]);                                                          
                                                                                       
        endwin();                                                                      
        return 0;                                                                      
}                                                                                      


À§ ¿¹Á¦´Â ²Ï Á÷¼³ÀûÀÌ´Ù. new_field() ·Î µÎ°³ÀÇ Çʵ带 »ý¼ºÇÑ´Ù. new_field() ¿¡´Â ³ôÀÌ, ³ÐÀÌ, starty, startx, offscreen ÀÇ ÁÙ ¼ö ±×¸®°í Ãß°¡ÀûÀÎ ÀÛ¾÷¿ë ¹öÆÛÀÇ ¼ö µîÀÌ ÇÊ¿äÇÏ´Ù. ´Ù¼¸¹ø° ÀÎÀÚÀÎ offscreen ÀÇ ÁÙ ¼ö´Â ÇʵåÀÇ ¾î´À Á¤µµ¸¦ º¸¿©ÁÙ °ÍÀÎÁö °áÁ¤ÇÏ´Â °ªÀÌ´Ù. ¸¸¾à 0 À̸é, ÇʵåÀÇ ÀϺΰ¡ È­¸é¿¡ Ç¥½ÃµÇÁö ¾Ê¾Æ¼­ ÆûÀÌ ½ºÅ©·ÑµÇ¾ß µÇ´Â °æ¿ì°¡ ¾Æ´Ï¸é Ç×»ó Àüü Çʵ带 º¸¿©ÁØ´Ù. Æû ¶óÀ̺귯¸®´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÏ´Â µ¥ÀÌÅ͸¦ ÀúÀåÇϱâ À§Çؼ­ Çʵå´ç ¹öÆÛ¸¦ Çϳª¾¿ ÇÒ´çÇÑ´Ù. new_field() ÀÇ ¸¶Áö¸· ÀÎÀÚ¸¦ ¸í½ÃÇؼ­ ¿ì¸®´Â ¸î¸î ºÎ°¡ÀûÀÎ ¹öÆÛ¸¦ ÇÒ´çÇØ µÑ ¼ö ÀÖ´Ù. ÀÌ ¹öÆÛµéÀº ´ç½ÅÀÌ ¿øÇÏ´Â ´ë·Î ¾²¸é µÈ´Ù.

Çʵ带 »ý¼ºÇÑ ÈÄ, set_field_back() ÇÔ¼ö·Î µÎ Çʵå¸ðµÎ ¹è°æ ¼Ó¼ºÀ» UNDERLINE ·Î ¸ÂÃè´Ù. AUTOSKIP ¿É¼ÇÀº field_opts_off() ÇÔ¼ö·Î ±â´ÉÀ» ²°´Ù. ¸¸¾à ÀÌ ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ¸¸é, È°¼ºÈ­µÈ Çʵ尡 ¿ÏÀüÈ÷ °ªÀÌ Ã¤¿öÁö¸é ´ÙÀ½ Çʵå·Î ÀÚµ¿À¸·Î Æ÷Ä¿½º°¡ À̵¿ÇÏ°Ô µÈ´Ù.

Çʵ带 Æû¿¡ °áÇÕ½ÃÅ°°í ³­ ÈÄ, ÆûÀÌ Àü´ÞµÈ´Ù. ¿©±â¼­ »ç¿ëÀÚ ÀÔ·ÂÀÌ while ·çÇÁ¿¡¼­ form_driver ¿¡ ÇØ´çÇÏ´Â ¿äûÀ» º¸³»¼­ 󸮵ȴÙ. form_driver() ·Î ³Ñ¾î°¡´Â ¸ðµç ¿äû °ªµéÀº µÚ¿¡ ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù.


1.18.3. ÇÊµå °¡Áö°í ³î±â


°¢°¢ÀÇ Æû Çʵå´Â ¸¹Àº ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Ù. ±×°ÍµéÀº ¿øÇÏ´Â È¿°ú¿Í Àç¹Õ°Ô ¸¸µé±â À§ÇØ Á¶ÀÛÇØ º¼ ¼ö ÀÖ´Ù !!!. ¹» ÁÖÀúÇϳª?


1.18.3.1. ÇʵåÀÇ À§Ä¡¿Í Å©±â °¡Á®¿À±â


ÇÊµå »ý¼º½Ã¿¡ ³Ñ°ÜÁØ ÀÎÀÚ´Â field_info() ÇÔ¼ö·Î ´Ù½Ã ¹Þ¾Æ¿Ã ¼ö ÀÖ´Ù. ±×°ÍÀº »ý¼º½Ã ÁÖ¾îÁø ³ôÀÌ, ³ÐÀÌ, starty, startx, È­¸é¿¡ º¸ÀÌÁö¾Ê´Â Ä­ ¼ö, ±×¸®°í ºÎ°¡ ¹öÆÛÀÇ ¼öµîÀ» ¸®ÅÏÇÑ´Ù. new_field() ÀÇ ¹Ý´ë¶ó°í º¸¸é µÈ´Ù.

int field_info(     FIELD *field,              /* field from which to fetch */ 
                    int *height, *int width,   /* field size */                
                    int *top, int *left,       /* upper left corner */         
                    int *offscreen,            /* number of offscreen rows */  
                    int *nbuf);                /* number of working buffers */ 




1.18.3.2. Çʵå À̵¿Çϱâ


move_field() ÇÔ¼ö·Î Çʵ带 ´Ù¸¥ À§Ä¡·Î ¿Å±æ ¼ö ÀÖ´Ù.

int move_field(    FIELD *field,              /* field to alter */           
                   int top, int left);        /* new upper-left corner */    


º¸Åë ¹Ù²ï À§Ä¡´Â field_infor() ÇÔ¼ö·Î ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.


1.18.3.3. Çʵå Á¤·Ä


set_field_just() ÇÔ¼ö¸¦ ½á¼­ Çʵ带 Á¤·ÄÇÒ ¼ö ÀÖ´Ù.

    int set_field_just(FIELD *field,          /* field to alter */           
               int justmode);         /* mode to set */                      
    int field_just(FIELD *field);          /* fetch justify mode of field */ 


ÀÌ ÇÔ¼öµé¿¡ ¾²ÀÌ°í ¸®ÅϵǴ Á¤·Ä¸ðµå´Â ´ÙÀ½°ú °°´Ù. NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT, JUSTIFY_CENTER.


1.18.3.4. Çʵå Ç¥Çö ¼Ó¼º


À§ÀÇ ¿¹Á¦¿¡¼­ ºÃ´Ù½ÃÇÇ, ÇʵåÀÇ Ç¥Çö ¼Ó¼ºÀº set)field_fore() ¿Í set_field_ back() ÇÔ¼ö·Î ¼³Á¤ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº ÇʵåÀÇ Àü°æ ¹× ¹è°æ ¼Ó¼ºÀ» ¼³Á¤ÇÑ´Ù. ¶ÇÇÑ ÇʵåÀÇ ¿©¹é ºÎºÐÀ» ä¿ï ÆÐµå ¹®ÀÚ¸¦ ¸í½ÃÇÒ ¼öµµ ÀÖ´Ù. ÆÐµå ¹®ÀÚ´Â set_field_pad() ÇÔ¼ö·Î ¼³Á¤ÇÑ´Ù. ±âº» ÆÐµå ¹®ÀÚ´Â ½ºÆäÀ̽º ÀÌ´Ù. field_fore(), field_back(), field_pad() ÇÔ¼ö´Â ÇöÀç ÆûÀÇ Àü°æ, ¹è°æ ¼Ó¼º°ú ÆÐµå ¹®ÀÚ¸¦ ¾Ë¾Æ¿À´Âµ¥ ¾µ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ÇÔ¼ö »ç¿ë¹ýÀÇ ¸®½ºÆ® ÀÌ´Ù.

int set_field_fore(FIELD *field,        /* field to alter */                 
                   chtype attr);        /* attribute to set */               
                                                                             
chtype field_fore(FIELD *field);        /* field to query */                 
                                        /* returns foreground attribute */   
                                                                             
int set_field_back(FIELD *field,        /* field to alter */                 
                   chtype attr);        /* attribute to set */               
                                                                             
chtype field_back(FIELD *field);        /* field to query */                 
                                        /* returns background attribute */   
                                                                             
int set_field_pad(FIELD *field,         /* field to alter */                 
                  int pad);             /* pad character to set */           
                                                                             
chtype field_pad(FIELD *field);         /* field to query */                 
                                        /* returns present pad character */  


ºñ·Ï À§ÀÇ ÇÔ¼öµéÀÌ ²Ï °£´ÜÇØ º¸À̱â´Â ÇÏÁö¸¸ set_field_fore() ¸¦ ÀÌ¿ëÇؼ­ Ä÷¯¸¦ »ç¿ëÇÏ´Â °ÍÀº óÀ½¿£ Á» Çò°¥¸°´Ù. ¸ÕÀú ÇʵåÀÇ Àü°æ ¹× ¹è°æ ¼Ó¼º¿¡ ´ëÇؼ­ ¼³¸íÀ» Çغ¸°Ú´Ù. Àü°æ ¼Ó¼ºÀº ¹®ÀÚ¿Í °ü·ÃÀÌ ÀÖ´Ù. Áï ÇʵåÀÇ ±ÛÀÚ°¡ set_field_fore() ¿¡¼­ ÁöÁ¤ÇÑ ¼Ó¼º´ë·Î º¸Àδٴ ¸»ÀÌ´Ù. ¹è°æ ¼Ó¼ºÀº ±ÛÀÚ°¡ ÀÖµç ¸»µç »ó°ü ¾øÀÌ ÇʵåÀÇ ¹è°æÀ» ä¿ì´Â °Í°ú °ü·ÃÀÌ ÀÖ´Ù. ÀÚ±×·³ »ö»óÀº ¾î¶±Çϴ°¡? »ö»óÀº »ö»ó¦¿¡ Ç×»ó Á¤ÀǵǾî ÀÖ´Ù. ±×·¸´Ù¸é »öÀÌ ÀÖ´Â Çʵ带 Ç¥ÇöÇÏ´Â Á¦´ë·ÎµÈ ¹æ¹ýÀº ¹«¾ùÀΰ¡? ¿©±â Ä÷¯ ¼Ó¼º¿¡ °üÇØ ¸íÈ®È÷ ÇÏ´Â ¿¹Á¦°¡ ÀÖ´Ù.

Example 26. Form Attributes example

#include <form.h>                                                                        
                                                                                         
int main()                                                                               
{       FIELD *field[3];                                                                 
        FORM  *my_form;                                                                  
        int ch;                                                                          
                                                                                         
        /* Initialize curses */                                                          
        initscr();                                                                       
        start_color();                                                                   
        cbreak();                                                                        
        noecho();                                                                        
        keypad(stdscr, TRUE);                                                            
                                                                                         
        /* Initialize few color pairs */                                                 
        init_pair(1, COLOR_WHITE, COLOR_BLUE);                                           
        init_pair(2, COLOR_WHITE, COLOR_BLUE);                                           
                                                                                         
        /* Initialize the fields */                                                      
        field[0] = new_field(1, 10, 4, 18, 0, 0);                                        
        field[1] = new_field(1, 10, 6, 18, 0, 0);                                        
        field[2] = NULL;                                                                 
                                                                                         
        /* Set field options */                                                          
        set_field_fore(field[0], COLOR_PAIR(1));/* Put the field with blue background */ 
        set_field_back(field[0], COLOR_PAIR(2));/* and white foreground (characters */   
                                                /* are printed in white         */       
        field_opts_off(field[0], O_AUTOSKIP);   /* Don't go to next field when this */   
                                                /* Field is filled up           */       
        set_field_back(field[1], A_UNDERLINE);                                           
        field_opts_off(field[1], O_AUTOSKIP);                                            
                                                                                         
        /* Create the form and post it */                                                
        my_form = new_form(field);                                                       
        post_form(my_form);                                                              
        refresh();                                                                       
                                                                                         
        set_current_field(my_form, field[0]); /* Set focus to the colored field */       
        mvprintw(4, 10, "Value 1:");                                                     
        mvprintw(6, 10, "Value 2:");                                                     
        mvprintw(LINES - 2, 0, "Use UP, DOWN arrow keys to switch between fields");      
        refresh();                                                                       
                                                                                         
        /* Loop through to get user requests */                                          
        while((ch = getch()) != KEY_F(1))                                                
        {       switch(ch)                                                               
                {       case KEY_DOWN:                                                   
                                /* Go to next field */                                   
                                form_driver(my_form, REQ_NEXT_FIELD);                    
                                /* Go to the end of the present buffer */                
                                /* Leaves nicely at the last character */                
                                form_driver(my_form, REQ_END_LINE);                      
                                break;                                                   
                        case KEY_UP:                                                     
                                /* Go to previous field */                               
                                form_driver(my_form, REQ_PREV_FIELD);                    
                                form_driver(my_form, REQ_END_LINE);                      
                                break;                                                   
                        default:                                                         
                                /* If this is a normal character, it gets */             
                                /* Printed                                */             
                                form_driver(my_form, ch);                                
                                break;                                                   
                }                                                                        
        }                                                                                
                                                                                         
        /* Un post form and free the memory */                                           
        unpost_form(my_form);                                                            
        free_form(my_form);                                                              
        free_field(field[0]);                                                            
        free_field(field[1]);                                                            
                                                                                         
        endwin();                                                                        
        return 0;                                                                        
}                                                                                        


»ö»ó¦À» °¡Áö°í À̸®Àú¸® Çغ¸¸é¼­ Àü°æ°ú ¹è°æ ¼Ó¼º¿¡ ´ëÇؼ­ ÀÌÇØÇϵµ·Ï ³ë·ÂÇغ¸ÀÚ. Ä÷¯ ¼Ó¼ºÀ» ¾²´Â ³» ÇÁ·Î±×·¥¿¡¼­ ³ª´Â º¸Åë ¹è°æÀ» set_field_back() ÇÔ¼ö¸¦ ÅëÇØ ¼³Á¤Çß´Ù. curses ¿¡¼­´Â ´Ü¼øÈ÷ °³º° Ä÷¯ ¼Ó¼º¸¸ Á¤ÀÇÇÏ´Â °Ç Çã¿ëÇÏÁö ¾Ê´Â´Ù.


1.18.3.5. ÇÊµå ¿É¼Ç ºñÆ®


¹°·Ð Æûó¸®ÀÇ ´Ù¾çÇÑ ¸éÀ» Á¦¾îÇϱâ À§ÇÑ ¸¹Àº ÇÊµå ¿É¼Ç ºñÆ®µéÀÌ ÀÖ´Ù. ±×°ÍµéÀº ´ÙÀ½ÀÇ ÇÔ¼ö·Î Á¶ÀÛ °¡´ÉÇÏ´Ù:

int set_field_opts(FIELD *field,          /* field to alter */               
                   int attr);             /* attribute to set */             
                                                                             
int field_opts_on(FIELD *field,           /* field to alter */               
                  int attr);              /* attributes to turn on */        
                                                                             
int field_opts_off(FIELD *field,          /* field to alter */               
                  int attr);              /* attributes to turn off */       
                                                                             
int field_opts(FIELD *field);             /* field to query */               


set_field_opts() ÇÔ¼ö´Â ÇʵåÀÇ ¼Ó¼ºÀ» Á÷Á¢ÀûÀ¸·Î ¼³Á¤ÇÒ¶§ ¾²ÀδÙ. ¶Ç field_opts_on() °ú field_opts_off() ÇÔ¼ö¸¦ ÀÌ¿ëÇØ ¸î¸î ¼Ó¼ºµéÀ» ¼±ÅÃÀûÀ¸·Î ²°´Ù Ä×´Ù ÇÒ ¼ö ÀÖ´Ù. ¾ðÁ¦µçÁö field_opts() ÇÔ¼ö·Î ÇʵåÀÇ ¼Ó¼ºÀ» ¾ò¾î¿Ã¼öµµ ÀÖ´Ù. ´ÙÀ½Àº °¡´ÉÇÑ ¿É¼ÇµéÀÇ ¸®½ºÆ®ÀÌ´Ù. ±âº»ÀûÀ¸·Î ¸ðµç ¿É¼ÇµéÀ» ÄÑÁ®ÀÖ´Ù.

O_VISIBLE

Çʵ尡 È­¸é¿¡ Ç¥½ÃµÇ´ÂÁö °áÁ¤ÇÑ´Ù. Æû󸮸¦ ÇÏ´Â µ¿¾È »óÀ§ ÇʵåÀÇ °ª¿¡ µû¶ó Çʵ带 ¼û±â°Å³ª ³ªÅ¸³ª°Ô Çϴµ¥ ¾²ÀδÙ.

O_ACTIVE

Æû ó¸®Áß (¿¹¸¦µé¾î Æû Ž»öÅ°·Î µé¾î¿ÔÀ»¶§) Çʵ尡 È°¼ºÈ­µÇ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù. ·¹À̺íÀ» ¸¸µé°Å³ª, »ç¿ëÀÚ°¡ ¾Æ´Ï Æû ¾îÇø®ÄÉÀ̼ǿ¡ ÀÇÇØ ¹öÆÛÀÇ °ªÀÌ º¯°æµÉ ¼ö ÀÖ´Â Çʵ带 °ñ¶ó³¾ ¶§ ¾µ ¼ö ÀÖ´Ù.

O_PUBLIC

Çʵ忡 °ªÀ» ÀÔ·ÂÇÒ ¶§ µ¥ÀÌÅÍ°¡ È­¸é¿¡ Ç¥½ÃµÉÁö¸¦ °áÁ¤ÇÑ´Ù. ¸¸¾à ÇʵåÀÇ ÀÌ ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é, ¶óÀ̺귯¸®°¡ ÀÌ Çʵ忡¼­ °ªÀ» ¹Þ¾ÆµéÀÌ°í µ¥ÀÌÅ͸¦ ¼öÁ¤ÇÏÁö¸¸ È­¸é¿¡´Â Ç¥½ÃµÇÁö ¾Ê°í Ä¿¼­µµ À̵¿ÇÏÁö ¾Ê´Â´Ù. Æнº¿öµå ÇʵåµîÀ» Á¤ÀÇÇÒ ¶§ O_PUBLIC ¿É¼ÇÀ» ²¨µÎ°í ÇÒ ¼ö ÀÖ´Ù.

O_EDIT

ÇʵåÀÇ µ¥ÀÌÅÍ°¡ ¼öÁ¤µÉ ¼ö ÀÖ´ÂÁö °áÁ¤ÇÑ´Ù. ÀÌ ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é REQ_PREV_CHOICE ¿Í REQ_NEXT_CHOICE ¸¦ Á¦¿ÜÇÑ ¸ðµç ¿¡µðÆà ¿äûÀº ½ÇÆÐÇÒ °ÍÀÌ´Ù. µµ¿ò¸» µîÀÇ Àбâ Àü¿ë Çʵ忡 À¯¿ëÇÒ °ÍÀÌ´Ù.

O_WRAP

¿©·¯ ÁÙÀÌ ÀÖ´Â Çʵ忡¼­ word-wrapping À» ÇÒÁö °áÁ¤ÇÑ´Ù. º¸Åë (°ø¹éÀ¸·Î ±¸ºÐµÈ) ´Ü¾îÀÇ ¾î¶² ¹®ÀÚ°¡ ÇöÀç ÁÙÀÇ ¸Ç ³¡¿¡ °É¸®¸é, Àüü ´Ü¾î°¡ (´ÙÀ½ ÁÙÀÌ ÀÖ´Ù°í °¡Á¤ÇÏ°í) ´ÙÀ½ÁÙ·Î ³»·Á°¡°Ô µÈ´Ù. ÀÌ ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é, ÁÙ ¹Ù²î´Â °÷¿¡¼­ ´Ü¾î°¡ ÂÉ°³Áú °ÍÀÌ´Ù.

O_BLANK

Çʵ带 ºñ¿ì´Â °É °áÁ¤ÇÑ´Ù. ÀÌ ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ¸¸é, ÇʵåÀÇ Ã¹¹ø° À§Ä¡¿¡ ±ÛÀÚ¸¦ ÀÔ·ÂÇÏ´Â ¼ø°£ (¹æ±Ý ÀÔ·ÂÇÑ ¹®ÀÚ¸¦ Á¦¿ÜÇÏ°í) ÇʵåÀÇ ³»¿ëÀ» Áö¿ì°Ô µÈ´Ù.

O_AUTOSKIP

ÇÑ Çʵ尡 ³»¿ëÀÌ ´Ù Â÷¸é ´ÙÀ½ Çʵå·Î ÀÚµ¿À¸·Î ³Ñ¾î°¥Áö¸¦ °áÁ¤ÇÑ´Ù. º¸Åë Æû »ç¿ëÀÚ°¡ °Å±â¿¡ ¸Â´Â µ¥ÀÌÅÍ º¸´Ù ´õ ¸¹Àº µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÏ°íÀÚ Çß´Ù¸é, ¼öÁ¤ À§Ä¡°¡ ´ÙÀ½ Çʵå·Î Á¡ÇÁÇÏ°Ô µÈ´Ù. ÀÌ ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é, »ç¿ëÀÚÀÇ Ä¿¼­°¡ ÇʵåÀÇ ³¡¿¡ °è¼Ó ³²¾ÆÀÖ°Ô µÈ´Ù. ÀÌ ¿É¼ÇÀº Å©±â Á¦ÇÑÀÌ ¾ø´Â µ¿Àû Çʵ忡¼­´Â ¹«½ÃµÈ´Ù.

O_NULLOK

ºñ¾îÀÖ´Â Çʵ忡 ´ëÇؼ­µµ ÀÎÁõÀ» ÇÒÁö °áÁ¤ÇÑ´Ù. º¸Åë ÀÌ ¿É¼ÇÀ» ÄÑÁö ¾Ê´Â´Ù; »ç¿ëÀÚ°¡ Çʵ带 ³ª°¥¶§ ÀϹÝÀûÀÎ È®ÀοäûÀ» ÇÏÁö ¾Ê±â ¶§¹®¿¡ Çʵ带 ºñ¿ö³õÀ» ¼ö°¡ ÀÖ´Ù. ¸¸¾à ÇʵåÀÇ ÀÌ ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é, Çʵ忡¼­ ³ª°¥ ½Ã È®ÀÎ ÀÛ¾÷ÀÌ ÀÌ·ç¾îÁö°Ô µÈ´Ù.

O_PASSOK

¸ðµç Çʵ忡¼­ ¶°³¯¶§ ¸¶´Ù È®ÀÎÀ» ÇÒÁö ¾Æ´Ï¸é ±× Çʵ尡 ¼öÁ¤µÇ¾úÀ» ¶§¸¸ È®ÀÎÀÛ¾÷À» ÇÒÁö °áÁ¤ÇÑ´Ù. º¸Åë ÈÄÀÚ·Î ¼³Á¤µÇ¾î ÀÖ´Ù. Æû ó¸®Áß ÇʵåÀÇ È®ÀÎ ÇÔ¼ö°¡ º¯°æµÉ ¼ö ÀÖ´Ù¸é O_PASSOK ¸¦ ¼³Á¤ÇØ ³õ´Â °ÍÀÌ À¯¿ëÇÒ °ÍÀÌ´Ù.

O_STATIC

Çʵ尡 ±×°ÍÀÇ Ãʱâ Å©±â·Î °íÁ¤µÇ¾î ÀÖÀ»Áö °áÁ¤ÇÑ´Ù. ÀÌ ¿É¼ÇÀ» ²¨µÎ°Ô µÇ¸é, Çʵ尡 µ¿ÀûÀ¸·Î ¹Ù²î°Ô µÇ°í ÀÔ·ÂÇÑ µ¥ÀÌÅÍ¿¡ ¸Â°Ô Å©±â¸¦ ´Ã¸°´Ù.

Çʵ尡 ¼±ÅõǾî ÀÖ´Â µ¿¾ÈÀº ÇʵåÀÇ ¿É¼ÇÀ» ¹Ù²Ü ¼ö ¾ø´Ù. ±×·¯³ª, ÇöÀç ¼±ÅõÇÁö ¾ÊÀº Çʵå¸é Æ÷½ºÆ®µÇ¾ú´õ¶óµµ ¿É¼ÇÀ» ¹Ù²Ü ¼ö ÀÖ´Ù.

¿É¼ÇÀÇ °ªµéÀº bit-mask ÀÌ°í, OR ³í¸®¿¬»êÀ» ÅëÇØ ½±°Ô ±¸¼ºÇÒ ¼ö ÀÖ´Ù. O_AUTOSKIP ¿É¼ÇÀ» ²ô´Â ¹æ¹ýÀ» ºÃÀ» °ÍÀÌ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¸î¸î ´õ ¸¹Àº ¿É¼ÇµéÀÇ »ç¿ëÀ» Àß º¸¿©ÁØ´Ù. ´Ù¸¥ ¿É¼ÇµéÀº ÀûÀýÇÒ¶§ ¼³¸íÇϵµ·Ï ÇÏ°Ú´Ù.

Example 27. Field Options Usage example

#include <form.h>                                                                    
                                                                                     
#define STARTX 15                                                                    
#define STARTY 4                                                                     
#define WIDTH 25                                                                     
                                                                                     
#define N_FIELDS 3                                                                   
                                                                                     
int main()                                                                           
{       FIELD *field[N_FIELDS];                                                      
        FORM  *my_form;                                                              
        int ch, i;                                                                   
                                                                                     
        /* Initialize curses */                                                      
        initscr();                                                                   
        cbreak();                                                                    
        noecho();                                                                    
        keypad(stdscr, TRUE);                                                        
                                                                                     
        /* Initialize the fields */                                                  
        for(i = 0; i < N_FIELDS - 1; ++i)                                            
                field[i] = new_field(1, WIDTH, STARTY + i * 2, STARTX, 0, 0);        
        field[N_FIELDS - 1] = NULL;                                                  
                                                                                     
        /* Set field options */                                                      
        set_field_back(field[1], A_UNDERLINE);  /* Print a line for the option  */   
                                                                                     
        field_opts_off(field[0], O_ACTIVE); /* This field is a static label */       
        field_opts_off(field[1], O_PUBLIC); /* This filed is like a password field*/ 
        field_opts_off(field[1], O_AUTOSKIP); /* To avoid entering the same field */ 
                                              /* after last character is entered */  
                                                                                     
        /* Create the form and post it */                                            
        my_form = new_form(field);                                                   
        post_form(my_form);                                                          
        refresh();                                                                   
                                                                                     
        set_field_just(field[0], JUSTIFY_CENTER); /* Center Justification */         
        set_field_buffer(field[0], 0, "This is a static Field");                     
                                                  /* Initialize the field  */        
        mvprintw(STARTY, STARTX - 10, "Field 1:");                                   
        mvprintw(STARTY + 2, STARTX - 10, "Field 2:");                               
        refresh();                                                                   
                                                                                     
        /* Loop through to get user requests */                                      
        while((ch = getch()) != KEY_F(1))                                            
        {       switch(ch)                                                           
                {       case KEY_DOWN:                                               
                                /* Go to next field */                               
                                form_driver(my_form, REQ_NEXT_FIELD);                
                                /* Go to the end of the present buffer */            
                                /* Leaves nicely at the last character */            
                                form_driver(my_form, REQ_END_LINE);                  
                                break;                                               
                        case KEY_UP:                                                 
                                /* Go to previous field */                           
                                form_driver(my_form, REQ_PREV_FIELD);                
                                form_driver(my_form, REQ_END_LINE);                  
                                break;                                               
                        default:                                                     
                                /* If this is a normal character, it gets */         
                                /* Printed                                */         
                                form_driver(my_form, ch);                            
                                break;                                               
                }                                                                    
        }                                                                            
                                                                                     
        /* Un post form and free the memory */                                       
        unpost_form(my_form);                                                        
        free_form(my_form);                                                          
        free_field(field[0]);                                                        
        free_field(field[1]);                                                        
                                                                                     
        endwin();                                                                    
        return 0;                                                                    
}                                                                                    


ÀÌ ¿¹Á¦´Â ºñ·Ï ±×´ÙÁö ¾µ¸ð À־ÀÌÁö´Â ¾ÊÁö¸¸ ¿©·¯ ¿É¼ÇÀÇ »ç¿ë¹ýÀ» º¸¿©ÁÖ°í ÀÖ´Ù. ÀûÀýÈ÷¸¸ ¾²°ÔµÇ¸é Æû¿¡¼­ Á¤º¸¸¦ ¸Å¿ì È¿°úÀûÀ¸·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù. µÎ¹ø° Çʵå´Â O_PUBLIC ¿É¼ÇÀ» ²°´Âµ¥, ÀÌ·¸°Ô µÇ¸é ´ç½ÅÀÌ Å¸ÀÌÇÎ ÇÏ´Â ±ÛÀÚµéÀ» º¸¿©ÁÖÁö ¾Ê°Ô µÈ´Ù.


1.18.3.6. ÇÊµå »óÅÂ


ÇÊµå »óÅ¿¡´Â Çʵ尡 ¼öÁ¤µÇ¾ú´ÂÁö ¾Æ´ÑÁö¸¦ ¸í½ÃÇØ µÐ´Ù. ÃʱⰪÀº FALSE·Î µÇ¾î ÀÖ°í »ç¿ëÀÚ°¡ ¹«¾ù°¡¸¦ ÀÔ·ÂÇؼ­ µ¥ÀÌÅÍ ¹öÆÛ°¡ ¼öÁ¤µÇ¸é TRUE ·Î ¹Ù²î°Ô µÈ´Ù. ±×·¯¹Ç·Î ÇʵåÀÇ »óÅ´ ±×°ÍÀÌ ¼öÁ¤µÇ¾ú´ÂÁö ¾Æ´ÑÁö ¾Ë¾Æ³»´Âµ¥ ¾µ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ÇÔ¼öµéÀÌ ±× ±â´ÉµéÀ» Áö¿øÇÑ´Ù.

int set_field_status(FIELD *field,      /* field to alter */                 
                   int status);         /* status to set */                  
                                                                             
int field_status(FIELD *field);         /* fetch status of field */          


Çʵ带 ¶°³¯¶§ µ¥ÀÌÅ͹öÆÛ´Â ¾ÆÁ÷ °»½ÅµÇÁö ¾ÊÀº »óÅ¿¡¼­ ÀÎÁõÀ» Çϱâ Àü¿¡ ÇʵåÀÇ »óŸ¦ üũÇØ º¸´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. Á¦´ë·ÎµÈ »óÅ°¡ ¸®ÅϵǴÂÁö È®ÁõÇغ¼·Á¸é field_status() ÇÔ¼ö¸¦ (1) ÇʵåÀÇ ÀÎÁõÈ®ÀÎ ·çƾÀ» ³ª°¥¶§ (2) ÇÊµå ¶Ç´Â ÆûÀÇ ÃʱâÈ­³ª Á¾·á ÈÄÅ© µî¿¡¼­, (3) forms driver ¿¡ REQ_VALIDATION ¿äûÀÌ µé¾î¿Â Á÷ ÈÄ¿¡ È£ÃâÀ» Çغ¸¾Æ¶ó.


1.18.3.7. ÇÊµå »ç¿ëÀÚ Æ÷ÀÎÅÍ


¸ðµç ÇÊµå ±¸Á¶Ã¼´Â »ç¿ëÀÚ°¡ ÀÓÀÇÀÇ ¸ñÀûÀ¸·Î ¾µ ¼ö ÀÖ°Ô Æ÷ÀÎÅÍ Çϳª¾¿À» Æ÷ÇÔÇÏ°í ÀÖ´Ù. ÀÌ°ÍÀº Æû ¶óÀ̺귯¸®¿¡ ÀÇÇؼ­ »ç¿ëµÇÁö ¾ÊÀ¸¸ç ´ÜÁö »ç¿ëÀÚÀÇ ¸ñÀûÀ¸·Î¸¸ ¾²¿©Áø´Ù. ´ÙÀ½ÀÇ ÇÔ¼ö´Â »ç¿ëÀÚ Æ÷ÀÎÅ͸¦ ¼³Á¤ÇÏ°í °¡Á®¿Â´Ù.

int set_field_userptr(FIELD *field,                                          
           char *userptr);      /* the user pointer you wish to associate */ 
                                /* with the field    */                      
                                                                             
char *field_userptr(FIELD *field);      /* fetch user pointer of the field */




1.18.3.8. Å©±â°¡ º¯ÇÏ´Â Çʵå


¸¸¾à ´ç½ÅÀÌ µ¿ÀûÀ¸·Î Å©±â°¡ º¯ÇÏ´Â Çʵ带 ¿øÇÏ°í ÀÖ´Ù¸é, ÀÌ ±â´ÉÀÌ ¹Ù·Î ¹Ù¶ó´ø ±×°ÍÀÌ´Ù. ÀÌ°ÍÀº »ç¿ëÀÚ·Î ÇÏ¿©±Ý ÇʵåÀÇ ¿ø·¡ Å©±âº¸´Ù ´õ ¸¹Àº µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÏ°Ô Çϸç Çʵå Å©±â°¡ Ä¿Áö°Ô ÇÑ´Ù. ÇʵåÀÇ ¹æħ¿¡ µû¸£¸é »õ·Î¿î µ¥ÀÌÅÍ Å©±â¿¡ ¸ÂÃç¼­ ¼öÆò ¶Ç´Â ¼öÁ÷À¸·Î ½ºÅ©·ÑÀÌ µÉ °ÍÀÌ´Ù.

Çʵ带 µ¿ÀûÀ¸·Î Å°¿ì·Á¸é, O_STATIC ¿É¼ÇÀÌ ²¨Á®ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ÀÏÀº ´ÙÀ½À» ÅëÇØ ÇÒ ¼ö ÀÖ´Ù.

    field_opts_off(field_pointer, O_STATIC);                                 


±×·¯³ª º¸Åë Çʵ带 ¹«ÇÑÈ÷ Å°¿ï ¼ö ÀÖ°Ô ³öµÎ´Â °ÍÀº ±×´ÙÁö ±ÇÇÒ¸¸ ÇÏÁö ¾Ê´Ù. Çʵ尡 Ä¿Áú ¼ö ÀÖ´Â ÃÖ´ë ±æÀÌ´Â ´ÙÀ½ ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

int set_max_field(FIELD *field,    /* Field on which to operate */           
                  int max_growth); /* maximum growth allowed for the field */


µ¿ÀûÀ¸·Î Ä¿Áö´Â Çʵ忡 ´ëÇÑ Á¤º¸´Â ´ÙÀ½ ÇÔ¼ö·Î ¹Þ¾Æ¿Â´Ù.

int dynamic_field_info( FIELD *field,     /* Field on which to operate */    
            int   *prows,     /* number of rows will be filled in this */    
            int   *pcols,     /* number of columns will be filled in this*/  
            int   *pmax)      /* maximum allowable growth will be filled */  
                              /* in this */                                  


ºñ·Ï field_info ÇÔ¼öµµ º¸Åëó·³ ÀÛµ¿ÇÏÁö¸¸, ÀÌ ÇÔ¼ö¸¦ µ¿ÀûÀ¸·Î ¹Ù²î´Â ÇʵåÀÇ ÀûÀýÇÑ ¼Ó¼ºµéÀ» ¾ò¾î¿Ã ¶§ ¾²´Â °ÍÀº ±ÇÇÒ¸¸ ÇÏÁö°¡ ¾Ê´Ù.

new_field ¶ó´Â ¶óÀ̺귯¸® ·çƾÀ» Àá½Ã ¶°¿Ã·Áº¸ÀÚ; ³ôÀ̸¦ 1·Î ¼³Á¤ÇÏ°í ¸¸µç Çʵå´Â ÇÑÁ٠¥¸® Çʵå·Î Á¤ÀǵȴÙ. ³ôÀÌ°¡ 1 ÀÌ»óÀÎ Çʵå´Â ¿©·¯ÁÙÀ» °¡Áø Çʵå·Î Á¤ÀÇµÉ °ÍÀÌ´Ù.

O_STATIC ¿É¼ÇÀÌ ²¨Áø (µ¿ÀûÀ¸·Î Ä¿Áú ¼ö ÀÖ´Â Çʵå) ÇÑÁ٠¥¸® Çʵå´Â ´Ü ÇÑÁÙ¸¸À» °¡Áø´Ù. ±×·¯³ª Ä­ ¼ö´Â Ãʱ⠰ªº¸´Ù »ç¿ëÀÚ°¡ ´õ ¸¹ÀÌ ÀÔ·ÂÇÒ ¼ö·Ï ´Ã¾î³­´Ù. È­¸é¿¡ ³ªÅ¸³ª´Â Ä­¼ö´Â °íÁ¤µÇ¾î ÀÖÀ» °ÍÀÌ¸ç ³²Àº µ¥ÀÌÅ͵éÀº ¼öÆòÀ¸·Î ½ºÅ©·Ñ µÉ °ÍÀÌ´Ù.

O_STATIC ÀÌ ²¨Áø (µ¿ÀûÀ¸·Î Ä¿Áú ¼ö ÀÖ´Â Çʵå) ¿©·¯ÁÙÀÇ Çʵå´Â °íÁ¤µÈ Ä­À» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ÁÙ ¼ö´Â Ãʱ⠰ªº¸´Ù »ç¿ëÀÚ°¡ ´õ ¸¹ÀÌ ÀÔ·ÂÇÒ ¼ö·Ï ´Ã¾î³­´Ù. È­¸é¿¡ ³ªÅ¸³ª´Â ÁÙ¼ö´Â °íÁ¤µÇ¾î ÀÖÀ» °ÍÀÌ¸ç ³²Àº µ¥ÀÌÅ͵éÀº ¼öÁ÷À¸·Î ½ºÅ©·Ñ µÉ °ÍÀÌ´Ù.

À§ µÎ ¹®´ÜÀº µ¿ÀûÀ¸·Î Ä¿Áö´Â ÇʵåÀÇ Æ¯¼ºÀ» ²Ï Àß ³ªÅ¸³»°í ÀÖ´Ù. Æû ¶óÀ̺귯¸®ÀÇ ³²Àº ºÎºÐµéÀÇ Æ¯¼ºÀº ¾Æ·¡¿¡ ±â¼úµÇ¾î ÀÖ´Ù:

  • O_AUTOSKIP ÇÊµå ¿É¼ÇÀº O_STATIC ¿É¼ÇÀÌ ²¨Á®ÀÖ°í Çʵ尡 Ä¿Áú ¼ö ÀÖ´Â ÃÖ´ë±æÀÌ°¡ ¸í½ÃµÇ¾î ÀÖÁö ¾ÊÀ¸¸é ¹«½ÃµÉ °ÍÀÌ´Ù. º¸ÅëÀº »ç¿ëÀÚ°¡ ÇʵåÀÇ ¸¶Áö¸· ¹®ÀÚÀ§Ä¡±îÁö ÀÔ·ÂÇϰԵǸé O_AUTOSKIP ÀÌ REQ_NEXT_FIELD ¸¦ form driver ¿¡ Àü´ÞÇÏ°Ô µÈ´Ù. ÃÖ´ë ±æÀÌ°ªÀÌ ¾ø´Â µ¿Àû Çʵ忡¼­´Â ¸¶Áö¸· ¹®ÀÚÀ§Ä¡¶õ °ÍÀÌ ¾ø´Ù. ¸¸¾à ÃÖ´ë ±æÀÌ°ªÀÌ ¸í½ÃµÈ´Ù¸é, O_AUTOSKIP ¿É¼ÇÀº Çʵ尡 ÃÖ´ë±æÀÌ¿¡ µµ´ÞÇÏ¸é º¸Åëó·³ ÀÛµ¿ÇÒ °ÍÀÌ´Ù.

  • O_STATIC ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é Çʵå Á¤·ÄÀÌ ¹«½ÃµÉ °ÍÀÌ´Ù. º¸ÅëÀº set_field_just ÇÔ¼ö¸¦ ½á¼­ ÇÑÁÙ ÇʵåÀÇ ³»¿ëÀ» JUSTIFY_LEFT, JUSTIFY_RIGHT, JUSTIFY_CENTER ÇÒ ¼ö ÀÖ´Ù. µ¿ÀûÀ¸·Î Ä¿Áö´Â ÇÑÁÙ Çʵ忡¼­´Â, Á¤ÀÇ¿¡ µû¶ó Å©±â°¡ Ä¿Áö°í ¼öÆòÀ¸·Î ½ºÅ©·Ñ µÉ °ÍÀÌ´Ù. ±×·¯¹Ç·Î Á¤·ÄÇÒ µ¥ÀÌÅͺ¸´Ù ´õ ¸¹Àº µ¥ÀÌÅ͸¦ Æ÷ÇÔÇÏ°í ÀÖ°Ô µÈ´Ù. field_just ÇÔ¼öÀÇ ¸®ÅÏ °ªÀº ¹Ù²îÁö ¾ÊÀ» °ÍÀÌ´Ù.

  • ¸¸¾à O_STATIC ÇÊµå ¿É¼ÇÀÌ ²¨Á®ÀÖ°í Çʵ尡 Ä¿Áú ¼ö ÀÖ´Â ÃÖ´ë±æÀÌ°¡ ¸í½ÃµÇ¾î ÀÖÁö ¾ÊÀ¸¸é, O_NL_OVERLOAD Æû ¿É¼Ç¿¡ »ó°ü¾øÀÌ Æû µå¶óÀ̹ö´Â REQ_NEW_LINE ¿¡ ´ëÇØ ¶È°°ÀÌ ÀÛµ¿ÇÒ °ÍÀÌ´Ù. º¸ÅëÀº O_NL_OVERLOAD Æû ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ¸¸é, ÇʵåÀÇ ¸¶Áö¸· ÁÙ¿¡¼­ È£ÃâµÈ REQ_NEW_LINE °ªÀº ³»ºÎÀûÀ¸·Î REQ_NEXT_FIELD ¸¦ ºÎ¸£°Ô µÈ´Ù. ¹Ý¸é ¸¸¾à Çʵ尡 ÇÑ°è¾øÀÌ Ä¿Áú ¼ö ÀÖ´Ù¸é, ¸¶Áö¸· ÁÙÀ̶ó´Â °ÍÀÌ ¾ø´Ù. ±×·¯¹Ç·Î REQ_NEW_LINE ´Â ³»ºÎÀûÀ¸·Î REQ_NEXT_FIELD ¸¦ È£ÃâÇÒ ÀÏÀÌ ¾ø°Ô µÈ´Ù. ¸¸¾à ÃÖ´ë±æÀÌ°ªÀÌ ¸í½ÃµÇ¾î ÀÖ°í O_NL_OVERLOAD Æû¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ¸¸é, REQ_NEW_LINE ´Â Çʵ尡 ÃÖ´ë±æÀ̱îÁö Ä¿Á³°í »ç¿ëÀÚ°¡ ¸¶Áö¸·ÁÙ¿¡ ÀÖÀ» ¶§ È£ÃâµÆÀ» °æ¿ì, ³»ºÎÀûÀ¸·Î REQ_NEXT_FIELD ¸¸À» ¹ß»ý½ÃÅ°°Ô µÈ´Ù.

  • dup_field ¶ó´Â ¶óÀ̺귯¸® È£ÃâÀº º¸Åëó·³ ÀÛµ¿ÇÒ °ÍÀÌ´Ù; ±×°ÍÀº Çʵ带 º¹»çÇÑ´Ù. ÇöÀç ¹öÆÛÅ©±â¿Í ÇʵåÀÇ ³»¿ë±îÁö ¸ðµÎ ¸»ÀÌ´Ù. Ä¿Áú ¼ö ÀÖ´Â ÃÖ´ë±æÀÌ°¡ ¸í½ÃµÇ¾î ÀÖ´Ù¸é ±×°Í ¶ÇÇÑ º¹»çµÉ °ÍÀÌ´Ù.

  • link_field ¶óÀ̺귯¸® È£Ãâµµ º¸Åëó·³ ÀÛµ¿ÇÒ °ÍÀÌ´Ù; ±×°ÍÀº ¸ðµç Çʵå¼Ó¼ºÀº º¹»çÇÏ°í, ¿ø·¡ ÇʵåÀÇ ¹öÆÛ´Â °øÀ¯ÇÒ °ÍÀÌ´Ù. ¸¸¾à O_STATIC Çʵå¿É¼ÇÀÌ Çʵ尡 °øÀ¯ÇÏ´Â ¹öÆÛ¿¡ ÀÇÇØ °á°úÀûÀ¸·Î °ªÀÌ º¯°æµÇ¾ú´Ù¸é, ¹öÆÛº¸´Ù ´õ Å« µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÒ¶§ ½Ã½ºÅÛÀÌ ¾î¶»°Ô ÀÛµ¿Çϴ°¡´Â ÇöÀç ÀÛ¾÷ÇÏ´Â ÇʵåÀÇ ¿É¼Ç ¼³Á¤¿¡ ´Þ·ÁÀÖ°Ô µÈ´Ù.

  • field_info ¶óÀ̺귯¸® È£Ãâµµ º¸Åëó·³ ÀÛµ¿ÇÒ °ÍÀÌ´Ù; nrow º¯¼ö¿¡´Â new_field ÀÇ ¿ø·¡ È£Ã⶧ÀÇ °ªÀ» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. À§¿¡¼­ ¾ð±ÞÇßµíÀÌ, ÇöÀçÀÇ ¹öÆÛ Å©±â¸¦ ¾Ë¾Æ¿Ã·Á¸é dynamic_field_info ÇÔ¼ö¸¦ »ç¿ëÇؾ߸¸ ÇÑ´Ù.

À§ ¿äÁ¡ Áß ¸î¸îÀº Æû µå¶óÀ̹ö¿¡ ´ëÇØ ¼³¸íÀ» ÇØ¾ß ½±°Ô ÀÌÇØµÉ °ÍÀÌ´Ù. ´ÙÀ½ ¸î ¼½¼Ç¿¡¼­ ±×°Í¿¡ ´ëÇØ ¾Ë¾Æº¼ °ÍÀÌ´Ù.


1.18.4. Æû À©µµ¿ì


Æû À©µµ¿ì´Â ¸Þ´º À©µµ¿ì¿Í ±× °³³äÀÌ Èí»çÇÏ´Ù. ¸ðµç ÆûÀº ¸ÞÀÎ À©µµ¿ì¿Í ÇÏÀ§ À©µµ¿ì·Î ±¸¼ºµÇ¾î ÀÖ´Ù. Æû ¸ÞÀÎ À©µµ¿ì´Â ŸÀÌƲ À̳ª Å׵θ® ¶Ç´Â °³¹ßÀÚ°¡ ¹Ù¶ó´Â ¾Æ¹«°ÍÀ̳ª Ç¥½ÃÇÒ ¼ö ÀÖ´Ù. ÇÏÀ§ À©µµ¿ì´Â ¸ðµç Çʵ带 Æ÷ÇÔÇÏ°í ±×µéÀÇ À§Ä¡¿¡ µû¶ó ±×°ÍµéÀ» Ç¥½ÃÇÑ´Ù. ÀÌ°ÍÀº ¿¹»Û ÆûÀ» ¸Å¿ì ½±°Ô ¸¸µé ¼ö ÀÖ´Â À¯¿¬ÇÔÀ» Á¦°øÇÑ´Ù.

ÀÌ°ÍÀº ¸Þ´º À©µµ¿ì¿Í ¸Å¿ì Èí»çÇϱ⠶§¹®¿¡, ¿¹Á¦¿¡ ±×·¸°Ô ¸¹Àº ¼³¸íÀ» ÇÏÁö´Â ¾Ê°Ú´Ù. ÇÔ¼öµéÀº ºñ½ÁÇÏ°í °°Àº ¹æ¹ýÀ¸·Î ÀÛµ¿ÇÑ´Ù.

Example 28. Form Windows Example

#include <form.h>                                                                                 
                                                                                                  
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color); 
                                                                                                  
int main()                                                                                        
{                                                                                                 
        FIELD *field[3];                                                                          
        FORM  *my_form;                                                                           
        WINDOW *my_form_win;                                                                      
        int ch, rows, cols;                                                                       
                                                                                                  
        /* Initialize curses */                                                                   
        initscr();                                                                                
        start_color();                                                                            
        cbreak();                                                                                 
        noecho();                                                                                 
        keypad(stdscr, TRUE);                                                                     
                                                                                                  
        /* Initialize few color pairs */                                                          
        init_pair(1, COLOR_RED, COLOR_BLACK);                                                     
                                                                                                  
        /* Initialize the fields */                                                               
        field[0] = new_field(1, 10, 6, 1, 0, 0);                                                  
        field[1] = new_field(1, 10, 8, 1, 0, 0);                                                  
        field[2] = NULL;                                                                          
                                                                                                  
        /* Set field options */                                                                   
        set_field_back(field[0], A_UNDERLINE);                                                    
        field_opts_off(field[0], O_AUTOSKIP); /* Don't go to next field when this */              
                                              /* Field is filled up             */                
        set_field_back(field[1], A_UNDERLINE);                                                    
        field_opts_off(field[1], O_AUTOSKIP);                                                     
                                                                                                  
        /* Create the form and post it */                                                         
        my_form = new_form(field);                                                                
                                                                                                  
        /* Calculate the area required for the form */                                            
        scale_form(my_form, &rows, &cols);                                                        
                                                                                                  
        /* Create the window to be associated with the form */                                    
        my_form_win = newwin(rows + 4, cols + 4, 4, 4);                                           
        keypad(my_form_win, TRUE);                                                                
                                                                                                  
        /* Set main window and sub window */                                                      
        set_form_win(my_form, my_form_win);                                                       
        set_form_sub(my_form, derwin(my_form_win, rows, cols, 2, 2));                             
                                                                                                  
        /* Print a border around the main window and print a title */                             
        box(my_form_win, 0, 0);                                                                   
        print_in_middle(my_form_win, 1, 0, cols + 4, "My Form", COLOR_PAIR(1));                   
                                                                                                  
        post_form(my_form);                                                                       
        wrefresh(my_form_win);                                                                    
                                                                                                  
        mvprintw(LINES - 2, 0, "Use UP, DOWN arrow keys to switch between fields");               
        refresh();                                                                                
                                                                                                  
        /* Loop through to get user requests */                                                   
        while((ch = wgetch(my_form_win)) != KEY_F(1))                                             
        {       switch(ch)                                                                        
                {       case KEY_DOWN:                                                            
                                /* Go to next field */                                            
                                form_driver(my_form, REQ_NEXT_FIELD);                             
                                /* Go to the end of the present buffer */                         
                                /* Leaves nicely at the last character */                         
                                form_driver(my_form, REQ_END_LINE);                               
                                break;                                                            
                        case KEY_UP:                                                              
                                /* Go to previous field */                                        
                                form_driver(my_form, REQ_PREV_FIELD);                             
                                form_driver(my_form, REQ_END_LINE);                               
                                break;                                                            
                        default:                                                                  
                                /* If this is a normal character, it gets */                      
                                /* Printed                                */                      
                                form_driver(my_form, ch);                                         
                                break;                                                            
                }                                                                                 
        }                                                                                         
                                                                                                  
        /* Un post form and free the memory */                                                    
        unpost_form(my_form);                                                                     
        free_form(my_form);                                                                       
        free_field(field[0]);                                                                     
        free_field(field[1]);                                                                     
                                                                                                  
        endwin();                                                                                 
        return 0;                                                                                 
}                                                                                                 
                                                                                                  
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)  
{       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;                                                                   
        wattron(win, color);                                                                      
        mvwprintw(win, y, x, "%s", string);                                                       
        wattroff(win, color);                                                                     
        refresh();                                                                                
}                                                                                                 




1.18.5. Çʵå ÀÎÁõ


±âº»ÀûÀ¸·Î Çʵå´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÏ´Â ¾î¶² µ¥ÀÌÅÍµç ¹Þ¾ÆµéÀδÙ. ÀÌ Çʵ忡 ÀÎÁõ±â´ÉÀ» ³Ö´Â °Íµµ °¡´ÉÇÏ´Ù. »ç¿ëÀÚ°¡ ³ÖÀº °ªµéÀº Çʵ带 ¶°³¯¶§ ÀÎÁõ¿¡ ¸ÂÁö ¾ÊÀ¸¸é ½ÇÆÐÇÒ °ÍÀÌ´Ù. ¾î¶² ÀÎÁõ ÇüŵéÀº ¹®ÀÚ¸¦ °¡Áö°í Àֱ⵵ ÇÏ´Ù-Çʵ忡 ±ÛÀÚ¸¦ ÀÔ·ÂÇÒ¶§¸¶´Ù ÀÎÁõ üũ¸¦ ÇÑ´Ù.

ÀÎÁõÀº ´ÙÀ½ÀÇ ÇÔ¼öµéÀ» ÅëÇØ Çʵ忡 µ¡ºÙÀÏ ¼ö ÀÖ´Ù.

int set_field_type(FIELD *field,          /* field to alter */               
                   FIELDTYPE *ftype,      /* type to associate */            
                   ...);                  /* additional arguments*/          


¼¼ÆÃµÈ ÈÄ Çʵ忡 ´ëÇÑ ÀÎÁõÇüÅ´ ´ÙÀ½ ÇÔ¼ö·Î ¾Ë¾Æ¿Ã ¼ö ÀÖ´Ù.

FIELDTYPE *field_type(FIELD *field);      /* field to query */               


Æû µå¶óÀ̹ö´Â ÃÖÁ¾»ç¿ëÀÚ¿¡ ÀÇÇØ µ¥ÀÌÅÍ°¡ ÀԷµǾúÀ» ¶§¸¸ ÇʵåÀÇ °ªÀ» ÀÎÁõÇÑ´Ù. ´ÙÀ½°ú °°Àº °æ¿ì´Â ÀÎÁõÀÌ ÀϾÁö ¾Ê´Â´Ù.

  • ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¥¿¡¼­ set_field_buffer ÇÔ¼ö¸¦ È£ÃâÇؼ­ ÇʵåÀÇ °ªÀ» ¹Ù²Û °æ¿ì

  • ¸µÅ©µÇ¾î ÀÖ´Â ÇʵåÀÇ °ªµéÀÌ °£Á¢ÀûÀ¸·Î ¹Ù²ï °æ¿ì -- ±× Çʵ尡 ¸µÅ©µÇ¾î ÀÖ´Â ¿ø·¡ ÇʵåÀÇ °ªÀ» ¹Ù²ã¼­ º¯°æµÈ °æ¿ì

´ÙÀ½Àº ¹Ì¸® Á¤ÀǵǾî ÀÖ´Â ÀÎÁõ ÇüŵéÀÌ´Ù. ´ç½ÅÀº ´ç½Å¸¸ÀÇ ÀÎÁõÀ» ¸í½ÃÇÒ ¼öµµ ÀÖ´Ù. ºñ·Ï Á» ±î´Ù·Ó°í ¼º°¡½Å ÀÏÀÌ°ÚÁö¸¸ ¸»ÀÌ´Ù.

TYPE_ALPHA

ÀÌ Çʵå ŸÀÔÀº ¾ËÆĺª µ¥ÀÌÅ͵鸸 ÀԷ¹޴´Ù; ºóÄ­, ¼ýÀÚ, Ư¼ö ¹®ÀÚÀº ¾ÈµÈ´Ù(ÀÌ ±ÛÀÚµéÀº ÀԷ½ÿ¡ üũµÈ´Ù.). ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù:

int set_field_type(FIELD *field,          /* field to alter */               
                   TYPE_ALPHA,            /* type to associate */            
                   int width);            /* maximum width of field */       


width ÀÎÀÚ´Â µ¥ÀÌÅÍÀÇ ÃÖ¼Ò ±æÀ̸¦ ¸»ÇÑ´Ù. »ç¿ëÀÚ´Â Çʵ带 ¶°³ª±âÀü ÃÖ¼Ò width ¸¸Å­ÀÇ ±ÛÀÚ¸¦ ÀÔ·ÂÇؾ߸¸ ÇÑ´Ù. ÀüÇüÀûÀ¸·Î ´ç½ÅÀº ÀÌ °ªÀ» ÇÊµå ±æÀ̸¸Å­ ¼³Á¤ÇÏ±æ ¿øÇÒ °ÍÀÌ´Ù; ¸¸¾à ÀÌ °ªÀÌ ÇÊµå ±æÀ̺¸´Ù Å©´Ù¸é, ÀÎÁõ ÀÛ¾÷ÀÌ Ç×»ó ½ÇÆÐÇÒ °ÍÀÌ´Ù. ÀÌ °ªÀ» 0 ·Î Çصθé ÀÌ Çʵ带 ä¿ïÁö ¸»Áö´Â »ç¿ëÀÚ ¼±ÅÃÀÌ´Ù.

TYPE_ALNUM

ÀÌ Çʵå ŸÀÔÀº ¾ËÆĺª°ú ¼ýÀÚ µ¥ÀÌÅ͵鸸 ÀԷ¹޴´Ù; ºóÄ­, Ư¼ö¹®ÀÚ´Â ¾ÈµÈ´Ù(ÀÌ ¹®ÀÚµéÀº ÀԷ½ÿ¡ üũµÈ´Ù.). ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.

int set_field_type(FIELD *field,          /* field to alter */               
                   TYPE_ALNUM,            /* type to associate */            
                   int width);            /* maximum width of field */       


width ÀÎÀÚ´Â µ¥ÀÌÅÍÀÇ ÃÖ¼Ò ±æÀ̸¦ ¸»ÇÑ´Ù. TYPE_ALPHA ¿Í °°ÀÌ ÀüÇüÀûÀ¸·Î ´ç½ÅÀº ÀÌ°ÍÀ» ÇÊµå ±æÀ̸¸Å­ ¿øÇÒ °ÍÀÌ´Ù; ¸¸¾à ÇÊµå ±æÀ̺¸´Ù Å©´Ù¸é ÀÎÁõ ÀÛ¾÷Àº Ç×»ó ½ÇÆÐÇÑ´Ù. ÀÌ °ªÀ» 0 ·Î Çصθé ÀÌ Çʵ带 ä¿ïÁö ¸»Áö´Â »ç¿ëÀÚ ¼±ÅÃÀÌ´Ù.

TYPE_ENUM

ÀÌ Å¸ÀÔÀº ÇʵåÀÇ ÀԷ°ªÀ» ½ºÆ®¸µ °ªµéÀÇ ÁýÇÕÁß Çϳª°¡ µÇµµ·Ï Á¦ÇÑÇÑ´Ù. (¿¹¸¦ µé¾î, U.S. states ÀÇ µÎ±ÛÀÚ ¿ìÆí¹øÈ£µî). ÀÌ°ÍÀº ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.

int set_field_type(FIELD *field,          /* field to alter */               
                   TYPE_ENUM,             /* type to associate */            
                   char **valuelist;      /* list of possible values */      
                   int checkcase;         /* case-sensitive? */              
                   int checkunique);      /* must specify uniquely? */       


valuelist ÀÎÀÚ´Â NULL ·Î ³¡³ª´Â À¯È¿ÇÑ ½ºÆ®¸µ ¸®½ºÆ®¸¦ °¡¸£Å°°í ÀÖ¾î¾ß µÈ´Ù. checkcase ÀÎÀÚ´Â ÂüÀÌ¸é ½ºÆ®¸µ ºñ±³¸¦ case-sensitive ÇÏ°Ô ¸¸µç´Ù.

»ç¿ëÀÚ°¡ TYPE_ENUM Çʵ带 ³ª°¥¶§, ÀÎÁõ ÀýÂ÷°¡ ¹öÆÛÀÇ µ¥ÀÌÅ͸¦ È®ÀÎµÈ °ªÀ¸·Î ¿Ï¼ºÇسõÀ¸·Á ½ÃµµÇÑ´Ù. µü¸Â´Â ¹®ÀÚ¿­ÀÌ ÀԷµǸé, ´ç¿¬È÷ ÀÎÁõÀ» Åë°úÇÑ´Ù. ±×·¯³ª ¶ÇÇÑ ÀÎÁõ ¹®ÀÚ¿­ÀÇ ¾Õ¸Ó¸®¸¸ ÀÔ·ÂÇÏ°í ³ª¸ÓÁö´Â ÀÚµ¿À¸·Î ¿Ï¼ºµÇ°Ô ÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.

±âº»ÀûÀ¸·Î ´ç½ÅÀÌ ¸Ó¸®±ÛÀÚ¸¸ ÀÔ·ÂÇÏ°í ¹®ÀÚ¿­ ¸®½ºÆ®¿¡¼­ °Å±â¿¡ ¸Â´Â °ÍÀÌ Çϳª ÀÌ»óÀÏ °æ¿ì, ù¹ø° ¸ÅĪµÇ´Â °ªÀ¸·Î ¿Ï¼ºµÈ´Ù. ±×·¯³ª checkunique ÀÎÀÚ°¡ ÂüÀ̸é ÀÎÁõ¹Þ±â À§Çؼ­´Â ¸Ó¸®±ÛÀÚ¿¡ ¸ÅĪµÇ´Â °ÍÀÌ À¯ÀÏÇؾßÇÑ´Ù.

REQ_NEXT_CHOICE ¿Í REQ_PREV_CHOICE ÀÔ·Â ¿äûÀº ÀÌ Çʵåµé¿¡ ƯÈ÷ À¯¿ëÇÏ´Ù.

TYPE_INTEGER

ÀÌ Çʵå ŸÀÔÀº Á¤¼ö¸¦ ÀԷ¹޴´Ù. ±×°ÍÀº ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.:

int set_field_type(FIELD *field,          /* field to alter */               
                   TYPE_INTEGER,          /* type to associate */            
                   int padding,           /* # places to zero-pad to */      
                   int vmin, int vmax);   /* valid range */                  


ÀÎÁõ¹ÞÀ» ¼ö ÀÖ´Â ¹®ÀÚ´Â ¸¶À̳ʽº ºÎÈ£·Î ½ÃÀÛÇصµ µÇ´Â ¼ýÀÚ´Ù. Çʵ忡¼­ ³ª°¥ ¶§ ¹üÀ§ üũ°¡ ÇàÇØÁø´Ù. ¸¸¾à ¹üÀ§ÀÇ ÃÖ´ë°ªÀÌ ÃÖ¼Ò°ªº¸´Ù °°°Å³ª ÀÛ´Ù¸é, ¹üÀ§´Â ¹«½ÃµÈ´Ù.

¸¸¾à ¹üÀ§ üũ¸¦ Åë°úÇÑ´Ù¸é, Æеù ÀÎÀÚÀÇ °ª¸¸Å­ ÇÊ¿äÇÑ ¾çÀÇ ¼ýÀÚ 0 ÀÌ ¾Õ¿¡ µ¡ºÙ¿©Áø´Ù.

TYPE_INTEGER ÇʵåÀÇ ¹öÆÛ °ªÀº C ¶óÀ̺귯¸®ÇÔ¼öÀÎ atoi(3) À¸·Î Æí¸®ÇÏ°Ô Á¤¼ö·Î ¹Ù²ð ¼ö ÀÖ´Ù.

TYPE_NUMERIC

ÀÌ Çʵå´Â ½Ç¼öµéÀ» ¹Þ´Â´Ù. ±×°ÍÀº ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.:

int set_field_type(FIELD *field,          /* field to alter */               
                   TYPE_NUMERIC,          /* type to associate */            
                   int padding,           /* # places of precision */        
                   int vmin, int vmax);   /* valid range */                  


Çã¿ë°¡´ÉÇÑ ¹®ÀÚ´Â ¸¶À̳ʽº ºÎÈ£·Î ½ÃÀÛÇصµ µÇ´Â ¼ýÀÚµéÀÌ´Ù. ¼Ò¼öÁ¡ ºÎÈ£µµ Æ÷ÇÔÇصµ µÈ´Ù. Çʵ忡¼­ ³ª°¥ ¶§ ¹üÀ§ üũ°¡ ½ÇÇàµÈ´Ù. ¹üÀ§ÀÇ ÃÖ´ë°ªÀÌ ÃÖ¼Ò°ªº¸´Ù À۰ųª °°À¸¸é, ¹üÀ§´Â ¹«½ÃµÈ´Ù.

°ªÀÌ ¹üÀ§ üũ¸¦ Åë°úÇϸé, Æеù ÀÎÀÚ·Î ³Ñ¾î¿Â ¼ö ¸¸Å­ ÇÊ¿äÇÑ 0ÀÌ °ªÀÇ µÚ¿¡ µ¡ºÙ´Â´Ù.

TYPE_NUMERIC ÇʵåÀÇ ¹öÆÛ °ªÀº C ¶óÀ̺귯¸®ÇÔ¼öÀÎ atof(3) À¸·Î Æí¸®ÇÏ°Ô ½Ç¼ö·Î ¹Ù²ð ¼ö ÀÖ´Ù.

TYPE_REGEXP

ÀÌ Çʵå´Â Á¤±Ô½Ä¿¡ ¸Â´Â °ªÀ» ¹Þ´Â´Ù. ±×°ÍÀº ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.

int set_field_type(FIELD *field,          /* field to alter */               
                   TYPE_REGEXP,           /* type to associate */            
                   char *regexp);         /* expression to match */          


Á¤±Ô½Ä¿¡ ´ëÇÑ ¹®¹ýÀº regcomp(3) ¿Í °°´Ù. Çʵ忡¼­ ³ª°¥ ¶§ Á¤±Ô½Ä¿¡ ¸Â´ÂÁö °Ë»ç¸¦ ÇÏ°Ô µÈ´Ù.


1.18.6. Æû µå¶óÀ̹ö: Æû ½Ã½ºÅÛÀÇ Å« ÀϲÛ


¸Þ´º ½Ã½ºÅÛ¿¡¼­ ó·³ form_driver() ´Â Æû ½Ã½ºÅÛ¿¡¼­ ¸Å¿ì Áß¿äÇÑ ¿ªÇÒÀ» ¸Ã°í ÀÖ´Ù. Æû ½Ã½ºÅÛÀ¸·Î °¡´Â ¸ðµç Á¾·ùÀÇ ¿äûÀº form_driver() ¸¦ ÅëÇØ¾ß ÇÑ´Ù.

int form_driver(FORM *form,     /* form on which to operate     */           
                int request)    /* form request code         */              


À§ÀÇ ¸î¸î ¿¹Á¦¿¡¼­µµ º¸¾ÒµíÀÌ, »ç¿ëÀÚ ÀÔ·ÂÀ» ó¸®ÇÏ´Â ·çÇÁ¸¦ µ¹¸é¼­ ±×¼­ÀÌ ÇÊµå µ¥ÀÌÅÍ ÀÔ·ÂÀÎÁö ¾Æ´Ï¸é Æû ó¸® ¿äûÀÎÁö¸¦ °áÁ¤Çؾ߸¸ ÇÑ´Ù. ±× ÈÄ Æû ó¸® ¿äûÀº form_driver() ·Î Àü´ÞµÇ¾î ÇÊ¿äÇÑ ÀÏÀ» ÇÏ°Ô µÈ´Ù.

¿äûÀº ´ë·« ´ÙÀ½ÀÇ ºÐ·ù·Î ³ª´²º¼ ¼ö ÀÖ´Ù. °¢°¢ÀÇ ¿äû°ú »ç¿ë¹ýÀº ¾Æ·¡¿¡ ¼³¸íµÇ¾î ÀÖ´Ù.:


1.18.6.1. ÆäÀÌÁö Ž»ö ¸®Äù½ºÆ®


ÀÌ ¸®Äù½ºÆ®µéÀº ÆûÀ» ÅëÇÑ ÆäÀÌÁö ·¹º§ÀÇ À̵¿°ú »õ ÆûÈ­¸éÀ¸·Î È­¸éÀ» À̵¿½ÃÅ°´Â °ÍµéÀÌ´Ù. ÆûÀº ¿©·¯ ÆäÀÌÁö·Î ¸¸µé ¼ö ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ ¸¹Àº Çʵå¿Í ³í¸®ÀûÀÎ ¿µ¿ªÀÌ ÀÖ´Â Å« ÆûÀ» °¡Áö°í ÀÖ´Ù¸é, ±× ÆûµéÀ» ÆäÀÌÁö·Î ³ª´² º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. set_new_page() ÇÔ¼ö°¡ ¸í½ÃÇÑ Çʵ忡¼­ »õÆäÀÌÁö¸¦ ¼³Á¤ÇÏ´Â ÇÔ¼öÀÌ´Ù.

int set_new_page(FIELD *field,/* Field at which page break to be set or unset */ 
         bool new_page_flag); /* should be TRUE to put a break */                


´ÙÀ½ ¸®Äù½ºÆ®µéÀÌ ´Ù¸¥ ÆäÀÌÁö·Î À̵¿ÇÒ¶§ ¾²ÀδÙ.

  • REQ_NEXT_PAGE Move to the next form page.

  • REQ_PREV_PAGE Move to the previous form page.

  • REQ_FIRST_PAGE Move to the first form page.

  • REQ_LAST_PAGE Move to the last form page.

ÀÌ ¸®Äù½ºÆ®µéÀº ¸®½ºÆ®¸¦ ¼øȯÇÑ´Ù; Áï, ¸¶Áö¸· ÆäÀÌÁö¿¡¼­ REQ_NEXT_PAGE ¸®Äù½ºÆ®´Â ù¹ø° ÆäÀÌÁö·Î À̵¿ÇÏ°í, ù¹ø° ÆäÀÌÁö¿¡¼­ REQ_PREV_PAGE ÀÌ ¸®Äù½ºÆ®´Â ¸¶Áö¸· ÆäÀÌÁö·Î À̵¿ÇÏ°Ô µÈ´Ù.


1.18.6.2. Çʵ尣 Ž»ö ¸®Äù½ºÆ®


ÀÌ ¸®Äù½ºÆ®µéÀº °°Àº ÆäÀÌÁö³»ÀÇ ÇÊµå »çÀ̸¦ ¿Õ·¡ÇÒ¶§ ¾²ÀδÙ.

  • REQ_NEXT_FIELD Move to next field.

  • REQ_PREV_FIELD Move to previous field.

  • REQ_FIRST_FIELD Move to the first field.

  • REQ_LAST_FIELD Move to the last field.

  • REQ_SNEXT_FIELD Move to sorted next field.

  • REQ_SPREV_FIELD Move to sorted previous field.

  • REQ_SFIRST_FIELD Move to the sorted first field.

  • REQ_SLAST_FIELD Move to the sorted last field.

  • REQ_LEFT_FIELD Move left to field.

  • REQ_RIGHT_FIELD Move right to field.

  • REQ_UP_FIELD Move up to field.

  • REQ_DOWN_FIELD Move down to field.

ÀÌ ¸®Äù½ºÆ®µéÀº ÇÑ ÆäÀÌÁöÀÇ ÇʵåµéÀ» ¼øȯÇÑ´Ù; Áï, ¸¶Áö¸· Çʵ忡¼­ÀÇ REQ_NEXT_FIELD ¸®Äù½ºÆ®´Â ¸Ç óÀ½ Çʵå·Î À̵¿ÇÏ°í ¸Ç Ã³À½ Çʵ忡¼­ÀÇ REQ_PREV_FIELD ¸®Äù½ºÆ®´Â ¸Ç ¸¶Áö¸· Çʵå·Î À̵¿ÇÏ°Ô µÈ´Ù. ÀÌ °æ¿ì (REQ_FIRST_FIELD ¿Í REQ_LAST_FIELD µµ ¸¶Âù°¡Áö) ÇʵåÀÇ ¼ø¼­´Â ±×³É Æû ¹è¿­ ( new_form() À̳ª set_form_fields() ¿¡ ÀÇÇØ ¼³Á¤µÇ´Â ) ÀÇ ¼ø¼­ÀÌ´Ù.

¶ÇÇÑ È­¸é¿¡ ³ª¿Í ÀÖ´Â ¼ø¼­´ë·Î Á¤·ÄµÈ °Íó·³ ÇʵåµéÀ» °¡·ÎÁö¸£´Â °Íµµ °¡´ÉÇÏ´Ù. ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ¶óµçÁö À§¿¡¼­ ¾Æ·¡·Î ó·³ ¸»ÀÌ´Ù. ÀÌ°ÍÀ» ÇÒ·Á¸é, µÎ¹ø° ±×·ìÀÎ ³×°³ÀÇ Á¤·ÄµÈ À̵¿ ¸®Äù½ºÆ®¸¦ ¾²¸é µÈ´Ù.

¸¶Áö¸·À¸·Î È­¸é¿¡ º¸À̴´ë·Î »óÇÏÁÂ¿ì ¹æÇâÀ¸·Î Çʵ尣 À̵¿µµ °¡´ÉÇÏ´Ù. ÀÌ°ÍÀ» ÇÒ·Á¸é ¼¼¹ø° ±×·ìÀÇ ³× ¸®Äù½ºÆ®¸¦ ¾²¸éµÈ´Ù. ´Ü ÁÖÀÇÇØ¾ß ÇÒ °ÍÀº ÀÌ ¸®Äù½ºÆ®¸¦ ¾µ¶§ ±âº»ÀÌ µÇ´Â ÆûÀÇ À§Ä¡´Â ±×°ÍÀÇ ¿ÞÂÊ À§ ±¸¼®À̶ó´Â °ÍÀÌ´Ù.

¿¹¸¦ µé¾î, ´ç½ÅÀÌ ¾î·ÁÁÙÀÇ ÇʵåÀÎ B ¸¦ Áß½ÉÀ¸·Î µÎ°³ÀÇ ÇÑÁÙÂ¥¸® ÇʵåÀÎ A ¿Í C¸¦ ¿ÞÂÊ, ¿À¸¥ÂÊÀÇ B ¿Í °°Àº ¶óÀο¡ µ×´Ù°í ÇÏÀÚ. A ¿¡¼­ REQ_MOVE_RIGHT ¸®Äù½ºÆ®°¡ ¹ß»ýÇϸé A, B, C ÀÇ Ã¹Â°ÁÙÀÌ °°À» ¶§¿¡¸¸ B ·Î À̵¿ÇÒ °ÍÀÌ´Ù; ¸¸¾à ±×·¸Áö ¾ÊÀ¸¸é B¸¦ °Ç³Ê¶Ù¾î C ·Î °¡°ÔµÈ´Ù.


1.18.6.3. ÇÊµå ³» Ž»ö ¸®Äù½ºÆ®


ÀÌ ¸®Äù½ºÆ®´Â ÇöÀç ¼±ÅÃµÈ ÇÊµå ³»¿¡¼­ Ä¿¼­¸¦ À̵¿½ÃŲ´Ù.

  • REQ_NEXT_CHAR Move to next character.

  • REQ_PREV_CHAR Move to previous character.

  • REQ_NEXT_LINE Move to next line.

  • REQ_PREV_LINE Move to previous line.

  • REQ_NEXT_WORD Move to next word.

  • REQ_PREV_WORD Move to previous word.

  • REQ_BEG_FIELD Move to beginning of field.

  • REQ_END_FIELD Move to end of field.

  • REQ_BEG_LINE Move to beginning of line.

  • REQ_END_LINE Move to end of line.

  • REQ_LEFT_CHAR Move left in field.

  • REQ_RIGHT_CHAR Move right in field.

  • REQ_UP_CHAR Move up in field.

  • REQ_DOWN_CHAR Move down in field.

¾Õ ´Ü¾î¿Í µÚ ´Ü¾î´Â °ø¹é¿¡ ÀÇÇؼ­ ±¸ºÐµÈ´Ù. ÁÙÀ̳ª ÇʵåÀÇ ¸Ç óÀ½°ú ³¡À¸·Î À̵¿ÇÏ´Â ¸í·ÉÀº ±×µéÀÇ ¹üÀ§³»¿¡¼­ Æеù ¹®ÀÚ°¡ ¾Æ´Ñ ¸Ç óÀ½ ¶Ç´Â ³¡ÀÇ ±ÛÀÚ¸¦ ã´Â´Ù.


1.18.6.4. ½ºÅ©·Ñ ¸®Äù½ºÆ®


Çʵå Áß¿¡¼­ µ¿ÀûÀ¸·Î Å©¸®°¡ º¯Çؼ­ È­¸é¿¡ º¸ÀÌÁö ¾Ê´Â ±ÛÀÚµéÀÌ ÀÖ´Â °ÍÀº ½ºÅ©·ÑÀÌ µÈ´Ù. ÇÑÁ٠¥¸® Çʵå´Â ¼öÆòÀ¸·Î ½ºÅ©·Ñ µÈ´Ù; ¿©·¯ÁÙÀÇ Çʵå´Â ¼öÁ÷À¸·Î µÈ´Ù. ´ëºÎºÐÀÇ ½ºÅ©·ÑÀº ¿¡µðÆà À̵¿°ú Çʵ峻 À̵¿¿¡ ÀÇÇØ ÇàÇØÁø´Ù. (¶óÀ̺귯¸®´Â Ä¿¼­°¡ °è¼Ó º¸À̵µ·Ï Çʵ带 ½ºÅ©·Ñ ÇÑ´Ù.) ´ÙÀ½ÀÇ ¸®Äù½ºÆ®¸¦ ÅëÇØ ½ºÅ©·Ñ±â´ÉÀ» ¾µ ¼ö ÀÖ´Ù.:

  • REQ_SCR_FLINE Scroll vertically forward a line.

  • REQ_SCR_BLINE Scroll vertically backward a line.

  • REQ_SCR_FPAGE Scroll vertically forward a page.

  • REQ_SCR_BPAGE Scroll vertically backward a page.

  • REQ_SCR_FHPAGE Scroll vertically forward half a page.

  • REQ_SCR_BHPAGE Scroll vertically backward half a page.

  • REQ_SCR_FCHAR Scroll horizontally forward a character.

  • REQ_SCR_BCHAR Scroll horizontally backward a character.

  • REQ_SCR_HFLINE Scroll horizontally one field width forward.

  • REQ_SCR_HBLINE Scroll horizontally one field width backward.

  • REQ_SCR_HFHALF Scroll horizontally one half field width forward.

  • REQ_SCR_HBHALF Scroll horizontally one half field width backward.

½ºÅ©·Ñ ½Ã ÇʵåÀÇ ÆäÀÌÁö´Â ±×°ÍÀÇ º¸ÀÌ´Â ºÎºÐÀÇ ³ôÀÌÀÌ´Ù.


1.18.6.5. ¿¡µðÆ® ¸®Äù½ºÆ®


´ç½ÅÀÌ Æû µå¶óÀ̹ö¿¡ ASCII ¹®ÀÚ¸¦ ³Ñ°åÀ» ¶§, ±×°ÍÀº ÇʵåÀÇ µ¥ÀÌÅÍ ¹öÆÛ¿¡ ±× ¹®ÀÚ¸¦ µ¡ºÙ¿©¶ó´Â ¿äûÀ¸·Î 󸮵ȴÙ. ÀÌ ÀÛ¾÷ÀÌ Ãß°¡ ¸ðµåÀÎÁö ¼öÁ¤ ¸ðµåÀÎÁö´Â ÇʵåÀÇ ¿¡µðÆ® ¸ðµå¿¡ µû¶ó ´Ù¸£´Ù. (Ãß°¡ ¸ðµå°¡ ±âº» °ªÀÌ´Ù.)

´ÙÀ½ÀÇ ¸®Äù½ºÆ®°¡ Çʵ带 ¼öÁ¤ÇÏ°í ÇʵåÀÇ ¿¡µðÆ® ¸ðµå¸¦ º¯°æÇÒ ¶§ ¾²ÀδÙ.

  • REQ_INS_MODE Set insertion mode.

  • REQ_OVL_MODE Set overlay mode.

  • REQ_NEW_LINE New line request (see below for explanation).

  • REQ_INS_CHAR Insert space at character location.

  • REQ_INS_LINE Insert blank line at character location.

  • REQ_DEL_CHAR Delete character at cursor.

  • REQ_DEL_PREV Delete previous word at cursor.

  • REQ_DEL_LINE Delete line at cursor.

  • REQ_DEL_WORD Delete word at cursor.

  • REQ_CLR_EOL Clear to end of line.

  • REQ_CLR_EOF Clear to end of field.

  • REQ_CLEAR_FIELD Clear entire field.

REQ_NEW_LINE ¿Í REQ_DEL_PREV ¸®Äù½ºÆ®ÀÇ ÀÛµ¿¹ýÀº ¾ÆÇØÇϱⰡ ½±Áö ¾Ê°í ºÎºÐÀûÀ¸·Î Æû ¿É¼ÇµéÀÇ ¿µÇâÀ» ¹Þ´Â´Ù. ÀÌ Æ¯º°ÇÑ ÄÉÀ̽º´Â Ä¿¼­°¡ ÇʵåÀÇ ½ÃÀÛÀ§Ä¡¿¡ Àְųª ÇʵåÀÇ ¸¶Áö¸· ÁÙ¿¡ ÀÖÀ» ¶§ ÀϾ´Ù.

¸ÕÀú, REQ_NEW_LINE ºÎÅÍ º¸ÀÚ:

Ãß°¡ ¸ðµå¿¡¼­ REQ_NEW_LINE ÀÇ ÀÛµ¿¹ýÀº ¸ÕÀú ÇöÀç ÁÙÀÇ Ä¿¼­°¡ ÀÖ´Â °÷¿¡¼­ ±× µÚ ºÎºÐµéÀ» »õ ÁÙ·Î ³»¸®°í, Ä¿¼­¸¦ »õÁÙÀÇ ½ÃÀÛ À§Ä¡·Î À̵¿ÇÏ´Â °ÍÀÌ´Ù. ( ´ç½ÅÀº ÀÌ°ÍÀÌ ÇÊµå ¹öÆÛ¿¡ newline ¹®ÀÚ¸¦ Áý¾î³Ö´Â °ÍÀ̶ó´Â °É ¾Ë¾ÆÂ÷·ÈÀ» °ÍÀÌ´Ù.

°ãÃÄ ¾²´Â ¼öÁ¤¸ðµå¿¡¼­ REQ_NEW_LINE ÀÇ ÀÛµ¿¹ýÀº Ä¿¼­µÚ¿¡¼­ºÎÅÍ ÁÙÀÇ ³¡±îÁö ³»¿ëÀ» Ŭ¸®¾îÇÑ´Ù. ±× ÈÄ Ä¿¼­¸¦ ´ÙÀ½ ÁÙÀÇ ½ÃÀÛÀ§Ä¡·Î ¿Å±â°Ô µÈ´Ù.

±×·¯³ª, ÇʵåÀÇ ½ÃÀÛÀ§Ä¡¿¡¼­³ª ÇʵåÀÇ ¸¶Áö¸· ÁÙ¿¡¼­ REQ_NEW_LINE ´Â REQ_NEXT_FIELD °¡ ´ëüÇÑ´Ù. O_NL_OVERLOAD ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é ÀÌ Æ¯¼ö ±â´ÉÀº ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù.

ÀÚ ´ÙÀ½Àº REQ_DEL_PREV ¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ:

REQ_DEL_PREV ÀÇ ÀÏ»óÀûÀÎ ±â´ÉÀº ±× ÀüÀÇ ¹®ÀÚ¸¦ Áö¿ì´Â °ÍÀÌ´Ù. ¸¸¾à Ãß°¡ ¸ðµåÀÌ°í Ä¿¼­°¡ ÁÙÀÇ ¸Ç ¾Õ¿¡ ÀÖ°í, ±× ÁÙÀÌ ±× ¾ÕÀÇ ÁÙ¿¡ ¸Â´Ù¸é, ±× ÁÙÀ» ¾ÕÁÙÀÇ µÚ¿¡ ÇÕÄ¡°í ±× ÁÙÀ» ¾ø¾Ö°Ô µÈ´Ù. (´ç½ÅÀº ÀÌ°ÍÀÌ ÇÊµå ¹öÆÛ¿¡¼­ newline ¹®ÀÚ¸¦ Á¦°ÅÇÏ´Â °ÍÀ̶õ °É ¾Ë¾ÆëÀ» °ÍÀÌ´Ù.)

±×·¯³ª, ÇʵåÀÇ ½ÃÀÛÁ¡¿¡¼­ REQ_DEL_PREV ¸®Äù½ºÆ®´Â REQ_PREV_FIELD ·Î ´Ù·ïÁø´Ù.

¸¸¾à O_BS_OVERLOAD ¿É¼ÇÀÌ ²¨Á® ÀÖÀ¸¸é, ÀÌ Æ¯¼ö ±â´ÉÀº ¾²ÀÌÁö ¾Ê°í Æû µå¶óÀ̹ö´Â ´ÜÁö E_REQUEST_DENIED ¸¦ ¸®ÅÏÇÑ´Ù.


1.18.6.6. Order Requests


¸¸¾à ´ç½ÅÀÇ Çʵ尡 Á¤·ÄµÈ »óÅÂÀÌ°í ÁÖ¾îÁø °ªÀÇ Å¸ÀÔ°ú °°Àº ´ÙÀ½À̳ª ±×ÀüÀÇ °ªÀ» Àоî¿Ã ¼ö ÀÖ´Â ÇÔ¼ö°¡ ºÙ¾î ÀÖ´Ù¸é, ÇÊµå ¹öÆÛ·Î ±× °ªÀ» °¡Á®¿Ã ¼ö ÀÖ´Â ¸®Äù½ºÆ®°¡ ÀÖ´Ù.

  • REQ_NEXT_CHOICE ¹öÆÛÀÇ ÇöÀç °ªÀÇ ´ÙÀ½¿¡ ÇØ´çÇÏ´Â °ªÀ» °¡Á®¿Â´Ù.

  • REQ_PREV_CHOICE ¹öÆÛÀÇ ÇöÀç °ªÀÇ ÀÌÀü¿¡ ÇØ´çÇÏ´Â °ªÀ» °¡Á®¿Â´Ù.

³»ÀåµÈ ÇʵåÇüÁß¿¡ TYPE_ENUM ¸¸ÀÌ ÀÌÀü °ª°ú ´ÙÀ½ °ªÀ» °¡Á®¿À´Â ÇÔ¼ö°¡ ¹Ì¸® ³»ÀåµÇ¾î ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ ´ç½Å¸¸ÀÇ ÇʵåÇü ( Custom Validation Çü Âü°í)À» Á¤ÀÇÇÑ´Ù¸é, ´ç½ÅÀº ¿ì¸®°¡ °®°í ÀÖ´Â ¼ø¼­¸¦ ¸ÂÃçÁÖ´Â ÇÔ¼ö¸¦ ºÙ¿© ³õÀ» ¼ö ÀÖ´Ù.


1.18.6.7. ¾îÇø®ÄÉÀÌ¼Ç ¸í·Éµé


Æû ¸®Äù½ºÆ®µéÀº KEY_MAX º¸´Ù Å©°í MAX_COMMAND º¸´Ù À۰ųª °°Àº curses °ªÀÇ Á¤¼ö·Î ³ªÅ¸³­´Ù. ÀÌ ¹üÀ§ ¾ÈÀÇ °ªÀº form_driver() ÇÔ¼ö¿¡ ÀÇÇØ ¹«½ÃµÈ´Ù. ±×·¯¹Ç·Î ÀÌ°ÍÀº ¾îÇø®ÄÉÀ̼ǿ¡ ÀÇÇØ ¾î¶² ¿ëµµ·Îµç ¾µ ¼ö ÀÖ´Ù. ±×°ÍÀº ¾îÇø®ÄÉÀ̼ÇÀÇ Æ¯Á¤ ±â´É ó·³ ´Ù·ïÁö¸ç ÇØ´ç ±â´ÉÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù.


1.19. Åø°ú À§Á¬ ¶óÀ̺귯¸®µé


ÀÚ ÀÌÁ¦ ´ç½ÅÀº ncurses ¿Í ±× ÀڸŠ¶óÀ̺귯¸®µéÀÇ ±â´ÉÀ» ¾Ë¾ÒÀ¸´Ï, ¼Ò¸Å¸¦ °È°í È­¸é¿¡ ¸¹Àº 󸮸¦ ÇؾßÇÏ´Â ÇÁ·ÎÁ§Æ®¸¦ ÇÒ Áغñ¸¦ ÇؾßÇÒ °ÍÀÌ´Ù. ±×·¯³ª Àá½Ã ±â´Ù·Á¶ó.. ½ÉÁö¾î ´õ ºÎ°¡ÀûÀÎ ¶óÀ̺귯¸®°¡ ÀÖ´Ù°í Çصµ º¸ÅëÀÇ ncurses ¿¡¼­ º¹ÀâÇÑ GUI À§Á¬µéÀ» ¸¸µé°í À¯ÁöÇÑ´Ù´Â °ÍÀº ²Ï³ª ¾î·Á¿î ÀÏÀÌ µÉ °ÍÀÌ´Ù. ±×·¡¼­ ¿©±â¿¡ ´ç½ÅÀÌ ´ç½Å¸¸ÀÇ À§Á¬À» ¸¸µé ÇÊ¿ä ¾øÀÌ ¹Ì¸® ¸¸µé¾î ³õÀº Åø°ú À§Á¬µéÀÌ ¸î¸î ÀÖ´Ù. ´ç½ÅÀº ±×°ÍµéÀ» ½áµµ µÇ°í ±× Äڵ忡¼­ ¾ÆÀ̵ð¾î¸¦ ¾òÀ» ¼öµµ ÀÖ°í ½ÉÁö¾î ±×°ÍµéÀ» È®ÀåÇصµ µÈ´Ù.


1.19.1. CDK (Curses Development Kit)


ÀÛ°¡ÀÇ ¸» Áß

CDK ´Â 'Curses Development Kit' ÀÇ ¾àÀÚÀÌ¸ç ±×°ÍÀº Ç® ½ºÅ©¸° curses ÇÁ·Î±×·¥À» »¡¸® °³¹ßÇϱâ À§ÇÑ 21 °³ÀÇ À§Á¬µéÀÌ ÀÖ´Ù.

ÀÌ Å°Æ®´Â ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ ¹Ù·Î ¾²ÀÏ ¼ö ÀÖ´Â ¸î¸î À¯¿ëÇÑ À§Á¬µéÀ» Á¦°øÇÑ´Ù. ÀÌ°ÍÀº ²Ï À߸¸µé¾îÁ³°í ¹®¼­È­°¡ ¸Å¿ì Àß µÇ¾ú´Ù. examples µð·ºÅ丮¾ÈÀÇ ¿¹Á¦´Â Ãʺ¸ÀÚ¿¡°Ô ÁÁÀº ½Ç½ÀÀÇ ÀåÀÌ µÉ ¼ö ÀÖ´Ù. CDK ´Â [http]http://www.vexus.ca/release/cdk.tar.gz(http://www.vexus.ca/release/cdk.tar.gz) ¿¡¼­ ´Ù¿î·Îµå ¹ÞÀ» ¼ö ÀÖ´Ù. ¼³Ä¡¸¦ ÇÒ·Á¸é README ¾ÈÀÇ µµ¿ò¸»À» Àß º¸±â ¹Ù¶õ´Ù.


1.19.1.1. À§Á¬ ¸®½ºÆ®


´ÙÀ½Àº cdk ¿¡¼­ Á¦°øÇÏ´Â À§Á¬°ú ±× ¼³¸íµéÀÌ´Ù.

#!
 Widget Type           Quick Description                                      
===========================================================================  
Alphalist             Allows a user to select from a list of words, with     
                      the ability to narrow the search list by typing in a   
                      few characters of the desired word.                    
Buttonbox             This creates a multiple button widget.                 
Calendar              Creates a little simple calendar widget.               
Dialog                Prompts the user with a message, and the user          
                      can pick an answer from the buttons provided.          
Entry                 Allows the user to enter various types of information. 
File Selector         A file selector built from Cdk base widgets. This      
                      example shows how to create more complicated widgets   
                      using the Cdk widget library.                          
Graph                 Draws a graph.                                         
Histogram             Draws a histogram.                                     
Item List             Creates a pop up field which allows the user to select 
                      one of several choices in a small field. Very useful   
                      for things like days of the week or month names.       
Label                 Displays messages in a pop up box, or the label can be 
                      considered part of the screen.                         
Marquee               Displays a message in a scrolling marquee.             
Matrix                Creates a complex matrix with lots of options.         
Menu                  Creates a pull-down menu interface.                    
Multiple Line Entry   A multiple line entry field. Very useful               
                      for long fields. (like a description                   
                      field)                                                 
Radio List            Creates a radio button list.                           
Scale                 Creates a numeric scale. Used for allowing a user to   
                      pick a numeric value and restrict them to a range of   
                      values.                                                
Scrolling List        Creates a scrolling list/menu list.                    
Scrolling Window      Creates a scrolling log file viewer. Can add           
                      information into the window while its running.         
                      A good widget for displaying the progress of           
                      something. (akin to a console window)                  
Selection List        Creates a multiple option selection list.              
Slider                Akin to the scale widget, this widget provides a       
                      visual slide bar to represent the numeric value.       
Template              Creates a entry field with character sensitive         
                      positions. Used for pre-formatted fields like          
                      dates and phone numbers.                               
Viewer                This is a file/information viewer. Very useful         
                      when you need to display loads of information.         
=========================================================================== 




1.19.1.2. ¸î¸î ¸Å·ÂÀûÀÎ ±â´Éµé


¹Ì¸® ¸¸µé¾îÁø À§Á¬µéÀ» ½á¼­ ÆíÇØÁø´Ù´Â Á¡À» ¶°³ª¼­, cdk ´Â ¿©·¯ »öÀÇ ¹®ÀÚ¿­°ú °ü·ÃµÈ ´çȤ½º·± ¹®Á¦¸¦ ÇØ°áÇؼ­, ¹®ÀÚµéÀ» ¸ÚÁö°Ô Á¤·ÄÇß´Ù. CDK ÇÔ¼ö¿¡¼­ 󸮵Ǵ Ư¼ö Æ÷¸Ë¿ë űװ¡ ¹®ÀÚ¿­¾È¿¡ ´õÇØÁ³´Ù. ¿¹¸¦ µé¾î ¸¸¾à

"</B/1>ÀÌ ÁÙÀº ÆĶõ ¹è°æ¿¡ ³ë¶õ ±Û¾¾·Î ÂïÇô¾ß µÈ´Ù.<!1>"

°ú °°Àº ÀÎÀÚ°¡ newCKDLabel() ·Î ³Ñ¾î°¡¸é, ±×°ÍÀº ÀÌ ÁÙÀ» ÆĶõ¹è°æ¿¡ ³ë¶õ ±Û¾¾·Î Âï°ÔµÈ´Ù. ¶ÇÇÑ ½ºÆ®¸µÀ» Á¤·ÄÇϰųª, ±×¸®±â¿¡ ¾²À̴ Ư¼ö ¹®ÀÚ¿ëÀÇ Å±׵鵵 ÀÖ´Ù. ÀÚ¼¼ÇÑ °ÍÀº cdk_display(3X) ÀÇ ¸Ç ÆäÀÌÁö¸¦ Âü°íÇ϶ó. ¸Ç ÆäÀÌÁö¿¡´Â ¸ÚÁø ¿¹Á¦¿Í ÇÔ²² »ç¿ë¹ýÀÌ ³ª¿Í ÀÖ´Ù.


1.19.1.3. °á·Ð


¸ðµç ¸é¿¡¼­ CDK ´Â ÀûÀýÈ÷ »ç¿ëÇÏ¸é º¹ÀâÇÑ GUI°³¹ßÀÇ °­·ÂÇÑ ÇÁ·¹ÀÓ¿÷À» ¸¸µé ¼ö ÀÖ´Â Àß ¸¸µé¾îÁø À§Á¬ ÆÐÅ°Áö ÀÌ´Ù.


1.19.2. ´ÙÀ̾ó·Î±×


Long long ago, in September 1994, when few people knew linux, Jeff Tranter wrote an [http]http://www2.linuxjournal.com/lj-issues/issue5/2807.html article on dialog in Linux Journal. He starts the article with these words..

¿À·¡ÀüÀÎ 1994³â 9¿ù¿¡ °Ü¿ì ¸î¸î »ç¶÷¸¸ÀÌ ¸®´ª½º¿¡ ´ëÇØ ¾Ë´ø ¶§, Jeff Tranter´Â [http]ÀÌ ±Û(http://www2.linuxjournal.com/lj-issues/issue5/2807.html)À» Linux Journal ¿¡ ½è´Ù. ±× ±ÛÀº ´ÙÀ½°ú °°ÀÌ ½ÃÀÛÇÑ´Ù..

¸®´ª½º´Â À¯´Ð½º¿¡ ±× ±â¹ÝÀ» µÎ°íÀÖ´Ù. °Ô´Ù°¡ À¯´Ð½º¿¡´Â ¾ø¾ú´ø ´Ù¾çÇÑ ÀÀ¿ëÇÁ·Î±×·¥°ú À¯ÀÏÇÏ°í À¯¿ëÇÑ Ä¿³ÎÀÇ ±â´Éµµ °¡Áö°í ÀÖ´Ù. Àß ¾Ë·ÁÁø º¸¼® Áß Çϳª´Â ½© ½ºÅ©¸³Æ® ¾È¿¡¼­ Àü¹®ÀûÀÎ ¸ð½ÀÀÇ ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ¸¸µé¼ö ÀÖ´Â À¯Æ¿¸®Æ¼ÀÎ 'dialog' ÀÌ´Ù. ÀÌ ±ÛÀº ´ÙÀ̾ó·Î±× À¯Æ¿¸®Æ¼¿¡ ´ëÇÑ ¼Ò°³¿Í ±×°ÍÀ» ¾î¶»°Ô »ç¿ëÇÏ°í ¾î¶² °÷¿¡ ½á¾ß µÇ´ÂÁö ¿¹Á¦¸¦ ´ã°í ÀÖ´Ù.

±×°¡ ¼³¸íÇϵíÀÌ, dialog ´Â ½±°Ô Àü¹®ÀûÀÎ ¸ð½ÀÀÇ ´ÙÀ̾ó·Î±× ¹Ú½º¸¦ ¸¸µå´Â ÁøÂ¥ º¸¼®ÀÌ´Ù. ±×°ÍÀº ´ÙÀ̾ó·Î±× ¹Ú½º, ¸Þ´º, üũ ¸®½ºÆ® µî ´Ù¾çÇÑ °ÍÀ» ¸¸µé ¼ö ÀÖ´Ù. ±×¸®°í ±×°ÍÀº ±âº»ÀûÀ¸·Î ¼³Ä¡µÈ´Ù. ¸¸¾à ±×·¸Áö ¾Ê´Ù¸é ibiblio linux archive ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù.

À§¿¡ ¾ð±ÞµÈ ±Û¿¡´Â ±×°ÍÀÇ »ç¿ë°ú ±â´É¿¡ ´ëÇÑ ¾ÆÁÖ ÁÁÀº °³¿ä°¡ ³ª¿Í ÀÖ´Ù. ¸Ç ÆäÀÌÁö¿¡´Â º¸´Ù »ó¼¼ÇÑ °ÍÀÌ ÀÖ´Ù. ±×°ÍÀº ´Ù¾çÇÑ »óȲ¿¡ ¾µ ¼ö ÀÖ´Ù. ÁÁÀº ¿¹´Â ¸®´ª½º Ä¿³ÎÀ» ÅؽºÆ® ¸ðµå·Î ¸¸µé ¶§ ÀÌ´Ù. ¸®´ª½º Ä¿³ÎÀº ±×°ÍÀÇ ÇÊ¿ä¿¡ µû¶ó ¾à°£ ¼öÁ¤µÈ dialog ¹öÀüÀ» »ç¿ëÇÏ°í ÀÖ´Ù.

dialog ´Â ¾ÖÃÊ¿¡ ½© ½ºÅ©¸³Æ®¿¡¼­ »ç¿ëÇϵµ·Ï µðÀÚÀÎ µÇ¾ú´Ù. ¸¸¾à ´ç½ÅÀÌ ±× ±â´ÉÀ» C ÇÁ·Î±×·¥¿¡¼­ ¾²°í ½Í´Ù¸é libdialog ¸¦ ½á¶ó. ¿©±â¿¡ °ü·ÃµÈ ¹®¼­´Â Á» ºó¾àÇÏ´Ù. °áÁ¤ÀûÀÎ Âü°í ¹®¼­´Â ¶óÀ̺귯¸®¿¡ ÀÖ´Â dialog.h Çì´õÆÄÀÏÀÌ´Ù. ´ç½ÅÀº ¿øÇÏ´Â °ÍÀ» ¾ò±â À§ÇØ ¿©±âÀú±â¸¦ ÇØÅ·Çغ¸¾Æ¾ß ÇÒÁöµµ ¸ð¸¥´Ù. ¼Ò½º´Â ½±°Ô ¼öÁ¤ÇØ º¼ ¸¸ ÇÏ´Ù. ³ª´Â ±×°É ¼öÁ¤Çؼ­ ¿©·¯¹ø ½á¸Ô±âµµ Çß´Ù.


1.19.3. Perl Curses Modules CURSES::FORM and CURSES::WIDGETS


ÆÞ¿ë ¸ðµâÀÎ Curses ¿Í Curses:Form, Curses::Widgets ´Â ÆÞ¿¡¼­ curses ¸¦ ¾µ ¼ö ÀÖ°Ô ÇÑ´Ù. ¸¸¾à ´ç½ÅÀÌ curses ¸¦ °¡Áö°í ÀÖ°í ±âº» perl ÀÌ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é, ÀÌ ¸ðµâµéÀ» CPAN All Modules page ¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù. Curses Ä«Å×°í¸®¿¡¼­ ÁýÀ¸·Î ¾ÐÃàµÈ ¼¼°³ÀÇ ¸ðµâÀ» ±¸Çضó. Çѹø ÀνºÅç ÈÄ¿¡´Â ÀÌ ¸ðµâµéÀ» ÆÞ ½ºÅ©¸³Æ®¿¡¼­ ´Ù¸¥ ¸ðµâµé ó·³ ¾µ ¼ö ÀÖ´Ù. ÆÞ ¸ðµâ¿¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸´Â perlmod ¸Ç ÆäÀÌÁö¸¦ Âü°íÇضó. À§ ¸ðµâ¿¡´Â ¹®¼­È­°¡ Àß µÇ¾î ÀÖ°í ±â´ÉÀ» Å×½ºÆ®Çغ¼ ¿¹Á¦ ½ºÅ©¸³Æ®µµ ÀÖ´Ù. ºñ·Ï °°ÀÌ Á¦°øµÇ´Â À§Á¬ÀÌ ¾ÆÁ÷Àº ¹ÌÈíÇÏÁö¸¸, ÀÌ ¸ðµâµéÀº ÆÞ¿¡¼­ curses ¶óÀ̺귯¸®¸¦ Àß ¾µ ¼ö ÀÖ°Ô ÇØÁÖ°í ÀÖ´Ù.

´õ ¸¹Àº Á¤º¸´Â Curses(3), Curses::Form(3) ¹× Curses::Widgets(3) ¸Ç ÆäÀÌÁö¸¦ Âü°íÇضó. ÀÌ ¸Ç ÆäÀÌÁöµéÀº À§ ¸ðµâµéÀ» ¹Þ¾Æ¼­ ¼³Ä¡Çؾ߸¸ º¼ ¼ö ÀÖ´Ù.


1.20. Just For Fun !!!


ÀÌ ¼½¼Ç¿¡´Â ³»°¡ ±×³É Àç¹Ì·Î ¸¸µé¾îº» ¸î¸î ÇÁ·Î±×·¥µéÀ» ¼Ò°³ÇÏ°í ÀÖ´Ù. ¾Æ¸¶ À̰ͺ¸´Ù ´õ ³ªÀº ÇÁ·Î±×·¥ À̳ª ncurses ¸¦ ´õ Àß ¾²´Â ¹æ¹ýµéÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥µéÀº Ãʺ¸ÀÚ·Î ÇÏ¿©±Ý ¾ÆÀ̵ð¾î¸¦ ¾òÀ» ¼ö ÀÖ°Ô ÇÏ°í ÀÌ ¼½¼Ç¿¡ ´õ ¸¹Àº ÇÁ·Î±×·¥µéÀ» Á¦°øÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇØ ¿©±â ÀÖ´Â °ÍÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ ¸ÚÁö°í °£´ÜÇÑ ÇÁ·Î±×·¥µéÀ» curses ·Î ¸¸µé¾ú°í ±×°ÍÀ» ¿©±â¿¡ Æ÷ÇÔ½ÃÅ°°í ½Í´Ù¸é Mp_padala_at_yahoo.com ¿¡°Ô ¿¬¶ôÇØÁֱ⠹ٶõ´Ù.


1.20.1. The Game of Life


Game of life ´Â ¼öÇÐÀÇ ¸¶¹ýÀÌ´Ù. [http]Paul CallahanÀÇ ¸»(http://www.math.com/students/wonders/life/life.html)¿¡¼­ Game of Life (ÁÙ¿©¼­ Life)´Â ÈçÈ÷ ¸»ÇÏ´Â °ÔÀÓÀÌ ¾Æ´Ï´Ù. Ç÷¹À̾ ¾ø°í, À̱â°Å³ª Áö´Â °Íµµ ¾ø´Ù. Çѹø ±× "Á¶°¢µé" ÀÌ ½ÃÀÛ À§Ä¡¿¡ ³õÀÌ°Ô µÇ¸é µÚ¿¡ ÀϾ ¸ðµç °ÍµéÀº ·êÀÌ °áÁ¤ÇÑ´Ù. ±×·³¿¡µµ ºÒ±¸ÇÏ°í, Life ´Â ³î¶ó¿î ÀÏ Åõ¼ºÀÌ´Ù. ´ëºÎºÐÀÇ °æ¿ì ½ÃÀÛ À§Ä¡( ¶Ç´Â ÆÐÅÏ ) À» º¸°í ¾ÕÀ¸·Î ¾î¶²ÀÏÀÌ ÀϾÁö ¿¹ÃøÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. ±×°ÍÀ» ¾Ë¾Æ³»´Â ´ÜÇϳªÀÇ ¹æ¹ýÀº ·êÀ» µû¶ó°¡ º¸´Â °ÍÀÌ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº °£´ÜÇÑ µÚÁýÈù U ÆÐÅÏÀ¸·Î ½ÃÀÛÇؼ­ life °¡ ¾ó¸¶³ª °æÀÌ·Ó°Ô µ¿ÀÛÇÏ´ÂÁö º¸¿©ÁØ´Ù. ÇÁ·Î±×·¥¾È¿¡´Â °³¼±ÇؾßÇÒ ¿©Áö°¡ ¸¹´Ù. ´ç½ÅÀº »ç¿ëÀÚ°¡ ¿øÇϴ´ë·Î ÆÐÅÏÀ» ÀÔ·ÂÇϰųª ÆÄÀÏ¿¡¼­ ±×°ÍÀ» Àоî¿À°Ô ÇÒ ¼öµµ ÀÖ´Ù. ¶ÇÇÑ ·êÀ» ¹Ù²Ü ¼öµµ ÀÖÀ¸¸é ±×°ÍÀ» ´Ù¾çÇÏ°Ô ¸¸µé¾î º¼ ¼öµµ ÀÖ´Ù. game of life ¿¡ ´ëÇÑ ´õ Èï¹Ì·Î¿î Á¤º¸µéÀº [http]±¸±Û(http://www.google.com) ¿¡¼­ ã¾Æº¸±â ¹Ù¶õ´Ù.

File Path: JustForFun/life.c


1.20.2. Magic Square


¶Ç ´Ù¸¥ ¼öÇÐÀÇ ¸¶¹ýÀÎ Magic Squre ´Â ÀÌÇØÇϱâ´Â ¸Å¿ì ½¬¿ì³ª ¸¸µé±â°¡ ¸Å¿ì ¾î·Æ´Ù. magic square ¿¡¼­ °¢ ÁÙÀÇ ¼ýÀÚÀÇ ÇÕ °¢¿­ÀÇ ¼ýÀÚÀÇ ÇÕÀº °°´Ù. ½ÉÁö¾î ´ë°¢¼±ÀÇ ÇÕµµ °°À» ¼ö ÀÖ´Ù. µ¶Æ¯ÇÑ ¼³Á¤À» °¡Áö´Â ´Ù¾çÇÑ º¯Á¾µéÀÌ ÀÖ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº Ȧ¼ö Å©±âÀÇ °£´ÜÇÑ magic square ¸¦ ¸¸µç´Ù.

File Path: JustForFun/magic.c


1.20.3. Towers of Hanoi


À¯¸íÇÑ ÇϳëÀÌÀÇ Å¾ÀÌ´Ù. ÀÌ °ÔÀÓÀÇ ¸ñÇ¥´Â ù¹ø° Àå´ëÀÇ ÆÇÀ» Áß°£ÀÇ Àå´ë¸¦ Àӽ÷Π»ç¿ëÇÏ¿© ¸¶Áö¸· Àå´ë±îÁö ¿Å±â´Â °ÍÀÌ´Ù. ±ÔÄ¢Àº ¹Ø¿¡ ÀÖ´Â °Íº¸´Ù ´õ Å« ÆÇÀ» À§¿¡´Ù ³õÀ» ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù.

File Path: JustForFun/hanoi.c


1.20.4. Queens Puzzle


À¯¸íÇÑ N-Queen ÆÛÁñÀÇ ¸ñÀûÀº N X N Å©±âÀÇ Ã¼½ºÆÇ¿¡ N ¸íÀÇ ÄýÀ» ¼­·Î °ø°ÝÇÏÁö ¾Ê°Ô ³öµÎ´Â °ÍÀÌ´Ù.

ÀÌ ÇÁ·Î±×·¥Àº ÀÌ ¹®Á¦¸¦ °£´ÜÇÑ ¹éÆ®·¡Å· ±â¼ú·Î Ç®¾ú´Ù.

File Path: JustForFun/queens.c


1.20.5. Shuffle


½Ã°£À» º¸³»¾ß ÇÒ¶§ Çغ¼ ¸¸ÇÑ °ÔÀÓÀÌ´Ù.

File Path: JustForFun/shuffle.c


1.20.6. Typing Tutor


°£´ÜÇÑ Å¸ÀÌÇÎ µµ¿ì¹Ì´Ù. ³ª´Â °£´ÜÈ÷ »ç¿ë¸¸Çϱ⺸´Ù ÇÊ¿ä¿¡µû¶ó Á»´õ ¸¹Àº ±â´ÉÀ» ¸¸µé¾ú´Ù. ¸¸¾à ´ç½ÅÀÌ Å°º¸µåÀÇ ¿îÁö¹ýÀº ¾ËÁö¸¸ ¿¬½ÀÀ» ¸¹ÀÌ ¸øÇغôٸé ÀÌ°ÍÀÌ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

File Path: JustForFun/tt.c


ID
Password
Join
Your own qualities will help prevent your advancement in the world.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2014-03-22 18:53:48
Processing time 0.0752 sec