´ÙÀ½ ÀÌÀü Â÷·Ê

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)·Î ³Ñ¾î°£´Ù. ÀÌ ÇÔ¼ö´Â ¾²ÀÏ ¶óÀ̺귯¸®¸¦ ÃʱâÈ­ ÇÏ°í, µðÆúÆ®·Î ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϸç, ¸í·ÉÇàÀ» ÅëÇØ ÇÁ·Î±×·¥¿¡ ÀüÇØÁø ÀÎÀÚµé Áß ¾Æ·¡ÀÇ °ÍµéÀ» ã¾Æ üũÇÑ´Ù.

´ç½ÅÀÇ ¾îÇÃÀÌ ÀνÄÇÏÁö ¾ÊÀ» °ÍµéÀ» ³²°ÜµÎ°í, À§ÀÇ °ÍµéÀ» ÀÎÀÚÀÇ ¸®½ºÆ®¿¡¼­ Á¦°ÅÇÑ´Ù. ÀÌ°ÍÀº ¸ðµç 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`

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

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

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°¡ Á¾·áµÈ´Ù.

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


´ÙÀ½ ÀÌÀü Â÷·Ê