· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linuxdoc Sgml/Gtk Tutorial-TRANS

GTK 1.x Tutorial

GTK 1.x Tutorial

Ian Main imain@gtk.org, Tony Gale gale@gtk.org

1998³â 5¿ù 24ÀÏ

¼­ÁÖÅÂ liberta@cau.ac.kr, ÇÑÁöÈ£ hanjiho@penta.co.kr

1998³â 5¿ù 25ÀÏ

1. ¿Å±äÀÌÀÇ ¸»

Áö³­ 2¿ù ¸»ºÎÅÍ Á¶±Ý¾¿ ¹ø¿ªÇØ º» GTK TutorialÀÔ´Ï´Ù. Ãâó´Â GTK+ÀÇ °ø½Ä ȨÆäÀÌÁöÀÎ http://www.gtk.org/ÀÔ´Ï´Ù. ¹ø¿ªÀ» ´ëÃæ ³¡¸¶Ä£ Áö±Ý(3/??), ÀÌ TutorialÀº 1998/1/24 ³¯Â¥·Î ¿Ã¶ó¿Â °ÍÀÌ °¡Àå »õ·Î¿î °ÍÀ̳׿ä. ¹°·Ð ÀÌ ¹ø¿ª¹°µµ ±×°ÍÀ» ±âÁØÀ¸·Î Çß½À´Ï´Ù. ¶Ç ÀçȰ¿ë¼º(?)À» À§ÇÏ¿© óÀ½ºÎÅÍ ³¡±îÁö ÀϹÝÀûÀÎ ÅØ½ºÆ®(plain text)ÀÇ Æ÷¸ËÀ» À¯ÁöÇß½À´Ï´Ù.

GTK+ TutorialÀº ¸ðµÎ 24°³ÀÇ Àå(Chapter)À¸·Î ÀÌ·ç¾îÁ³°í ¸¶Áö¸· ÀåÀÎ 24ÀåÀ» ºñ·ÔÇÑ ¸î¸îÀº ¿ÀÈ÷·Á ¿ø¹®À» ±×´ë·Î Âü°íÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀ̶ó°í ÆÇ´Ü, °ÅÀÇ ¹ø¿ªÇÏÁö ¾Ê¾Ò½À´Ï´Ù. ±×¸®°í Á¦°¡ ¹ø¿ªÇß´Ù°í ÁÖÀå(?)ÇÏ´Â ³ª¸ÓÁö Àåµéµµ, ¿ø·¡ »ó½ÄÀÌÇÏÀÇ ¿µ¾î½Ç·Â°ú ¼öÁØÀÌÇÏÀÇ Xlib/Widget Programming °æÇèÀ¸·Î ÀÎÇØ ²Ï³ª ¾îÁö·´°Ô ¾µ ¼ö¹Û¿¡ ¾ø¾ú½À´Ï´Ù. ÇÏÁö¸¸ ³ª¸§´ë·Î ½Å°æÀº ½èÀ¸´Ï±ñ, ¾Ë¾Æ¼­ ¹Þ¾ÆµéÀÌ½Ã±æ ¹Ù¶ø´Ï´Ù. :) ¹ø¿ªÇÑ ³»¿ëÀÇ Á¤È®¼º¿¡ ´ëÇØ¼­µµ Ã¥ÀÓ ¸ø Áý´Ï´Ù. ¶ÇÇÑ ´õ È¿°úÀûÀÎ ÀÌÇØ¸¦ À§Çؼ­ ¿¹Á¦¸¦ Á÷Á¢ ÄÄÆÄÀÏ/½ÇÇàÇØ º¸½Ç °ÍÀ» ±ÇÇÕ´Ï´Ù.

ÀÌ Tutorial ¹ø¿ª¹®À» º¸´Â µ¥ À־, ¾îÁö·¯¿òÀ» Á¶±ÝÀ̳ª¸¶ ´ú¾î µå¸®±â À§ÇØ ÀüüÀûÀÎ À±°ûÀ» ¼Ò°³ÇÕ´Ï´Ù.

¼Ò°³

GTK(GTK+)ÀÇ ¼³°è¿Í ¼Ò°³ÀÔ´Ï´Ù. ÀÌ¹Ì ³ª¿ì ¸®µ¿(go linux) ¹ø¿ª¹° °Ô½ÃÆÇ¿¡ ¿Ã¸° GTK+ FAQÀÌ Âü°í°¡ µÉ °ÍÀÔ´Ï´Ù.

½ÃÀÛÇϸ鼭

GTK ¾îÇÃÀÇ ÀüÇüÀûÀÎ ±¸Á¶¿Í, ±× À¯¸íÇÑ helloworld.c ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ±×¸®°í ´Ùµé °ñÄ¡¾ÆÆÄ ÇÏ´Â ÄÄÆÄÀÏ ¿É¼Çµµ °£´ÜÈ÷ ¼³¸íµÇ¾î ÀÖÁÒ. Áß¿äÇÑ ÀÌ·Ð, Áï ½Ã±×³Î(signal)°ú ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ(callback function)¸¦ GTK°¡ ÀÌ¿ëÇÏ´Â ¹æ½Ä¿¡ ´ëÇØ¼­µµ ´Ù·ì´Ï´Ù.

¾ÕÀ¸·Î ³ª¾Æ°¡¸ç

helloworld.c¸¦ Á¶±Ý °³¼±Çϸ鼭 ÀÚ·áÇüµé¿¡ ´ëÇÑ ÀܼҸ® ÂɱÝ, ±×¸®°í ½Ã±×³Î Çڵ鷯¿¡ ´ëÇÑ º¸Ãæ¼³¸íÀÌ ÀÖ½À´Ï´Ù. ½Ã±×³Î, Áß¿äÇÑ °ÅÁÒ.

ÆÐÅ· Widget

