¸®´ª½º ±âŸ ÀÚ·á

HomePage Backward Forward Post Reply List
Delete Modify
  Á¦¸ñ   gtk °­Á #1 1998/07/10 (17:25)
À̸§ ±èÈ¿¿ø
¹øÈ£ 84
Á¶È¸ 264
º»¹®
¡º¸®´ª½º Çдç-¹ø¿ª¹° (go LINUX)¡» 199¹ø
Á¦  ¸ñ:[¹ø¿ª] gtk Tutorial, Chap1~3ÀÔ´Ï´Ù.                         
¿Ã¸°ÀÌ:Áß¾ÓÀÚ´ë(ÀÌÈÆ    )    98/03/11 15:18    ÀÐÀ½:355 °ü·ÃÀÚ·á ¾øÀ½
-----------------------------------------------------------------------------

***********
*** 1. ¼Ò°³
***********

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

Peter Mattis   petm@xcf.berkeley.edu
Spencer Kimball spencer@xcf.berkeley.edu
Josh MacDonald jmacd@xcf.berkeley.edu

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

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

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



*****************
*** 2. ½ÃÀÛÇϸ鼭
*****************

 ¸ÕÀú ÇÒ ÀÏÀº ¹°·Ð GTKÀÇ ¼Ò½º¸¦ ¹Þ¾Æ¼­ ±×°ÍÀ» ¼³Ä¡ÇÏ´Â °ÍÀÌ´Ù.  ¾ðÁ¦³ª
°¡Àå ÃֽŠ¹öÀüÀ» ftp.gimp.orgÀÇ /pub/gtk¿¡¼­ °¡Á®¿Ã ¼ö ÀÖ´Ù.  GTK¿¡ ´ëÇÑ
¶Ç´Ù¸¥ ¼Ò½ºµéÀº http://www.gimp.org/gtk¿¡ ÀÖ´Ù.  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 À̺¥Æ®, ŸÀӾƿô, ¶Ç´Â ÆÄÀÏ ÀÔÃâ·Â °¨Áö
µîÀ» ±â´Ù¸®¸ç ´ë±âÇÏ°Ô µÈ´Ù.  ±×·¯³ª ÀÌ °£´ÜÇÑ ÇÁ·Î±×·¥¿¡¼­´Â ±×·± °ÍµéÀÌ
¹«½ÃµÇ°í ÀÖ´Ù.

***
*** 2-1. GTK¿¡¼­ÀÇ Hello World ÇÁ·Î±×·¥
***
 ÀÌÁ¦ ÇϳªÀÇ widget(¹öÆ°)À» À§ÇÑ ÇÁ·Î±×·¥ÀÌ´Ù, ±× À¯¸íÇÑ hello world¸¦
GTK·Î½á ±¸ÇöÇØ º¸ÀÚ.

 #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;
 }

***
*** 2-2. Hello world¸¦ ÄÄÆÄÀÏÇϱâ
***
 ÄÄÆÄÀÏÇϱâ À§ÇØ ÀÌ·¸°Ô Ç϶ó.

      gcc -Wall -g helloworld.c -o hello_world -L/usr/X11R6/lib \
          -lgtk -lgdk -lglib -lXext -lX11 -lm

 À§ÀÇ ¶óÀ̺귯¸®µéÀº µðÆúÆ® Ž»ö°æ·Î¿¡ ÀÖ¾î¾ß ÇÏ°í, ±×·¸Áö ¾ÊÀ» ¶§
-L<library directory> ¸¦ ´õÇØÁÖ¸é gcc°¡ ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦ ÀÌ µð·ºÅ丮¿¡¼­
Ž»öÇÏ°Ô µÉ °ÍÀÌ´Ù.  ¿¹¸¦µé¾î, ³»°¡ ¾²´Â Debian Linux ½Ã½ºÅÛ¿¡¼­´Â X11
¶óÀ̺귯¸®¸¦ ãÀ» ¼ö ÀÖµµ·Ï -L/usr/X11R6/lib ¶ó°í ÇØÁÖ¾î¾ß ÇÑ´Ù.

 ¶óÀ̺귯¸®µéÀÇ ¼ø¼­ ¶ÇÇÑ Áß¿äÇÏ´Ù.  ¸µÄ¿´Â ½ÇÇàµÇ±â ÀÌÀü¿¡ ¾î¶² ÇÔ¼öµéÀÌ
¾²¿´´ÂÁö ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.

 ¸¸¾à Á¤Àû ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇØ ÄÄÆÄÀÏÇÑ´Ù¸é ¶óÀ̺귯¸®ÀÇ ¼ø¼­´Â ƯÈ÷ Áß¿ä
ÇØÁø´Ù.  À§¿¡ º¸ÀÎ ¼ø¼­°¡ ¹Ù·Î ÀÌ·± °æ¿ì´Ù.

 ¿ì¸®°¡ ¸µÅ©½ÃŲ ¶óÀ̺귯¸®´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ´Ù.

The glib library (-lglib), ´Ù¾çÇÑ ÇÔ¼ö¸¦ Æ÷ÇÔÇÏ°í ÀÖÀ¸¸ç, ¿©±â¼­
¾²ÀÎ °ÍÀº g_print()ÇÔ¼ö´Ù.  GTK´Â glib¸¦ ±â¹ÝÀ¸·Î ÇÏ°í ÀÖÀ¸¹Ç·Î
¾ðÁ¦³ª ÀÌ ¶óÀ̺귯¸®°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù.  ÀÚ¼¼ÇÑ °ÍÀº glib¿¡ ´ëÇÑ
ºÎºÐÀ» ÂüÁ¶Ç϶ó.

The GDK library (-lgdk), Xlib¸¦ °¨Ãß¾î µÑ·¯½Ñ wrapper´Ù.

The GTK library (-lgtk), GDK¸¦ ±â¹ÝÀ¸·ÎÇÑ widget ¶óÀ̺귯¸®´Ù.

The Xlib library (-lX11), GDK¿¡ ÀÇÇØ ¾²¿©Áö°Ô µÈ´Ù.

The Xext library (-lXext), ÀÌ°ÍÀº °øÀ¯ ¸Þ¸ð¸® pixmap°ú ´Ù¸¥ X È®Àå
µé¿¡ ´ëÇÑ Äڵ带 À§ÇÑ °ÍÀÌ´Ù.

The math library (-lm), ÀÌ°ÍÀº ¿©·¯ ¸ñÀûÀ¸·Î GTK¿¡¼­ ¾²ÀÌ°Ô µÈ´Ù.  

***
*** 2-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¿¡ Ãß°¡ÀûÀÎ Á¤º¸¸¦ °¡Á®¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÌ´Ù.

***
*** 2-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°¡ Á¾·áµÇ°Ô ÇÏ´Â °ÍÀÌ´Ù.

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



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

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

***
*** 3-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¿¡¼­, ´ÜÁö
ÇöÀç ¼³Á¤µÈ ¸ðµç ½Ã±×³Î Çڵ鷯¸¦ Á¦°ÅÇØ ÁØ´Ù.

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

 #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
µµ ÀÖ´Ù.  ÀÌ°ÍÀº À©µµ¸Å´ÏÀú¿Í ¾à°£ ´Ù¸¥ ¹æ½ÄÀ¸·Î »óÈ£ÀÛ¿ëÇϸç, ÀϽÃÀûÀÎ À©µµ
µé¿¡ ´ëÇØ ¾²¿©Á®¾ß ÇÑ´Ù.

HomePage Backward Forward Post Reply List
1998 by swindler