¸ÕÀú ÇÒ ÀÏÀº ¹°·Ð 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 À̺¥Æ®, ŸÀӾƿô, ¶Ç´Â ÆÄÀÏ ÀÔÃâ·Â °¨Áö µîÀ» ±â´Ù¸®¸ç ´ë±âÇÏ°Ô µÈ´Ù. ±×·¯³ª ÀÌ °£´ÜÇÑ ÇÁ·Î±×·¥¿¡¼´Â ±×·± °ÍµéÀÌ ¹«½ÃµÇ°í ÀÖ´Ù.
ÀÌÁ¦ ÇϳªÀÇ 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;
}
ÄÄÆÄÀÏÇϱâ À§ÇØ ÀÌ·¸°Ô Ç϶ó.
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
´Â ¸µÅ©µÇ¾î¾ß ÇÏ´Â ¶óÀ̺귯¸®µé°ú
±× ¶óÀ̺귯¸®µéÀÌ Á¸ÀçÇÏ´Â µð·ºÅ丮µéÀ» Ãâ·ÂÇÑ´Ù.
º¸Åë ¸µÅ©½ÃÅ°´Â ¶óÀ̺귯¸®µéÀº ´ÙÀ½°ú °°Àº °ÍµéÀÌ´Ù.
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¿¡ Ãß°¡ÀûÀÎ Á¤º¸¸¦ °¡Á®¾ß ÇÒ ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÌ´Ù.
ÀÌÁ¦ Àû¿ëµÈ À̷п¡ ´ëÇØ ¾Ë¾Ò°í, 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°¡ Á¾·áµÈ´Ù.
ºñ·Ï ¾²ÀÓ»õ´Â °ÅÀÇ °°Àº °ÍÀÌÁö¸¸, À¯´Ð½º ½Ã½ºÅÛÀÇ ½Ã±×³ÎÀº ¿©±â¼ ¸»ÇÏ´Â ÀÌ·± ½Ã±×³Î°ú ´Ù¸¥ °ÍÀÌ¸ç »ç¿ëµÇÁöµµ ¾Ê´Â´Ù´Â Á¡À» ±â¾ïÇϱ⠹ٶõ´Ù.