ÆÐÅ·(packing)À̶ó´Â Áß¿äÇÑ °³³ä¿¡ ´ëÇØ(Àúµµ Áö±ßÁö±ßÇØÁ³½À´Ï´Ù` :) ¿¹Á¦¿Í ÇÔ²² ¼³¸íÇϰí ÀÖ½À´Ï´Ù. ÆÐÅ·Àº »ç°¢ÇüÀÇ ¾î¶² ¿µ¿ª¿¡ ¹º°¡¸¦ ³Ö¾î µÐ´Ù´Â Àǹ̷Î, GTK+ó·³ À©µµ, °´Ã¼¸¦ ´Ù·ç´Â °³¹ß¹æ½Ä¿¡¼­ ±²ÀåÈ÷ ±âº»ÀûÀ̰í "ÀÚÁÖ ³ª¿À´Â" ³ðÀÔ´Ï´Ù. ¿©±â¼­´Â Çϳª¾¿ ÆÐÅ·Çϱâ À§ÇÑ ¹Ú½º(box)°³³ä°ú, ¿©·¯°³¸¦ ÇѲ¨¹ø¿¡ ÆÐÅ·Çϱâ À§ÇÑ Å×À̺í(table)°³³äÀ» Â÷·Ê´ë·Î ¼Ò°³ÇÕ´Ï´Ù.

WidgetÀÇ °³¿ä

FAQ¿¡¼­µµ ¾ð±ÞÇß°í, ÀÌ ¹®¼­ÀÇ º»¹®¿¡µµ ¿©·¯¹ø °­Á¶µÆÁö¸¸, GTK+Àº C¾ð¾îÀÇ typedef struct{...} WidgetObject; °°Àº ÀÌ¿ëÀ¸·Î "°´Ã¼ÁöÇâ±â¹ý"À» Ãß±¸Çϰí ÀÖ½À´Ï´Ù. ¹°·Ð C++¿¡¼­ÀÇ public member functionÀ» Èä³»³»±â À§ÇØ return_type (*func_pointer)(parameters,...) À¸·Î ¼±¾ðµÇ´Â callback ÇÔ¼ö¸¦ ¾¹´Ï´Ù. ¿©±â¼­ func_pointerÀÇ Á¤Ã¼¸¦ ¾Ë°í, ±×¸®°í Àß ½á¸ÔÀ» ¼ö ÀÖÀ» Á¤µµÀÇ "C¾ð¾î ½Ç·Â(?)"¸¸ ÀÖ´Ù¸é GTK¸¦ °ñ·Á°¡¸ç ÀÌ±æ ¼ö ÀÖÀ» °Ì´Ï´Ù. GTK+Àº ÀÌ·¸°Ô ±×´ÙÁö ¾î·Á¿î °Ô ¾Æ´Õ´Ï´Ù. :) ÀÌ Àå¿¡¼­´Â GTK+ ObjectÀÇ ÀüºÎ³ª ´Ù¸§¾ø´Â widget¿¡ ´ëÇØ, ÀÏÁ¾ÀÇ °ø°Ý ÀÛÀü¼³¸íÀ» ÇØÁÖ°í ÀÖ½À´Ï´Ù. ÀÌ¹Ì ´Ù¸¥ Widget Áý´ÜÀ» ½áº» °æÇè ȤÀº ÃÖ¼ÒÇÑ Xlib¸¦ ´Ù·ïº» °æÇèÀÌ ÀÖ´Ù¸é C¾ð¾î¿¡ ´ÉÅëÇÑ °Í¸¸Å­À̳ª Å« µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù. Âü, ÀÌ Àå¿¡´Â Gtk widget objectµéÀÇ °èÃþ±¸Á¶µµ ÁÙÁÙÀÌ ¼Ò°³µÇ¾î ÀÖ½À´Ï´Ù. ¸Å¿ì ¿ä±äÇÑ Á¤º¸ÁÒ.

¹öư widget

¿ì¼± Á¦ÀÏ ¸¸¸¸ÇÑ widgetÀ¸·Î ¹öưÀ» ÇØÄ¡¿ì°í ÀÖ½À´Ï´Ù. ±×³É ¹öư, ÀÌ»Û ¹öư(ÇȽº¸ÊÀÌ ºÙÀº *), ƯÀÌÇÑ ¹öư(Åä±Û, üũ, ¶óµð¿À,..) µî ¿ì¸®°¡ À©µµ¿ë ÀÀ¿ë¾îÇõ鿡¼­ ¸¹ÀÌ ÀÌ¿ëÇØ ¿Â ¸ðµç(?) Á¾·ùÀÇ ¹öưµéÀ» ÆÄÇìĨ´Ï´Ù.

´Ù¾çÇÑ widgetµé

ÀÚ±â È¥ÀÚ ¾²À̱⺸´Ù ´Ù¸¥ widgetÀ» ²Ù¹Ì±â À§ÇØ ¾²ÀÌ´Â °æÇâÀÌ ÀÖ´Â ¸î°¡Áö Àâ´ÙÇÑ widgetÀ» ¼Ò°³ÇÕ´Ï´Ù. ¶óº§(label), dz¼±µµ¿ò¸»(tooltip), ÁøÇà ¸·´ë(progress bar), ´ëÈ­»óÀÚ(dialog box), ÇȽº¸Ê(pixmap) µîÀÔ´Ï´Ù. ƯÈ÷ ÇȽº¸Ê¿¡ ´ëÇØ¼­´Â ²Ï ±æ°í ÀÚ»óÇϰÔ(?) ´Ù·ð±º¿ä. TooltipÀ» dz¼±µµ¿ò¸»À̶ó°í ÇØ¼®ÇÑ °Ç, MacOS(ÇÑ±ÛÆÇ)¿¡¼­ ±×·± °É dz¼±µµ¿ò¸»À̶ó ºÎ¸£´Â µ¥ Àͼ÷ÇØÁ³±â ¶§¹®ÀÔ´Ï´Ù. ¶Ç´Ù¸¥ Ç¥ÇöÀº ¸ô¶ó¿ä. :) ¶Ç, °£´ÜÇϸ鼭µµ °ÅÀÇ ¸ðµç ¾îÇõ鿡¼­ ¿ä±äÇÏ°Ô ¾²ÀÏ ÆÄÀϼ±Åà ¹Ú½º°¡ ¼Ò°³µÇ¾î ÀÖ½À´Ï´Ù. ±×³É '½¬¾î°¡´Â ÆäÀÌÁö' Á¤µµ µÉ µí Çϳ׿ä. :) ¿¹Á¦¸¦ ÄÄÆÄÀÏÇØ¼­ ½ÇÇàÇØ º¸¸é, ¿Ö ³Êµµ³ªµµ ŸŶ(toolkit)À» ã´ÂÁö ¾Ë ¼ö ÀÖÀ» °Ì´Ï´Ù.

ÄÁÅ×ÀÌ³Ê widget

³ëÆ®ºÏ(notebook)°ú ½ºÅ©·ÑµÈ À©µµ(scrolled window)¸¦ ´Ù·ì´Ï´Ù. À̵éÀº °á°úÀûÀ¸·Î º¸¿©Áö°Ô µÉ ´Ù¸¥ widgetµéÀ» Á¶Á÷ÀûÀ¸·Î °ü¸®ÇÏ´Â widget µéÀÔ´Ï´Ù. À¥½áÄ¡¿£Áø(Yahoo,Altavista,..)À¸·Î ÈçÇÑ ´Ü¾î, ¿¹¸¦µé¾î "girl"À» °Ë»öÇØº¸¸é ´Ùµé ¾Ë´Ù½ÃÇÇ ¹«Áö¸·ÁöÇÑ °¹¼öÀÇ ¸µÅ©°¡ ½ñ¾ÆÁöÁÒ? À̶§ È­¸éÀ» °ü¸®Çϱâ À§ÇØ À¥ºê¶ó¿ìÀú À©µµ´Â ½ºÅ©·ÑµË´Ï´Ù. Áï, ½ºÅ©·Ñ¹Ù(scroll bar)°¡ »ý±âÁÒ. ÇÏÁö¸¸ "girl"ÀÇ °æ¿ìó·³ ¼öõ ¼ö¸¸ °³ÀÇ ¸µÅ©¸¦ °¡Á³´Ù¸é ½ºÅ©·Ñ¹Ù ·Îµµ °¨´ç¸øÇÏÁÒ? ±×·¡¼­ ±× ÆäÀÌÁöÀÇ Á¦ÀÏ ¾Æ·¡ÂÊ¿¡ ³»·Á¿Íº¸¸é Àüü ¸µÅ©¸¦ 1ºÎÅÍ 20±îÁö, ±×¸®°í <´õ ÀÖÀ½(NEXT)>À̶ó´Â, ÆäÀÌÁö(page)·Î °ü¸®Çϰí ÀÖÀ½À» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÆäÀÌÁö¸¦ °ü¸®ÇÏ´Â °Ô ³ëÆ®ºÏÀÔ´Ï´Ù.

¸®½ºÆ® widget

ÆÄÀϸŴÏÀú(file manager)°¡ °¡Àå ÁÁÀº ¿¹°¡ µÇ°Ú³×¿ä. M$À©µµ±×ÀÇ Å½»ö±â(explorer)³ª TkDeskÀÇ ÆÄÀϰü¸®Ã¢À» º¸¸é, °¢ ÆÄÀÏÀÇ À̸§°ú ¼Ó¼ºµéÀ» ¾ÆÀÌÅÛ(item)À¸·Î ÇÏ´Â ¸®½ºÆ®(list)·Î ÀÌ·ç¾îÁ® ÀÖ½À´Ï´Ù. ÀÌ Àå¿¡¼­ ´Ù·ç´Â °ÍÀº ÀÌ·± ¸®½ºÆ®¸¦ ¸¸µå´Â ¹æ¹ý°ú, ¸¶¿ì½º¹öưÀÇ Á¿ìŬ¸¯À» ÀûÀýÈ÷ ³¢¿ö¸ÂÃç ¼±ÅÃ(selection)À» °ü¸®ÇÏ´Â ¹æ¹ý µîÀÔ´Ï´Ù. °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ ÀÖÀ¸´Ï Âü°íÇϼ¼¿ä.

¸Þ´º widget

¸Þ´º(menu)¸¦ ¸¸µå´Â ¹æ¹ýÀ» ¼Ò°³Çϰí ÀÖ½À´Ï´Ù. GTK+ ¿ª½Ã ÇϳªÀÇ ÅøÅ¶À̴ϱñ ³ª¸§´ë·Î ¸Þ´º Çϳª ¸¸µé¾î ÁÖ´Â ÇÔ¼ö ÂëÀº Á¦°øÇÕ´Ï´Ù. ±×¸®°í ¼¶¼¼ÇÔ¿¡¼± ¾à°£ ¶³¾îÁöÁö¸¸, ¸Þ´º¸¦ ¿Õâ ´ë·®»ý»êÇØÁÖ´Â °øÀå(factory)µµ Á¦°øÇÕ´Ï´Ù. ¸Þ´º¿¡´Â Ç®´Ù¿î(pull-down)°ú ÆË¾÷(pop-up) µÎ°¡Áö°¡ ÀÖÁÒ. ±×¸®°í ½¬¿î ¹æ¹ý°ú "´õ" ½¬¿î ¹æ¹ý(¸Þ´º°øÀå)À» °¢°¢ ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï µÎ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ ¼Ò°³µÇ¾ú½À´Ï´Ù.

ÅØ½ºÆ® widget

¸¹Àº ¾çÀÇ ÅØ½ºÆ®¸¦ ´Ù·ê ¶§ Æí¸®ÇÑ ÅØ½ºÆ® widget¿¡ °üÇØ ¼³¸íÇϰí ÀÖ½À´Ï´Ù. ÀÌ widgetÀº ÀÏ¹Ý ÅØ½ºÆ® ¿¡µðÅͳª ºä¾î¿Í ºñ½ÁÇÑ ±â´ÉÀ» °®°í ÀÖ½À´Ï´Ù.

¹®¼­È­µÇÁö ¾ÊÀº widgetµé

'ÀÌ·± °Íµé¿¡ ´ëÇØ¼­´Â ¾ÆÁ÷ Æ©Å丮¾óÀÌ ¾øÀ¸´Ï ´ç½ÅÀÌ ÇÑ ¹ø ¸¸µé¾î ºÁ!' -> ÀÌ·¯´Â±º¿ä. :) ´©°¡ º»º¸±â·Î Preview¶ó´Â widget¿¡ ´ëÇØ ½á³ù´Ù¸ç ±× ¹®¼­¸¦ ÀοëÇß´õ±º¿ä. ÇÏÁö¸¸ Àü ±× ºÎºÐÀ» °ú°¨È÷(?!) »èÁ¦Çϰí ÀÌ Àå Àüü¸¦ ºñ¿öµ×½À´Ï´Ù. (Á˼۠*) www.gtk.org¿¡ ÀÖ´Â ¿ø¹®À» Âü°íÇϼ¼¿ä.

À̺¥Æ®¹Ú½º widget

gtk+970916.tar.gz ÀÌÈÄÀÇ ¹èÆ÷º»¿¡¼­¸¸ Áö¿øÇÏ´Â widgetÀ̶ó´Â±º¿ä. ¸Þ´ºµµ ¾Æ´Ï°í ¹öưµµ ¾Æ´Ï°í, ¾î·µç °á°úÀûÀ¸·Î À¯¿ëÇϰÔ(?) ¾²Àδٳ׿ä. :)

WidgetÀÇ ¼Ó¼ºÀ» ¼¼ÆÃÇϱâ

Á¦¸ñÀº ±×·²µíÇÏÁö¸¸, ½ÇÁ¦·Î ÀÌ ÀåÀ» ¿­¾îº¸´Ï ÇÔ¼ö¿øÇü(prototype) ¸î °³ »ÓÀÌ´õ±º¿ä. ÇÏÁö¸¸ GTK+¿¡¼­µµ ¿ª½Ã ±ä ÇÔ¼öÀ̸§Àº ±× ÀÚü°¡ ¼³¸íÀÔ ´Ï´Ù. ù ºÎºÐ¿¡ ¹«½¼ ÀܼҸ®°¡ ÀÖ´øµ¥, ±×³É ÀÖ´Â ±×´ë·Î ÇØ¼®ÇØ µ×½À´Ï´Ù. °¢ widget objectµéÀÇ ¼Ó¼º(property)À» °ü¸®Çϱâ À§ÇÑ ÇÔ¼öµéÀÔ´Ï´Ù.

ŸÀӾƿô, ±×¸®°í I/O¿Í Idle ÇÔ¼öµé

ÁÖ¾îÁø ½Ã°£(milliseconds)¸¶´Ù È£ÃâµÇ´Â ÇÔ¼ö, ±×³É ´ë±âÇÏ´Â ÇÔ¼ö, µ¥ÀÌÅÍÀÇ À̵¿À» °¨½ÃÇÏ´Â(monitoring) ÇÔ¼ö µîÀÌ ¼Ò°³µÇ¾î ÀÖ½À´Ï´Ù. ¿¹Á¦´Â ¾øÁö¸¸ ´ëÃæ º¸¸é °¨ÀÌ ÀâÈú °Ì´Ï´Ù. ^^;

Selection °ü¸®Çϱâ

´ëºÎºÐÀÇ Å͹̳ÎÀ̳ª ¿¡µðÅÍ(editor)´Â ¸¶¿ì½º·Î º»¹®À» Âï ±ÜÀ¸¸é ±× ¼±ÅÃµÈ ¿µ¿ªÀÌ ¹ÝÀüµÇ°í, ¸Þ´º¿¡¼­ ±× ¿µ¿ª¿¡ ´ëÇØ Ä«ÇÇ(copy), ÄÆ(cut), ÆäÀ̽ºÆ®(paste) µîÀÇ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·±µ¥ ¾î¶² ¿¡µðÅÍ¿¡¼­ ¹º°¡ ±Ü¾î³õ°í °ð¹Ù·Î ´Ù¸¥ ¿¡µðÅÍÀÇ ¶Ç ÇÑ ¿µ¿ªÀ» ±ÜÀ¸¸é º¸Åë ¾î¶»°Ô µÇ´ø°¡¿ä? Á¦°¡ ±â¾ïÇÏ´Â °ÅÀÇ ¸ðµç ¾îÇÃÀÇ °æ¿ì, ¸ÕÀú ±Ü¾ú´ø ³»¿ëÀº '¹«½Ã'µÇ´õ±º¿ä. ÀÌ·± ¹®Á¦¸¦ selectionÀÌ °ü¸®ÇÕ´Ï´Ù. ±²ÀåÈ÷ ¾î·Á¿î ´Ü¾îµµ ÀÖ°í ÇØ¼­, °Ü¿ì ¹ø¿ªÇß½À´Ï´Ù. (¿ø¹®Àº ²Ï ÀоîÁÙ ¸¸ Çߴµ¥, Á¦°¡ ¹ø¿ªÇÑ °Ç ³ªµµ ÀбⰡ ½È³×¿ä. :)

glib

GTK+ FAQ¿¡¼­µµ °£´ÜÈ÷ ¹àÇûÁö¸¸, GTK+´Â ±âÁ¸ÀÇ libc°¡ ¾Æ´Ñ, glib¸¦ ÀÌ¿ëÇÕ´Ï´Ù. ´çÀå °¢ Ç÷§Æû¿¡¼­ ÀÌ »õ·Î¿î ¹öÀüÀÇ C ¶óÀ̺귯¸®¸¦ ¼³Ä¡ÇØ¾ß ÇÒ »Ó¸¸ ¾Æ´Ï¶ó, ¸î°¡Áö Ç¥ÁØÇÔ¼öµéÀÌ glib¿¡¼­ ¾î¶»°Ô º¯Çß´ÂÁö ´ëÃæ ¾Ë¾Æ³ö¾ß ÇϰÚÁÒ. (ÀϹÝÀûÀÎ »ç¿ëÀÚ ÀÔÀå¿¡¼­´Â º°·Î º¯ÇÑ °Ô ¾ø½À´Ï´Ù, ¿ø·¡ printf°¡ g_print·Î ¹Ù²ï ½ÄÀ̴ϱñ¿ä. ;) ÀÌ Àå¿¡¼­´Â ±âÁ¸ÀÇ libc¿¡¼­´Â Á¦°øÇÏÁö ¾Ê´Â »õ·Î¿î °ÍµéÀ» À§ÁÖ·Î, °£´ÜÇÑ ¼³¸íÀ» Çϰí ÀÖ½À´Ï´Ù. °¢ ÀÚ·áÇü¸¶´ÙÀÇ ±ØÇѰª(extrema)°ú, ¾ÆÅ°ÅØÃÄ (architecture)¿¡ °ü°è¾øÀÌ typedefµÈ ÁÖ¿ä ÀÚ·áÇü(data type)µé, ±×¸®°í ¸»ÀÌ ³ª¿Â ±è¿¡ ÁÙÁÙÀÌ ¿¬°á¸®½ºÆ®(linked list)µµ ¼Ò°³ÇØ ³ù±º¿ä. ±âÁ¸ÀÇ ¸Þ¸ð¸® °ü¸® ÇÔ¼ö ´ë½Å ¾²¶ó¸é¼­ g_malloc/g_free¸¦ ºñ·ÔÇÑ, glibÆÇÀÇ ¸Þ¸ð¸®ÇÔ¼öµéµµ ÀÖÀ¸¸ç, ½Ã½ºÅÛ Å¸À̸Ó(timer)ÇÔ¼ö, ¹®ÀÚ¿­(string)ÇÔ¼ö±îÁö Àֳ׿ä. ±×¸®°í ³¡À¸·Î À¯Æ¿¸®Æ¼ ¹× ¿¡·¯ÇÔ¼öµéÀ» ¼Ò°³Çß½À´Ï´Ù.

GTKÀÇ rc ÆÄÀÏ

À¯´Ð½º °è¿­ÀÇ ¿î¿µÃ¼Á¦¸¦ ÀÌ¿ëÇÏ´Â ºÐÀ̶ó¸é ²Þ¿¡¼­µµ ÀÌ rcÆÄÀÏÀ» ÆíÁýÇÏÁö³ª ¾ÊÀ»Áö ¸ð¸£°Ú³×¿ä. ^^; ÀÌ Àå¿¡¼­´Â ¿ì¸®°¡ Àͼ÷ÇØÁø ¾îÇõéó·³, ¶È°°Àº ¹ÙÀ̳ʸ®(binary,executable)¸¦ °¢ »ç¿ëÀÚÀÇ ÀÔ¸À¿¡ ¸Â°Ô 'ȯ°æ¼³Á¤'À» ÇØ¼­ ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô ÇÏ´Â °É ¼Ò°³ÇÕ´Ï´Ù. GTK+ÀÇ rcÆÄÀÏÀº ´Ù¸¥ ´ëºÎºÐÀÇ X¿ë ¾îÇõé°ú ºñ½ÁÇÑ, Àϰü¼º ÀÖ´Â ½Éº¼(simbol)À» ÀÌ¿ëÇÕ´Ï´Ù. ¸¶Áö¸· ºÎºÐ¿¡ ¿¹Á¦ rcÆÄÀÏÀÌ ÀÖÀ¸´Ï Âü°íÇϼ¼¿ä.

ÀڽŸ¸ÀÇ widget ¸¸µé±â

ÀÌ ÀåÀÇ ³»¿ëÀº "Creating Your Own Widgets", Áï "ÀڽŸ¸ÀÇ widget ¸¸µé±â" ÀÔ´Ï´Ù. ½ÇÁ¦ ÇÏ´Â ¿ªÇÒµµ ±×·¸Áö¸¸ À̸§µµ Tictactoe¶ó´Â widgetÀ» ÀÌ·¸°Ô Àú·¸°Ô ¸¸µé¾î °¡´Â °úÁ¤¿¡¼­ ¿©·¯°¡Áö ÁÖÀDz¨¸®/Âü°í²¨¸®¸¦ ´Ã¾î³õ¾Ò½À´Ï´Ù. WidgetÀ» ¸¸µç´Ù´Â °Ç ÀÌ¹Ì ÀÖ´Â widgetÀ» ÀÌ¿ëÇÏ´Â °Í°ú´Â ¶Ç´Ù¸¥ °³³äÀ¸·Î, ¸î°¡Áö Áý°í ³Ñ¾î°¥ °ÍÀÌ ÀÖ½À´Ï´Ù. ¿ì¼±, ÁøÂ¥ ÇãÇã¹úÆÇ¿¡¼­ ½ÃÀÛ ÇÏ´Â °Ô ¾Æ´Ï¶ó "¾îµð¼­ »ó¼Ó"¹ÞÀ» °ÍÀÎÁö¸¦, Áï ±×ÀÇ parent class¸¦ ¼±ÅÃÇØ¾ß ÇÕ´Ï´Ù. ±×¸®°í ÀÌ widgetÀÌ Ã³¸®ÇؾßÇÒ ½Ã±×³Î°ú À̺¥Æ®¿¡ ´ëÇØ¼­µµ ¸ñÀû¿¡ ¸Â°Ô "Àß" ¼³Á¤ÇؾßÁÒ. ±×¸®°í ÀÌ ÀåÀÇ ¸¶Áö¸·¿¡¼­´Â, ÀÌ·¸°Ô ¾Ö½á(?) ¸¸µç widgetµéÀÇ ¾î¼³Ç ¹®Á¦Á¡µéÀ» ÁöÀûÇϰí, ±× ÇØ°á¹æÇâÀ» Á¦½ÃÇϰí ÀÖ±º¿ä.

³«¼­Àå, °£´ÜÇÑ ±×¸®±â ¿¹Á¦

»ó´çÈ÷ ¹æ´ëÇϰí Àâ´ÙÇÑ(?) ³»¿ëÀ» ´Ù·ç´Â ÀåÀÔ´Ï´Ù. GIMPó·³, ÁøÂ¥ ±×¸²À» ´Ù·ç±â À§Çؼ­ ¾Ë¾Æ¾ß ÇÒ °ÍµéÀ̶ó°í Çϴ±º¿ä. ¸ÕÀú ¸¶¿ì½º¿Í Űº¸µåÀÇ ¹Ì¹¦ÇÑ Àú¼öÁØ À̺¥Æ®(low-level event)¸¦ ´Ù·ç°í ÀÖ½À´Ï´Ù. Xlib¿¡¼­ Á¢ÇÒ ¼ö ÀÖµíÀÌ ¿©·¯ #define »ó¼öµéÀ» ºñÆ®¿¬»ê (bitwise operation)½ÃŰ´Â °ÅÁÒ. ÀÌ »ó¼öµéÀº Űº¸µå¿Í ¸¶¿ì½º¿¡¼­ ÀϾ´Â ¿©·¯°¡Áö À̺¥Æ®µéÀ» ¼¶¼¼ÇÏ°Ô ±¸º°Çϱâ À§ÇÑ °ÍÀ̰ÚÁÒ? µÚ¸¦ ÀÕ´Â ³ðµéÀº ³«¼­¸¦ ÇÒ µµÈ­Áö¸¦ °ü¸®ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ´ëºÎºÐÀÇ widget°ú ÇÔ¼öµéÀº GTKÀÇ º£À̽º(base)¸¦ ÀÌ·ç´Â GDK(General Drawing Kits) ¶óÀ̺귯¸®¿¡¼­ ¿Â °Íµé ÀÔ´Ï´Ù. À©µµ¿¡ Á÷Á¢ ±×¸®´Â °Íº¸´Ù, ÇȽº¸ÊÀ̶ó´Â °¡»óÀÇ µµÈ­Áö¿¡ ±×·Á³õ°í ±× ³»¿ëÀ» ÇÊ¿äÇÒ ¶§ À©µµ·Î º¹»çÇØ ÁÖ´Â ¹æ½ÄÀ» ¾²ÁÒ, Xlib¿¡¼­Ã³·³. ´ÙÀ½¿£ ÇȽº¸Ê¿¡ ±×¸²À» ±×¸®´Â µµ±¸µé¿¡ ´ëÇØ ÀܼҸ®°¡ À̾îÁý´Ï´Ù. Xlib¿¡¼­ GC(Graphics Context)¶õ ³ðÀ» ±¸°æÇØ ºÃ´Ù¸é ´õ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °Ì´Ï´Ù. ¿¹¸¦µé¾î »ç°¢ÇüÀ» Çϳª ±×¸®´Â µµ±¸´Â gdk_draw_rectangle()À̶õ ³ð Àε¥, »ç°¢ÇüÀ» ÀÌ·ç´Â ¼±ÀÇ ±½±â, »ö±ò, Á¾·ù(½Ç¼±/Á¡¼±/¼â¼±) µî ±âº»ÀûÀÎ ¼Ó¼ºµéÀ» GC¿¡ ÀúÀåÇØ ³õ°í, ½ÇÁ¦·Î ±×¸± ¶§´Â gdk_draw_rectangleÀ̶õ ÇÔ¼öÀÇ ÀÎÀڷμ­ ÇØ´çÇÏ´Â ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Â GC¸¦ ³Ñ°ÜÁÝ´Ï´Ù. ¹°·Ð GTK+´Â ÃæºÐÈ÷ °´Ã¼ÁöÇâÀûÀ̱⠶§¹®¿¡ ±âº»¸¸ ÀÌÇØÇÑ´Ù¸é Xlib¿¡¼­º¸´Ù ´õ Á÷°üÀûÀ¸·Î Áñ±æ ¼ö ÀÖÀ» °Ì´Ï´Ù. ¾ÆÁ÷ ³¡³ªÁö ¾Ê¾Ò±º¿ä! -_-; ÀÌ Àå¿¡¼­´Â ´õ ¼¶¼¼ÇÑ ±×¸²À» ±×¸®±â À§ÇØ ¸¶¿ì½ºº¸´Ù ´õ ÁÁÀº(´õ ºñ½Ñ?) ÀÔ·ÂÀåÄ¡¸¦ ÀÌ¿ëÇÒ °ÍÀ», Àº±ÙÈ÷ ºÎÃß±â°í ÀÖ½À´Ï´Ù. Drawing tablet°°Àº, Ư¼öÇÑ ÀÔ·ÂÀåÄ¡¿¡¼­ ¹ß»ýÇÏ´Â ¶Ç´Ù¸¥ À̺¥Æ® µéÀ» ´Ù·ç±â À§ÇØ È®ÀåÀ̺¥Æ®(extended event)¸¦ Á¦°øÇÑ´Ù°í Çϳ׿ä. ¸¶¿ì½º ¿¡¼­ ¹ß»ýÇÏ´Â ¸î°¡Áö À̺¥Æ®¸¸À¸·Îµµ ¸Ó¸®°¡ ¾ÆÇµ¥ ¸»ÀÔ´Ï´Ù. :) ¾î·µç ÀÌ ÀåÀÇ ¸¶Áö¸·¿¡¼­´Â, ¸¶¿ì½ºº¸´Ù ´õ ÁÁÀº ÀåÄ¡(device)ÀÇ ±â´ÉÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ À̾߱âÇϰí ÀÖ½À´Ï´Ù.

GTK ¾îÇÃÀ» °³¹ßÇÏ´Â ÆÁ

³Ê¹« Áß¿äÇÑ ³»¿ëÀ̶ó ²À Á÷Á¢ º¸¶ó°í¹Û¿¡´Â ¸»ÇÒ ¼ö ¾ø³×¿ä. ;)

Contributing

¿ª½Ã ¸Å¿ì Áß¿äÇÑ °Ì´Ï´Ù.

Credits

ÀÌ ¹®¼­¸¦ Á¦ÀÛÇÏ´Â µ¥ µµ¿òÀÌ µÈ »ç¶÷µé¿¡°Ô °¨»çÀÇ ¸»À» ÀüÇÏ´Â, ¿ª½Ã ¾ÆÁÖ Áß¿äÇÑ ÀåÀÔ´Ï´Ù. ÀϺΠ¿ø¹®À» ±×´ë·Î µ×½À´Ï´Ù.

Tutorial Copyright and Permissions Notice

GPL¿¡ ÀÇÇÑ ¸ðµç ¹®¼­¿¡¼­ º¼ ¼ö ÀÖ´Â, Á¤¸» Áß¿äÇÑ ±ÛÀÔ´Ï´Ù. ÀϺη¯ ¿ø¹®À» ±×´ë·Î ³öµ×½À´Ï´Ù.

Á¦°¡ 3¿ù 26ÀÏ¿¡ ÀԴ븦 ÇÏ´Â °ü°è·Î liberta@zeus.phys.cau.ac.kr, ±×¸®°í liberta@cau.ac.kr ·Î ¸ÞÀÏÀ» º¸³»¼Åµµ ´äÀÌ ¾øÀ» °Ì´Ï´Ù. :) ÀÌ ¹®¼­¿¡ ´ëÇÑ Ãß°¡¿Í ¼öÁ¤, ±×¸®°í ¾î¶² °÷À¸·ÎÀÇ ¾÷·Îµå µîÀº ÀüÀûÀ¸·Î Àڽſ¡°Ô ´Þ·Á ÀÖ½À´Ï´Ù. ±×·³ GTK+°ú ÇÔ²² Áñ°Å¿î ¿©ÇàÀ» ÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù. :)

(¼­ÁÖÅ´ÔÀÌ ¹ø¿ªÇϽŠÀÌ ¹®¼­¸¦ ÇÑÁöÈ£°¡ ´Ù½Ã ÀÏ¹Ý text¿¡¼­ SGML ÇüÅ·Π¹Ù²Ù°í ÃֽŠ¿ø¹®ÀÎ 5¿ù 24ÀÏÀÚ TutorialÀ» ÂüÁ¶Çؼ­ ´Þ¶óÁø ºÎºÐÀ» º¸ÅÂ¾î ¼öÁ¤Çß½À´Ï´Ù. ÀÌ ¹®¼­¸¦ ÀÐÀ¸½Ã´Ù°¡ °©Àڱ⠹ø¿ªÀÌ ¿­¾ÇÇØÁ³´Ù°í ´À³¢½Ã´Â ºÎºÐÀÌ ÀÖ´Ù¸é ¾Æ¸¶ ±× ºÎºÐÀº ÇÑÁöÈ£°¡ »õ·Î ¹ø¿ªÇؼ­ Ãß°¡ÇÑ °÷Àϰ̴ϴÙ. ^^; ÀÌ ±ä ¹®¼­¸¦ ¹ø¿ªÇÏ¿© ÁֽôÀ¶ó ¼ö°íÇϽм­ÁÖÅ´Բ² °¨»çµå¸³´Ï´Ù. Ȥ½Ã À߸ø ¹ø¿ªµÈ °÷À̳ª ½Ç¼ö, ¿ÀÀÚ¸¦ ¹ß°ßÇϽŠºÐÀº hanjiho@penta.co.kr·Î ¸ÞÀÏÀ» º¸³»ÁÖ½Ã¸é ¹«Ã´ °í¸¿°Ú½À´Ï´Ù. ¼­ÁÖÅÂ´Ô ¸»¾¸´ë·Î GTK+¿Í Áñ°Å¿î ¿©ÇàÀ» ÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù.)

2. ¼Ò°³

GTK(GIMP Toolkit)Àº ¿ø·¡ GIMP(General Image Manipulation Program)À» ¸¸µé±â À§ÇÑ ÅøÅ¶À¸·Î °³¹ßµÇ¾ú´Ù. GTK´Â XlibÀÇ ÇÔ¼öµé¿¡ ´ëÇÑ ±âº»ÀûÀÎ wrapperÀÎ GDK(GIMP Drawing Kit)¸¦ ±â¹ÝÀ¸·Î Çϰí ÀÖ´Ù. ¿ø·¡ GIMP¸¦ ¸¸µé ¸ñÀûÀ¸·Î °³¹ßµÇ¾úÁö¸¸, Áö±ÝÀº ¸î °¡Áö ÇÁ¸® ¼ÒÇÁÆ®¿þ¾îÀÇ Á¦ÀÛ¿¡ ¾²ÀÌ°Ô µÇ¾ú´Ù. GTKÀÇ Á¦ÀÛÀÚµéÀº ´ÙÀ½°ú °°´Ù.

GTK´Â º»ÁúÀûÀ¸·Î °´Ã¼ÁöÇâÀûÀÎ ¾îÇà °³¹ßÀÚ È¯°æÀÌ´Ù(API, Application Programmers Interface). ºñ·Ï ¿ÏÀüÈ÷ C·Î ¾²¿©Á³Áö¸¸ Ŭ·¡½ºÀÇ °³³ä°ú callback ÇÔ¼ö(ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ)°¡ °®Ãß¾îÁø °ÍÀÌ´Ù.

¿©±â¿¡´Â ¿¬°á¸®½ºÆ®(linked list)¸¦ ´Ù·ç±â À§ÇÑ ¸î °¡Áö ÇÔ¼öµé°ú ÇÔ²², glib¶ó°í ºÒ¸®¿ì¸ç ¸î °¡Áö Ç¥ÁØÇÔ¼öµéÀ» ´ëÄ¡ÇÒ ¼ö ÀÖ´Â ÇÔ¼öµéµµ ¼¼¹øÂ° ¿ä¼Ò·Î Æ÷ÇԵǾî ÀÖ´Ù. g_strerror()ó·³, ¿©±â ¾²ÀÎ ¾î¶² ÇÔ¼öµéÀº ´Ù¸¥ À¯´Ð½ºµé¿¡ ´ëÇØ Ç¥ÁØÀÌ ¾Æ´Ï°Å³ª ¾²¿©Áú ¼ö ¾ø´Â °ÍÀ̱⠶§¹®¿¡, GTKÀÇ À̽ļºÀ» ³ôÀ̱â À§ÇØ ¿©±â¿¡ ´ëÇÑ ´ëÄ¡ÇÔ¼öµéµµ ¾²¿´´Ù. ¶ÇÇÑ g_mallocÀÌ µð¹ö±ë ±â´ÉÀ» °­È­ÇßµíÀÌ libcÀÇ ¹öÀü¿¡ º¸°­ÀÌ ÀÌ·ç¾îÁö±âµµ Çß´Ù.

ÀÌ ¹®¼­´Â ´ÜÁö GTK¸¦ À§ÇÑ Âü°í°¡ µÉ »ÓÀ̸ç, ¿ÏÀüÇÑ °ÍÀ» ÀǹÌÇÏÁö ¾Ê´Â´Ù. µ¶ÀÚ´Â C¾ð¾î¸¦ Àß ¾Ë¸ç CÇÁ·Î±×·¥À» ¾î¶»°Ô ¸¸µå´ÂÁö ¾Ë°í ÀÖÀ» °ÍÀ̶ó°í °¡Á¤ ÇÑ´Ù. ²À ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï°ÚÁö¸¸, µ¶ÀÚ°¡ ÀÌ¹Ì X ÇÁ·Î±×·¥¿¡ ´ëÇÑ °æÇèÀÌ ÀÖ´Ù¸é ¸Å¿ì Å« µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ widget ¼¼Æ®¿¡ ´ëÇØ GTK°¡ óÀ½ Á¢ÇÑ °ÍÀ̶ó¸é, ÀÌ ¹®¼­¸¦ ¾î¶»°Ô ¹ß°ßÇÏ°Ô µÇ¾ú°í ¶Ç Ưº°È÷ Èûµç ºÎºÐÀº ¾î¶² °ÍÀ̶ó´Â °ÍÀ» ²À ¾Ë·ÁÁֱ⠹ٶõ´Ù. GTK¸¦ À§ÇØ C++ÀÇ Çü½Ä¿¡ µû¸¥ APIµµ ÀÖ´Ù´Â °ÍÀ» ÂüÁ¶ÇÒ °ÍÀ̸ç, ¸¸¾à C++À» ´õ ¼±È£ÇÑ´Ù¸é ÀÌ°Í ´ë½Å¿¡ ±×°É ¼±ÅÃÇϱ⠹ٶõ´Ù. ¶ÇÇÑ Objective C, Guile°úÀÇ ¹ÙÀεùµµ ÀÖÁö¸¸, ¾î·µç ¿©±â¼­´Â ±×°ÍµéÀ» µû¸£Áö ¾Ê°Ú´Ù.

´ç½ÅÀÌ ÀÌ ¹®¼­¸¦ ÅëÇØ GTK¸¦ °øºÎÇÏ´Â µ¥ À־ ¾î¶² ¹®Á¦¶óµµ ³ª¿¡°Ô ¾Ë·Á Áֱ⠹ٶó¸ç, ±×°ÍÀº ÀÌ ¹®¼­°¡ Çâ»óµÇ´Â °Í¿¡ Å« µµ¿òÀÌ µÉ °ÍÀ̶ó°í »ý°¢ÇÑ´Ù.

3. ½ÃÀÛÇϸ鼭

¸ÕÀú ÇÒ ÀÏÀº ¹°·Ð GTKÀÇ ¼Ò½º¸¦ ¹Þ¾Æ¼­ ±×°ÍÀ» ¼³Ä¡ÇÏ´Â °ÍÀÌ´Ù. ¾ðÁ¦³ª °¡Àå ÃֽйöÀüÀ» ftp.gtk.orgÀÇ /pub/gtk¿¡¼­ °¡Á®¿Ã ¼ö ÀÖ´Ù. GTK¿¡ ´ëÇÑ ¶Ç´Ù¸¥ ¼Ò½ºµéÀº http://www.gtk.org/¿¡ ÀÖ´Ù. GTK´Â GNU autoconf¸¦ ÀÌ¿ëÇÑ´Ù. ÀÏ´Ü ¾ÐÃàÀ» Ǭ ´ÙÀ½¿¡, ./configure --help¸¦ Ãļ­ ¿É¼ÇµéÀ» »ìÆì º¸±â ¹Ù¶õ´Ù.

GTK¿¡ ´ëÇÑ ¼Ò°³¸¦ À§Çؼ­, °¡´ÉÇÑ ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥ºÎÅÍ ½ÃÀÛÇØ º¸ÀÚ. ÀÌ ÇÁ·Î±×·¥Àº 200x200 Çȼ¿ÀÇ À©µµ¸¦ ¸¸µå´Â °ÍÀ¸·Î, ½©À» ÀÌ¿ëÇÏÁö ¾Ê°í´Â ³¡³¾ ¼ö ¾ø´Â ÇÁ·Î±×·¥ÀÌ´Ù.

#include <gtk/gtk.h>

int main (int argc, char *argv[])
{
    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_show (window);

    gtk_main ();

    return 0;
}

¸ðµç ÇÁ·Î±×·¥Àº ¹°·Ð GTK ¾îÇÿ¡ ¾²ÀÏ º¯¼ö, ÇÔ¼ö, ±¸Á¶Ã¼ µîÀÌ ¼±¾ðµÇ¾î ÀÖ´Â gtk/gtk.h¸¦ Æ÷ÇÔÇÒ °ÍÀÌ´Ù.

gtk_init (&argc, &argv);

GTK·Î ¾²¿©Áö´Â ´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥¿¡¼­ ºÎ¸£°Ô µÇ´Â ÇÔ¼öÀÎ gtk_init(gint *argc, gchar ***argv) ¸¦ ºÎ¸£°í ÀÖ´Ù. À̰ÍÀº µðÆúÆ®·Î ¾µ ºñÁÖ¾ó°ú Ä®¶ó¸Ê µî ¸î°¡Áö¸¦ ¼¼ÆÃÇÏ¸ç ±× ÀÌÈÄ gdk_init(gint *argc, gchar ***argv)·Î ³Ñ¾î°£´Ù. ÀÌ ÇÔ¼ö´Â ¾²ÀÏ ¶óÀ̺귯¸®¸¦ ÃʱâÈ­ Çϰí, µðÆúÆ®·Î ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϸç, ¸í·ÉÇàÀ» ÅëÇØ ÇÁ·Î±×·¥¿¡ ÀüÇØÁø ÀÎÀÚµé Áß ¾Æ·¡ÀÇ °ÍµéÀ» ã¾Æ üũÇÑ´Ù.

  • --display
  • --debug-level
  • --no-xshm
  • --sync
  • --show-events
  • --no-show-events

´ç½ÅÀÇ ¾îÇÃÀÌ ÀνÄÇÏÁö ¾ÊÀ» °ÍµéÀ» ³²°ÜµÎ°í, À§ÀÇ °ÍµéÀ» ÀÎÀÚÀÇ ¸®½ºÆ®¿¡¼­ Á¦°ÅÇÑ´Ù. À̰ÍÀº ¸ðµç GTK ¾îÇÿ¡¼­ »ý·«ÇÒ Ç¥ÁØÀûÀÎ ÀÎÀÚµéÀÇ ¼¼Æ®¸¦ ¸¸µç´Ù.

´ÙÀ½ÀÇ µÎ ÁÙ¿¡¼­´Â À©µµ¸¦ ¸¸µé°í º¸¿©ÁØ´Ù.

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);

GTK_WINDOW_TOPLEVELÀ̶õ ÀÎÀÚ´Â À©µµ ¸Å´ÏÀúÀÇ Àå½Ä°ú À§Ä¡¼³Á¤¿¡ µû¸£°Ô ÇÑ´Ù. 0x0 Å©±âÀÇ À©µµ¸¦ ¸¸µéÁö ¾Ê°í, child°¡ ¾ø´Â À©µµ´Â µðÆúÆ®·Î 200x200 Å©±â·Î ¸¸µé¾îÁ®¼­ ¿ì¸®´Â ±×°ÍÀ» ¸¶À½²¯ ´Ù·ê ¼ö ÀÖ´Ù.

gtk_widget_show() ÇÔ¼ö´Â ÀÌ widgetÀÇ ¼Ó¼º¿¡ ´ëÇÑ ¼¼ÆÃÀÌ ³¡³µÀ½À» GTK¿¡ ¾Ë·ÁÁÖ´Â °ÍÀ̰í, ±×·¡¼­ ±× widgetÀº º¸¿©Áö°Ô µÈ´Ù.

¸¶Áö¸· ÁÙÀº GTKÀÇ ÁÖ Ã³¸® ·çÇÁ¿¡ µé¾î°¡´Â °ÍÀÌ´Ù.

gtk_main ();

gtk_main()Àº GTK ¾îÇà Àü¹ÝÀûÀ¸·Î º¼ ¼ö ÀÖ´Â ¶Ç ÇϳªÀÇ ÇÔ¼öÈ£ÃâÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ¿©±â¿¡ À̸£¸é, GTK´Â X À̺¥Æ®, ŸÀӾƿô, ¶Ç´Â ÆÄÀÏ ÀÔÃâ·Â °¨Áö µîÀ» ±â´Ù¸®¸ç ´ë±âÇÏ°Ô µÈ´Ù. ±×·¯³ª ÀÌ °£´ÜÇÑ ÇÁ·Î±×·¥¿¡¼­´Â ±×·± °ÍµéÀÌ ¹«½ÃµÇ°í ÀÖ´Ù.

3.1 GTK¿¡¼­ÀÇ Hello World ÇÁ·Î±×·¥

ÀÌÁ¦ ÇϳªÀÇ widget(¹öư)À» À§ÇÑ ÇÁ·Î±×·¥ÀÌ´Ù, ±× À¯¸íÇÑ hello world¸¦ GTK·Î½á ±¸ÇöÇØ º¸ÀÚ.

/* helloworld.c */

#include <gtk/gtk.h>

/* À̰ÍÀº callbackÇÔ¼ö´Ù.  ¿©±â¼­´Â µ¥ÀÌÅÍÀÎÀÚµéÀÌ ¹«½ÃµÇ¾ú´Ù. */
void hello (GtkWidget *widget, gpointer data)
{
    g_print ("Hello World\n");
}

gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    g_print ("delete event occured\n");
    /* "delete_event"¶ó´Â ½Ã±×³ÎÇڵ鷯¿¡¼­ TRUE¸¦ ¸®ÅÏÇϸé,
     * GTK´Â "destroy" ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù.  FALSE¸¦ ¸®ÅÏÇϸé
     * À©µµ°¡ ÁøÂ¥·Î ÆÄ±«µÇ±æ ¿øÇÏÁö ¾Ê´Â °ÍÀÌ´Ù.  À̰ÍÀº
     * 'ÁøÂ¥·Î ³¡³»·Æ´Ï±î?' °°Àº ´ëÈ­»óÀÚ°¡ Æ¢¾î³ª¿À°Ô ÇÒ ¶§
     * À¯¿ëÇÏ´Ù. */
       
    /* FALSE¸¦ TRUE·Î °íÄ¡¸é main À©µµ´Â "delete_event"¿Í ÇÔ²²
     * ÆÄ±«µÉ °ÍÀÌ´Ù. */
    return (FALSE);
}

/* ¶Ç´Ù¸¥ callback */
void destroy (GtkWidget *widget, gpointer data)
{
    gtk_main_quit ();
}

int main (int argc, char *argv[])
{
    /* GtkWidgetÀº widgetµéÀ» À§ÇÑ ±â¾ïÀå¼Ò ŸÀÔÀÌ´Ù. */
    GtkWidget *window;
    GtkWidget *button;

    /* À̰ÍÀº ¸ðµç GTK ¾îÇõ鿡¼­ È£ÃâµÈ´Ù.  ÀÎÀÚµéÀº ¸í·ÉÇà »óÀ¸·ÎºÎÅÍ
     * ÁÖ¾îÁ® ¾îÇ÷ΠÀüÇØÁø´Ù. */
    gtk_init (&argc, &argv);

    /* »õ·Î¿î À©µµ¸¦ ¸¸µç´Ù. */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /* À©µµ°¡ "delete_event"¸¦ ¹ÞÀ¸¸é(ÀÌ´Â À©µµ¸Å´ÏÀú¸¦ ÅëÇÑ´Ù), ¿ì¸®´Â
     * À§¿¡¼­ Á¤ÀÇÇÑ ÇÔ¼ö delete_event()¸¦ È£ÃâÇÒ °ÍÀÎÁö È®ÀÎÇÑ´Ù.  ÀÌ
     * callbackÇÔ¼ö·Î ÀüÇØÁø µ¥ÀÌÅÍ´Â NULLÀÌ°í µû¶ó¼­ ¿©±â¼­ ¹«½ÃµÈ´Ù. */
    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (delete_event), NULL);

    /* ¿©±â¼­´Â ½Ã±×³ÎÇڵ鷯¿¡ "destroy" À̺¥Æ®¸¦ ¿¬°áÇØ ÁØ´Ù.
     * ÀÌ À̺¥Æ®´Â ¿ì¸®°¡ À©µµ¿¡ ´ëÇØ gtk_widget_destroy()¸¦ È£ÃâÇϰųª,
     * ¶Ç´Â "delete_event" callback¿¡¼­ 'TRUE'¸¦ ¸®ÅÏÇßÀ» ¶§ ¹ß»ýÇÑ´Ù. */
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (destroy), NULL);

    /* À©µµÀÇ border width¸¦ ¼¼ÆÃÇÑ´Ù. */
    gtk_container_border_width (GTK_CONTAINER (window), 10);

    /* "Hello World"¶ó´Â ¶óº§ÀÌ ÀÖ´Â »õ·Î¿î ¹öưÀ» ¸¸µç´Ù. */
    button = gtk_button_new_with_label ("Hello World");

    /* ¹öưÀÌ "clicked" ½Ã±×³ÎÀ» ¹ÞÀ¸¸é NULLÀ» ÀÎÀÚ·Î ÇØ¼­ hello()°¡
     * È£ÃâµÈ´Ù.  ÀÌ hello() ÇÔ¼ö´Â À§¿¡¼­ Á¤ÀǵǾú´Ù. */
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (hello), NULL);

    /* À̰ÍÀÌ "clicked"µÇ¸é gtk_widget_destroy(window)°¡ È£Ãâ, ±× À©µµ¸¦
     * ÆÄ±«ÇÏ°Ô µÈ´Ù.  ¾Õ¼­ ¼³¸íÇßµíÀÌ, 'destroy' ½Ã±×³ÎÀº ¿©±â¼­ ÀÌ·¸°Ô
     * ¹ß»ýÇϰųª, ¶Ç´Â À©µµ¸Å´ÏÀú¸¦ ÅëÇØ ¹ß»ýÇÑ´Ù. */
    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                               GTK_SIGNAL_FUNC (gtk_widget_destroy),
                               GTK_OBJECT (window));

    /* À̰ÍÀº ¹öưÀ» À©µµ, Áï GTK ÄÁÅ×À̳ÊÀÇ Çϳª·Î ÆÐÅ·ÇÑ´Ù. */
    gtk_container_add (GTK_CONTAINER (window), button);

    /* ³¡À¸·Î »õ·Î ¸¸µç widgetÀÎ ¹öưÀ» º¸¿©ÁÖ´Â °ÍÀÌ´Ù. */
    gtk_widget_show (button);

    /* À©µµ Àüü¸¦ ¿©±â¼­ º¸¿©ÁØ´Ù. */
    gtk_widget_show (window);

    /* ¸ðµç GTK ¾îÇÃÀº ²À gtk_main()À» Çϳª¾¿ °¡Áö°í ÀÖ´Ù.  ÄÁÆ®·ÑÀº
     * ¿©±â¼­ ³¡³ª°í ÀÌÁ¦ ¾î¶² À̺¥Æ®(۸¦ ´©¸¥´Ù°Å³ª ¸¶¿ì½º¸¦ Á¶ÀÛÇÏ´Â
     * µîÀÇ)°¡ ¹ß»ýÇÒ ¶§±îÁö ´ë±âÇÑ´Ù. */
    gtk_main ();

    return 0;
}

3.2 Hello world¸¦ ÄÄÆÄÀÏÇϱâ

ÄÄÆÄÀÏÇϱâ À§ÇØ ÀÌ·¸°Ô Ç϶ó.

gcc -Wall -g helloworld.c -o hello_world `gtk-config --cflags` \
    `gtk-config --libs`

Gtk2.0¿¡¼­´Â gtk-config´ë½Å pkg-config·Î º¯°æµÇ¾úÀ¸¹Ç·Î, ÄÄÆÄÀÏÇϱâ À§ÇØ ÀÌ·¸°Ô Ç϶ó.

gcc -Wall -g helloworld.c -o hello_world `pkg-config --cflags --libs gtk+-2.0`

ÀÌ·¸°Ô ÇÏ´Â °ÍÀº gtk¿Í ÇÔ²² µþ·Á¿À´Â gtk-config¶õ ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº gtk¸¦ ¾²´Â ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇϱâ À§Çؼ­ ¾î¶² ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡µéÀÌ ÇÊ¿äÇÑÁö '¾Ë°í'ÀÖ´Ù. gtk-config --cflags ´Â ÄÄÆÄÀÏ·¯°¡ header ÆÄÀϵéÀ» ã¾Æº¸¾Æ¾ß ÇÏ´Â include µð·ºÅ丮µéÀ» Ãâ·ÂÇϰí, gtk-config --libs ´Â ¸µÅ©µÇ¾î¾ß ÇÏ´Â ¶óÀ̺귯¸®µé°ú ±× ¶óÀ̺귯¸®µéÀÌ Á¸ÀçÇÏ´Â µð·ºÅ丮µéÀ» Ãâ·ÂÇÑ´Ù.

º¸Åë ¸µÅ©½ÃŰ´Â ¶óÀ̺귯¸®µéÀº ´ÙÀ½°ú °°Àº °ÍµéÀÌ´Ù.

  • The GTK library (-lgtk), GDK¸¦ ±â¹ÝÀ¸·ÎÇÑ widget ¶óÀ̺귯¸®´Ù.
  • The GDK library (-lgdk), Xlib¸¦ °¨Ãß¾î µÑ·¯½Ñ wrapper´Ù.
  • The glib library (-lglib), ´Ù¾çÇÑ ÇÔ¼ö¸¦ Æ÷ÇÔÇϰí ÀÖÀ¸¸ç, ¿©±â¼­ ¾²ÀÎ °ÍÀº g_print()ÇÔ¼ö´Ù. GTK´Â glib¸¦ ±â¹ÝÀ¸·Î Çϰí ÀÖÀ¸¹Ç·Î ¾ðÁ¦³ª ÀÌ ¶óÀ̺귯¸®°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ÀÚ¼¼ÇÑ °ÍÀº glibÀ» ÂüÁ¶Ç϶ó.
  • The Xlib library (-lX11), GDK¿¡ ÀÇÇØ ¾²¿©Áö°Ô µÈ´Ù.
  • The Xext library (-lXext), À̰ÍÀº °øÀ¯ ¸Þ¸ð¸® pixmap°ú ´Ù¸¥ X È®Àåµé¿¡ ´ëÇÑ Äڵ带 À§ÇÑ °ÍÀÌ´Ù.
  • The math library (-lm), À̰ÍÀº ¿©·¯ ¸ñÀûÀ¸·Î GTK¿¡¼­ ¾²ÀÌ°Ô µÈ´Ù.

3.3 ½Ã±×³Î°ú callback¿¡ ´ëÇÑ ÀÌ·Ð

Hello world ÇÁ·Î±×·¥À» ÀÚ¼¼È÷ »ìÆìº¸±â¿¡ ¾Õ¼­, À̺¥Æ®¿Í callback¿¡ ´ëÇØ Áý°í ³Ñ¾î°¡ÀÚ. GTK´Â À̺¥Æ®·Î µ¹¾Æ°¡´Â ŸŶÀ̸ç, À̰ÍÀº ¾î¶² À̺¥Æ®°¡ ¹ß»ýÇØ¼­ ÀûÀýÇÑ ´Ù¸¥ ÇÔ¼ö·Î Á¦¾î°¡ ³Ñ¾î°¡Áö ¾Ê´Â ÇÑ °è¼Ó ´ë±âÇÑ´Ù´Â Àǹ̴Ù.

ÀÌ Á¦¾î¸¦ ³Ñ±ä´Ù´Â °ÍÀº "½Ã±×³Î"ÀÇ À̿뿡 ÀÇÇØ ÀÌ·ç¾îÁø´Ù. ¸¶¿ì½º ¹öưÀ» ´©¸£´Â °Í°°ÀÌ ¾î¶² À̺¥Æ®°¡ ÀÖÀ¸¸é, ´­·¯Á³´Ù¿¡ ÇØ´çÇÏ´Â ÀûÀýÇÑ ½Ã±×³ÎÀÌ widget¿¡ ÀÇÇØ "¹ß»ý"ÇÏ°Ô µÈ´Ù. À̰ÍÀÌ GTK°¡ ÇÏ´Â À¯¿ëÇÑ ÀÛ¾÷ÀÇ ´ëºÎºÐÀÌ´Ù. ¹öưÀÇ ÀÛ¿ëÀ¸·Î ¾î¶² µ¿ÀÛÀ» ½ÃŰ·Á¸é, ¿ì¸®´Â ÀÌ·± ½Ã±×³ÎµéÀ» Àâ¾Æ³»µµ·Ï ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϰí ÀÌ¿¡ Àû´çÇÑ ÇÔ¼ö¸¦ ºÎ¸£¸é µÈ´Ù. À̰ÍÀº ´ÙÀ½°ú °°Àº ÇÔ¼ö¸¦ ÀÌ¿ëÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù.

gint gtk_signal_connect (GtkObject *object,
                         gchar *name,
                         GtkSignalFunc func,
                         gpointer func_data);

ù¹øÂ° ÀÎÀÚ´Â ½Ã±×³ÎÀ» ¹ß»ý½Ãų widgetÀ̰í, µÎ¹øÂ°´Â Àâ¾Æ³»°íÀÚ ÇÏ´Â ½Ã±×³ÎÀÇ À̸§ÀÌ´Ù. ¼¼¹øÂ° ÀÎÀÚ´Â ±× ½Ã±×³ÎÀÌ Å½ÁöµÇ¾úÀ» ¶§ È£ÃâÇÒ ÇÔ¼ö¸ç, ³×¹øÂ°´Â ÀÌ ÇÔ¼ö¿¡ ³Ñ°ÜÁÙ Á¤º¸´Ù.

¼¼¹øÂ° ÀÎÀÚ·Î ³ª¿ÍÀÖ´Â ÇÔ¼ö¸¦ "callback ÇÔ¼ö"¶ó°í ºÎ¸£¸ç ´ÙÀ½Ã³·³ ÀÌ·ç¾îÁ® ÀÖ´Ù.

void callback_func(GtkWidget *widget, gpointer callback_data);

ÀÌ ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ´Â ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ widgetÀ» ÇâÇÑ Æ÷ÀÎÅͰ¡ µÇ°í, µÎ¹øÂ° ÀÎÀÚ´Â À§¿¡ º¸ÀÎ gtk_signal_connect() ÇÔ¼öÀÇ ³×¹øÂ° ÀÎÀÚ·Î ÁÖ¾îÁ® ÀÖ´Â Á¤º¸¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Ù.

Hello world ¿¹Á¦¿¡¼­ ¾²ÀÎ ¶Ç´Ù¸¥ È£ÃâÀº À̰ÍÀÌ´Ù.

gint gtk_signal_connect_object (GtkObject *object,
                                gchar  *name,
                                GtkSignalFunc func,
                                GtkObject *slot_object);

gtk_signal_connect_object()´Â callbackÇÔ¼ö°¡ GTK object¿¡ ´ëÇÑ Æ÷ÀÎÅͶó´Â, ´Ü ÇϳªÀÇ ÀÎÀÚ¸¦ ÀÌ¿ëÇÑ´Ù´Â Á¡¸¸ »©°í´Â gtk_signal_connect()¿Í °°´Ù. ±×·¯¹Ç·Î ½Ã±×³ÎÀ» ¿¬°á½Ãų ¶§ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù¸é callbackÇÔ¼ö´Â ÀÌ·± ¸ð¾çÀ» ÇØ¾ß ÇÒ °ÍÀÌ´Ù.

void callback_func (GtkObject *object);

¿©±â¼­ÀÇ object¶õ ´ë°³ widgetÀ» ¸»ÇÑ´Ù. ¿ì¸®´Â ¾î·µç µÇµµ·Ï gtk_signal_connect_object¸¦ ÀÌ¿ëÇØ¼­ callbackÀ» ¼Â¾÷ÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ±×µéÀº ¿ì¸®ÀÇ hello world ¿¹Á¦¿¡¼­Ã³·³, ÁÖ·Î ÀÎÀڷμ­ ½Ã±×³Î widget/object¸¦ Çã¿ëÇÏ´Â GTK ÇÔ¼öµéÀ» ºÎ¸¦ ¶§ ¾²À̰í ÀÖ´Ù.

½Ã±×³ÎÀ» ¿¬°á½ÃŰ´Â µ¥ µÎ °³ÀÇ ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Â °ÍÀº ´ÜÁö ¼­·Î ´Ù¸¥ °¹¼öÀÇ ÀÎÀÚ¸¦ °¡Áö°í ÀÖ´Â callbackÀ» Çã¿ëÇϱâ À§Çؼ­ÀÌ´Ù. GTK ¶óÀ̺귯¸®¿¡ ÀÖ´Â ¸¹Àº ÇÔ¼öµéÀº ÀÎÀڷμ­ ¿ÀÁ÷ GtkWidget Æ÷ÀÎÅ͸¸À» Çã¿ëÇϹǷÎ, ÀÌ·± °æ¿ì ¿¡´Â gtk_signal_connect_object() ¸¦ ÀÌ¿ëÇÏ¸é µÉ °ÍÀÌ´Ù. ¹Ý¸é ÀÚ½ÅÀÇ ÇÔ¼ö¿¡ ´ëÇØ¼­´Â, callback¿¡ Ãß°¡ÀûÀÎ Á¤º¸¸¦ °¡Á®¾ß ÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù.

3.4 Hello World¸¦ µû¶ó ÇѰÉÀ½¾¿

ÀÌÁ¦ Àû¿ëµÈ À̷п¡ ´ëÇØ ¾Ë¾Ò°í, hello world ¿¹Á¦ ÇÁ·Î±×·¥À» µû¶ó ´õ È®½ÇÈ÷ ÇØµÎÀÚ.

À̰ÍÀº ¹öưÀÇ "´­¸²"À̶ó´Â À̺¥Æ®¿¡ ´ëÇØ È£ÃâµÉ callbackÇÔ¼ö´Ù. ÀÌ ¿¹Á¦ ¿¡¼­´Â widget°ú Á¤º¸°¡ ¸ðµÎ ¹«½ÃµÇÁö¸¸, ±×°ÍµéÀ» ´Ù·ç´Â °ÍÀº ±×´ÙÁö ¾î·ÆÁö ¾Ê´Ù. ÀÌ°Í ´ÙÀ½ÀÇ ¿¹Á¦´Â ¾î¶² ¹öưÀÌ ´­·¯Á³´Â°¡¸¦ ¾Ë·ÁÁÖ±â À§ÇØ Á¤º¸ ÀÎÀÚ¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù.

void hello (GtkWidget *widget, gpointer data)
{
    g_print ("Hello World\n");
}

ÀÌ callbackÀº ´Ù¼Ò Ưº°ÇÏ´Ù. À©µµ¸Å´ÏÀú°¡ ¾îÇÿ¡ ÀÌ À̺¥Æ®¸¦ º¸³»¸é "delete_event"°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. ¿ì¸®´Â ¿©±â¼­ ÀÌ·± À̺¥Æ®µé¿¡ ´ëÇØ ¹«¾ùÀ» ÇØÁà¾ß ÇÒÁö ¼±ÅÃÇÑ´Ù. ¿ì¸®´Â ±×°ÍÀ» ¹«½ÃÇÒ ¼öµµ ÀÖ°í, ÀÌ¿¡ ´ëÇÑ ¹ÝÀÀÀ» Á¤¸®ÇÒ ¼öµµ ÀÖÀ¸¸ç, ¶Ç´Â °£´ÜÈ÷ ±× ¾îÇÃÀ» Á¾·áÇÒ ¼öµµ ÀÖ´Ù.

ÀÌ callbackÀÇ ¸®ÅϰªÀ» ÅëÇØ GTK´Â ¾î¶² ÀÏÀ» ÇØ¾ßÇÒ Áö ¾Ë°Ô µÈ´Ù. FALSE¸¦ ¸®ÅÏÇϸé GTK´Â ¿ì¸®°¡ "destroy"½Ã±×³ÎÀ» ¹ß»ýÇÏ´Â °ÍÀ» ¿øÇÏÁö ¾Ê´Â´Ù°í ÆÇ´Ü ÇÏ°Ô µÈ´Ù. ±×¸®°í TRUE¸¦ ¸®ÅÏÇÏ´Â °ÍÀ¸·Î ¿ì¸®´Â "destroy"½Ã±×³ÎÀÌ ¹ß»ýÇÔÀ» È®ÀνÃ۰í, "destroy"½Ã±×³Î Çڵ鷯¸¦ È£ÃâÇÏ°Ô µÈ´Ù.

gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    g_print ("delete event occured\n");

    return (FALSE);
}

¿©±â ´ÜÁö gtk_main_quit()À» È£ÃâÇÏ´Â °ÍÀ¸·Î Á¾·áÇØ ¹ö¸®´Â, ¶Ç´Ù¸¥ callback ÇÔ¼ö°¡ ÀÖ´Ù. À̰Ϳ¡ ´ëÇØ¼± ±ä¸» ¾Ê°Ú´Ù, º¸¸é ¾Ë ¼ö ÀÖÀ» °ÍÀ̹ǷÎ.

void destroy (GtkWidget *widget, gpointer data)
{
    gtk_main_quit ();
}

´ç½ÅÀÌ main() ¶õ °Í¿¡ ´ëÇØ ¾Ë°í ÀÖÀ¸¸®¶ó »ý°¢ÇÑ´Ù, ´Ù¸¥ ¾îÇðú ¸¶Âù°¡Áö·Î, ¸ðµç GTK ¾îÇà ¿ª½Ã main() À» Çϳª¾¿ °¡Áö°í ÀÖ´Ù.

int main (int argc, char *argv[])
{

ÀÌ ºÎºÐ¿¡¼­, GtkWidgetÇüÀÇ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¼±¾ðÇÑ´Ù. À̰͵éÀº À©µµ¿Í ¹öưÀ» ¸¸µé±â À§ÇØ ¾Æ·¡¿¡¼­ ¾²ÀÌ°Ô µÈ´Ù.

    GtkWidget *window;
    GtkWidget *button;

¿©±â ´Ù½Ã gtk_init°¡ ³ª¿Â´Ù. Àü°ú ¸¶Âù°¡Áö·Î, À̰ÍÀº ŸŶÀ» ÃʱâÈ­Çϰí, ¸í·ÉÇà¿¡¼­ ÁÖ¾îÁø ÀÎÀÚµéÀ» ºÐ¼®ÇÑ´Ù. À̰ÍÀº ¸í·ÉÇà¿¡¼­ °¨ÁöµÈ ¾î¶² ÀÎÀÚ¶óµµ ÀÎÀÚÀÇ ¸®½ºÆ®¿¡¼­ »èÁ¦Çϰí, argc¿Í argv¸¦ º¯Çü½ÃÄÑ ±× ÀÎÀÚµéÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °Íó·³ º¸ÀÌ°Ô ÇØ¼­, ´ç½ÅÀÇ ¾îÇÃÀÌ ³²¾ÆÀÖ´Â ÀÎÀڵ鸸À» ºÐ¼®Çϵµ·Ï ÇØÁØ´Ù.

    gtk_init (&argc, &argv);

»õ À©µµ¸¦ Çϳª ¸¸µç´Ù. À̰ÍÀº ²Ï³ª °£´ÜÇÏ´Ù. GtkWidget *window °¡ °¡¸® Ű´Â ±¸Á¶Ã¼¿¡ ¸Þ¸ð¸®°¡ ÇÒ´çµÇ¾î ÀÌÁ¦ ½ÇÁ¦·Î Á¸ÀçÇÏ´Â ±¸Á¶Ã¼¸¦ °¡¸®Å°°Ô µÈ °ÍÀÌ´Ù. »õ·Î¿î À©µµ¸¦ ¼Â¾÷ÇÏÁö¸¸, ¾ÆÁ÷ gtk_widget_show(window)¸¦ È£ÃâÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ ½ÇÁ¦·Î º¸¿©ÁöÁø ¾Ê°í ÀÖ´Ù. ÀÌ À©µµ´Â ÇÁ·Î±×·¥ÀÇ ³¡ ±Ùó¿¡¼­¾ß º¸ÀÌ°Ô µÉ °ÍÀÌ´Ù.

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

ÀÌ °æ¿ì¿£ À©µµ°¡ µÇ°ÚÁö¸¸, ¿©±â ÇÑ object¿¡ ½Ã±×³Î Çڵ鷯¸¦ ¿¬°á½ÃŰ´Â ¿¹°¡ ÀÖ´Ù. ¿©±â¼­´Â "destory"½Ã±×³ÎÀÌ Å½ÁöµÈ´Ù. ÀÌ ½Ã±×³ÎÀº ¿ì¸®°¡ À©µµ¸¦ ¾ø¾Ö±â À§Çؼ­ À©µµ¸Å´ÏÀúÀÇ ±â´ÉÀ» ÀÌ¿ëÇßÀ» ¶§(±×¸®°í ¿ì¸®°¡ "delete_event" Çڵ鷯¿¡¼­ TRUE¸¦ ¸®ÅÏÇßÀ» ¶§), ¶Ç´Â ÆÄ±«ÇÒ object·Î À©µµwidgetÀ» ¼±ÅÃÇÏ¿© gtk_widget_destroy()¸¦ È£ÃâÇßÀ» ¶§ ¹ß»ýÇÑ´Ù. À̰ÍÀ» ¼Â¾÷ÇÏ´Â °ÍÀ¸·Î ¿ì¸®´Â ÇÑ ¹øÀÇ È£Ãâ·Î µÎ °æ¿ì ¸ðµÎ¸¦ ´Ù·ê ¼ö ÀÖ´Ù. ¿©±â¼­, ±×°ÍÀº ¾Õ¿¡¼­ Á¤ÀÇµÈ destroy() ÇÔ¼ö¸¦ NULL ÀÎÀڷΠȣÃâÇÏ¿© GTK¸¦ Á¾·áÇÏ°Ô ÇÑ´Ù.

GTK_OBJECT¿Í GTK_SIGNAL_FUNC´Â Äڵ带 ½±°Ô ºÐ¼®ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ¸ç ÀÚ·áÇü ij½ºÆÃ°ú üũ¸¦ ÇØÁÖ´Â ¸ÅÅ©·ÎµéÀÌ´Ù.

    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC (destroy), NULL);

À̹ø ÇÔ¼ö´Â container objectÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇØ ÁÖ±â À§ÇØ ¾²¿´´Ù. À̰ÍÀº À©µµ¸¦ 10 Çȼ¿ÀÇ ³ÊºñÀÇ ºó ¿µ¿ªÀ¸·Î µÑ·¯½×ÀÌ°Ô ÇÑ´Ù. ¿ì¸®´Â ¾ÕÀ¸·Î Widget ¼Ó¼º¼³Á¤ À̶ó´Â section¿¡¼­ À¯»çÇÑ ±â´ÉÀ» °¡Áø ´Ù¸¥ ÇÔ¼öµéÀ» Á¢ÇÏ°Ô µÉ °ÍÀÌ´Ù.

±×¸®°í, GTK_CONTAINER´Â ¿ª½Ã ÀÚ·áÇü ij½ºÆÃÀ» ÇØÁÖ´Â ¸ÅÅ©·Î´Ù.

    gtk_container_border_width (GTK_CONTAINER (window), 10);

ÀÌ È£ÃâÀº »õ ¹öưÀ» Çϳª ¸¸µç´Ù. À̰ÍÀº »õ·Î¿î GtkWidget ±¸Á¶Ã¼¸¦ À§ÇÑ ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇϰí, ±×°ÍÀ» ÃʱâÈ­Çϸç, ±×¸®°í buttonÀ̶ó´Â Æ÷ÀÎÅͰ¡ ±× ¿µ¿ªÀ» °¡¸®Å°µµ·Ï ÇÑ´Ù. ÀÌ ¹öưÀº º¸¿©Áö°Ô µÇ¾úÀ» ¶§ "Hello World"¶ó´Â ¶óº§À» °¡Áö°Ô µÉ °ÍÀÌ´Ù.

    button = gtk_button_new_with_label ("Hello World");

¿ì¸®´Â ¿©±â¼­ ÀÌ ¹öưÀÌ ¹º°¡ À¯¿ëÇÑ ÀÏÀ» Çϵµ·Ï ÇÑ´Ù. ¿ì¸®´Â ±×°Í¿¡ ½Ã±×³Î Çڵ鷯¸¦ ´Þ¾ÆÁÖ°í, "clicked"½Ã±×³ÎÀÌ ¹ß»ýÇßÀ» ¶§ ¿ì¸®ÀÇ hello() ÇÔ¼ö°¡ È£ÃâµÇµµ·Ï ÇÑ´Ù. ÀüÇØÁú Á¤º¸´Â ¾ø°í, µû¶ó¼­ ¿ì¸®´Â hello()¶ó´Â callbackÇÔ¼ö¿¡ ´Ü¼øÈ÷ NULLÀ» ÀüÇØÁØ´Ù. ºÐ¸íÈ÷, ¿ì¸®°¡ ¸¶¿ì½º Æ÷ÀÎÅÍ·Î ±× ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ "clicked"½Ã±×³ÎÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù.

    gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (hello), NULL);

¿ì¸®´Â ¶ÇÇÑ ÇÁ·Î±×·¥À» ³¡³»±â À§Çؼ­µµ ÀÌ ¹öưÀ» ÀÌ¿ëÇÑ´Ù. À̰ÍÀº À©µµ ¸Å´ÏÀú¸¦ ÅëÇØ¼­, ȤÀº ¿ì¸® ÇÁ·Î±×·¥À» ÅëÇØ¼­ "destroy"½Ã±×³ÎÀÌ ¾î¶»°Ô ÀüÇØ ¿À´ÂÁö¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù. ¾Õ¿¡¼­Ã³·³ ¹öưÀÌ ´­·ÁÁö¸é ¸ÕÀú hello() callback ÇÔ¼ö°¡ ºÒ·ÁÁö°í, µÚÀÌ¾î ±×µéÀÌ ¼Â¾÷µÈ ¼ø¼­´ë·Î À̰ÍÀÌ È£ÃâµÈ´Ù. ÇÊ¿äÇÏ´Ù¸é ¾ó¸¶µçÁö callbackÇÔ¼ö¸¦ ¾µ ¼ö ÀÖÀ¸¸ç, ±×°Íµé ¸ðµÎ´Â ¿ì¸®°¡ ¿¬°á½ÃÄѳõÀº ¼ø¼­´ë·Î ½ÇÇàµÈ´Ù. gtk_widget_destroy()ÇÔ¼ö°¡ ¿ÀÁ÷ GtkWidget *widget¸¸À» ÀÎÀÚ·Î Çã¿ëÇϱ⠶§¹®¿¡, ¿ì¸®´Â ¿©±â¼­ gtk_signal_connect()¸¦ ¹Ù·Î ¾²Áö ¾Ê°í gtk_signal_connect_object()¸¦ ¾´´Ù.

    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                               GTK_SIGNAL_FUNC (gtk_widget_destroy),
                               GTK_OBJECT (window));

À̰ÍÀº ÆÐÅ·È£ÃâÀÌ¸ç µÚ¿¡¼­ ´õ ±í°Ô ´Ù·ê °ÍÀÌ´Ù. ÇÏÁö¸¸ »ó´çÈ÷ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖ´Ù. À̰ÍÀº ´ÜÁö GTK¿¡°Ô, ¹öưÀº ±× ¹öưÀÌ º¸¿©Áö°Ô µÉ À©µµ¿¡ À§Ä¡ÇØ¾ß µÈ´Ù´Â °É ¾Ë·ÁÁØ´Ù.

    gtk_container_add (GTK_CONTAINER (window), button);

ÀÌÁ¦ ¿ì¸®´Â ÇÊ¿äÇÑ ¸ðµç ¼Â¾÷À» ¸¶ÃÆ´Ù. ÀÚ¸®¸¦ ÀâÀº ¸ðµç ½Ã±×³Î Çڵ鷯¿Í ÇÔ²², ¸ðµç ¹öưÀÌ °¢°¢ ÀÖ¾î¾ß ÇÒ À©µµ¿¡ ÀÚ¸®¸¦ Àâ¾Ò°í, ¿ì¸®´Â GTK°¡ ½ºÅ©¸° À§¿¡ widgetµéÀ» "º¸¿©ÁÖ±â"¸¦ ¿ä±¸ÇÑ´Ù. À©µµwidgetÀÌ °¡Àå ³ªÁß¿¡ º¸¿©Áø´Ù. µû¶ó¼­ À©µµ°¡ ¸ÕÀú º¸¿©Áö°í ±× ³»ºÎ¿¡ ¹öư ¸ð¾çÀÌ µÚÀÌ¾î ±×·ÁÁö´Â °Ô ¾Æ´Ï¶ó, ¿ÏÀüÈ÷ ¸ð¾çÀ» °®Ãá À©µµ°¡ ÇѲ¨¹ø¿¡ º¸¿©Áö°Ô µÈ´Ù.

    gtk_widget_show (button);

    gtk_widget_show (window);

±×¸®°í ¹°·Ð, ¿ì¸®´Â gtk_main()À» ºÒ·¯¼­ X ¼­¹ö·ÎºÎÅÍ À̺¥Æ®°¡ ¹ß»ýÇϱ⸦ ±â´Ù¸®°Ô Çϰí, ÀÌ À̺¥Æ®°¡ ŽÁöµÇ¾úÀ» ¶§ ½Ã±×³ÎÀ» ³»µµ·Ï widgetÀ» È£ÃâÇÒ °ÍÀÌ´Ù.

    gtk_main ();
±×¸®°í ¸¶Áö¸· ¸®ÅÏ. gtk_quit()°¡ È£ÃâµÈ ÀÌÈÄ Á¦¾î´Â ¿©±â¼­ ³¡³ª°Ô µÈ´Ù.
    return 0;

ÀÌÁ¦, ¿ì¸®°¡ GTKÀÇ ¹öư À§¿¡¼­ ¸¶¿ì½º ¹öưÀ» Ŭ¸¯Çϸé widgetÀº "clicked" ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù. ÀÌ·± Á¤º¸¸¦ ÀÌ¿ëÇϱâ À§ÇØ ¿ì¸® ÇÁ·Î±×·¥Àº ±× ½Ã±×³ÎÀ» Àâ¾Æ³¾ ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϰí, ±×°ÍÀº ¿ì¸®ÀÇ ¼±Åÿ¡ ÀÇÇÑ ÇÔ¼öµéÀ» À绡¸® ºÎ¸£°Ô µÈ´Ù. ¿ì¸®ÀÇ ¿¹Á¦¿¡¼­´Â ¿ì¸®°¡ ¸¸µç ¹öưÀÌ ´­·ÁÁö¸é hello()ÇÔ¼ö°¡ NULL ÀÎÀڷΠȣÃâµÇ°í, µÚÀ̾î ÀÌ ½Ã±×³ÎÀ» À§ÇÑ ´ÙÀ½ Çڵ鷯°¡ È£ÃâµÈ´Ù. À̰ÍÀº À©µµ widgetÀ» ÀÎÀÚ·Î ÇÏ¿© gtk_widget_destroy()ÇÔ¼ö¸¦ È£ÃâÇØ¼­ À©µµ widgetÀ» ¾ø¾Ø´Ù. À̰ÍÀº À©µµ°¡ "destroy"½Ã±×³ÎÀ» ¹ß»ýÇÏ°Ô ÇØ¼­ ŽÁöµÇ°í, "destroy"¿¡ ÇØ´çÇÏ´Â callbackÇÔ¼ö¸¦ È£ÃâÇØ¼­ GTK°¡ Á¾·áµÇ°Ô ÇÏ´Â °ÍÀÌ´Ù.

À̺¥Æ®µéÀÇ ¶Ç´Ù¸¥ »ç¿ë¹æ¹ýÀº À©µµ¸¦ Á¾·áÇϴµ¥ À©µµ ¸Å´ÏÁ®¸¦ ¾²´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çϸé "delete_event" ½Ã±×³ÎÀÌ ¹ß»ýÇϰí ÀÌ´Â ¿ì¸®ÀÇ "delete_event" Çڵ鷯¸¦ È£ÃâÇÑ´Ù. ¸¸ÀÏ ¿ì¸®°¡ ¿©±â¼­ TRUE¸¦ ¸®ÅÏÇϸé À©µµ´Â ±×´ë·Î È­¸é¿¡ ³²°í ¾Æ¹«Àϵµ »ý±âÁö ¾Ê´Â´Ù. FALSE¸¦ ¸®ÅÏÇϸé GTK´Â "destroy" ½Ã±×³ÎÀ» ¹ß»ýÇϰí "destroy" callbackÀÌ È£ÃâµÇ¾î GTK°¡ Á¾·áµÈ´Ù.

ºñ·Ï ¾²ÀÓ»õ´Â °ÅÀÇ °°Àº °ÍÀÌÁö¸¸, À¯´Ð½º ½Ã½ºÅÛÀÇ ½Ã±×³ÎÀº ¿©±â¼­ ¸»ÇÏ´Â ÀÌ·± ½Ã±×³Î°ú ´Ù¸¥ °ÍÀÌ¸ç »ç¿ëµÇÁöµµ ¾Ê´Â´Ù´Â Á¡À» ±â¾ïÇϱ⠹ٶõ´Ù.

4. ¾ÕÀ¸·Î ³ª¾Æ°¡¸ç

4.1 ÀÚ·áÇü

¾Õ¼­ÀÇ ¿¹Á¦¿¡¼­ ÁÖ¸ñÇß°ÚÁö¸¸ ¼³¸íÀÌ ÇÊ¿äÇÑ °ÍÀÌ Á» ÀÖ´Ù. gint, gchar µîÀº °¢°¢ int¿Í char¿¡ ´ëÇÑ typedefµéÀÌ´Ù. À̰ÍÀº °è»êÀ» ÇÒ ¶§ °£´ÜÇÑ ÀÚ·áÇüµéÀÇ Å©±â¿¡ ´ëÇÑ ÁöÀúºÐÇÑ ÀÇÁ¸¼ºÀ» ÇÇÇϱâ À§ÇÑ °ÍÀÌ´Ù. 64ºñÆ®ÀÇ ¾ËÆÄµç 32ºñÆ®ÀÇ ÀÎÅÚÀ̵ç "gint32"´Â Ç÷§Æû¿¡ °ü°è¾øÀÌ 32ºñÆ® Á¤¼ö·Î typedefµÇ¾î ÀÖ´Â °ÍÀÌ ÁÁÀº ¿¹°¡ µÉ °ÍÀÌ´Ù. ÀÌ typedefÀº »ó´çÈ÷ Á÷°üÀûÀÌ´Ù. ±×µéÀº ¸ðµÎ glib/ glib.h¿¡¼­ Á¤ÀǵǾî ÀÖ´Ù(À̰ÍÀº gtk.h¿¡¼­ Æ÷ÇÔ½ÃŰ°Ô µÈ´Ù.). ´ç½ÅÀº ¶ÇÇÑ ÇÔ¼ö°¡ GtkObject¸¦ ºÎ¸¦ ¶§ GtkWidgetÀ» ÀÌ¿ëÇÏ´Â °Í¿¡µµ ÁÖ¸ñÇÒ °ÍÀÌ´Ù. GTK´Â °´Ã¼ÁöÇâÀûÀ¸·Î ¼³°èµÈ °ÍÀ̰í, widgetÀº ÇϳªÀÇ objectÀÌ´Ù.

4.2 ½Ã±×³Î Çڵ鷯¿¡ ´ëÇØ Á» ´õ ¾Ë¾Æº¸±â

gtk_signal_connectÀÇ ¼±¾ðÀ» ¶Ç ´Ù¸£°Ô »ìÆìº¸ÀÚ.

gint gtk_signal_connect (GtkObject *object, gchar *name,
                         GtkSignalFunc func, gpointer func_data);

gintÇüÀÇ ¸®Åϰª? À̰ÍÀº callbackÇÔ¼ö¸¦ È®ÀÎÇϱâ À§ÇÑ ²¿¸®Ç¥´Ù. ¾Õ¼­ ¾ê±âÇßµíÀÌ ¿ì¸®´Â ½Ã±×³Î°ú object¿¡ ´ëÇØ ÇÊ¿äÇÑ ¸¸Å­ÀÇ ¸¹Àº callbackÀ» °¡Áú ¼ö ÀÖ°í, ±×°ÍµéÀº ºÙ¿©Á® ÀÖ´Â ¼ø¼­´ë·Î °¢°¢ ½ÇÇàµÉ °ÍÀÌ´Ù. ÀÌ ²¿¸®Ç¥´Â ¿ì¸®°¡ ¸®½ºÆ®¿¡¼­ ÀÌ·± callbackÀ» Á¦°ÅÇϵµ·Ï ÇØÁØ´Ù.

void gtk_signal_disconnect (GtkObject *object,
                            gint id);

±×·¡¼­, Çڵ鷯·ÎºÎÅÍ Á¦°ÅÇϰíÀÚ ÇÏ´Â widget°ú signal_connectÇÔ¼ö·ÎºÎÅÍ ¸®ÅÏµÈ±× widgetÀÇ ²¿¸®Ç¥ ȤÀº id¸¦ ³Ñ°ÜÁÜÀ¸·Î½á ½Ã±×³Î Çڵ鷯¸¦ ²÷¾îÁÙ ¼ö ÀÖ´Ù.

Object¿¡¼­ ¸ðµç ½Ã±×³Î Çڵ鷯¸¦ Á¦°ÅÇÏ´Â ¶Ç´Ù¸¥ ÇÔ¼ö´Â À̰ÍÀÌ´Ù.

gtk_signal_handlers_destroy (GtkObject *object);
ÀÌ È£ÃâÀº º¸ÀÌ´Â ±×´ë·Î´Ù. À̰ÍÀº ù¹øÂ° ÀÎÀÚ·Î ³Ñ°Ü¹ÞÀº object¿¡¼­, ´ÜÁö ÇöÀç ¼³Á¤µÈ ¸ðµç ½Ã±×³Î Çڵ鷯¸¦ Á¦°ÅÇØ ÁØ´Ù.

4.3 Çâ»óµÈ Hello World ÇÁ·Î±×·¥

CallbackÇÔ¼ö¿¡ ´ëÇÑ ´õ ³ªÀº ¿¹Á¦°¡ µÉ ¾à°£ °³¼±µÈ hello world¸¦ º¸ÀÚ. À̰ÍÀº ¶ÇÇÑ ¿ì¸®ÀÇ ´ÙÀ½ Àý¿¡¼­ÀÇ ÁÖÁ¦ÀÎ ÆÐÅ· widgetÀ» ¼Ò°³ÇÒ °ÍÀÌ´Ù.

/* helloworld2.c */

#include <gtk/gtk.h>

/* ¿ì¸®ÀÇ ¾à°£ °³¼±µÈ callback.  ÀÌ ÇÔ¼ö·Î ÀüÇØÁø µ¥ÀÌÅʹ ǥÁØÃâ·ÂÀ¸·Î
 * º¸¿©Áø´Ù. */
void callback (GtkWidget *widget, gpointer data)
{
        g_print ("Hello again - %s was pressed\n", (char *) data);
}
/* ´Ù¸¥ callback */
void delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
{
        gtk_main_quit ();
}
int main (int argc, char *argv[])
{
        /* GtkWidgetÀº widgetµéÀ» À§ÇÑ ÀúÀåÀå¼Ò ŸÀÔÀÌ´Ù. */ 
        GtkWidget *window;
        GtkWidget *button;
        GtkWidget *box1;
        /* À̰ÍÀº ¸ðµç GTK ¾îÇÿ¡¼­ ¾´´Ù.  ¸í·ÉÇà¿¡¼­ ÁÖ¾îÁø ÀÎÀÚµéÀº À̰ÍÀ»
         * Åë°úÇØ¼­ ¾îÇÿ¡ Àü´ÞµÈ´Ù. */
        gtk_init (&argc, &argv);
        /* »õ·Î¿î À©µµ¸¦ ¸¸µç´Ù. */
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        /* »õ·Î Á¢ÇÏ´Â ÇÔ¼ö·Î, À©µµ¿¡ "Hello Buttons!"¶ó´Â ŸÀÌÆ²À» ÁØ´Ù. */
        gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!");
        /* ¿©±â¼­ ¿ì¸®´Â GTK¸¦ Áï½Ã ³¡³ª°Ô ÇÏ´Â delete_event¸¦ À§ÇÑ Çڵ鷯¸¦
         * ¼¼ÆÃÇÑ´Ù. */
        gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (delete_event), NULL);
        /* À©µµÀÇ border width¸¦ ¼¼ÆÃÇÑ´Ù. */
        gtk_container_border_width (GTK_CONTAINER (window), 10);
        /* widgetµéÀÌ ÆÐÅ·µÉ ¹Ú½º¸¦ ¸¸µç´Ù.  À̰ÍÀº ÆÐÅ·¿¡ ´ëÇÑ ºÎºÐ¿¡¼­
         * ÀÚ¼¼È÷ ¼³¸íµÉ °ÍÀÌ´Ù.  ¹Ú½º´Â ½ÇÁ¦·Î º¸ÀÌ´Â °Ç ¾Æ´Ï¸ç ´ÜÁö
         * widgetµéÀ» Á¤·ÄÇØ ³õÀ» µµ±¸·Î¼­ ¾²ÀδÙ. */
        box1 = gtk_hbox_new(FALSE, 0);
        /* ¹Ú½º¸¦ À©µµ ¾È¿¡ ³õ´Â´Ù. */
        gtk_container_add (GTK_CONTAINER (window), box1);
        /* "Button 1"À̶õ ¶óº§À» °¡Áø »õ·Î¿î ¹öưÀ» ¸¸µç´Ù. */
        button = gtk_button_new_with_label ("Button 1");
        /* ÀÌÁ¦ ¹öưÀÌ Å¬¸¯µÇ¸é ¿ì¸®´Â ÀÌ ¹öư¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î °¡Áö´Â
         * "callback" ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. */
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (callback), (gpointer) "button 1");
        /* gtk_container_add ´ë½Å¿¡, ¿ì¸®´Â ÀÌ¹Ì À©µµ¿¡ ÆÐÅ·µÇ¾î ÀÖ´Â º¸ÀÌÁö
         * ¾Ê´Â ¹Ú½º¿¡ ¹öưÀ» ÆÐÅ·ÇÑ´Ù. */
        gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);
        /* ÀÌ ¼ø¼­¸¦ ²À ±â¾ïÇ϶ó.  ¿©±â¼­ ¹öư¿¡ ´ëÇÑ ¼¼ÆÃÀÌ ¿ÏÀüÈ÷ ³¡³µÀ½À»
         * GTK¿¡°Ô ¾Ë¸®°í, µû¶ó¼­ ±×°ÍÀº ÀÌÁ¦ º¸¿©Áú ¼ö ÀÖ´Ù. */
        gtk_widget_show(button);
        /* µÎ¹øÂ° ¹öưÀ» ¸¸µé±â À§ÇØ °°Àº ÀýÂ÷¸¦ °ÅÄ£´Ù. */
        button = gtk_button_new_with_label ("Button 2");
        /* °°Àº callbackÀ» È£ÃâÇÑ´Ù.  ¹°·Ð ÀÎÀÚ´Â "button 2"¿¡ ´ëÇÑ
         * Æ÷ÀÎÅÍ´Ù. */
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (callback), (gpointer) "button 2");
        gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);
        /* ¿ì¸®°¡ ¹öưÀ» ¸ÕÀú º¸¿©Áà¾ß ÇÏ´Â ±× ¼ø¼­´Â ½ÇÁ¦·Î Áß¿äÇÑ °ÍÀº
         * ¾Æ´Ï´Ù.  ÇÏÁö¸¸ ³ª´Â ¸ðµç °ÍµéÀÌ ÇѲ¨¹ø¿¡ Æ¢¾î ³ª¿À¸ç º¸¿©Áú ¼ö
         * ÀÖµµ·Ï À©µµ¸¦ °¡Àå ³ªÁß¿¡ º¸¿©ÁÙ °ÍÀ» ±ÇÀåÇÑ´Ù. */
        gtk_widget_show(button);
        gtk_widget_show(box1);
        gtk_widget_show (window);
        /* ¿©±â¼­ ¾ÕÀ¸·ÎÀÇ Àç¹ÌÀÖ´Â °ÍµéÀ» ±â´Ù¸®°Ô µÈ´Ù! */
        gtk_main ();
        return 0;
}

ÀÌ ÇÁ·Î±×·¥À» ¿ì¸®ÀÇ Ã¹¹øÂ° ¿¹Á¦¿Í °°Àº ¸µÅ© ÀÎÀÚ¸¦ ÁÖ°í ÄÄÆÄÀÏÇÏÀÚ. ¿ª½Ã ¿ì¸®´Â ÀÌ ÇÁ·Î±×·¥À» Á¾·áÇϱâ À§Çؼ­ À©µµ¸Å´ÏÀú¸¦ ÀÌ¿ëÇϰųª ¸í·ÉÇà¿¡¼­ Á×ÀÌ´Â °Í ¸»°í´Â ´Ù¸¥ ¹æ¹ýÀÌ ¾ø´Ù´Â °É ¾Ë °ÍÀÌ´Ù. ¿¬½À»ï¾Æ ¼¼¹øÂ°·Î "Quit" ¹öưÀ» ¸¸µé¾î Ãß°¡ÇØ º¸´Â °Íµµ ÁÁÀ» °ÍÀÌ´Ù. ¶ÇÇÑ ´ÙÀ½ ÀýÀ» Àо¸ç gtk_box_pack_start()¿¡ ¿É¼ÇÀ» Á־ ¼öµµ ÀÖ´Ù. À©µµÀÇ Å©±â¸¦ ¹Ù²Ù·Á°í ½Ãµµµµ ÇØº¸°í, µ¿ÀÛÀ» °üÂûÇØ º¸¶ó.

Âü°í·Î, gtk_window_new()¸¦ À§ÇÑ ¶Ç´Ù¸¥ À¯¿ëÇÑ defineÀ¸·Î GTK_WINDOW_DIALOG µµ ÀÖ´Ù. À̰ÍÀº À©µµ¸Å´ÏÀú¿Í ¾à°£ ´Ù¸¥ ¹æ½ÄÀ¸·Î »óÈ£ÀÛ¿ëÇϸç, ÀϽÃÀûÀÎ À©µµ µé¿¡ ´ëÇØ ¾²¿©Á®¾ß ÇÑ´Ù.

5. ÆÐÅ· Widget

¿ì¸®°¡ ¾î¶² ¾îÇÃÀ» °³¹ßÇϸ鼭, ÇϳªÀÇ À©µµ¿¡ Çϳª ÀÌ»óÀÇ ¹öưÀ» ³õÀ¸·Á ÇÒ °ÍÀÌ´Ù. ¿ì¸®ÀÇ Ã¹¹øÂ° hello world ¿¹Á¦´Â ÇϳªÀÇ widget¸¸ ½è°í µû¶ó¼­ ¿ì¸®´Â ±×°ÍÀ» À©µµ ³»ºÎ¿¡ "pack"Çϱâ À§ÇØ gtk_container_add ÇÔ¼ö¸¦ ½è´Ù. ±×·¯³ª ¿ì¸®°¡ ÇϳªÀÇ À©µµ¿¡ ´õ¸¹Àº widgetÀ» ³õÀ¸·Á ÇÒ ¶§, ¾î¶»°Ô ±×µéÀÌ ³õÀÏ À§Ä¡¸¦ Á¦¾îÇØ¾ß ÇÒ±î? ¿©±â¼­ ¹Ù·Î "packing"À̶õ °ÍÀÌ µîÀåÇÑ´Ù.

5.1 ¹Ú½º packingÀÇ ¿ø¸®

´ëºÎºÐÀÇ ÆÐÅ·Àº ¾Õ¼­ÀÇ ¿¹Á¦¿¡¼­Ã³·³ ¹Ú½º¸¦ ¸¸µå´Â °ÍÀ¸·Î ÀÌ·ç¾îÁø´Ù. À̵éÀº ¿ì¸®ÀÇ widgetÀ» ¼öÆò ȤÀº ¼öÁ÷ ¹æÇâÀ¸·Î ÆÐÅ·ÇØ ³ÖÀ» ¼ö ÀÖ´Â, º¸ÀÌÁö ¾Ê´Â widget ÄÁÅ×À̳ʵéÀÌ´Ù. ¼öÆò ¹Ú½º·ÎÀÇ ÆÐÅ·widgetÀÎ °æ¿ì, object´Â È£Ãâ ÇÏ´Â ¹æ½Ä¿¡ µû¶ó ¼öÆòÀ¸·Î ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ȤÀº ¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊÀ¸·Î »ðÀÔ µÈ´Ù. ¼öÁ÷ ¹Ú½º¿¡¼­´Â ¹Ý´ë·Î ¼öÁ÷À¸·Î »ðÀԵȴÙ. ¿ì¸®´Â ¿øÇÏ´Â È¿°ú¸¦ ³»±â À§ÇØ ´Ù¸¥ ¹Ú½ºµéÀÇ ¾ÈÆÆ¿¡¼­ ¾î¶»°Ô¶óµµ Á¶ÇÕÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

»õ·Î¿î ¼öÆò¹Ú½º¸¦ ¸¸µé±â À§ÇØ ¿ì¸®´Â gtk_hbox_new()¸¦, ±×¸®°í ¼öÁ÷¹Ú½º¸¦ À§Çؼ­´Â gtk_vbox_new()¸¦ ÀÌ¿ëÇÑ´Ù. gtk_box_pack_start()¿Í gtk_box_pack_end ()´Â ÀÌ·± ÄÁÅ×À̳ÊÀÇ ³»ºÎ¿¡ objectµéÀ» À§Ä¡½Ã۱â À§ÇØ »ç¿ëÇÑ´Ù. gtk_box_ pack_start()ÇÔ¼ö´Â ¼öÁ÷¹Ú½º¿¡¼­´Â À§¿¡¼­ ¾Æ·¡ÂÊÀ¸·Î, ±×¸®°í ¼öÆò¹Ú½º¿¡¼­´Â ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ÆÐÅ·ÇÒ °ÍÀÌ´Ù. ±×¸®°í gtk_box_pack_end()´Â ÀÌ¿Í ¹Ý´ë ¹æÇâÀ¸·Î ÆÐÅ·ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇÔÀ¸·Î½á ¿ì¸®´Â ¿À¸¥ÂÊ ¶Ç´Â ¿ÞÂÊÀ¸·Î widgetÀ» Á¤·ÄÇÒ ¼ö ÀÖ°í, ¿øÇÏ´Â È¿°ú¸¦ ³¾ ¼ö ÀÖ´Ù. ¿ì¸®´Â ´ëºÎºÐÀÇ ¿¹Á¦¿¡¼­ gtk_box_pack_start()¸¦ ÀÌ¿ëÇÒ °ÍÀÌ´Ù. Object´Â ¶Ç´Ù¸¥ ÄÁÅ×À̳ʰųª widgetÀÌ µÉ ¼ö ÀÖ´Ù. ±×¸®°í »ç½Ç, ¸¹Àº widgetµéÀº ½ÇÁ¦·Î ¹öưÀ» Æ÷ÇÔÇϰí ÀÖ´Â widget ÀÌÁö¸¸, ¿ì¸®´Â º¸Åë ¹öư ¾ÈÀÇ ¶óº§¸¸À» ÀÌ¿ëÇÒ °ÍÀÌ´Ù.

ÀÌ·± ÇÔ¼öÈ£Ãâ·Î½á, GTK´Â ¿ì¸®°¡ widgetÀ» ³õÀ» À§Ä¡¸¦ ¾Ë°ÔµÇ°í µû¶ó¼­ ÀÚµ¿ÀûÀ¸·Î Å©±â¸¦ Á¶ÀýÇÑ´ÙµçÁö ¶Ç´Ù¸¥ ¸Å·ÂÀûÀÎ ÀϵéÀ» ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¶ÇÇÑ ¿ì¸®ÀÇ widgetÀÌ ¾î¶»°Ô ÆÐÅ·µÇ¾î¾ß ÇÏ´À³Ä¿¡ µû¸¥ ¼ö¸¹Àº ¿É¼Çµéµµ ÀÖ´Ù. ¿ì¸®°¡ »ó»óÇϵíÀÌ, ÀÌ·± ¹æ½ÄÀº widgetÀ» ³õ°í ¸¸µå´Â µ¥ À־ »ó´çÇÑ À¯¿¬¼º À» Á¦°øÇØ ÁØ´Ù.

5.2 ¹Ú½º¿¡ ´ëÇØ ÀÚ¼¼È÷ ¾Ë¾Æº¸ÀÚ

ÀÌ·± À¯¿¬¼º ¶§¹®¿¡, GTK¿¡¼­ ¹Ú½º¸¦ ÆÐÅ·ÇÏ´Â °ÍÀº óÀ½¿£ È¥¶õ½º·¯¿ïÁö ¸ð¸¥´Ù. ¸¹Àº ¿É¼ÇµéÀÌ ÀÖÀ¸¸ç, ±×µéÀÌ ¾î¶»°Ô ¼­·Î ²ç¾î ¸ÂÃçÁö´ÂÁö Áï½Ã °£ÆÄ ÇÒ ¼ö´Â ¾øÀ» °ÍÀÌ´Ù. ±×·¯³ª °á±¹, ¿ì¸®´Â ´Ù¼¸ °¡ÁöÀÇ ±âº»ÀûÀÎ ½ºÅ¸ÀÏÀ» °¡Áö°Ô µÈ´Ù.

Box Packing Example Image

°¢°¢ÀÇ ÁÙÀº ¸î °³ÀÇ ¹öưÀ» °¡Áö°í ÀÖ´Â ÇϳªÀÇ ¼öÆò¹Ú½º(hbox)¸¦ Æ÷ÇÔÇÑ´Ù. ÇÔ¼öÈ£Ãâ gtk_box_packÀº ÀÌ ¼öÆò¹Ú½º¿¡ °¢°¢ÀÇ ¹öưÀ» ÆÐÅ·ÇÏ´Â °ÍÀ» ´ÜÃàÇÑ °ÍÀÌ´Ù. °¢°¢ÀÇ ¹öưÀº ÀÌ ¼öÆò¹Ú½º¿¡ °°Àº ¹æ¹ýÀ¸·Î ÆÐÅ·µÈ´Ù(Áï, gtk_box_pack _startÇÔ¼ö¿¡ °°Àº ÀÎÀÚ¸¦ Áشٴ ¸»).

À̰ÍÀº gtk_box_pack_startÇÔ¼öÀÇ ¼±¾ðÀÌ´Ù.

void gtk_box_pack_start (GtkBox    *box,
                         GtkWidget *child,
                         gint       expand,
                         gint       fill,
                         gint       padding);

ù¹øÂ° ÀÎÀÚ´Â object¸¦ ÆÐÅ·ÇÒ ¹Ú½º°í µÎ¹øÂ°´Â ±× object´Ù. Object´Â ¿©±â¼­ ¸ðµÎ ¹öưÀÌ µÉ °ÍÀ̰í, µû¶ó¼­ ¿ì¸®´Â ¹Ú½º¾È¿¡ ¹öưµéÀ» ÆÐÅ·ÇÏ°Ô µÈ´Ù.

gtk_box_pack_start() ¶Ç´Â gtk_box_pack_end()¿¡¼­ÀÇ expand¶ó´Â ÀÎÀÚ°¡ TRUE ÀÏ ¶§, widgetÀº ¿©¹é°ø°£À» °¡µæ ä¿ì¸ç ¹Ú½º¿¡ µé¾î°¡°Ô µÉ °ÍÀÌ´Ù. ±×¸®°í ±×°ÍÀÌ FALSE¶ó¸é widgetÀº ÀûÀýÈ÷ ¿©¹éÀ» µÎ°Ô µÈ´Ù. ÀÌ expand¸¦ FALSE·Î µÎ¸é ¿ì¸®´Â widgetÀÇ Á¿ì Á¤·ÄÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ±×µéÀº ¹Ú½º¿¡ °¡µæÂ÷¼­ gtk_box_pack_start ¶Ç´Â gtk_box_pack_end ¾î´À ÂÊÀ» ÀÌ¿ëÇϵçÁö °°Àº È¿°ú¸¦ °¡Áö°Ô µÈ´Ù.

ÀÎÀÚ fillÀº TRUEÀÏ ¶§ object ÀÚ½ÅÀÇ ¿©¹é°ø°£À» Á¦¾îÇÑ´Ù. ±×¸®°í FALSE¶ó¸é object ÀÚ½ÅÀÇ ¿©¹é°ø°£À» µÎÁö ¾Ê´Â´Ù. À̰ÍÀº expand ÀÎÀÚ°¡ TRUEÀÏ ¶§¸¸ È¿°ú °¡ ÀÖ´Ù.

»õ·Î¿î ¹Ú½º¸¦ ¸¸µé ¶§´Â ÀÌ·± ÇÔ¼ö°¡ ÀÖ´Ù(¼öÆò¹Ú½º).

GtkWidget * gtk_hbox_new (gint homogeneous,
                          gint spacing);

¿©±â¼­ÀÇ ÀÎÀÚ homogeneous´Â ¹Ú½º ¾ÈÀÇ °¢ objectµéÀÌ °°Àº Å©±â¸¦ °¡Áöµµ·Ï Á¦¾îÇÑ´Ù(Áï ¼öÆò¹Ú½ºÀÏ °æ¿ì¿£ °°Àº ³Êºñ, ¼öÁ÷¹Ú½ºÀÏ °æ¿ì¿£ °°Àº ³ôÀÌ). À̰ÍÀÌ ¼¼ÆÃµÇ¸é, gtk_box_packÇÔ¼öÀÇ expand ÀÎÀÚ´Â ¾ðÁ¦³ª TRUE°¡ µÈ´Ù.

¿©±â¼­ spacing(¹Ú½º°¡ ¸¸µé¾îÁö¸ç ¼¼ÆÃµÊ)¿Í padding(¿ä¼ÒµéÀÌ ÆÐÅ·µÇ¸ç ¼¼ÆÃµÊ)ÀÇ Â÷ÀÌÁ¡Àº ¹«¾ùÀϱî? SpacingÀº objectµé »çÀÌ¿¡ »ý°Ü³ª´Â °ÍÀ̸ç paddingÀº ÇÑ objectÀÇ °¢ ¹æÇâ¿¡¼­ »ý°Ü³ª´Â °ÍÀÌ´Ù. À̰ÍÀÌ ±× Á¡À» ¸íÈ®È÷ ÇØÁÙ °ÍÀÌ´Ù.

Box Packing Example Image

¿©±â ÀÌ À̹ÌÁö¸¦ ¸¸µé¾î ÁÖ´Â Äڵ尡 ÀÖ´Ù. ³ª´Â ¿©·¯ ¹ø °­Á¶ÇßÀ¸¹Ç·Î À̰Ϳ¡¼­ º° ¹®Á¦´Â ¾øÀ¸¸®¶ó ¹Ï´Â´Ù. ½º½º·Î ÄÄÆÄÀÏÇØ¼­ °¡Áö°í ³î¾Æ º¸µµ·Ï ÇÑ´Ù.

5.3 ÆÐÅ·¿¡ ´ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥

/* packbox.c */

#include "gtk/gtk.h"

void
delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
{
  gtk_main_quit ();
}

/* Button_labelµé·Î ÀÌ·ç¾îÁø hbox¸¦ ¸¸µç´Ù.  ¿ì¸®°¡ °ü½ÉÀ» °¡Áø º¯¼öµéÀ»
 * À§ÇÑ ÀÎÀÚµéÀÌ ÀÌ ÇÔ¼ö·Î ³Ñ°ÜÁø´Ù.
 * ¿ì¸®´Â ¹Ú½º¸¦ º¸ÀÌÁö ¾Ê°í, ±× ¾È¿¡ ÀÖ´Â ¸ðµç °ÍÀ» º¸ÀÏ °ÍÀÌ´Ù. */
GtkWidget *make_box (gint homogeneous, gint spacing,
                     gint expand, gint fill, gint padding)
{
  GtkWidget *box;
  GtkWidget *button;
  char padstr[80];
  /* Àû´çÇÑ homogenous¿Í spacingÀ» °¡Áø hbox¸¦ ¸¸µç´Ù. */
  box = gtk_hbox_new (homogeneous, spacing);
  /* ÀûÀýÈ÷ ¼¼ÆÃµÈ ¹öưµéÀ» ¸¸µç´Ù. */
  button = gtk_button_new_with_label ("gtk_box_pack");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  button = gtk_button_new_with_label ("(box,");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  button = gtk_button_new_with_label ("button,");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);
  /* expandÀÇ °ª¿¡ µû¸£´Â ¶óº§À» °¡Áø ÇÑ ¹öưÀ» ¸¸µç´Ù. */
  if (expand == TRUE)
    button = gtk_button_new_with_label ("TRUE,");
  else
    button = gtk_button_new_with_label ("FALSE,");

  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);
  /* À§ÀÇ °æ¿ì¿Í °°Àº ¹öưÀ» ¸¸µéÁö¸¸, ´õ ´ÜÃàµÈ Ç¥ÇöÀÌ´Ù. */
  button = gtk_button_new_with_label (fill ? "TRUE," : "FALSE,");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  sprintf (padstr, "%d);", padding);

  button = gtk_button_new_with_label (padstr);
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  return box;
}

int
main (int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *box1;
  GtkWidget *box2;
  GtkWidget *separator;
  GtkWidget *label;
  GtkWidget *quitbox;
  int which;

  /* ¾ðÁ¦³ª ÀÌ·¸°Ô ½ÃÀÛÇÏ´Â °ÍÀ» ÀØÁö ¸» °Í! */
  gtk_init (&argc, &argv);

  if (argc != 2) {
    fprintf (stderr, "usage: packbox num, where num is 1, 2, 3.\n");
    /* GTK¸¦ ³¡³»´Â ºÎºÐÀ̸ç, exit status´Â 1ÀÌ´Ù. */
    gtk_exit (1);
  }

  which = atoi (argv[1]);

    /* ¿ì¸®ÀÇ À©µµ¸¦ ¸¸µç´Ù. */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  /* Main À©µµ¿¡ destroy ½Ã±×³ÎÀ» ¿¬°á½ÃÄÑ Áà¾ß ÇÑ´Ù.  À̰ÍÀº Á¦´ë·Î µÈ
   * µ¿ÀÛÀ» À§ÇØ ¸Å¿ì Áß¿äÇÑ °ÍÀÌ´Ù. */
  gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                      GTK_SIGNAL_FUNC (delete_event), NULL);
  gtk_container_border_width (GTK_CONTAINER (window), 10);

  /* ¿ì¸®´Â ¼öÆò¹Ú½ºµéÀ» ÆÐÅ·ÇØ ³ÖÀ» ¼öÁ÷¹Ú½º(vbox)¸¦ ¸¸µç´Ù.
   * ¹öưÀÌ µé¾îÀÖ´Â ¼öÆò¹Ú½º´Â ÀÌ ¼öÁ÷¹Ú½º ¾ÈÀ¸·Î ¼ø¼­´ë·Î ½×ÀδÙ.
   * (½ºÅà ±¸Á¶¸¦ »ý°¢ÇÏ¸é µÉ °ÍÀÌ´Ù.) */
  box1 = gtk_vbox_new (FALSE, 0);

  switch (which) {
  case 1:
        /* »õ·Î¿î ¶óº§À» ¸¸µç´Ù. */
        label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");

        /* ¶óº§µéÀ» ¿ÞÂÊÀ¸·Î Á¤·Ä½ÃŲ´Ù.  À̰Ϳ¡ ´ëÇØ¼­ widgetÀÇ ¼Ó¼º
         * ¼¼ÆÃÇϱ⿡¼­ ´Ù½Ã ´Ù·ê °ÍÀÌ´Ù. */
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);

        /* ¶óº§À» ¼öÁ÷¹Ú½º(vbox box1)¿¡ ÆÐÅ·ÇÑ´Ù.  ÇÑ vbox¿¡ ÆÐÅ·µÇ´Â
         * widgetµéÀº ¼ø¼­´ë·Î ´Ù¸¥ °ÍµéÀÇ À§ÂÊÀ¸·Î ÆÐÅ·µÈ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);

        /* ¶óº§À» º¸¿©ÁØ´Ù. */
        gtk_widget_show (label);

        /* make_box ÇÔ¼ö¸¦ ÀûÀýÇÑ ÀÎÀڷνá È£ÃâÇÑ´Ù. */
        box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 0, TRUE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 0, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);
        /* ÇϳªÀÇ separator¸¦ ¸¸µç´Ù.  À̵鿡 ´ëÇØ¼­ µÚ¿¡¼­ ÀÚ¼¼È÷
         * ´Ù·ê °ÍÀ̸ç, ²Ï³ª °£´ÜÇÑ °ÍÀÌ´Ù. */
        separator = gtk_hseparator_new ();

        /* separator¸¦ vbox ¾ÈÀ¸·Î ÆÐÅ·ÇÑ´Ù.  ÀÌµé °¢°¢ÀÇ widgetÀº
         * vbox ¾ÈÀ¸·Î ÆÐÅ·µÇ¹Ç·Î, ¼öÁ÷ ¹æÇâÀ¸·Î ½×ÀÏ °ÍÀÌ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);

        /* ¶Ç´Ù¸¥ ¶óº§À» ¸¸µé¾î ±×°ÍÀ» º¸¿©ÁØ´Ù. */
        label = gtk_label_new ("gtk_hbox_new (TRUE, 0);");
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
        gtk_widget_show (label);

        /* °¢ ÀÎÀÚ´Â homogeneous, spacing, expand, fill, paddingÀÌ´Ù. */
        box2 = make_box (TRUE, 0, TRUE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (TRUE, 0, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        /* ¶Ç´Ù¸¥ separator */
        separator = gtk_hseparator_new ();
        /* gtk_box_pack_start ÀÇ ¸¶Áö¸· 3°¡Áö ÀÎÀÚµéÀº
         * expand, fill, padding ÀÌ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);

        break;

    case 2:

        /* ¶óº§À» »õ·Î ¸¸µç´Ù. box1Àº main()ÀÇ ½ÃÀۺκп¡¼­ ¸¸µé¾îÁø
         * ´ë·Î vboxÀÌ´Ù. */
        label = gtk_label_new ("gtk_hbox_new (FALSE, 10);");
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
        gtk_widget_show (label);

        box2 = make_box (FALSE, 10, TRUE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 10, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        separator = gtk_hseparator_new ();
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);

        label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
        gtk_widget_show (label);

        box2 = make_box (FALSE, 0, TRUE, FALSE, 10);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 0, TRUE, TRUE, 10);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        separator = gtk_hseparator_new ();
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);
        break;

    case 3:
        /* À̰ÍÀº gtk_box_pack_end()¸¦ ÀÌ¿ëÇÏ¿© widgetÀ» ¿À¸¥ÂÊ Á¤·ÄÇÏ´Â
         * °É º¸¿©ÁØ´Ù.  ¸ÕÀú, ¾Õ¿¡¼­Ã³·³ »õ·Î¿î ¹Ú½º¸¦ Çϳª ¸¸µç´Ù. */
        box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
        /* ¶óº§À» Çϳª ¸¸µç´Ù. */
        label = gtk_label_new ("end");
        /* ±×°ÍÀ» gtk_box_pack_end()·Î½á ÆÐÅ·ÇϹǷÎ, make_box()·Î ¸¸µé¾îÁø
         * hboxÀÇ ¿À¸¥ÂÊÀ¸·Î ³õ¿©Áö°Ô µÈ´Ù.
        gtk_box_pack_end (GTK_BOX (box2), label, FALSE, FALSE, 0);
        /* ¶óº§À» º¸ÀδÙ. */
        gtk_widget_show (label);

        /* box2¸¦ box1 ¾ÈÀ¸·Î ÆÐÅ·ÇÑ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        /* bottom ÂÊÀ» À§ÇÑ separator. */
        separator = gtk_hseparator_new ();
        /* À̰ÍÀº 400Çȼ¿ÀÇ ³Êºñ¿¡ 5Çȼ¿ÀÇ ³ôÀÌ(µÎ²²)·Î separator¸¦
         * ¼¼ÆÃÇÑ´Ù. À̰ÍÀº ¿ì¸®°¡ ¸¸µç hbox°¡ ¶ÇÇÑ 400Çȼ¿ÀÇ ³ÊºñÀ̱â
         * ¶§¹®À̰í, "end" ¶óº§Àº hboxÀÇ ´Ù¸¥ ¶óº§µé°ú ±¸ºÐµÉ(separated)
         * °ÍÀÌ´Ù.  ±×·¸Áö ¾ÊÀ¸¸é, hbox ³»ºÎÀÇ ¸ðµç widgetµéÀº °¡´ÉÇѸ¸Å­
         * ¼­·Î »ª»ªÈ÷ ºÙ¾î¼­ ÆÐÅ·µÉ °ÍÀÌ´Ù. */
        gtk_widget_set_usize (separator, 400, 5);
        /* main()ÇÔ¼öÀÇ ½ÃÀۺκп¡¼­ ¸¸µé¾îÁø vbox(box1)À¸·Î separator¸¦ 
         * ÆÐÅ·ÇÑ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);
    }

    /* ¶Ç´Ù¸¥ hbox¸¦ ¸¸µç´Ù.. ¿ì¸®°¡ ¿øÇÏ´Â ¸¸Å­ ¾ó¸¶µçÁö ¸¸µé¼ö ÀÖ´Ù! */
    quitbox = gtk_hbox_new (FALSE, 0);

    /* ¿ì¸®ÀÇ quit ¹öưÀÌ´Ù. */
    button = gtk_button_new_with_label ("Quit");

    /* À©µµ¸¦ ÆÄ±«Çϱ⠽ñ׳ÎÀ» ¼¼ÆÃÇÑ´Ù.  À̰ÍÀº À§¿¡¼­ Á¤ÀÇµÈ ¿ì¸®ÀÇ 
     * ½Ã±×³Î Çڵ鷯¿¡ ÀÇÇØ Æ÷ÂøµÉ, "destroy"½Ã±×³ÎÀ» À©µµ·Î º¸³»ÁØ´Ù. */
    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                               GTK_SIGNAL_FUNC (gtk_widget_destroy),
                               GTK_OBJECT (window));
    /* quitbox·Î ¹öưÀ» ÆÐÅ·ÇÑ´Ù.  gtk_box_pack_startÀÇ ¸¶Áö¸· ¼¼ ÀÎÀÚ´Â
     * expand, fill, paddingÀÌ´Ù. */
    gtk_box_pack_start (GTK_BOX (quitbox), button, TRUE, FALSE, 0);
    /* vbox(box1) ¾ÈÀ¸·Î quitbox¸¦ ÆÐÅ·ÇÑ´Ù. */
    gtk_box_pack_start (GTK_BOX (box1), quitbox, FALSE, FALSE, 0);

    /* ¿ì¸®ÀÇ ¸ðµç widgetÀ» Æ÷ÇÔÇÏ°Ô µÈ ÀÌ vbox¸¦, mainÀ©µµ·Î ÆÐÅ·. */
    gtk_container_add (GTK_CONTAINER (window), box1);

    /* ±×¸®°í ³²¾ÆÀÖ´Â ¸ðµç °ÍÀ» º¸¿©ÁØ´Ù. */
    gtk_widget_show (button);
    gtk_widget_show (quitbox);

    gtk_widget_show (box1);
    /* ¸¶Áö¸·¿¡ À©µµ¸¦ º¸¿©Á༭ ¸ðµç °ÍÀÌ Çѹø¿¡ Æ¢¾î³ª¿À¸ç º¸ÀδÙ. */
    gtk_widget_show (window);

    /* ´ç¿¬È÷ ¿ì¸®ÀÇ gtk_mainÀÌ´Ù. */
    gtk_main ();

    /* gtk_main_quit()À» È£ÃâÇß´Ù¸é Á¦¾î´Â À̰÷À¸·Î ¿Â´Ù.  gtk_exit()¸¦
     * È£ÃâÇÏ¸é ±×·¸Áö ¾Ê´Ù. */

    return 0;
}

5.4 Å×À̺íÀ» ÀÌ¿ëÇÑ ÆÐÅ·

¶Ç´Ù¸¥ ÆÐÅ· - Å×À̺íÀ» ÀÌ¿ëÇÑ °ÍÀ» º¸ÀÚ. À̰ÍÀº ¾î¶² »óȲ¿¡¼­ ¾ÆÁÖ À¯¿ëÇÒ °ÍÀÌ´Ù.

Å×À̺íÀ» ÀÌ¿ëÇØ¼­, ¿ì¸®´Â widgetÀ» ³Ö¾îµÑ °ÝÀÚÆÇÀ» ¸¸µé°Ô µÈ´Ù. ±× widget µéÀº ¿ì¸®°¡ ¼³Á¤Çϴ´ë·Î ¾ó¸¶µçÁö °ø°£À» °¡Áö°Ô µÉ °ÍÀÌ´Ù.

¹°·Ð ¸ÕÀú ºÁ¾ß ÇÒ °ÍÀº gtk_table_new ÇÔ¼ö´Ù.

GtkWidget* gtk_table_new (gint rows,
                          gint columns,
                          gint homogeneous);

ù¹øÂ° ÀÎÀÚ´Â Å×ÀÌºí¿¡ ¸¸µé ÇàÀÇ °¹¼ö°í, µÎ¹øÂ°´Â ´ç¿¬È÷ ¿­ÀÇ °¹¼ö´Ù.

ÀÎÀÚ homogeneous´Â Å×À̺íÀÇ ¹Ú½ºµéÀÇ Å©±â°¡ ¾î¶»°Ô µÇ¾î¾ß ÇÏ´ÂÁö¸¦ °áÁ¤ ÇÑ´Ù. À̰ÍÀÌ TRUE¶ó¸é Å×À̺íÀÇ ¹Ú½ºµéÀº ±× Å×ÀÌºí¿¡¼­ °¡Àå Å« widgetÀÇ Å©±â¿¡ µû¸£°Ô µÈ´Ù. ¶Ç FALSE¶ó¸é °¢ ¹Ú½ºµéÀº °°Àº Çà¿¡¼­ °¡Àå ³ôÀº widgetÀÇ ³ôÀ̸¦, ±×¸®°í °°Àº ¿­¿¡¼­´Â °¡Àå ³ÐÀº widgetÀÇ ³Êºñ¸¦ µû¸£°Ô µÈ´Ù.

°¢ Çà°ú ¿­Àº 0¿¡¼­ n±îÁö Â÷ÁöÇÏ°Ô µÈ´Ù. ¿©±â¼­ nÀº gtk_table_new¸¦ È£ÃâÇÒ ¶§ °áÁ¤µÈ ¼ýÀÚ´Ù. ±×·¡¼­, ¸¸¾à ¿ì¸®°¡ Çà=2 ±×¸®°í ¿­=2, ÀÌ·¸°Ô ¼³Á¤ÇÏ°Ô µÇ¸é ±¸Á¶´Â ÀÌ·¸°Ô µÈ´Ù.

 0          1          2
0+----------+----------+
 |          |          |
1+----------+----------+
 |          |          |
2+----------+----------+

ÁÂÇ¥°è´Â ¿ÞÂÊ À§¿¡¼­ Ãâ¹ßÇÏ´Â °ÍÀ» ÁÖÀÇÇÏÀÚ. ¹Ú½º¾È¿¡ widgetÀ» ³õÀ¸·Á¸é ´ÙÀ½ ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.

void gtk_table_attach (GtkTable      *table,
                       GtkWidget     *child,
                       gint           left_attach,
                       gint           right_attach,
                       gint           top_attach,
                       gint           bottom_attach,
                       gint           xoptions,
                       gint           yoptions,
                       gint           xpadding,
                       gint           ypadding);

ù¹øÂ° ÀÎÀÚ tableÀº ¿ì¸®°¡ ¸¸µç Å×À̺íÀÌ°í µÎ¹øÂ° child´Â ÀÌ Å×ÀÌºí¿¡ ³õÀ¸·Á°í ÇÏ´Â widgetÀÌ´Ù.

¿ÞÂʰú ¿À¸¥ÂÊÀÇ attach¶ó´Â ÀÎÀÚµéÀº widgetÀ» ³õÀ» À§Ä¡¿Í ÀÌ¿ëÇÒ ¹Ú½ºÀÇ °¹¼ö¸¦ °áÁ¤ÇÑ´Ù. ¸¸¾à ¿ì¸®ÀÇ 2x2 Å×À̺íÀÇ ¿À¸¥ÂÊ ¾Æ·¡ Ä­¿¡ À§Ä¡ÇÑ ¹öưÀ» ¿øÇÑ´Ù¸é, ±×¸®°í ±× ¿ä¼Ò¸¸ °¡µæÃ¤¿ì±â¸¦ ¿øÇÑ´Ù¸é, left_attach=1, right_ attach=2, top_attach=1, bottom_attach=2, ÀÌ·¸°Ô µÇ¾î¾ß ÇÑ´Ù.

ÀÌÁ¦, ¿ì¸®ÀÇ 2x2 Å×À̺íÀÇ Ã¹¹øÂ° Çà Àüü¸¦ ¼±ÅÃÇß´Ù¸é, left_attach=0, right_attach=2, top_attach=0, bottom_attach=1 À̶ó°í ÇÏ¸é µÈ´Ù.

ÀÎÀÚ xoption°ú yoptionÀº ÆÐÅ· ¿É¼ÇÀ» Á¤Çϱâ À§ÇÑ °ÍÀ¸·Î, ¿©·¯°¡ÁöÀÇ ¿É¼ÇÀ» ÁÖ±â À§Çؼ­ OR ¿¬»êÀÚ¸¦ ¾µ ¼ö ÀÖ´Ù.

ÀÌ ¿É¼ÇµéÀº ´ÙÀ½°ú °°´Ù.

  • GTK_FILL - GTK_FILLÀÌ ¼³Á¤µÇ¸é Å×ÀÌºí ¹Ú½º°¡ widgetº¸´Ù Ŭ ¶§ widgetÀº »ç¿ë°¡´ÉÇÑ ¸ðµç °ø°£À¸·Î È®´ëµÈ´Ù.
  • GTK_SHRINK - Å×À̺í widgetÀÌ ´õ ÀûÀº °ø°£À» Â÷ÁöÇϵµ·Ï µÇ¾úÀ» ¶§ widget Àº Á¤»óÀûÀ¸·Î À©µµÀÇ ¾Æ·¡ÂÊÀ¸·Î ¹Ð·Á³ª¼­ ÀϺΰ¡ º¸ÀÌÁö ¾Ê°Ô µÈ´Ù. ¸¸¾à GTK_SHRINK°¡ ¼³Á¤µÇ¸é widgetÀº ÀÚµ¿À¸·Î ÁÙ¾îµé¾î ³»ºÎ¿¡ ²À ¸Â°Ô µÈ´Ù.
  • GTK_EXPAND - À̰ÍÀÌ ¼³Á¤µÇ¸é Å×À̺íÀº À©µµÀÇ ³²´Â °ø°£À¸·Î ²Ë Â÷°Ô È®´ëµÈ´Ù.

ÆÐµùÀº ¹Ú½º ¾È¿¡¼­Ã³·³, Çȼ¿ ´ÜÀ§·Î ¶Ñ·ÇÇÑ ¿µ¿ªÀ» widget ÁÖÀ§¿¡ ¸¸µé¾î ÁØ´Ù.

gtk_table_attach()´Â ¼ö¸¹Àº ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù. ±×·¡¼­ ÀÌ·± shortcutÀÌ ÀÖ´Ù.

void gtk_table_attach_defaults (GtkTable   *table,
                                GtkWidget  *widget,
                                gint        left_attach,
                                gint        right_attach,
                                gint        top_attach,
                                gint        bottom_attach);

X¿Í Y ¿É¼ÇÀº µðÆúÆ®·Î GTK_FILL|GTK_EXPAND, ±×¸®°í X¿Í YÀÇ ÆÐµùÀº 0ÀÌ´Ù. ³ª¸ÓÁö ÀÎÀÚµéÀº ÀÌÀüÀÇ ÇÔ¼ö¿Í °°´Ù.

¶ÇÇÑ gtk_table_set_row_spacing()°ú gtk_table_set_col_spacing()À̶õ ÇÔ¼öµµ ÀÖ´Ù. À̰ÍÀº ÁÖ¾îÁø Çà ¶Ç´Â ¿­¿¡ ´ëÇØ spacingÀ» ¼³Á¤ÇÑ´Ù.

void gtk_table_set_row_spacing (GtkTable      *table,
                                gint           row,
                                gint           spacing);
±×¸®°í
void       gtk_table_set_col_spacing  (GtkTable      *table,
                                       gint           column,
                                       gint           spacing);
¾î¶² ¿­¿¡ ´ëÇØ¼­ space´Â ¿­ÀÇ ¿À¸¥ÂÊÀ¸·Î, ±×·¡°í Çà¿¡ ´ëÇØ¼­´Â ÇàÀÇ ¾Æ·¡ÂÊ À¸·Î ÁÖ¾îÁø´Ù´Â °ÍÀ» ¿°µÎ¿¡ µÎÀÚ.

¸ðµç Çà°ú ¿­¿¡ ´ëÇÑ ÀϰüµÈ spacingÀº ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

void gtk_table_set_row_spacings (GtkTable *table,
                                 gint      spacing);

void gtk_table_set_col_spacings (GtkTable  *table,
                                 gint       spacing);

ÀÌ µÎ ÇÔ¼ö´Â ¸¶Áö¸· Çà°ú ¸¶Áö¸· ¿­¿¡ ´ëÇØ¼­´Â spacingÀ» ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ±â¾ïÇ϶ó.

5.5 Å×ÀÌºí ÆÐÅ· ¿¹Á¦

¿©±â¼­ ¿ì¸®´Â 2x2 Å×ÀÌºí ¾È¿¡ ¼¼°³ÀÇ ¹öưÀÌ ÀÖ´Â À©µµ¸¦ Çϳª ¸¸µç´Ù. óÀ½ µÎ ¹öưÀº À­Çà¿¡ ³õÀÌ°í ¼¼¹øÂ° quit ¹öưÀº µÎ¿­À» Â÷ÁöÇϸ鼭 ¾Æ·§Çà¿¡ ³õÀδÙ. ±×·¯¹Ç·Î ´ÙÀ½ ±×¸²Ã³·³ º¸ÀÌ°Ô µÈ´Ù.

Table Packing Example Image

¼Ò½º ÄÚµå´Â ÀÌ·¸´Ù.

/* table.c */
#include <gtk/gtk.h>

/* ¿ì¸®ÀÇ callback.
 * ÀÌ ÇÔ¼ö·Î ³Ñ°ÜÁö´Â µ¥ÀÌŸ´Â stdoutÀ¸·Î Ãâ·ÂµÈ´Ù. */
void callback (GtkWidget *widget, gpointer data)
{
    g_print ("Hello again - %s was pressed\n", (char *) data);
}

/* ÀÌ callback ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù */
void delete_event (GtkWidget *widget, gpointer data)
{
    gtk_main_quit ();
}

int main (int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *table;

    gtk_init (&argc, &argv);

    /* »õ·Î¿î À©µµ¸¦ ¸¸µç´Ù. */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /* À©µµÀÇ Á¦¸ñÀ» Á¤ÇÑ´Ù. */
    gtk_window_set_title (GTK_WINDOW (window), "Table");

    /* GTK¸¦ °ðÀå Á¾·á½ÃŰ´Â delete_event Çڵ鷯¸¦ Á¤ÇÑ´Ù. */
    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (delete_event), NULL);

    /* À©µµÀÇ border width¸¦ Á¤ÇÑ´Ù. */
    gtk_container_border_width (GTK_CONTAINER (window), 20);

    /* 2x2ÀÇ Å×À̺íÀ» ¸¸µç´Ù. */
    table = gtk_table_new (2, 2, TRUE);

    /* Å×À̺íÀ» À©µµ¿¡ ³õ´Â´Ù. */
    gtk_container_add (GTK_CONTAINER (window), table);

    /* ù ¹öưÀ» ¸¸µç´Ù. */
    button = gtk_button_new_with_label ("button 1");

    /* ¹öưÀÌ ´­¸®¸é "button 1"À» Àμö·Î ÇØ¼­ "callback" ÇÔ¼ö¸¦
     * ºÎ¸¥´Ù. */
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
              GTK_SIGNAL_FUNC (callback), (gpointer) "button 1");


    /* ù ¹öưÀ» Å×ÀÌºí ¿ÞÂÊ Á¦ÀÏ À§¿¡ ³õ´Â´Ù. */
    gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 1, 0, 1);

    gtk_widget_show (button);

    /* µÎ¹øÂ° ¹öưÀ» ¸¸µç´Ù. */

    button = gtk_button_new_with_label ("button 2");

    /* ¹öưÀÌ ´­¸®¸é "button 2"À» Àμö·Î ÇØ¼­ "callback" ÇÔ¼ö¸¦ 
     * ºÎ¸¥´Ù. */
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
              GTK_SIGNAL_FUNC (callback), (gpointer) "button 2");
    /* µÎ¹øÂ° ¹öưÀ» Å×ÀÌºí ¿À¸¥ÂÊ Á¦ÀÏ À§¿¡ ³õ´Â´Ù. */
    gtk_table_attach_defaults (GTK_TABLE(table), button, 1, 2, 0, 1);

    gtk_widget_show (button);

    /* "Quit" ¹öưÀ» ¸¸µç´Ù. */
    button = gtk_button_new_with_label ("Quit");

    /* ¹öưÀÌ ´­¸®¸é "delete_event" ÇÔ¼ö¸¦ È£ÃâÇØ¼­
     * ÇÁ·Î±×·¥À» ³¡³½´Ù. */
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (delete_event), NULL);

    /* "Quit" ¹öưÀ» Å×À̺íÀÇ ¾Æ·§ÇàÀÇ  µÎ¿­¿¡ ³õ´Â´Ù. */ 
    gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 2, 1, 2);

    gtk_widget_show (button);

    gtk_widget_show (table);
    gtk_widget_show (window);

    gtk_main ();

    return 0;
}

6. WidgetÀÇ °³¿ä

GTK¿¡¼­ widgetÀ» ¸¸µå´Â ÀϹÝÀûÀÎ ÀýÂ÷´Â ´ÙÀ½°ú °°´Ù.

  1. gtk_*_new - »õ·Î¿î widgetÀ» ¸¸µé±â À§ÇÑ ´Ù¾çÇÑ ÇÔ¼ö. ÀÌ°Íµé ¸ðµÎ´Â ¿©±â¼­ ÀÚ¼¼È÷ º¸¿©Áú °ÍÀÌ´Ù.
  2. Àû´çÇÑ Çڵ鷯¿¡ »ç¿ëÇÒ ¸ðµç ½Ã±×³ÎÀ» °áÇÕ½ÃŲ´Ù.
  3. WidgetÀÇ ¼Ó¼ºÀ» ¼¼ÆÃÇÑ´Ù.
  4. gtk_container_add()³ª gtk_box_pack_start()°°Àº Àû´çÇÑ ÇÔ¼ö¸¦ ½á¼­ widgetÀ» ÄÁÅ×ÀÌ³Ê ¾ÈÀ¸·Î ÆÐÅ·ÇÑ´Ù.
  5. gtk_widget_show()·Î widgetÀ» º¸ÀδÙ.

gtk_widget_show()´Â ¿ì¸®°¡ widgetÀÇ ¼Ó¼ºÀ» ¸ðµÎ ¼¼ÆÃÇßÀ½À» GTK¿¡°Ô ¾Ë¸®°í, ±×°ÍÀº ÀÌÁ¦ º¸¿©Áú Áغñ°¡ ´Ù µÈ °ÍÀÌ´Ù. ¿ì¸®´Â ±×°ÍÀ» ´Ù½Ã º¸ÀÌÁö ¾Ê°Ô Çϱâ À§ÇØ gtk_widget_hide¸¦ ÀÌ¿ëÇÒ ¼öµµ ÀÖ´Ù. WidgetµéÀÌ º¸¿©Áö´Â ¼ø¼­´Â Áß¿ä ÇÏÁö ¾Ê´Ù. ³»°¡ ¸»ÇÏ·Á´Â °ÍÀº, °¢°¢ÀÇ widgetÀÌ »ý°Ü³ª´Â ´ë·Î ½ºÅ©¸°¿¡ º¸¿©Áö°Ô ÇÏ´Â °Íº¸´Ù´Â, À©µµ¸¦ °¡Àå ³ªÁß¿¡ º¸¿©Áö°Ô ÇØ¼­ ¸ðµç ±¸¼º¿ä¼Ò°¡ Çѹø¿¡ Æ¢¾î¿À¸£°Ô ÇÏ´Â °ÍÀÌ ³´´Ù´Â °ÍÀÌ´Ù. gtk_widget_show()ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ°Ô µÇ¸é ¾î¶² widget(À©µµ ¿ª½Ã ÇϳªÀÇ widgetÀÌ´Ù)ÀÇ ±¸¼º¿ä¼ÒµéÀº ±× À©µµ ÀÚü°¡ º¸¿©Áö±â Àü¿¡ ¸ÕÀú º¸¿©ÁöÁö ¾Ê´Â´Ù.

6.1 ij½ºÆÃ(ÀÚ·áÇüÀÇ °­Á¦º¯È¯)

°è¼ÓÇϸ鼭 ¾Ë°ÚÁö¸¸, GTK´Â ÀÚ·áÇüÀÇ °­Á¦º¯È¯ ½Ã½ºÅÛÀ» ¾´´Ù. À̰ÍÀº ÁÖ¾îÁø ´ë»óÀ» ij½ºÆÃÇÏ´Â ´É·ÂÀ» Å×½ºÆ®ÇÒ ¶§³ª, ±×¸®°í ij½ºÆÃÀ» ½ÇÇàÇÒ ¶§³ª, ¾ðÁ¦³ª ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù. ¿ì¸®°¡ º¸°Ô µÉ ¸î¸îÀº ´ÙÀ½°ú °°´Ù.

  • GTK_WIDGET(widget)
  • GTK_OBJECT(object)
  • GTK_SIGNAL_FUNC(function)
  • GTK_CONTAINER(container)
  • GTK_WINDOW(window)
  • GTK_BOX(box)

À̰͵éÀº ¸ðµÎ ÇÔ¼öÀÇ ÀÎÀÚµéÀ» ij½ºÆ®Çϱâ À§ÇØ ¾²¿´´Ù. ¿ì¸®´Â À̵éÀ» ¿¹Á¦µé¿¡¼­ º¼ °ÍÀ̸ç, ÇÔ¼öÀÇ ¼±¾ðºÎ¸¦ º¸´Â °Í¸¸À¸·Î ±×µéÀ» ÀÌ¿ëÇÒ ¶§¸¦ ¸»ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¾Æ·¡ÀÇ Å¬·¡½º °èÃþ±¸Á¶¿¡¼­ º¼ ¼ö ÀÖµíÀÌ, ¸ðµç GtkWidgetµéÀº ±â¹ÝŬ·¡½ºÀÎ GtkObject¿¡¼­ ÆÄ»ýµÈ °ÍÀÌ´Ù. À̰ÍÀº ¾î¶² ÇÔ¼ö°¡ object¸¦ ¿ä±¸ÇÒ ¶§ ¾îµð¼­ µçÁö widgetÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù - ´Ü¼øÈ÷ GTK_OBJECT() ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇØ¼­. ¿¹¸¦ µé¾î º¸ÀÚ.

gtk_signal_connect(GTK_OBJECT(button), "clicked",
                   GTK_SIGNAL_FUNC(callback_function), callback_data);

À̰ÍÀº ¹öưÀ» ÇϳªÀÇ object·Î ij½ºÆ®Çϰí, ÇÔ¼ö Æ÷ÀÎÅ͸¦ callbackÀ¸·Î ij½ºÆ®ÇÑ´Ù.

¸¹Àº widgetµéÀº ¶ÇÇÑ ÄÁÅ×À̳ʴÙ. ¾Æ·¡ÀÇ Å¬·¡½º °èÃþ±¸Á¶¸¦ º¸¸é »ó´ç¼öÀÇ widgetµéÀÌ GtkContainer¿¡¼­ ÆÄ»ýµÇ¾úÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×µé Áß ¾î¶² widgetÀÌ¶óµµ ÄÁÅ×À̳ʸ¦ ¿ä±¸ÇÏ´Â ÇÔ¼ö¿¡ ³Ñ°ÜÁÖ±â À§ÇØ GTK_CONTAINER ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

ºÒÇàÇϰԵµ ÀÌ·± ¸ÅÅ©·ÎµéÀº ÀÌ ¹®¼­¿¡¼­ ±¤¹üÀ§ÇÏ°Ô ´Ù·ç¾îÁöÁö ¾Ê¾Ò´Ù. ³ª´Â ¿©·¯ºÐÀÌ GTKÀÇ Çì´õÆÄÀϵéÀ» »ìÆìº¸±â¸¦ ±ÇÇÑ´Ù. »ç½Ç, ÇÔ¼öÀÇ ¼±¾ðºÎ¸¦ º¸¸é¼­ widgetÀÌ ¾î¶»°Ô ÀÛ¿ëÇÏ´ÂÁö °øºÎÇÏ´Â °ÍÀº ±×¸® ¾î·ÆÁö ¾Ê´Ù.

6.2 WidgetÀÇ °èÃþ±¸Á¶

¿©·¯ºÐÀÌ Âü°íÇÒ ¼ö ÀÖµµ·Ï, ¿©±â widgetµéÀ» º¸ÃæÇϱâ À§ÇÑ Å¬·¡½º °èÃþ±¸Á¶ Æ®¸®°¡ ÀÖ´Ù.

  GtkObject
   +GtkData
   | +GtkAdjustment
   | `GtkTooltips
   `GtkWidget
     +GtkContainer
     | +GtkBin
     | | +GtkAlignment
     | | +GtkEventBox
     | | +GtkFrame
     | | | `GtkAspectFrame
     | | +GtkHandleBox
     | | +GtkItem
     | | | +GtkListItem
     | | | +GtkMenuItem
     | | | | `GtkCheckMenuItem
     | | | |   `GtkRadioMenuItem
     | | | `GtkTreeItem
     | | +GtkViewport
     | | `GtkWindow
     | |   +GtkColorSelectionDialog
     | |   +GtkDialog
     | |   | `GtkInputDialog
     | |   `GtkFileSelection
     | +GtkBox
     | | +GtkButtonBox
     | | | +GtkHButtonBox
     | | | `GtkVButtonBox
     | | +GtkHBox
     | | | +GtkCombo
     | | | `GtkStatusbar
     | | `GtkVBox
     | |   +GtkColorSelection
     | |   `GtkGammaCurve
     | +GtkButton
     | | +GtkOptionMenu
     | | `GtkToggleButton
     | |   `GtkCheckButton
     | |     `GtkRadioButton
     | +GtkCList
     |  `GtkCTree
     | +GtkFixed
     | +GtkList
     | +GtkMenuShell
     | | +GtkMenuBar
     | | `GtkMenu
     | +GtkNotebook
     | +GtkPaned
     | | +GtkHPaned
     | | `GtkVPaned
     | +GtkScrolledWindow
     | +GtkTable
     | +GtkToolbar
     | `GtkTree
     +GtkDrawingArea
     | `GtkCurve
     +GtkEditable
     | +GtkEntry
     | | `GtkSpinButton
     | `GtkText
     +GtkMisc
     | +GtkArrow
     | +GtkImage
     | +GtkLabel
     | | `GtkTipsQuery
     | `GtkPixmap
     +GtkPreview
     +GtkProgressBar
     +GtkRange
     | +GtkScale
     | | +GtkHScale
     | | `GtkVScale
     | `GtkScrollbar
     |   +GtkHScrollbar
     |   `GtkVScrollbar
     +GtkRuler
     | +GtkHRuler
     | `GtkVRuler
     `GtkSeparator
       +GtkHSeparator
       `GtkVSeparator

6.3 À©µµ¿Í ¹«°üÇÑ widget

¿©±âÀÇ widgetµéÀº °ü·ÃµÈ À©µµ°¡ ¾ø´Â °ÍµéÀÌ´Ù. ¸¸¾à ¾î¶² À̺¥Æ®¸¦ Æ÷Âø ÇÏ·Á¸é GtkEventBox¸¦ ÀÌ¿ëÇØ¾ß ÇÒ °ÍÀÌ´Ù. The EventBox Widget¿¡ ´ëÇÑ sectionÀ» ÂüÁ¶Ç϶ó.

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

¿ì¸®´Â °¢°¢ÀÇ widgetÀ» Â÷·Ê·Î ½ÃÇèÇÏ°í ±×µéÀ» º¸ÀÏ ¼ö ÀÖ´Â °£´ÜÇÑ ÇÔ¼öµéÀ» ¸¸µé¾î °¡¸ç GTK¿¡ ´ëÇÑ Å½±¸¸¦ °è¼ÓÇÒ °ÍÀÌ´Ù. ¶Ç´Ù¸¥ ÈǸ¢ÇÑ ¼Ò½º´Â GTK¿Í ÇÔ²² ¹èÆ÷µÈ testgtk.c ÀÌ´Ù. ±×°ÍÀº gtk/testgtk.c ¿¡¼­ ãÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

7. ¹öư widget

7.1 º¸ÅëÀÇ ¹öư

¿ì¸®´Â ¹öưwidget¿¡ ´ëÇØ¼­´Â °ÅÀÇ º¸¾Æ¿Ô´Ù. ±×°ÍÀº »ó´çÈ÷ °£´ÜÇÏ´Ù. ±×·±µ¥ ¹öưÀ» ¸¸µå´Âµ¥´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ¿ì¸®´Â ¶óº§ÀÌ ÀÖ´Â ¹öưÀ» ¸¸µé±â À§ÇØ gtk_button_new_with_labe()À» ÀÌ¿ëÇÒ ¼ö ÀÖ°í, ºó ¹öưÀ» ¸¸µé±â À§ÇØ gtk_button_new()¸¦ ÀÌ¿ëÇÒ ¼öµµ ÀÖ´Ù. ±×·± ´ÙÀ½ ±×°Í¿¡ ¶óº§À» ºÙÀ̵çÁö ÇȽº¸ÊÀ» ºÙÀ̵çÁö ÇÏ´Â °ÍÀº ¿©·¯ºÐ¿¡°Ô ´Þ·ÁÀÖ´Ù. ±×·¸°Ô ÇÏ·Á¸é »õ·Î¿î ¹Ú½º¸¦ ¸¸µé°í gtk_box_pack_start·Î½á ÀÌ ¹Ú½º ¾È¿¡ ¿ì¸®ÀÇ object¸¦ ÆÐÅ·Çϸç, ±× ´ÙÀ½¿£ gtk_container_add·Î½á ±× ¹Ú½º¸¦ ¹öư ¾ÈÀ¸·Î ÆÐÅ·ÇÏ¸é µÈ´Ù.

ÀÌ ¿¹Á¦´Â gtk_button_new¸¦ ÀÌ¿ëÇÏ¿© ±×¸²°ú ¶óº§ÀÌ ÀÖ´Â ¹öưÀ» ¸¸µç´Ù. ¹Ú½º¸¦ ¸¸µå´Â Äڵ尡 ´Ù¸¥ °Íµé·ÎºÎÅÍ ¶³¾îÁ® ³ª¿Í ÀÖÀ¸¸ç ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ ¿¡¼­ ±×°ÍÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

/* buttons.c */

#include <gtk/gtk.h>

/* À̹ÌÁö¿Í ±×°Í¿¡ ÆÐÅ·µÈ ¶óº§À» °¡Áö°í ÀÖ´Â hbox¸¦ Çϳª ¸¸µç´Ù.
 * ±×¸®°í ±× ¹Ú½º¸¦ ¸®ÅÏÇÑ´Ù. */

GtkWidget *xpm_label_box (GtkWidget *parent, gchar *xpm_filename, gchar *label_text)
{
                GtkWidget *box1;
                GtkWidget *label;
                GtkWidget *pixmapwid;
                GdkPixmap *pixmap;
                GdkBitmap *mask;
                GtkStyle *style;

                /* xpm°ú ¶óº§À» À§ÇÑ ¹Ú½º¸¦ ¸¸µç´Ù. */
                box1 = gtk_hbox_new (FALSE, 0);
                gtk_container_border_width (GTK_CONTAINER (box1), 2);

                /* ¹öưÀÇ ½ºÅ¸ÀÏÀ» ÃëÇÑ´Ù.. background »ö±òÀ» ÃëÇÏ´Â °Í °°Àºµ¥,
                 * ¾Æ´Ï¶ó¸é ´©±º°¡ ³ª¿¡°Ô Á¤Á¤ÇØ ÁÖ±æ ¹Ù¶õ´Ù. */
                style = gtk_widget_get_style(parent);

                /* xpm ÆÄÀϷκÎÅÍ ÇȽº¸ÊÀ» ¸¸µç´Ù. */
                pixmap = gdk_pixmap_create_from_xpm (parent->window, &mask,
                                             &style->bg[GTK_STATE_NORMAL],
                                             xpm_filename);
                pixmapwid = gtk_pixmap_new (pixmap, mask);

                /* ¹öưÀ» À§ÇÑ ¶óº§À» ¸¸µç´Ù. */
                label = gtk_label_new (label_text);

                /* ¹Ú½º ¾ÈÀ¸·Î ÇȽº¸Ê°ú ¶óº§À» ÆÐÅ·ÇØ ³Ö´Â´Ù. */
                gtk_box_pack_start (GTK_BOX (box1),
                                                        pixmapwid, FALSE, FALSE, 3);

                gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 3);

                gtk_widget_show(pixmapwid);
                gtk_widget_show(label);

                return (box1);
}

/* ¿ì¸®ÀÇ ÀüÇüÀûÀÎ callback ÇÔ¼ö´Ù. */
void callback (GtkWidget *widget, gpointer data)
{
                g_print ("Hello again - %s was pressed\n", (char *) data);
}

int main (int argc, char *argv[])
{
                /* GtkWidgetÀº widgetµéÀ» À§ÇÑ ±â¾ïÀå¼Ò Á¾·ù´Ù. */
                GtkWidget *window;
                GtkWidget *button;
                GtkWidget *box1;

                gtk_init (&argc, &argv);

                /* À©µµ¸¦ Çϳª ¸¸µç´Ù. */
                window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

                gtk_window_set_title (GTK_WINDOW (window), "Pixmap'd Buttons!");

                /* ¸ðµç À©µµµé¿¡ ´ëÇØ ÀÌ·¸°Ô ÇØÁÖ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. */
                gtk_signal_connect (GTK_OBJECT (window), "destroy",
                            GTK_SIGNAL_FUNC (gtk_exit), NULL);

                /* À©µµÀÇ border width¸¦ ¼¼ÆÃÇÑ´Ù. */
                gtk_container_border_width (GTK_CONTAINER (window), 10);

                /* »õ·Î¿î ¹öưÀ» Çϳª ¸¸µç´Ù. */
                button = gtk_button_new ();

                /* ÀÌÂë¿¡¼­ ÀÌ ÇÔ¼ö¸¦ ¾²´Â °ÍÀ» ±â¾ïÇ϶ó. */
                gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (callback), (gpointer) "cool button");

                /* ¹Ú½º¸¦ ¸¸µå´Â ÇÔ¼ö´Ù. */
                box1 = xpm_label_box(window, "info.xpm", "cool button");

                /* ¿ì¸® widgetµéÀ» ÆÐÅ·Çϰí, º¸¿©ÁØ´Ù. */
                gtk_widget_show(box1);

                gtk_container_add (GTK_CONTAINER (button), box1);

                gtk_widget_show(button);

                gtk_container_add (GTK_CONTAINER (window), button);

                gtk_widget_show (window);

                /* ¿©±â¼­ºÎÅÍ´Â ¹º°¡ Àç¹ÌÀÖ´Â ÀÏÀÌ ½ÃÀÛµÉ ¶§±îÁö ¹«ÀÛÁ¤ ±â´Ù¸°´Ù. */
                gtk_main ();

                return 0;
}

xpm_label_box ÇÔ¼ö´Â ÄÁÅ×À̳ʰ¡ µÉ ¼ö ÀÖ´Â ¾î¶² widget¿¡¶óµµ ÇȽº¸Ê°ú ¶óº§À» ÆÐÅ·Çϱâ À§ÇÏ¿© ¾²¿©Áú ¼ö ÀÖÀ» °ÍÀÌ´Ù.

7.2 Åä±Û ¹öư

Åä±Û¹öưÀº Ŭ¸¯¿¡ ÀÇÇØ ÅÃÀϵǴ µÎ°¡Áö Áß ¾î´À ÇÑ »óÅ¿¡ ÀÖ¾î¾ß ÇÑ´Ù´Â Á¡¸¸ »«´Ù¸é º¸Åë ¹öư°ú ¸Å¿ì À¯»çÇÏ´Ù. ±×°ÍÀº ´­·ÁÁø »óÅ·ΠÀÖ´Ù°¡µµ, ¿ì¸®°¡ ´Ù½Ã Ŭ¸¯ÇØ ÁÖ¸é ´Ù½Ã Æ¢¾î³ª¿À°Ô µÉ ¼ö ÀÖ´Ù. ¶Ç Ŭ¸¯ÇÏ¸é ±×°ÍÀº ´Ù½Ã ´­·¯Á® µé¾î°¥ °ÍÀÌ´Ù.

Åä±Û¹öư¿¡ ¾²ÀÌ´Â ¸¹Àº ÇÔ¼öµéÀÌ ¶óµð¿À¿Í üũ ¹öư¿¡ ÀÇÇØ »ó¼ÓµÇ¾î ¾²À̵íÀÌ, Åä±Û¹öưÀº üũ¹öư°ú ¶óµð¿À¹öưÀÇ ±â¹ÝÀÌ µÈ´Ù. À̰͵éÀ» Á¢ÇÏ°Ô µÇ¸é ÀÌ Á¡À» ´Ù½Ã ÁöÀûÇÒ °ÍÀÌ´Ù.

»õ·Î¿î Åä±Û¹öưÀ» ¸¸µé·Á¸é À̰ÍÀ» ÀÌ¿ëÇÑ´Ù.

GtkWidget* gtk_toggle_button_new (void);

GtkWidget* gtk_toggle_button_new_with_label (gchar *label);

ÃßÃøÇÒ ¼ö ÀÖ°ÚÁö¸¸, À̰ÍÀº º¸Åë¹öư widgetÀÇ È£Ãâ°ú ¶È°°ÀÌ ÀÛ¿ëÇÑ´Ù. ù¹øÂ° °ÍÀº ºó Åä±Û¹öưÀ», ±×¸®°í µÎ¹øÂ° °ÍÀº ÀÌ¹Ì ¶óº§widgetÀÌ ÆÐÅ·µÇ¾î ÀÖ´Â ¹öưÀ» ¸¸µç´Ù.

Åä±Û¹öư°ú ¶óµð¿À¹öư, üũ¹öưÀÇ »óŸ¦ µÇµ¹¸®±â À§ÇØ, ¿ì¸®´Â ¾Æ·¡ÀÇ ¿¹Á¦¿¡¼­ º¸¿©Áú ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÑ´Ù. À̰ÍÀº ¾î¶² callback¿¡¼­ Åä±ÛÀÇ »óŸ¦ Å×½ºÆ®ÇÑ´Ù. Åä±Û¹öư¿¡ ÀÇÇØ ¹ß»ýÇÏ´Â ½Ã±×³ÎÀº (Åä±Û/üũ/¶óµð¿À ¹öư widgetµé) "toggled" ½Ã±×³ÎÀÌ´Ù. ÀÌ ¹öưµéÀÇ »óŸ¦ üũÇÏ·Á¸é ÀÌ toggled ½Ã±×³ÎÀ» Àâ¾Æ³»µµ·Ï ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϰí, ±×°ÍÀÇ »óŸ¦ °áÁ¤Çϱâ À§ÇÑ ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÑ´Ù. ±× callbackÀº ÀÌ·± ¸ð¾çÀÇ °ÍÀÌ´Ù.

void toggle_button_callback (GtkWidget *widget, gpointer   data)
{
    if (GTK_TOGGLE_BUTTON (widget)->active)
    {
        /* ÄÁÆ®·ÑÀÌ ¿©±â·Î ¿À¸é, Åä±Û¹öưÀÇ »óÅ´ upÀÌ´Ù. */

    } else {

        /* Åä±Û¹öưÀº downÀÌ´Ù. */
    }
}

void gtk_toggle_button_set_state (GtkToggleButton *toggle_button,
                                  gint state);

À§ÀÇ È£ÃâÀº Åä±Û¹öư°ú, ±×°Í¿¡¼­ ÆÄ»ýµÇ´Â ¶óµð¿À¿Í üũ¹öưÀÇ »óŸ¦ ¼¼ÆÃÇϱâ À§ÇØ ¾²ÀÏ ¼ö ÀÖ´Ù. ù¹øÂ° ÀÎÀÚ·Î ¿ì¸®°¡ ¸¸µç ¹öưÀ» ³Ñ°ÜÁÖ°í, ±×¸®°í ±×°ÍÀÌ ´­¸° »óÅÂÀÎÁö ¾Æ´ÑÁö¸¦ ±¸º°Çϱâ À§ÇØ µÎ¹øÂ° ÀÎÀÚ¸¦ TRUE ¶Ç´Â FALSE·Î ³Ñ°ÜÁØ´Ù. µðÆúÆ®´Â ¾È ´­·¯Áø »óÅÂ, Áï FALSEÀÌ´Ù.

¿ì¸®°¡ gtk_toggle_button_set_state()ÇÔ¼ö¸¦ ¾²¸é ¹öư¿¡¼­ "clicked"½Ã±×³ÎÀÌ ¹ß»ýÇØ¼­ ¹öưÀÇ »óŰ¡ ½ÇÁ¦·Î º¯ÇÏ°Ô µÊÀ» ±â¾ïÇÏÀÚ.

void    gtk_toggle_button_toggled (GtkToggleButton *toggle_button);

À̰ÍÀº °£´ÜÈ÷ ¹öưÀ» Åä±ÛÇϰí, "toggled"½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù.

7.3 üũ¹öư

üũ¹öưÀº À§¿¡ ÀÖ´Â Åä±Û¹öư¿¡¼­ ¸¹Àº Ư¼º°ú ÇÔ¼öµéÀ» »ó¼Ó¹Þ¾ÒÁö¸¸ ´Ù¼Ò ´Ù¸£°Ô º¸ÀδÙ. À̰ÍÀº ¹öư°ú ±× ¾ÈÀÇ ÅØ½ºÆ®·Î Àִٱ⺸´Ù´Â, ÅØ½ºÆ® ¿·¿¡ ÀÖ´Â ÀÛÀº »ç°¢ÇüÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. À̵éÀº ¾î¶² ¾îÇÿ¡¼­ Åä±ÛµÇ´Â ¿É¼ÇÀ¸·Î¼­ ¸¹ÀÌ ºÃÀ» °ÍÀÌ´Ù.

À̰ÍÀ» ¸¸µå´Â µÎ°¡Áö ÇÔ¼ö´Â º¸Åë¹öư¿¡¼­¿Í ¸¶Âù°¡Áö´Ù.

GtkWidget* gtk_check_button_new (void);

GtkWidget* gtk_check_button_new_with_label (gchar *label);

new_with_labelÇÔ¼ö´Â ¿·¿¡ ÅØ½ºÆ® ¶óº§À» °¡Áö°í Àִ üũ¹öưÀ» ¸¸µç´Ù.

üũ¹öưÀÇ »óŸ¦ üũÇÏ´Â °ÍÀº Åä±Û¹öư¿¡¼­¿Í °°´Ù.

7.4 ¶óµð¿À¹öư

¶óµð¿À¹öưÀº ±×µéÀÌ ±×·ìÈ­µÇ¾î À־ ÇÑ ¹ø¿¡ ¿ÀÁ÷ Çϳª¾¿¸¸ ¼±ÅÃ/º¹±ÍµÉ ¼ö ÀÖ´Ù´Â Á¡¸¸ »©°í´Â üũ¹öư°ú À¯»çÇÏ´Ù. À̰ÍÀº ¾îÇÃÀÌ ¿É¼ÇÀÇ ¸®½ºÆ®¿¡¼­ Çϳª¸¦ ¼±ÅÃÇϵµ·Ï ÇÏ´Â °æ¿ì¿¡ ¾²À̸é ÁÁÀ» °ÍÀÌ´Ù.

»õ·Î¿î ¶óµð¿À¹öưÀ» ¸¸µå´Â µ¥ ¾²´Â ÇÔ¼öµéÀÌ´Ù.

GtkWidget* gtk_radio_button_new (GSList *group);

GtkWidget* gtk_radio_button_new_with_label (GSList *group,
                                            gchar *label);

ÀÌ È£Ãâµé¿¡´Â ´Ù¼Ò ´Ù¸¥ ÀÎÀÚ°¡ ÀÖ´Ù´Â °ÍÀ» ´«¿©°Ü º¸ÀÚ. À̵éÀº ÀûÀýÈ÷ ÀÓ¹«¸¦ ¼öÇàÇÒ ±×·ìÀ» ÇÊ¿ä·Î ÇÑ´Ù. ù¹øÂ° ÇÔ¼ö´Â ù¹øÂ° ÀÎÀÚ·Î NULLÀ» ³Ñ°Ü Áà¾ß ÇÑ´Ù. ±×¸®°í ¿ì¸®´Â À̰ÍÀ» ÀÌ¿ëÇÏ¿© ±×·ìÀ» ¸¸µç´Ù.

GSList* gtk_radio_button_group (GtkRadioButton *radio_button);

±×¸®°í´Â ÀÌ ±×·ìÀ» gtk_radio_button_new ¶Ç´Â gtk_radio_button_new_with_ label¿¡ ù¹øÂ° ÀÎÀÚ·Î ³Ñ°ÜÁØ´Ù. ´ÙÀ½À» ÀÌ¿ëÇØ¼­ ¾î¶² ¹öưÀÌ µðÆúÆ®·Î ´­·¯Áö°Ô µÇ´ÂÁö¸¦ ºÐ¸íÈ÷ ÇØµÎ´Â °Íµµ ÁÁÀº »ý°¢ÀÌ´Ù.

void gtk_toggle_button_set_state (GtkToggleButton *toggle_button,
                                  gint state);

À̰ÍÀº Åä±Û¹öư¿¡ ´ëÇÑ ºÎºÐ¿¡¼­ ¼³¸íµÇ¾úÀ¸¸ç, Á¤È®È÷ °°Àº ¹æ¹ýÀ» µû¸¥´Ù.

´ÙÀ½ ¿¹´Â ¼¼°³ÀÇ ¹öưÀ¸·Î ÀÌ·ç¾îÁø ±×·ìÀ» ¸¸µç´Ù.

/* radiobuttons.c */

#include <gtk/gtk.h>
#include <glib.h>

void close_application( GtkWidget *widget, gpointer data ) {
  gtk_main_quit();
}

main(int argc,char *argv[])
{
  static GtkWidget *window = NULL;
  GtkWidget *box1;
  GtkWidget *box2;
  GtkWidget *button;
  GtkWidget *separator;
  GSList *group;
  
  gtk_init(&argc,&argv);          
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  
  gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                      GTK_SIGNAL_FUNC(close_application),
                      NULL);

  gtk_window_set_title (GTK_WINDOW (window), "radio buttons");
  gtk_container_border_width (GTK_CONTAINER (window), 0);

  box1 = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (window), box1);
  gtk_widget_show (box1);

  box2 = gtk_vbox_new (FALSE, 10);
  gtk_container_border_width (GTK_CONTAINER (box2), 10);
  gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
  gtk_widget_show (box2);

  button = gtk_radio_button_new_with_label (NULL, "button1");
  gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  gtk_widget_show (button);

  group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
  button = gtk_radio_button_new_with_label(group, "button2");
  gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), TRUE);
  gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  gtk_widget_show (button);

  group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
  button = gtk_radio_button_new_with_label(group, "button3");
  gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  gtk_widget_show (button);

  separator = gtk_hseparator_new ();
  gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
  gtk_widget_show (separator);

  box2 = gtk_vbox_new (FALSE, 10);
  gtk_container_border_width (GTK_CONTAINER (box2), 10);
  gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
  gtk_widget_show (box2);

  button = gtk_button_new_with_label ("close");
  gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                             GTK_SIGNAL_FUNC(close_application),
                             GTK_OBJECT (window));
  gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  gtk_widget_grab_default (button);
  gtk_widget_show (button);
  gtk_widget_show (window);
     
  gtk_main();
  return(0);
}

´ÙÀ½ ¹®Àå°ú °°Àº ½ÄÀ¸·Î ¾î¶² º¯¼ö Çϳª°¡ ¹öưµéÀÇ ¸®½ºÆ®¸¦ °¡Áö°í ÀÖ¾î¾ßÇÒ Çʿ䰡 ¾øµµ·Ï ÁÙ¿© ¾µ ¼öµµ ÀÖ´Ù.

     button2 = gtk_radio_button_new_with_label(
                 gtk_radio_button_group (GTK_RADIO_BUTTON (button1)),
                 "button2");

8. ´Ù¾çÇÑ widgetµé

8.1 ¶óº§(label)

¶óº§Àº GTK¿¡¼­ ÀÚÁÖ ¾²ÀÌ°í ºñ±³Àû °£´ÜÇÑ °ÍÀÌ´Ù. À̵éÀº °ü·ÃµÈ XÀ©µµ°¡ ¾øÀ¸¹Ç·Î ½Ã±×³ÎÀ» ¹ß»ýÇÏÁö ¾Ê´Â´Ù. ¸¸¾à ½Ã±×³ÎÀ» Àâ¾Æ³»°Å³ª Ŭ¸®ÇÎÀ» ÇÒ ¸ñÀûÀ̶ó¸é EventBox widgetÀ» ÀÌ¿ëÇ϶ó.

»õ·Î¿î ¶óº§À» ¸¸µé±â À§ÇØ À̰ÍÀ» ÀÌ¿ëÇÑ´Ù.

GtkWidget* gtk_label_new (char *str);

ÇϳªÀÇ ÀÎÀÚ´Â ¿ì¸®°¡ ³ªÅ¸³»°íÀÚ ÇÏ´Â ¶óº§ÀÇ ¹®ÀÚ¿­ÀÌ´Ù.

¶óº§À» ¸¸µç ÀÌÈÄ¿¡ ÀÌ ¶óº§ÀÇ ÅØ½ºÆ®¸¦ ¹Ù²Ù·Á¸é À̰ÍÀ» ÀÌ¿ëÇÑ´Ù.

void gtk_label_set (GtkLabel  *label,
                    char      *str);

ù¹øÂ° ÀÎÀÚ´Â ÀÌÀü¿¡ ¸¸µé¾îÁ® ÀÖ´Â ¶óº§(GTK_LABEL()¸ÅÅ©·Î·Î½á ij½ºÆ®µÊ) À̰í, µÎ¹øÂ°´Â »õ·Î¿î ¹®ÀÚ¿­ÀÌ´Ù.

»õ·Î¿î ¶óº§À» À§ÇÑ °ø°£Àº ÇÊ¿äÇÒ °æ¿ì¿¡ ÀÚµ¿ÀûÀ¸·Î Á¶ÀýµÈ´Ù.

ÇöÀçÀÇ ¹®ÀÚ¿­À» µÇã°í ½Í´Ù¸é À̰ÍÀ» ÀÌ¿ëÇÑ´Ù.

void gtk_label_get (GtkLabel  *label,
                    char     **str);

ù¹øÂ° ÀÎÀÚ´Â ¸¸µé¾îÁ³´ø ¶óº§À̰í, µÎ¹øÂ°´Â µÇ»ì¸®°íÀÚ ÇÏ´Â ¹®ÀÚ¿­ÀÌ´Ù.

8.2 dz¼± µµ¿ò¸»(tooltip widget)

¸¶¿ì½ºÆ÷ÀÎÅ͸¦ ¾î¶² ¹öưÀ̳ª ´Ù¸¥ widget À§¿¡ ¸î ÃÊ ¸Ó¹«¸£°Ô Çϸé ÀÛÀº ÅØ½ºÆ® ¹®ÀÚ¿­ÀÌ Æ¢¾î³ª¿À´Â °æ¿ì°¡ ÀÖ´Ù. À̰ÍÀº °£´ÜÇÑ °ÍÀ̸ç, ±×·¡¼­ ¿©±â¼­ ¿¹Á¦¾øÀÌ ¼³¸íÇϰڴÙ. ½ÇÁ¦·Î Äڵ带 º¸°í½Í´Ù¸é GDK¿Í ÇÔ²² ¹èÆ÷µÇ´Â testgtk.c ÇÁ·Î±×·¥À» ÂüÁ¶Ç϶ó.

¶óº§ µî ¾î¶² widget¿¡´Â ÀÌ tooltipÀÌ ¾²ÀÌÁö ¾Ê´Â´Ù.

¿ì¸®°¡ óÀ½ ÀÌ¿ëÇÒ ÇÔ¼ö´Â »õ·Î¿î tooltipÀ» ¸¸µå´Â °ÍÀÌ´Ù. À̰ÍÀº ÁÖ¾îÁø ÇÔ¼ö¿¡¼­ Çѹø¸¸ ÇØÁÖ¸é µÈ´Ù. ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â GtkTooltipÀº ´ÙÁßÀÇ tooltipµéÀ» ¸¸µå´Âµ¥µµ ÀÌ¿ëµÉ ¼ö ÀÖ´Ù.

GtkTooltips *gtk_tooltips_new (void);

ÀÏ´Ü »õ·Î¿î tooltip°ú ±×°ÍÀ» »ç¿ëÇÒ widgetÀ» ¸¸µé¾úÀ¸¸é, ±×°ÍÀ» ¼¼ÆÃÇϱâ À§ÇØ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇ϶ó.

void gtk_tooltips_set_tip (GtkTooltips *tooltips,
                           GtkWidget   *widget,
                           const gchar *tip_text,
                           const gchar *tip_private);

ù¹øÂ° ÀÎÀÚ´Â ¿ì¸®°¡ ¸¸µç tooltipÀ̰í, ´ÙÀ½Àº ÀÌ tooltipÀ» Æ÷ÇÔÇÏ°Ô µÉ widgetÀÌ´Ù. ¼¼¹øÂ° ÀÎÀÚÀÎ ÅØ½ºÆ®´Â ¿ì¸®°¡ tooltip¿¡¼­ ¸»ÇϰíÀÚ ÇÏ´Â °ÍÀÌ´Ù. ¸¶Áö¸· ÀÎÀÚ´Â NULL·Î ÁÙ ¼ö ÀÖ´Ù.

À̰ÍÀº ªÀº ¿¹´Ù.

GtkTooltips *tooltips;
GtkWidget *button;
...
tooltips = gtk_tooltips_new ();
button = gtk_button_new_with_label ("button 1");
...
gtk_tooltips_set_tip (tooltips, button, "This is button 1", NULL);

Tooltip¿¡ ¾²ÀÌ´Â ´Ù¸¥ ÇÔ¼öµéµµ ÀÖ´Ù. ¿©±â¼­ ±×µéÀ» °£´ÜÈ÷ ¼Ò°³ÇϰڴÙ.

void gtk_tooltips_destroy    (GtkTooltips *tooltips);

¸¸µé¾îÁø tooltipÀ» Á¦°ÅÇÑ´Ù.

void gtk_tooltips_enable     (GtkTooltips *tooltips);

Disable·Î ¼³Á¤µÈ tooltipÀ» enableÇÑ´Ù.

void gtk_tooltips_disable    (GtkTooltips *tooltips);

Enable·Î ¼³Á¤µÈ tooltipÀ» disableÇÑ´Ù.

void gtk_tooltips_set_delay  (GtkTooltips *tooltips,
                              gint         delay);

TooltipÀÌ Æ¢¾î¿À¸£±â À§ÇØ ¾ó¸¶³ª ¸¶¿ì½ºÆ÷ÀÎÅ͸¦ widgetÀ§¿¡ ¸Ó¹«¸£°Ô ÇØ¾ßÇÏ´Â Áö¸¦, millisecond´ÜÀ§·Î ¼¼ÆÃÇÑ´Ù. µðÆúÆ®·Î 1000millisecond, Áï 1ÃÊ´Ù.

void gtk_tooltips_set_tips (GtkTooltips *tooltips,
                            GtkWidget   *widget,
                            gchar    *tips_text);

ÀÌ¹Ì ¸¸µé¾îÁø tooltipÀÇ ÅØ½ºÆ® ³»¿ëÀ» ¹Ù²Û´Ù.

void gtk_tooltips_set_colors (GtkTooltips *tooltips,
                              GdkColor    *background,
                              GdkColor    *foreground);

TooltipÀÇ Ç¥Çö»ö°ú ¹è°æ»öÀ» ¹Ù²Û´Ù. ¾î¶»°Ô »ö±òÀ» ¼³Á¤ÇÏ´ÂÁö¿¡ ´ëÇØ¼­´Â ¸ð¸£°Ú´Ù.

Tooltip¿¡ °ü·ÃµÈ ÇÔ¼ö´Â À̰ÍÀÌ ÀüºÎ´Ù. ´õÀÌ»ó ¾Ë °Íµµ ¾ø´Ù. :)

8.3 ÁøÇื´ë(progress bar)

ÁøÇื´ë´Â ÀÛ¾÷ÀÇ »óȲÀ» ³ªÅ¸³»±â À§ÇØ ¾²ÀδÙ. ÀÌÁ¦ Äڵ带 º¸¸é ¾Ë°ÚÁö¸¸, À̰ÍÀº ²Ï °£´ÜÇÏ´Ù. ±×·¯³ª ¸ÕÀú »õ·Î¿î ÁøÇื´ë¸¦ ¸¸µé¾îÁÖ´Â ÇÔ¼ö¸¦ »ìÆì º¸´Â °ÍÀ¸·Î ½ÃÀÛÇÏÀÚ.

GtkWidget *gtk_progress_bar_new (void);

ÀÌÁ¦ ÁøÇื´ë°¡ ¸¸µé¾îÁ³°í ¿ì¸®´Â ±×°ÍÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

void gtk_progress_bar_update (GtkProgressBar *pbar, gfloat percentage);

ù¹øÂ° ÀÎÀÚ´Â µ¿ÀÛ½Ãų ÁøÇื´ë°¡ µÇ°í, µÎ¹øÂ° ÀÎÀÚ´Â '¿Ï·áµÈ' ºÐ·®À» ³ªÅ¸³½´Ù. À̰ÍÀº ½ÇÁ¦ ¼ýÀÚ·Î 0ºÎÅÍ 1±îÁö°í, 0ºÎÅÍ 100ÆÛ¼¾Æ®¸¦ ÀǹÌÇÏ´Â °ÍÀÌ´Ù.

ÁøÇื´ë´Â º¸Åë ŸÀӾƿôÀ̳ª ¶Ç´Â ¸ÖƼŽºÅ·ÇÏ´Â Âø°¢À» ÀÏÀ¸Å°°Ô ÇÏ´Â ÇÔ¼öµé°ú ÇÔ²² ¾²ÀδÙ. (section ŸÀӾƿô, ±×¸®°í I/O¿Í Idle ÇÔ¼öµéÀ» ÂüÁ¶Ç϶ó.) ¸ðµç °æ¿ì¿¡ gtk_progress_bar_updateÇÔ¼ö°¡ µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î ¾²ÀÌ°Ô µÈ´Ù.

À̰ÍÀº ŸÀӾƿôÀ» ÀÌ¿ëÇØ ¾÷µ¥ÀÌÆ®µÇ´Â ÁøÇื´ë¸¦ º¸ÀÎ ¿¹Á¦´Ù. À̰ÍÀº ¶ÇÇÑ ÁøÇื´ë¸¦ ¸®¼Â, Áï ÃʱâÈ­ÇÏ´Â ¹æ¹ýµµ º¸¿©ÁÙ °ÍÀÌ´Ù.

/* progressbar.c */

#include <gtk/gtk.h>

static int ptimer = 0;
int pstat = TRUE;

/* ÀÌ ÇÔ¼ö´Â ÁøÇื´ë¸¦ Áõ°¡½ÃŰ°í ¾÷µ¥ÀÌÆ®ÇÑ´Ù.  ¶Ç pstat°¡ FALSE·Î µÇ¸é
 * ÁøÇื´ë¸¦ ¸®¼Â, Áï ÃʱâÈ­ÇÑ´Ù. */
gint progress (gpointer data)
{
                gfloat pvalue;

                /* ÁøÇื´ëÀÇ ÇöÀç°ªÀ» ¾Ë¾Æ³½´Ù. */
                pvalue = GTK_PROGRESS_BAR (data)->percentage;

                if ((pvalue >= 1.0) || (pstat == FALSE)) {
                                pvalue = 0.0;
                                pstat = TRUE;
                }
                pvalue += 0.01;

                gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);

                return TRUE;
}

/* ÀÌ ÇÔ¼ö´Â ÁøÇื´ëÀÇ ¸®¼ÂÀ» À§ÇÑ ½Ã±×³ÎÀ» ³½´Ù. */
void progress_r (void)
{
                pstat = FALSE;
}

void destroy (GtkWidget *widget, gpointer data)
{
                gtk_main_quit ();
}

int main (int argc, char *argv[])
{
                GtkWidget *window;
                GtkWidget *button;
                GtkWidget *label;
                GtkWidget *table;
                GtkWidget *pbar;

                gtk_init (&argc, &argv);

                window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

                gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                            GTK_SIGNAL_FUNC (destroy), NULL);

                gtk_container_border_width (GTK_CONTAINER (window), 10);

                table = gtk_table_new(3,2,TRUE);
                gtk_container_add (GTK_CONTAINER (window), table);

                label = gtk_label_new ("Progress Bar Example");
                gtk_table_attach_defaults(GTK_TABLE(table), label, 0,2,0,1);
                gtk_widget_show(label);

                /* »õ·Î¿î ÁøÇื´ë¸¦ ¸¸µé°í, ±×°ÍÀ» Å×ÀÌºí¿¡ ÆÐÅ·ÇÏ¿© º¸¿©ÁØ´Ù. */
                pbar = gtk_progress_bar_new ();
                gtk_table_attach_defaults(GTK_TABLE(table), pbar, 0,2,1,2);
                gtk_widget_show (pbar);

                /* ÁøÇื´ëÀÇ ÀÚµ¿ ¾÷µ¥ÀÌÆ®¸¦ À§ÇÑ timeoutÀ» ¼³Á¤ÇÑ´Ù. */
                ptimer = gtk_timeout_add (100, progress, pbar);

                /* ÀÌ ¹öưÀÌ ÁøÇื´ë¸¦ ¸®¼ÂÇÏ´Â ½Ã±×³ÎÀ» À§ÇÑ °ÍÀÌ´Ù. */
                button = gtk_button_new_with_label ("Reset");
                gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (progress_r), NULL);
                gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1,2,3);
                gtk_widget_show(button);

                button = gtk_button_new_with_label ("Cancel");
                gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (destroy), NULL);

                gtk_table_attach_defaults(GTK_TABLE(table), button, 1,2,2,3);
                gtk_widget_show (button);

                gtk_widget_show(table);
                gtk_widget_show(window);

                gtk_main ();

                return 0;
}

ÀÌ ÀÛÀº ÇÁ·Î±×·¥¿¡´Â ÁøÇื´ëÀÇ ÀϹÝÀûÀÎ µ¿ÀÛ°ú °ü·ÃµÈ ³× °³ÀÇ ¿µ¿ªÀÌ ÀÖ´Ù. ±×µéÀÌ ¾²¿©Áø ¼ø¼­¿¡ µû¶ó ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

pbar = gtk_progress_bar_new ();

ÀÌ ÄÚµå´Â pbar¶ó´Â À̸§ÀÇ »õ·Î¿î ÁøÇื´ë¸¦ ¸¸µé°í ÀÖ´Ù.

ptimer = gtk_timeout_add (100, progress, pbar);

ÀÌ Äڵ忡¼­ ÀÏÁ¤ÇÑ ½Ã°£°£°ÝÀÇ Å¸ÀӾƿôÀ» ÀÌ¿ëÇϴµ¥, ÁøÇื´ëÀÇ À̿뿡 ²À ŸÀӾƿôÀ» ½á¾ß µÇ´Â °ÍÀº ¾Æ´Ï´Ù.

pvalue = GTK_PROGRESS_BAR (data)->percentage;

¿©±â¼­ pvalue¸¦ ÇâÇÑ percentage barÀÇ ÇöÀç °ªÀ» ÁöÁ¤ÇØ ÁÖ°í ÀÖ´Ù.

gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);

³¡À¸·Î, pvalueÀÇ °ª¿¡ ÀÇÇØ ÁøÇื´ë¸¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù.

±×¸®°í ÁøÇื´ë¿¡ ´ëÇØ ¾Ë °ÍÀº À̰ÍÀÌ ÀüºÎ´Ù, Áñ°Üº¸±â¸¦ !

8.4 ´ëÈ­»óÀÚ

´ëÈ­»óÀÚ widgetÀº ¸Å¿ì °£´ÜÇÑ °ÍÀε¥, ½ÇÁ¦·Î À̰ÍÀº ¸î°¡Áö°¡ ¹Ì¸® ÆÐÅ·µÇ¾î ÀÖ´Â ÇϳªÀÇ À©µµÀÏ »ÓÀÌ´Ù. Dialog¸¦ À§ÇÑ ±¸Á¶Ã¼´Â À̰ÍÀÌ´Ù.

struct GtkDialog
{
      GtkWindow window;

      GtkWidget *vbox;
      GtkWidget *action_area;
};

º¸´Ù½ÃÇÇ À̰ÍÀº ´Ü¼øÈ÷ À©µµ¸¦ ¸¸µé°í, ±×¸®°í´Â vbox¸¦ ¸Ç À§·Î ÆÐÅ·Çϰí, ´ÙÀ½À¸·Î separator¸¦, ±×¸®°í ³ª¼­ "action_area"¸¦ À§ÇÑ hbox¸¦ ÆÐÅ·ÇÑ´Ù.

´ëÈ­»óÀÚwidgetÀº »ç¿ëÀÚ¿¡°Ô ÆË¾÷ ¸Þ½ÃÁö¸¦ º¸À̰ųª ÇÏ´Â µîÀÇ ¸ñÀûÀ¸·Î ¾²ÀÏ ¼ö ÀÖ´Ù. À̰ÍÀº Á¤¸» ±âº»ÀûÀÎ °ÍÀ¸·Î, ´ëÈ­¹Ú½º¸¦ À§ÇÑ ÇÔ¼ö´Â ÀÌ°Í Çϳª »ÓÀÌ´Ù.

GtkWidget* gtk_dialog_new (void);

±×·¡¼­ »õ·Î¿î ´ëÈ­¹Ú½º¸¦ ¸¸µé·Á¸é ÀÌ·¸°Ô ÇÑ´Ù.

GtkWidget *window;
window = gtk_dialog_new ();

À̰ÍÀº ´ëÈ­»óÀÚ¸¦ ¸¸µé °ÍÀ̰í, ¾î¶»°Ô ÀÌ¿ëÇÒÁö´Â °¢ÀÚ¿¡°Ô ´Þ·ÁÀÖ´Ù. ¿ì¸®´Â ÀÌ·± ½ÄÀ¸·Î ÇØ¼­ action_area ¾È¿¡ ¹öưÀ» ÆÐÅ·ÇÒ ¼ö ÀÖ´Ù.

button = ...
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
                    TRUE, TRUE, 0);
gtk_widget_show (button);

±×¸®°í ¿ì¸®´Â ÆÐÅ·¿¡ ÀÇÇÏ¿© vbox ¿µ¿ª¿¡ ¶óº§ µîÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡¿Í °°ÀÌ ÇØº¸ÀÚ.

label = gtk_label_new ("Dialogs are groovy");
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE,
                    TRUE, 0);
gtk_widget_show (label);

´ëÈ­»óÀÚ¸¦ ÀÌ¿ëÇÑ ¿¹Á¦¿¡¼­Ã³·³, ¿ì¸®´Â action_area¿¡ Cancel°ú OkÀÇ µÎ ¹öưÀ», ±×¸®°í vbox¿µ¿ª¿£ »ç¿ëÀÚ¿¡°Ô ¹°¾îº¸°Å³ª ¿¡·¯¸Þ½ÃÁö¸¦ ³»°Å³ª ÇÏ´Â ¸ñÀûÀÇ ¶óº§À» ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×¸®°í ³ª¼­ »ç¿ëÀÚÀÇ ¼±Åÿ¡ µû¶ó ÀÛµ¿Çϵµ·Ï ¹öư °¢°¢¿¡ ¼­·Î ´Ù¸¥ ½Ã±×³ÎÀ» ¼³Á¤ÇØ µÑ ¼ö ÀÖ´Ù.

8.5 ÇȽº¸Ê

ÇȽº¸ÊÀº ±×¸²À» Æ÷ÇÔÇϰí ÀÖ´Â ÀÚ·á ±¸Á¶ÀÌ´Ù. ÀÌ·± ±×¸²Àº ¿©·¯°¡Áö·Î ¾²ÀÏ ¼ö Àִµ¥, °¡Àå ´«¿¡ ¶ç´Â ÀÌ¿ëÀº XÀ©µµ µ¥½ºÅ©ÅéÀÇ ¾ÆÀÌÄÜÀ̳ª Ä¿¼­ÀÏ °ÍÀÌ´Ù. ºñÆ®¸ÊÀ̶õ 2»öÀÇ ÇȽº¸ÊÀÌ´Ù.

GTK¿¡¼­ ÇȽº¸ÊÀ» ÀÌ¿ëÇϱâ À§ÇØ, ¿ì¸®´Â ¸ÕÀú GDK ¼öÁØÀÇ ÇÔ¼öµé·Î½á GdkPixmap ±¸Á¶Ã¼¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ÇȽº¸ÊÀº ¸Þ¸ð¸®ÀÇ ÀÚ·á ȤÀº ÆÄÀϷκÎÅÍ ÀоîµéÀÎ ÀÚ·á·ÎºÎÅÍ ¸¸µé¾îÁú ¼ö ÀÖ´Ù. ¿ì¸®´Â ÇȽº¸ÊÀ» ¸¸µé±â À§ÇÑ °¢°¢ÀÇ ÇÔ¼ö¸¦ Áö±ÝºÎÅÍ »ìÆìº¼ °ÍÀÌ´Ù.

GdkPixmap *gdk_bitmap_create_from_data( GdkWindow *window,
                                        gchar     *data,
                                        gint      width,
                                        gint      height );

ÀÌ ÇÔ¼ö´Â ¸Þ¸ð¸®ÀÇ µ¥ÀÌÅÍ·Î 2»öÀÇ single-plane ÇȽº¸ÊÀ» ¸¸µé±â À§ÇÑ °ÍÀ¸·Î, µ¥ÀÌÅÍÀÇ °¢°¢ÀÇ ºñÆ®´Â Çȼ¿ÀÇ on/off ¿©ºÎ¸¦ ³ªÅ¸³½´Ù. width/height´Â Çȼ¿ ´ÜÀ§´Ù. ÇȽº¸Ê ¸®¼Ò½º´Â ±×°ÍÀÌ º¸¿©Áú ½ºÅ©¸°ÀÇ ¹è°æ¿¡¼­¸¸ Àǹ̰¡ ÀÖÀ¸¹Ç·Î, GdkWindow Çü Æ÷ÀÎÅÍ´Â ÇöÀçÀÇ À©µµ¸¦ °¡¸®Å°°Ô µÈ´Ù.

GdkPixmap* gdk_pixmap_create_from_data( GdkWindow  *window,
                                        gchar      *data,
                                        gint        width,
                                        gint        height,
                                        gint        depth,
                                        GdkColor   *fg,
                                        GdkColor   *bg );

À̰ÍÀº ÁÖ¾îÁø ºñÆ®¸Ê µ¥ÀÌŸ·ÎºÎÅÍ ÀÓÀÇÀÇ depth(»öÀÇ °¹¼ö)¸¦ °¡Áø ÇȽº¸ÊÀ» ¸¸µé ¶§ ¾²ÀδÙ. fg¿Í bg´Â ÀÌ¿ëÇÒ foreground ¹× background »ö±òÀÌ´Ù.

GdkPixmap* gdk_pixmap_create_from_xpm( GdkWindow  *window,
                                       GdkBitmap **mask,
                                       GdkColor   *transparent_color,
                                       const gchar *filename );

XPM Æ÷¸ËÀº XÀ©µµ½Ã½ºÅÛ¿¡¼­ ÀоîµéÀÏ ¼ö ÀÖ´Â ÇϳªÀÇ ÇȽº¸Ê ÇüÅ´Ù. À̰ÍÀº ³Î¸® ¾²À̰í ÀÖÀ¸¸ç À̹ÌÁö ÆÄÀÏÀ» ÀÌ Æ÷¸ËÀ¸·Î ¸¸µé¾î ÁÖ´Â ¼ö¸¹Àº À¯Æ¿¸®Æ¼µéÀÌ ÀÖ´Ù. ÆÄÀÏÀ̸§À¸·Î ºÒ¸®¾îÁø ÀÌ ÆÄÀÏÀº ±× Æ÷¸ËÀÇ À̹ÌÁö¸¦ Æ÷ÇÔÇϰí ÀÖ¾î¾ß Çϰí, ±×°ÍÀº ÇȽº¸Ê ±¸Á¶Ã¼ ¾ÈÀ¸·Î ·ÎµåµÈ´Ù. ±× ÇȽº¸ÊÀÇ ¾î¶² ºñÆ®°¡ ºÒÅõ¸í ÇØ¾ß ÇÏ´ÂÁö´Â mask°¡ °áÁ¤ÇÑ´Ù. ³ª¸ÓÁö ¸ðµç ºñÆ®µéÀº transparent_color¿¡ ÀÇÇØ Á¤ÇØÁø »ö±òÀ» °¡Áö°Ô µÈ´Ù. À̰ÍÀ» ÀÌ¿ëÇÏ´Â ¿¹Á¦°¡ ¾Æ·¡¿¡ µÚµû¸¦ °ÍÀÌ´Ù.

GdkPixmap* gdk_pixmap_create_from_xpm_d (GdkWindow  *window,
                                         GdkBitmap **mask,
                                         GdkColor   *transparent_color,
                                         gchar     **data);

ÀÛÀº À̹ÌÁö´Â XPM Æ÷¸ËÀÇ µ¥ÀÌÅͷμ­ ÇÁ·Î±×·¥ ³»ºÎ¿¡ Æ÷ÇԵǾî ÀÖÀ» ¼ö°¡ ÀÖ´Ù. ¾î¶² ÇȽº¸ÊÀº ÆÄÀϷκÎÅÍ µ¥ÀÌÅ͸¦ ÀоîµéÀÌ´Â ´ë½Å ÀÌ·± µ¥ÀÌÅ͸¦ ÀÌ¿ëÇØ ¸¸µé¾îÁø´Ù. ÀÌ µ¥ÀÌÅÍÀÇ ¿¹´Â ÀÌ·± °ÍÀÌ´Ù.

/* XPM */
static const char * xpm_data[] = {
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "};

void gdk_pixmap_destroy( GdkPixmap  *pixmap );

¿ì¸®°¡ ¾î¶² ÇȽº¸ÊÀ» ÀÌ¿ëÇß°í ¶Ç ´çºÐ°£ ´Ù½Ã ÀÌ¿ëÇÒ Çʿ䰡 ¾øÀ» °æ¿ì, ÀÌ ¸®¼Ò½º¸¦ gdk_pixmap_destory·Î ¸Þ¸ð¸®¿¡ ¹Ý³³ÇØÁÖ´Â °Íµµ ÁÁÀº »ý°¢ÀÌ´Ù. ÇȽº¸ÊÀº Áß¿äÇÑ ¸®¼Ò½º·Î °£ÁֵǾî¾ß ÇÑ´Ù.

¿ì¸®°¡ ÀÏ´Ü ÇȽº¸ÊÀ» ¸¸µé¸é, ±×°ÍÀ» GTK widgetó·³ º¸¿©ÁÙ ¼ö ÀÖ´Ù. ¿ì¸®´Â GDK ÇȽº¸ÊÀ» Æ÷ÇÔ½Ã۱â À§Çؼ­ ÇȽº¸ÊwidgetÀ» ¸¸µé¾î¾ß¸¸ ÇÑ´Ù. À̰ÍÀ» ÀÌ¿ë ÇØ¼­ ±×·¸°Ô ÇÒ ¼ö ÀÖ´Ù.

GtkWidget* gtk_pixmap_new( GdkPixmap  *pixmap,
                           GdkBitmap  *mask );

¶Ç´Ù¸¥ ÇȽº¸Êwidget ÇÔ¼öµéÀº ´ÙÀ½°ú °°´Ù.

guint gtk_pixmap_get_type( void );
void  gtk_pixmap_set( GtkPixmap  *pixmap,
                      GdkPixmap  *val,
                      GdkBitmap  *mask);
void  gtk_pixmap_get( GtkPixmap  *pixmap,
                      GdkPixmap **val,
                      GdkBitmap **mask);

gtk_pixmap_setÀº widgetÀÌ ÇöÀç ´Ù·ç°í ÀÖ´Â ÇȽº¸ÊÀ» º¯È­½Ã۱â À§ÇØ ÀÌ¿ëÇÑ´Ù. ÀÎÀÚ valÀº GDK¸¦ ÀÌ¿ëÇØ ¸¸µé¾îÁø ÇȽº¸ÊÀÌ´Ù.

ÀÌ ¿¹Á¦´Â ¹öư ¾È¿¡ ÇȽº¸ÊÀ» ³Ö´Â ¿¹Á¦ÀÌ´Ù.

#include <gtk/gtk.h>

/* Open-File ¾ÆÀÌÄÜÀ» À§ÇÑ XPM µ¥ÀÌÅÍ */
static const char * xpm_data[] = {
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "};

/* À̰ÍÀÌ È£ÃâµÇ¸é(delete_event ½Ã±×³ÎÀ» ÅëÇØ) ¾îÇÃÀÌ Á¾·áµÈ´Ù. */
void close_application( GtkWidget *widget, GdkEvent *event, gpointer data )
{
                gtk_main_quit();
}

/* ¹öưÀÌ Å¬¸¯µÇ¸é È£ÃâµÇ¾î ¸Þ½ÃÁö¸¦ ÇÁ¸°Æ®ÇÑ´Ù. */
void button_clicked( GtkWidget *widget, gpointer data )
{
                printf( "button clicked\n" );
}

int main( int argc, char *argv[] )
{
                /* GtkWidgetÀº widgetÀ» À§ÇÑ ±â¾ïÀå¼Ò ŸÀÔÀÌ´Ù. */ 
                GtkWidget *window, *pixmapwid, *button;
                GdkPixmap *pixmap;
                GdkBitmap *mask;
                GtkStyle *style;

                /* main À©µµ¸¦ ¸¸µé°í, ¾îÇÃÀ» ³¡³»±â À§ÇÑ delete_event ½Ã±×³ÎÀ»
                 * ¿¬°á½ÃÄÑ µÐ´Ù. */
                gtk_init( &argc, &argv );
                window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
                gtk_signal_connect( GTK_OBJECT (window), "delete_event",
                            GTK_SIGNAL_FUNC (close_application), NULL );
                gtk_container_border_width( GTK_CONTAINER (window), 10 );
                gtk_widget_show( window );

                /* gdkÇÔ¼ö·Î ÇȽº¸ÊÀ» ¸¸µé±â À§ÇÑ °ÍÀÌ´Ù. */
                style = gtk_widget_get_style( window );
                pixmap = gdk_pixmap_create_from_xpm_d( window->window,  &mask,
                                              &style->bg[GTK_STATE_NORMAL],
                                              (gchar **)xpm_data );

                /* ÇȽº¸ÊÀ» ´Ù·ê pixmap widgetÀÌ´Ù. */
                pixmapwid = gtk_pixmap_new( pixmap, mask );
                gtk_widget_show( pixmapwid );

                /* pixmap widgetÀ» °¡Áö°Ô µÇ´Â ¹öưÀÌ´Ù. */
                button = gtk_button_new();
                gtk_container_add( GTK_CONTAINER(button), pixmapwid );
                gtk_container_add( GTK_CONTAINER(window), button );
                gtk_widget_show( button );

                gtk_signal_connect( GTK_OBJECT(button), "clicked",
                            GTK_SIGNAL_FUNC(button_clicked), NULL );

                /* À©µµ¸¦ º¸ÀδÙ. */
                gtk_main ();

                return 0;
}

ÇöÀç µð·ºÅ丮ÀÇ icon0.xpm À̶ó´Â XPM µ¥ÀÌÅÍÆÄÀÏÀ» ºÒ·¯¿À±â À§Çؼ­, ¿ì¸®´Â ÇȽº¸ÊÀ» ¸¸µé¾î¾ß ÇÑ´Ù.

/* ÆÄÀϷκÎÅÍ ÇȽº¸ÊÀ» ºÒ·¯¿Â´Ù. */
pixmap = gdk_pixmap_create_from_xpm( window->window, &mask,
                                    &style->bg[GTK_STATE_NORMAL],
                                    "./icon0.xpm" );
pixmapwid = gtk_pixmap_new( pixmap, mask );
gtk_widget_show( pixmapwid );
gtk_container_add( GTK_CONTAINER(window), pixmapwid );

ÇȽº¸ÊÀ» ÀÌ¿ëÇÒ ¶§ ´ÜÁ¡ Çϳª´Â À̹ÌÁö¿¡ °ü°è¾øÀÌ ¸ðµç ´ë»óÀÌ Á÷»ç°¢Çü À̶ó´Â °ÍÀÌ´Ù. ¿ì¸®´Â µ¥½ºÅ©Åé°ú ¾îÇÿ¡¼­ ¾ÆÀÌÄÜÀÌ Á»´õ ÀÚ¿¬½º·¯¿î ¸ð¾çÀ» °¡Áöµµ·Ï Çϰí½Í´Ù. ¿¹¸¦µé¾î ¾î¶² °ÔÀÓ ÀÎÅÍÆäÀ̽º¿¡¼­, ¿ì¸®´Â ´©¸¦ ¹öưÀÌ µÕ±Ù ¸ð¾çÀ» °¡Áöµµ·Ï ÇÏ°í ½Í¾îÇÑ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ­´Â ƯÁ¤ÇÑ ¸ð¾çÀ» °®Ãá À©µµ¸¦ ÀÌ¿ëÇÑ´Ù.

ƯÁ¤ÇÑ ¸ð¾çÀ» °®Ãá À©µµ¶õ °£´ÜÈ÷ ¹è°æÀ» ÀÌ·ç´Â Çȼ¿µéÀÌ Åõ¸íÇÑ °ÍÀ» ¸»ÇÑ´Ù. ¹è°æ À̹ÌÁö°¡ ¿©·¯ »öÀ» ¶ì°í ÀÖ´Ù¸é, ÀÌ·¸°Ô ¿ì¸®´Â ¿ì¸®ÀÇ ¾ÆÀÌÄÜÀ» µÑ·¯½Ñ µé¾î¸ÂÁö ¾Ê´Â °æ°èÀÎ Á÷»ç°¢ÇüÀ¸·Î °ãÃÄ ±×¸®Áö ¾Ê´Â´Ù. À̹ø ¿¹Á¦´Â ÀÌ·± ½ÄÀ¸·Î ÇØ¼­ µ¥½ºÅ©Åé¿¡ ¼ö·¹¹ÙÄû À̹ÌÁö¸¦ º¸¿©ÁØ´Ù.

/* wheelbarrow.c */

#include <gtk/gtk.h>

/* XPM */
static char * WheelbarrowFull_xpm[] = {
"48 48 64 1",
"       c None",
".      c #DF7DCF3CC71B",
"X      c #965875D669A6",
"o      c #71C671C671C6",
"O      c #A699A289A699",
"+      c #965892489658",
"@      c #8E38410330C2",
"#      c #D75C7DF769A6",
"$      c #F7DECF3CC71B",
"%      c #96588A288E38",
"&      c #A69992489E79",
"*      c #8E3886178E38",
"=      c #104008200820",
"-      c #596510401040",
";      c #C71B30C230C2",
":      c #C71B9A699658",
">      c #618561856185",
",      c #20811C712081",
"<      c #104000000000",
"1      c #861720812081",
"2      c #DF7D4D344103",
"3      c #79E769A671C6",
"4      c #861782078617",
"5      c #41033CF34103",
"6      c #000000000000",
"7      c #49241C711040",
"8      c #492445144924",
"9      c #082008200820",
"0      c #69A618611861",
"q      c #B6DA71C65144",
"w      c #410330C238E3",
"e      c #CF3CBAEAB6DA",
"r      c #71C6451430C2",
"t      c #EFBEDB6CD75C",
"y      c #28A208200820",
"u      c #186110401040",
"i      c #596528A21861",
"p      c #71C661855965",
"a      c #A69996589658",
"s      c #30C228A230C2",
"d      c #BEFBA289AEBA",
"f      c #596545145144",
"g      c #30C230C230C2",
"h      c #8E3882078617",
"j      c #208118612081",
"k      c #38E30C300820",
"l      c #30C2208128A2",
"z      c #38E328A238E3",
"x      c #514438E34924",
"c      c #618555555965",
"v      c #30C2208130C2",
"b      c #38E328A230C2",
"n      c #28A228A228A2",
"m      c #41032CB228A2",
"M      c #104010401040",
"N      c #492438E34103",
"B      c #28A2208128A2",
"V      c #A699596538E3",
"C      c #30C21C711040",
"Z      c #30C218611040",
"A      c #965865955965",
"S      c #618534D32081",
"D      c #38E31C711040",
"F      c #082000000820",
"                                                ",
"          .XoO                                  ",
"         +@#$%o&                                ",
"         *=-;#::o+                              ",
"           >,<12#:34                            ",
"             45671#:X3                          ",
"               +89<02qwo                        ",
"e*                >,67;ro                       ",
"ty>                 459@>+&&                    ",
"$2u+                  ><ipas8*                  ",
"%$;=*                *3:.Xa.dfg>                ",
"Oh$;ya             *3d.a8j,Xe.d3g8+             ",
" Oh$;ka          *3d$a8lz,,xxc:.e3g54           ",
"  Oh$;kO       *pd$%svbzz,sxxxxfX..&wn>         ",
"   Oh$@mO    *3dthwlsslszjzxxxxxxx3:td8M4       ",
"    Oh$@g& *3d$XNlvvvlllm,mNwxxxxxxxfa.:,B*     ",
"     Oh$@,Od.czlllllzlmmqV@V#V@fxxxxxxxf:%j5&   ",
"      Oh$1hd5lllslllCCZrV#r#:#2AxxxxxxxxxcdwM*  ",
"       OXq6c.%8vvvllZZiqqApA:mq:Xxcpcxxxxxfdc9* ",
"        2r<6gde3bllZZrVi7S@SV77A::qApxxxxxxfdcM ",
"        :,q-6MN.dfmZZrrSS:#riirDSAX@Af5xxxxxfevo",
"         +A26jguXtAZZZC7iDiCCrVVii7Cmmmxxxxxx%3g",
"          *#16jszN..3DZZZZrCVSA2rZrV7Dmmwxxxx&en",
"           p2yFvzssXe:fCZZCiiD7iiZDiDSSZwwxx8e*>",
"           OA1<jzxwwc:$d%NDZZZZCCCZCCZZCmxxfd.B ",
"            3206Bwxxszx%et.eaAp77m77mmmf3&eeeg* ",
"             @26MvzxNzvlbwfpdettttttttttt.c,n&  ",
"             *;16=lsNwwNwgsvslbwwvccc3pcfu<o    ",
"              p;<69BvwwsszslllbBlllllllu<5+     ",
"              OS0y6FBlvvvzvzss,u=Blllj=54       ",
"               c1-699Blvlllllu7k96MMMg4         ",
"               *10y8n6FjvllllB<166668           ",
"                S-kg+>666<M<996-y6n<8*          ",
"                p71=4 m69996kD8Z-66698&&        ",
"                &i0ycm6n4 ogk17,0<6666g         ",
"                 N-k-<>     >=01-kuu666>        ",
"                 ,6ky&      &46-10ul,66,        ",
"                 Ou0<>       o66y<ulw<66&       ",
"                  *kk5       >66By7=xu664       ",
"                   <<M4      466lj<Mxu66o       ",
"                   *>>       +66uv,zN666*       ",
"                              566,xxj669        ",
"                              4666FF666>        ",
"                               >966666M         ",
"                                oM6668+         ",
"                                  *4            ",
"                                                ",
"                                                "};

/* À̰ÍÀÌ È£ÃâµÇ¸é(delete_event ½Ã±×³ÎÀ» ÅëÇØ) ¾îÇÃÀÌ Á¾·áµÈ´Ù. */
void close_application( GtkWidget *widget, GdkEvent *event, gpointer data )
{
                gtk_main_quit();
}

int main (int argc, char *argv[])
{
                GtkWidget *window, *pixmap, *fixed;
                GdkPixmap *gdk_pixmap;
                GdkBitmap *mask;
                GtkStyle *style;
                GdkGC *gc;

                /* mainÀ©µµ¸¦ ¸¸µé°í, ¾îÇÃÀ» ³¡³»±â À§ÇÑ delete_event ½Ã±×³ÎÀ» °Å±â¿¡
                 * ¿¬°á½ÃÄÑ µÐ´Ù.  main À©µµ´Â ¿ì¸®°¡ popup¸¸ µÇµµ·Ï ¸¸µé¾ú±â ¶§¹®¿¡
                 * ŸÀÌÆ²¹Ù¸¦ °¡ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù. */
                gtk_init (&argc, &argv);
                window = gtk_window_new( GTK_WINDOW_POPUP );
                gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                            GTK_SIGNAL_FUNC (close_application), NULL);
                gtk_widget_show (window);

                /* ÇȽº¸Ê°ú pixmap widgetÀ» À§ÇÑ °ÍÀÌ´Ù. */
                style = gtk_widget_get_default_style();
                gc = style->black_gc;
                gdk_pixmap = gdk_pixmap_create_from_xpm_d( window->window, &mask,
                                              &style->bg[GTK_STATE_NORMAL],
                                              WheelbarrowFull_xpm );
                pixmap = gtk_pixmap_new( gdk_pixmap, mask );
                gtk_widget_show( pixmap );

                /* ÇȽº¸ÊÀ» º¸À̱â À§ÇØ, ¿ì¸®´Â ÇȽº¸ÊÀ» ³õ¾ÆµÑ fixed widgetÀ»
                 * ÀÌ¿ëÇÑ´Ù. */
                fixed = gtk_fixed_new();
                gtk_widget_set_usize( fixed, 200, 200 );
                gtk_fixed_put( GTK_FIXED(fixed), pixmap, 0, 0 );
                gtk_container_add( GTK_CONTAINER(window), fixed );
                gtk_widget_show( fixed );

                /* À̰ÍÀº À̹ÌÁö ÀÚ½ÅÀ» Á¦¿ÜÇÑ ´Ù¸¥ ¸ðµç °ÍÀ» ÀºÆóÇÑ´Ù. */
                gtk_widget_shape_combine_mask( window, mask, 0, 0 );

                /* À©µµ¸¦ º¸ÀδÙ. */
                gtk_widget_set_uposition( window, 20, 400 );
                gtk_widget_show( window );
                gtk_main ();

                return 0;
}

¼ö·¹¹ÙÄû À̹ÌÁö¸¦ ´õ ¼¶¼¼ÇÏ°Ô ¸¸µé±â À§ÇØ, ¿ì¸®´Â ¹öưÀÌ ´­·ÁÁø À̺¥Æ®ÀÇ ½Ã±×³ÎÀÌ ¼ö·¹¹ÙÄû¿¡ ¾î¶² µ¿ÀÛÀ» Çϵµ·Ï ¿«¾îÁÙ ¼ö ÀÖ´Ù. ¿©±â º¸ÀÌ´Â ¸î ÁÙÀÇ ÄÚµå´Â ¸¶¿ì½º¹öưÀÌ ´­·ÁÁ³À» ¶§ ¾îÇÃÀÌ ³¡³ªµµ·Ï ÇØÁØ´Ù.

gtk_widget_set_events( window,
                       gtk_widget_get_events( window ) |
                       GDK_BUTTON_PRESS_MASK );

gtk_signal_connect( GTK_OBJECT(window), "button_press_event",
                    GTK_SIGNAL_FUNC(close_application), NULL );

8.6 ·ê·¯(ruler)

·ê·¯ widgetÀº ÁÖ¾îÁø ÇÑ À©µµ¿¡¼­ ¸¶¿ì½º Æ÷ÀÎÅÍÀÇ À§Ä¡¸¦ °¡¸®Å°´Âµ¥ ¾²ÀδÙ. À©µµ´Â ÆøÀ» °¡·ÎÁö¸£´Â ¼öÆò ·ê·¯¿Í ³ôÀ̸¦ °¡·ÎÁö¸£´Â ¼öÁ÷·ê·¯¸¦ °¡Áú ¼ö ÀÖ´Ù. ·ê·¯ À§ÀÇ Á¶±×¸¸ »ï°¢Çü Ç¥½Ã±â(indicator)°¡ ·ê·¯¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÇ Á¤È®ÇÑ À§Ä¡¸¦ º¸¿©ÁØ´Ù.

·ê·¯´Â ¹Ýµå½Ã ¹Ì¸® ¸ÕÀú ¸¸µé¾îÁ®¾ß¸¸ ÇÑ´Ù. ¼öÆò ¹× ¼öÁ÷ ·ê·¯´Â ´ÙÀ½ ÇÔ¼öµéÀ» ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø´Ù.

GtkWidget *gtk_hruler_new(void);    /* ¼öÆò ·ê·¯ */
GtkWidget *gtk_vruler_new(void);    /* ¼öÁ÷ ·ê·¯ */

·ê·¯°¡ Çѹø ¸¸µé¾îÁö¸é ÃøÁ¤´ÜÀ§¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ·ê·¯ÀÇ ÃøÁ¤´ÜÀ§´Â GTK_PIXELS³ª GTK_INCHES, GTK_CENTIMETERS ÁßÀÇ Çϳª°¡ µÈ´Ù.

void gtk_ruler_set_metric( GtkRuler        *ruler,
                           GtkMetricType   metric );

±âº» ¼³Á¤ ´ÜÀ§´Â GTK_PIXELSÀÌ´Ù.

gtk_ruler_set_metric( GTK_RULER(ruler), GTK_PIXELS );

¶Ç´Ù¸¥ Áß¿äÇÑ ·ê·¯ÀÇ Æ¯¼ºÀº ¾î¶»°Ô Å©±â ´ÜÀ§¸¦ ³ªÅ¸³»´À³Ä ÇÏ´Â Á¡°ú Ç¥½Ã±â°¡ óÀ½ ¾îµð¿¡ ³õÀ̳ÄÇÏ´Â Á¡ÀÌ´Ù. À̵éÀº ´ÙÀ½ ÇÔ¼ö·Î °áÁ¤ÇÑ´Ù.

void  gtk_ruler_set_range  (GtkRuler       *ruler,
                            gfloat          lower,
                            gfloat          upper,
                            gfloat          position,
                            gfloat          max_size);

ÀÎÀÚ lower¿Í upper´Â ·ê·¯ÀÇ ¹üÀ§¸¦ Á¤ÀÇÇϰí max_size´Â Ãâ·Â °¡´ÉÇÑ °¡Àå Å« ¼ö¸¦ ¼³Á¤ÇÑ´Ù. PositionÀº ·ê·¯ ³»ÀÇ Ç¥½Ã±â Ãʱâ À§Ä¡ÀÌ´Ù.

800 Çȼ¿ÀÇ ¼öÁ÷ ·ê·¯´Â ÀÌ·¸°Ô µÈ´Ù.

gtk_ruler_set_range( GTK_RULER(vruler), 0, 800, 0, 800);

0ºÎÅÍ 800±îÁö ¸Å 100 Çȼ¿¸¶´Ù Ç¥Áö(marking)°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù. ¸¸ÀÏ ·ê·¯ÀÇ ¹üÀ§¸¦ 7ºÎÅÍ 16À¸·Î ¹Ù²Ù·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

gtk_ruler_set_range( GTK_RULER(vruler), 7, 16, 0, 20);

·ê·¯ÀÇ Ç¥½Ã±â´Â Æ÷ÀÎÅÍÀÇ »ó´ëÀûÀÎ À§Ä¡¸¦ °¡¸®Å°´Â Á¶±×¸¸ »ï°¢Çü Ç¥ÁöÀÌ´Ù. ¸¸ÀÏ ·ê·¯°¡ ¸¶¿ì½º Æ÷ÀÎÅ͸¦ µû¸£°Ô ÇÏ°í ½Í´Ù¸é motion_notify_event ½Ã±×³ÎÀÌ ·ê·¯ÀÇ motion_notify_event method¿Í ¿¬°áµÇ¾î¾ß¸¸ ÇÑ´Ù. ƯÁ¤ À©µµ ¿µ¿ª ³»ÀÇ ¸ðµç ¸¶¿ì½º ¿òÁ÷ÀÓÀ» µû¸£°Ô Çϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x

gtk_signal_connect_object( GTK_OBJECT(area), "motion_notify_event",
         (GtkSignalFunc)EVENT_METHOD(ruler, motion_notify_event),
         GTK_OBJECT(ruler) );

´ÙÀ½ ¿¹Á¦´Â ¼öÆò ·ê·¯¸¦ À§¿¡ ¼öÁ÷ ·ê·¯¸¦ ¿ÞÂÊ¿¡ °¡Áø drawing area¸¦ ¸¸µç´Ù. ÀÌ drawing area´Â 600 Çȼ¿ÀÇ Æø°ú 400 Çȼ¿ÀÇ ³ôÀ̸¦ °¡Áø´Ù. ¼öÆò ·ê·¯´Â 7ºÎÅÍ 13ÀÇ ¹üÀ§¿¡ ¸Å 100 Çȼ¿¸¶´Ù Ç¥Áö¸¦ ÇÏ°í ¼öÁ÷ ·ç·¯´Â 0ºÎÅÍ 400ÀÇ ¹üÀ§¿¡ ¸¶Âù°¡Áö·Î ¸Å 100 Çȼ¿¸¶´Ù Ç¥Áö¸¦ ÇÑ´Ù. ·ê·¯µé°ú drawing areaÀÇ À§Ä¡ ¼³Á¤Àº Å×À̺íÀ» »ç¿ëÇÑ´Ù.

/* rulers.c */

#include <gtk/gtk.h>

#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x

#define XSIZE  600
#define YSIZE  400

/* ´Ý±â ¹öư(close button)ÀÌ ´­·¯Áö¸é ÀÌ ÇÔ¼ö°¡ ºÒ¸°´Ù.
 */
void close_application( GtkWidget *widget, gpointer data ) {
    gtk_main_quit();
}


/* ¸ÞÀÎ ÇÔ¼ö
 */
int main( int argc, char *argv[] ) {
    GtkWidget *window, *table, *area, *hrule, *vrule;

    /* gtk¸¦ ÃʱâÈ­ÇÏ°í ¸ÞÀÎ À©µµ¸¦ ¸¸µç´Ù.*/
    gtk_init( &argc, &argv );

    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
            GTK_SIGNAL_FUNC( close_application ), NULL);
    gtk_container_border_width (GTK_CONTAINER (window), 10);

    /* ·ê·¯¿Í drawing area¸¦ ³õÀº Å×À̺íÀ» ¸¸µç´Ù */
    table = gtk_table_new( 3, 2, FALSE );
    gtk_container_add( GTK_CONTAINER(window), table );

    area = gtk_drawing_area_new();
    gtk_drawing_area_size( (GtkDrawingArea *)area, XSIZE, YSIZE );
    gtk_table_attach( GTK_TABLE(table), area, 1, 2, 1, 2,
                      GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0 );
    gtk_widget_set_events( area, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK );

    /* ¼öÆò ·ê·¯´Â °¡Àå À§¿¡ ³õÀδÙ.  ¸¶¿ì½º°¡ drawing area À§¸¦ ¿òÁ÷À̸é,
       motion_notify_event °¡ ·ê·¯ÀÇ ÀûÀýÇÑ À̺¥Æ® Çڵ鷯¿¡°Ô Àü´ÞµÈ´Ù.
     */
    hrule = gtk_hruler_new();
    gtk_ruler_set_metric( GTK_RULER(hrule), GTK_PIXELS );
    gtk_ruler_set_range( GTK_RULER(hrule), 7, 13, 0, 20 );
    gtk_signal_connect_object( GTK_OBJECT(area), "motion_notify_event",
                               (GtkSignalFunc)EVENT_METHOD(hrule, motion_notify_event),
                               GTK_OBJECT(hrule) );
    /*  GTK_WIDGET_CLASS(GTK_OBJECT(hrule)->klass)->motion_notify_event, */
    gtk_table_attach( GTK_TABLE(table), hrule, 1, 2, 0, 1,
                      GTK_EXPAND|GTK_SHRINK|GTK_FILL, GTK_FILL, 0, 0 );
    
    /* ¼öÁ÷ ·ê·¯´Â Á¦ÀÏ ¿ÞÂÊ¿¡ ³õÀδÙ.  ¸¶¿ì½º°¡ drawing area À§¸¦ ¿òÁ÷À̸é,,
       motion_notify_event °¡ ·ê·¯ÀÇ ÀûÀýÇÑ À̺¥Æ® Çڵ鷯¿¡°Ô Àü´ÞµÈ´Ù.
     */
    vrule = gtk_vruler_new();
    gtk_ruler_set_metric( GTK_RULER(vrule), GTK_PIXELS );
    gtk_ruler_set_range( GTK_RULER(vrule), 0, YSIZE, 10, YSIZE );
    gtk_signal_connect_object( GTK_OBJECT(area), "motion_notify_event",
                               (GtkSignalFunc)
                                  GTK_WIDGET_CLASS(GTK_OBJECT(vrule)->klass)->motion_notify_event,
                               GTK_OBJECT(vrule) );
    gtk_table_attach( GTK_TABLE(table), vrule, 0, 1, 1, 2,
                      GTK_FILL, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0 );

    /* ÀÌÁ¦ ¸ðµç °ÍÀ» º¸¿©ÁØ´Ù */
    gtk_widget_show( area );
    gtk_widget_show( hrule );
    gtk_widget_show( vrule );
    gtk_widget_show( table );
    gtk_widget_show( window );
    gtk_main();

    return 0;
}

8.7 »óÅÂÇ¥½ÃÁÙ(statusbar)

»óÅÂÇ¥½ÃÁÙÀº ÅØ½ºÆ® ¸Þ½ÃÁö¸¦ º¸¿©Áִµ¥ ¾²ÀÌ´Â °£´ÜÇÑ widgetÀÌ´Ù. ÀÌ widgetÀº ÅØ½ºÆ® ¸Þ½ÃÁöµéÀ» ½ºÅÿ¡ º¸°üÇÑ´Ù. µû¶ó¼­ ÇöÀçÀÇ ¸Þ½ÃÁö¸¦ ²¨³»¸é ¹Ù·Î ÀÌÀüÀÇ ¸Þ½ÃÁö¸¦ ´Ù½Ã º¸¿©ÁÖ°Ô µÈ´Ù.

ÇÑ ¾îÇø®ÄÉÀ̼ÇÀÇ ¿©·¯ ºÎºÐµéÀÌ ¸Þ½ÃÁö¸¦ Ç¥½ÃÇϴµ¥ °°Àº »óÅÂÇ¥½ÃÁÙÀ» »ç¿ëÇØ¾ßÇÏ´Â °æ¿ì, »óÅÂÇ¥½ÃÁÙ widgetÀº ¿©·¯ '»ç¿ëÀÚ'µéÀ» ±¸ºÐÇϴµ¥ ¾²ÀÌ´Â Context Identifier¸¦ ¹ßÇàÇÑ´Ù. ¾î¶² context¸¦ °¡Á³´À³Ä¿¡ »ó°ü¾øÀÌ ½ºÅà Á¦ÀÏ À§ÀÇ ¸Þ½ÃÁö°¡ º¸¿©Áø´Ù. ¸Þ½ÃÁöµéÀº Context IdentifierÀÇ ¼ø¼­°¡ ¾Æ´Ï¶ó ³ªÁß¿¡ µé¾î°£ °ÍÀÌ ¸ÕÀú ³ª¿À´Â ¼ø¼­·Î ½ºÅÿ¡ ½×ÀδÙ.

»óÅÂÇ¥½ÃÁÙÀº ´ÙÀ½ ÇÔ¼ö¸¦ ÅëÇØ ¸¸µé¾îÁø´Ù.

GtkWidget* gtk_statusbar_new (void);

»õ·Î¿î Context Identifier´Â °£´ÜÇÑ context¿¡ °üÇÑ ¼³¸í°ú ÇÔ²² ´ÙÀ½ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¾òÀ» ¼ö ÀÖ´Ù.

guint gtk_statusbar_get_context_id (GtkStatusbar *statusbar,
                                    const gchar  *context_description);

»óÅÂÇ¥½ÃÁÙÀ» ´Ù·ç´Â ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀÌ ÀÖ´Ù.

guint    gtk_statusbar_push        (GtkStatusbar *statusbar,
                                    guint          context_id,
                                    gchar         *text);

void     gtk_statusbar_pop         (GtkStatusbar *statusbar)
                                    guint         context_id);
void     gtk_statusbar_remove      (GtkStatusbar *statusbar,
                                    guint         context_id,
                                    guint         message_id); 

¸ÕÀú gtk_statusbar_push´Â »óÅÂÇ¥½ÃÁÙ¿¡ »õ·Î¿î ¸Þ½ÃÁö¸¦ Ãß°¡Çϴµ¥ ¾²ÀδÙ. ÀÌ ÇÔ¼ö´Â ³ªÁß¿¡ gtk_statusbar_remove¸¦ È£ÃâÇϴµ¥ ¾²ÀÏ ¼ö ÀÖ´Â Message Identifier¸¦ ¸®ÅÏÇÑ´Ù. gtk_statusbar_remove´Â ÁÖ¾îÁø Message¿Í Context IdentifierÀÇ ¸Þ½ÃÁö¸¦ »óÅÂÇ¥½ÃÁÙ¿¡¼­ Á¦°ÅÇÑ´Ù.

gtk_statusbar_popÀº ÁÖ¾îÁø Context IdentifierÀÇ ½ºÅà Á¦ÀÏ À§ ¸Þ½ÃÁö¸¦ ²¨³» »èÁ¦ÇÑ´Ù.

´ÙÀ½ ¿¹Á¦´Â ¹öư 2°³¿Í »óÅÂÇ¥½ÃÁÙ Çϳª¸¦ ¸¸µç´Ù. º­Æ° Çϳª´Â »óÅÂÇ¥½ÃÁÙ¿¡ »õ ¸Þ½ÃÁö¸¦ ³Ö°í ³ª¸ÓÁö ´Ù¸¥ ¹öưÀº ¸¶Áö¸·À¸·Î ³Ö¾îÁø ¸Þ½ÃÁö¸¦ Á¦°ÅÇÑ´Ù.

/* statusbar.c */

#include <gtk/gtk.h>
#include <glib.h>

GtkWidget *status_bar;

void push_item (GtkWidget *widget, gpointer data)
{
  static int count = 1;
  char buff[20];

  g_snprintf(buff, 20, "Item %d", count++);
  gtk_statusbar_push( GTK_STATUSBAR(status_bar), (guint) &data, buff);

  return;
}

void pop_item (GtkWidget *widget, gpointer data)
{
  gtk_statusbar_pop( GTK_STATUSBAR(status_bar), (guint) &data );
  return;
}

int main (int argc, char *argv[])
{

    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *button;

    int context_id;

    gtk_init (&argc, &argv);

    /* »õ À©µµ¸¦ Çϳª ¸¸µç´Ù */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize( GTK_WIDGET (window), 200, 100);
    gtk_window_set_title(GTK_WINDOW (window), "GTK Statusbar Example");
    gtk_signal_connect(GTK_OBJECT (window), "delete_event",
                       (GtkSignalFunc) gtk_exit, NULL);
 
    vbox = gtk_vbox_new(FALSE, 1);
    gtk_container_add(GTK_CONTAINER(window), vbox);
    gtk_widget_show(vbox);
          
    status_bar = gtk_statusbar_new();      
    gtk_box_pack_start (GTK_BOX (vbox), status_bar, TRUE, TRUE, 0);
    gtk_widget_show (status_bar);

    context_id = gtk_statusbar_get_context_id( GTK_STATUSBAR(status_bar), "Statusbar example");

    button = gtk_button_new_with_label("push item");
    gtk_signal_connect(GTK_OBJECT(button), "clicked",
        GTK_SIGNAL_FUNC (push_item), &context_id);
    gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 2);
    gtk_widget_show(button);              

    button = gtk_button_new_with_label("pop last item");
    gtk_signal_connect(GTK_OBJECT(button), "clicked",
        GTK_SIGNAL_FUNC (pop_item), &context_id);
    gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 2);
    gtk_widget_show(button);              

    /* ´Ù¸¥ ¸ðµç °ÍµéÀÌ Çѹø¿¡ ¸ðµÎ ´Ù º¸À̵µ·Ï Çϱâ À§Çؼ­
     * Ç×»ó À©µµ¸¦ Á¦ÀÏ ¸¶Áö¸·¿¡ º¸¿©ÁØ´Ù. */
    gtk_widget_show(window);

    gtk_main ();

    return 0;
}

8.8 ÅØ½ºÆ® ÀÔ·Â(text entry)

ÅØ½ºÆ® ÀÔ·Â widgetÀº ÇÑÁÙÂ¥¸® ÅØ½ºÆ® »óÀÚ ¾È¿¡ ¹®ÀÚ¸¦ ŸÀÌÇÁÇØ ³Ö°Å³ª ¶Ç´Â ±×³É º¸¿©ÁÙ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÅØ½ºÆ®´Â Çö ÀÔ·Â widgetÀÇ ³»¿ëÀ» Ãß°¡Çϰųª ¶Ç´Â ¿ÏÀüÈ÷ ´ëüÇÏ´Â ÇÔ¼ö È£Ãâµé¿¡ ÀÇÇØ °áÁ¤µÈ´Ù.

ÅØ½ºÆ® ÀÔ·Â widgetÀ» ¸¸µå´Âµ¥´Â ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

GtkWidget* gtk_entry_new (void);

GtkWidget* gtk_entry_new_with_max_length (guint16 max);

óÀ½ °ÍÀº ´Ü¼øÈ÷ »õ·Î¿î ÀÔ·Â widgetÀ» Çϳª ¸¸µç´Ù. ±×¿¡ ¹ÝÇØ µÎ¹øÂ° °ÍÀº ÆíÁý°¡´ÉÇÑ ÅØ½ºÆ®ÀÇ ±æÀÌ Á¦ÇÑÀ» °¡Áø ÀÔ·Â widgetÀ» ¸¸µç´Ù.

Çö ÀÔ·ÂÀÇ ÅØ½ºÆ®¸¦ º¯°æÇϴµ¥ ¾²ÀÌ´Â ¸î°¡Áö ÇÔ¼ö°¡ Á¸ÀçÇÑ´Ù.

void gtk_entry_set_text       (GtkEntry    *entry,
                               const gchar *text);
void gtk_entry_append_text    (GtkEntry    *entry,
                               const gchar *text);
void gtk_entry_prepend_text   (GtkEntry    *entry,
                               const gchar *text);

ÇÔ¼ö gtk_entry_set_textÀº ÀÔ·ÂµÈ ³»¿ëÀ» ¿ÏÀüÈ÷ º¯°æÇÑ´Ù. ÇÔ¼ö gtk_entry_append_text¿Í gtk_entry_prepend_text´Â Çö ³»¿ëÀÇ ¾Õ ¶Ç´Â µÚ¿¡ ¿øÇÏ´Â ÅØ½ºÆ®¸¦ µ¡ºÙÀδÙ.

´ÙÀ½ ÇÔ¼ö´Â ÇöÀçÀÇ ÅØ½ºÆ® ÀÔ·Â À§Ä¡¸¦ Á¤ÇÑ´Ù.

void gtk_entry_set_position   (GtkEntry *entry,
                               gint     position);

ÀÔ·Â widgetÀÇ ³»¿ëÀº ´ÙÀ½ ÇÔ¼ö È£Ãâ¿¡ ÀÇÇØ¼­ ¾Ë ¼ö ÀÖ´Ù. À̰ÍÀº ³ªÁß¿¡ ¼³¸íÇÒ callback ÇÔ¼ö ¾È¿¡¼­ »ç¿ëÇÏ´Â °ÍÀÌ À¯¿ëÇÏ´Ù.

gchar* gtk_entry_get_text (GtkEntry *entry);

¸¸ÀÏ ÀÔ·ÂµÈ ³»¿ëÀÌ Å¸ÀÌÇο¡ ÀÇÇØ¼­ º¯°æµÇ´Â °ÍÀ» ¿øÇÏÁö ¾Ê´Â´Ù¸é ÆíÁýÀÌ ºÒ°¡´ÉÇϵµ·Ï »óŸ¦ ¹Ù²Ü ¼ö ÀÖ´Ù.

void gtk_entry_set_editable (GtkEntry *entry,
                             gboolean editable);

ÀÌ ÇÔ¼öÀÇ editable ÀÎÀÚ¿¡ TRUE³ª FALSE¸¦ ÁÖ¾î ÀÔ·Â widgetÀÌ ÆíÁý °¡´ÉÇÏ°Ô µÇ°Å³ª ¶Ç´Â °¡´ÉÇÏÁö ¾Êµµ·Ï º¯°æÇÒ ¼ö ÀÖ´Ù.

¸¸¾à ÆÐ½º¿öµå¸¦ ÀÔ·ÂÇÒ ¶§Ã³·³ ÀÔ·ÂÇÏ´Â ÅØ½ºÆ®°¡ º¸ÀÌÁö ¾Ê¾Æ¾ß ÇÑ´Ù¸é boolean flag¸¦ °®´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

void gtk_entry_set_visibility (GtkEntry *entry,
                               gboolean visible);

´ÙÀ½ ÇÔ¼ö¸¦ ½á¼­ ÅØ½ºÆ®ÀÇ ÀÏÁ¤ ºÎºÐÀ» ¼±ÅÃ(selected)µÇµµ·Ï ¸¸µé ¼ö ÀÖ´Ù. ÀÌ ±â´ÉÀº ¹Ì¸® ±âº» ÅØ½ºÆ®¸¦ Á¤ÇØ Ãâ·ÂÇϰí À̸¦ »ç¿ëÀÚ°¡ »õ·Î¿î ÀÔ·ÂÀ» À§Çؼ­ °£´ÜÈ÷ Áö¿ï ¼ö ÀÖ°Ô Çϴµ¥ ÀÚÁÖ ¾²ÀδÙ.

void gtk_entry_select_region (GtkEntry *entry,
                              gint     start,
                              gint     end);

¸¸¾à¿¡ »ç¿ëÀÚ°¡ ÅØ½ºÆ®¸¦ ÀÔ·ÂÇÏ´Â °ÍÀ» ¾Ë¾ÆÃ¤°í ½Í´Ù¸é, activate³ª changed ½Ã±×³ÎÀ» ¿¬°áÇÒ ¼ö ÀÖ´Ù. Activate´Â »ç¿ëÀÚ°¡ ¿£ÅÍ۸¦ ŸÀÌÇÁÇϸé, Changed´Â ÅØ½ºÆ®°¡ ÀüºÎ ´Ù¸¥ °ÍÀ¸·Î ¹Ù²î¸é ¹ß»ýÇÑ´Ù.(¸ðµç ¹®ÀÚ°¡ ÀԷµǾú°Å³ª Áö¿öÁ³À» ¶§ µî)

´ÙÀ½Àº ÅØ½ºÆ® ÀÔ·Â widgetÀÇ ÇÑ ¿¹ÀÌ´Ù.

/* entry.c */

#include <gtk/gtk.h>

void enter_callback(GtkWidget *widget, GtkWidget *entry)
{
  gchar *entry_text;
  entry_text = gtk_entry_get_text(GTK_ENTRY(entry));
  printf("Entry contents: %s\n", entry_text);
}

void entry_toggle_editable (GtkWidget *checkbutton,
                                   GtkWidget *entry)
{
  gtk_entry_set_editable(GTK_ENTRY(entry),
                         GTK_TOGGLE_BUTTON(checkbutton)->active);
}

void entry_toggle_visibility (GtkWidget *checkbutton,
                                   GtkWidget *entry)
{
  gtk_entry_set_visibility(GTK_ENTRY(entry),
                         GTK_TOGGLE_BUTTON(checkbutton)->active);
}

int main (int argc, char *argv[])
{

    GtkWidget *window;
    GtkWidget *vbox, *hbox;
    GtkWidget *entry;
    GtkWidget *button;
    GtkWidget *check;

    gtk_init (&argc, &argv);

    /* create a new window */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize( GTK_WIDGET (window), 200, 100);
    gtk_window_set_title(GTK_WINDOW (window), "GTK Entry");
    gtk_signal_connect(GTK_OBJECT (window), "delete_event",
                       (GtkSignalFunc) gtk_exit, NULL);

    vbox = gtk_vbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (window), vbox);
    gtk_widget_show (vbox);

    entry = gtk_entry_new_with_max_length (50);
    gtk_signal_connect(GTK_OBJECT(entry), "activate",
                       GTK_SIGNAL_FUNC(enter_callback),
                       entry);
    gtk_entry_set_text (GTK_ENTRY (entry), "hello");
    gtk_entry_append_text (GTK_ENTRY (entry), " world");
    gtk_entry_select_region (GTK_ENTRY (entry),
                             0, GTK_ENTRY(entry)->text_length);
    gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
    gtk_widget_show (entry);

    hbox = gtk_hbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (vbox), hbox);
    gtk_widget_show (hbox);
                                  
    check = gtk_check_button_new_with_label("Editable");
    gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
    gtk_signal_connect (GTK_OBJECT(check), "toggled",
                        GTK_SIGNAL_FUNC(entry_toggle_editable), entry);
    gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(check), TRUE);
    gtk_widget_show (check);
    
    check = gtk_check_button_new_with_label("Visible");
    gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
    gtk_signal_connect (GTK_OBJECT(check), "toggled",
                        GTK_SIGNAL_FUNC(entry_toggle_visibility), entry);
    gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(check), TRUE);
    gtk_widget_show (check);
                                   
    button = gtk_button_new_with_label ("Close");
    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                               GTK_SIGNAL_FUNC(gtk_exit),
                               GTK_OBJECT (window));
    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
    gtk_widget_grab_default (button);
    gtk_widget_show (button);
    
    gtk_widget_show(window);

    gtk_main();
    return(0);
}

8.9 »ö ¼±ÅÃ(color selection)

»ö¼±Åà widgetÀº, »ç½Ç ÀüÇô ³î¶øÁö ¾Ê°ÚÁö¸¸, Á÷Á¢ »öÀ» ¼±ÅÃÇϴµ¥ ¾²ÀδÙ. ÀÌ º¹ÇÕÀûÀÎ widgetÀº »ç¿ëÀÚ·Î ÇÏ¿©±Ý RGB(Red, Green, Blue)¿Í HSV (Hue, Saturation, Value) ¼¼ ¿ä¼Ò¸¦ ÅëÇØ »öÀ» °í¸£°Ô ÇÑ´Ù. ÀÌ´Â ½½¶óÀÌ´õ³ª ÀÔ·ÂâÀ» ÀÌ¿ëÇØ¼­ °¢ ¿ä¼Ò¿¡ ƯÁ¤ °ªÀ» ÁÖ°ÔÇϰųª ¶Ç´Â, hue-saturation wheel¿¡¼­ Á÷Á¢ »öÀ» ¼±ÅÃÇÏ°Ô ÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù. Çʿ信 µû¶ó¼­´Â »öÀÇ Åõ¸íµµµµ Á¤ÇØÁÙ ¼ö ÀÖ´Ù.

ÀÌ »ö¼±Åà widgetÀº ¿ÜºÎ¿¡¼­ gtk_color_selection_set_color()À» ÅëÇØ ÁöÁ¤Ç߰ųª ¶Ç´Â »ç¿ëÀÚ°¡ Á÷Á¢ ÇöÀç »öÀ» º¯°æÇÒ ¶§¸¶´Ù "color_changed"À̶ó´Â ´Ü ÇѰ¡ÁöÀÇ ½Ã±×³Î¸¸À» ¹ß»ý½ÃŲ´Ù.

ÀÌ »ö¼±Åà widgetÀÌ ¿ì¸®¿¡°Ô ¹«¾ùÀ» ³Ñ°ÜÁÖ¾î¾ß ÇÏ´ÂÁö º¸ÀÚ. ÀÌ widgetÀº gtk_color_selection¿Í gtk_color_selection_dialogÀÇ µÎ ÇüŰ¡ ÀÖ´Ù.

GtkWidget *gtk_color_selection_new(void);

´ë°³ ÀÌ ÇÔ¼ö¸¸À» Á÷Á¢ ¾µ ¼ö´Â ¾ø´Ù. À̰ÍÀº ³ªÁß¿¡ ¾îµò°¡·Î ¿¬°áÀ» ½ÃÄÑÁÖ¾î¾ß¸¸ ÇÏ´Â GtkColorSelection widgetÀ» ¸¸µé µû¸§ÀÌ´Ù. ÀÌ GtkColorSelection widgetÀº GtkVBox widget¿¡¼­ »ó¼ÓµÈ °ÍÀÌ´Ù.

 
GtkWidget *gtk_color_selection_dialog_new(const gchar *title);

´ë°³ ÀÌ ÇÔ¼ö¸¦ »ö¼±Åà widgetÀ» ¸¸µå´Â µ¥ »ç¿ëÇÑ´Ù. ÀÌ´Â GtkColorSelectionDialog¶ó´Â GtkDialog¿¡¼­ »ó¼ÓµÈ widgetÀ» ¸¸µç´Ù. ÀÌ widgetÀº GtkColorSelection, GtkHSeparator¿Í "Ok", "Cancel", "Help"ÀÇ ¹öư ¼¼°³¸¦ °¡Áø GtkHBoxµéÀ» Æ÷ÇÔÇÑ GtkFrame widgetÀ¸·Î ÀÌ·ç¾îÁ®ÀÖ´Ù. GtkColorSelectionDialog structure¿¡¼­ "ok_button", "cancel_button", "help_button" widget¿¡ Á¢±ÙÇØ¼­ ±× ¼¼ ¹öưµéÀ» Á÷Á¢ ´Ù·ê ¼ö ÀÖ´Ù. (¿¹ : GTK_COLOR_SELECTION_DIALOG(colorseldialog)->ok_button)

void gtk_color_selection_set_update_policy(GtkColorSelection *colorsel, 
                                           GtkUpdateType policy);

ÀÌ ÇÔ¼ö´Â °»½Å Á¤Ã¥À» Á¤ÇÑ´Ù. ±âº» Á¤Ã¥Àº »ç¿ëÀÚ°¡ ¹«¾ùÀÌµç º¯°æÇÏ´Â ±×¶§¸¶´Ù ¹Ù·Î Áï½Ã ÇöÀçÀÇ »öÀ» °Å±â¿¡ µû¶ó ¹Ù²Ù´Â GTK_UPDATE_CONTINOUSÀÌ´Ù. ¼º´É¹®Á¦°¡ ¹ß»ýÇϸé GTK_UPDATE_DISCONTINOUS³ª GTK_UPDATE_DELAYED·Î ¹Ù²Ù¾î ÁÙ ¼ö ÀÖ´Ù.

void gtk_color_selection_set_opacity(GtkColorSelection *colorsel,
                                     gint use_opacity);
»ö¼±Åà widgetÀº »öÀÇ Åõ¸íµµ(¾ËÆÄä³ÎÀ̶ó°íµµ ¾Ë·ÁÁø)¸¦ Á¶Á¤ÇÏ´Â ±â´Éµµ Áö¿øÇÑ´Ù. ÀÌ ±â´ÉÀº ±âº» ¼³Á¤¿¡¼­´Â ²¨Á®ÀÖ´Ù. À̰ÍÀ» »ç¿ëÇÏ·Á¸é À§ÀÇ ÇÔ¼ö¸¦ use_opacity¸¦ TRUE·Î ÇØ¼­ È£ÃâÇÑ´Ù. ¸¶Âù°¡Áö·Î use_opacity¸¦ FALSE·Î ÇØ¼­ È£ÃâÇϸé Åõ¸íµµ Á¶Á¤ ±â´ÉÀÌ ²¨Áø´Ù.

void gtk_color_selection_set_color(GtkColorSelection *colorsel,
                                   gdouble *color);

»ö»ó array(gdouble)¿Í ÇÔ²² À§ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¿ÜºÎ¿¡¼­ ÇöÀç »öÀ» ÁöÁ¤ÇØ ÁÙ ¼ö ÀÖ´Ù. ÀÌ arrayÀÇ ±æÀÌ´Â »ö Åõ¸íµµ Á¶Á¤ ±â´ÉÀ» Äѳõ¾Ò´ÂÁö ²¨³õ¾Ò´ÂÁö¿¡ µû¶ó ´Þ¶óÁø´Ù. À§Ä¡ 0Àº »¡°£»ö, 1Àº ³ì»ö, 2´Â ÆÄ¶õ»öÀ̸ç 3Àº Åõ¸íµµÀÌ´Ù.(Åõ¸íµµ´Â ÀÌ ±â´ÉÀ» Äѳõ¾ÒÀ» ¶§¸¸ Àǹ̰¡ ÀÖ´Ù. ¾Õ¿¡¼­ ³ª¿Â gtk_color_selection_set_opacity()¿¡ ´ëÇÑ ºÎºÐÀ» º¸¶ó.) ¸ðµç °ªÀº 0.0°ú 1.0 »çÀÌ¿¡ ÀÖ´Ù.

void gtk_color_selection_get_color(GtkColorSelection *colorsel,
                                   gdouble *color);

¸¸ÀÏ 'color_changed" ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§, ÇöÀç »öÀÌ ¾î¶² °ÍÀÌÁö ¾Ë°í ½Í´Ù¸é À§ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. Color´Â »ö arrayÀÌ´Ù. ÀÌ »ö array¿¡ ´ëÇÑ °ÍÀº gtk_color_selection_set_color() ÇÔ¼ö¿¡ ´ëÇÑ ºÎºÐÀ» º¸¶ó.

´ÙÀ½Àº GtkColorSelectionDialogÀ» »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº drawing area¸¦ °¡Áø À©µµ Çϳª¸¦ ¸¸µç´Ù. À̰ÍÀ» Ŭ¸¯Çϸé color selection dialog°¡ ¶á´Ù. À̸¦ Á¶Á¤Çؼ­ ¹è°æ»öÀ» ¹Ù²Ü ¼ö ÀÖ´Ù.

#include <glib.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>

GtkWidget *colorseldlg = NULL;
GtkWidget *drawingarea = NULL;

/* »öÀÌ ¹Ù²î¸é ÀÌ ÇÔ¼ö¸¦ ºÎ¸¥´Ù. */

void color_changed_cb (GtkWidget *widget, GtkColorSelection *colorsel)
{
  gdouble color[3];
  GdkColor gdk_color;
  GdkColormap *colormap;

  /* drawing areaÀÇ colormapÀ» ¾ò´Â´Ù */

  colormap = gdk_window_get_colormap (drawingarea->window);

  /* ÇöÀç »öÀ» ¾ò´Â´Ù */

  gtk_color_selection_get_color (colorsel,color);

  /* unsigned 16 bit Á¤¼ö(0..65535)·Î ¹Ù²ã¼­ GdkColor¿¡ ³Ö´Â´Ù  */

  gdk_color.red = (guint16)(color[0]*65535.0);
  gdk_color.green = (guint16)(color[1]*65535.0);
  gdk_color.blue = (guint16)(color[2]*65535.0);

  /* »öÀ» ÇÒ´çÇÑ´Ù */

  gdk_color_alloc (colormap, &gdk_color);

  /* À©µµÀÇ ¹è°æ»öÀ» Á¤ÇÑ´Ù */

  gdk_window_set_background (drawingarea->window, &gdk_color);

  /* À©µµ¸¦ Áö¿î´Ù */

  gdk_window_clear (drawingarea->window);
}

/* Drawingarea event handler */

gint area_event (GtkWidget *widget, GdkEvent *event, gpointer client_data)
{
  gint handled = FALSE;
  GtkWidget *colorsel;

  /* ¹öưÀÌ ´­·¯Á³´ÂÁö È®ÀÎÇÑ´Ù */

  if (event->type == GDK_BUTTON_PRESS && colorseldlg == NULL)
    {
      /* Yes, we have an event and there's no colorseldlg yet! */

      handled = TRUE;

      /* color selection dialog¸¦ ¸¸µç´Ù */

      colorseldlg = gtk_color_selection_dialog_new("Select background color");

      /* GtkColorSelection widgetÀ» ±¸ÇÑ´Ù */

      colorsel = GTK_COLOR_SELECTION_DIALOG(colorseldlg)->colorsel;

      /* "color_changed" ½Ã±×³ÎÀ» widget¿¡ ¿¬°áÇÑ´Ù. */

      gtk_signal_connect(GTK_OBJECT(colorsel), "color_changed",
        (GtkSignalFunc)color_changed_cb, (gpointer)colorsel);

      /* color seclection dialog¸¦ º¸Àδ٠*/

      gtk_widget_show(colorseldlg);
    }

  return handled;
}

/* À©µµ¸¦ ´Ý°í Çڵ鷯¿¡¼­ ºüÁ®³ª°£´Ù */

void destroy_window (GtkWidget *widget, gpointer client_data)
{
  gtk_main_quit ();
}

/* Main */

gint main (gint argc, gchar *argv[])
{
  GtkWidget *window;

  /* ŸŶÀ» ÃʱâÈ­Çϰí gtk¿Í °ü·ÃµÈ ¸í·ÉÀÔ·Â ¿ä¼ÒµéÀ» ¾ø¾Ø´Ù. */

  gtk_init (&argc,&argv);

  /* toplevel À©µµ¸¦ ¸¸µé°í Á¦¸ñ°ú policy¸¦ Á¤ÇÑ´Ù */

  windo