¸®´ª½º ±âŸ ÀÚ·á |
---|
Á¦¸ñ | gtk °Á #7 1998/07/10 (17:33) |
À̸§ | ±èÈ¿¿ø |
¹øÈ£ | 91 |
Á¶È¸ | 270 |
º»¹® |
¡º¸®´ª½º Çдç-¹ø¿ª¹° (go LINUX)¡» 203¹ø Á¦ ¸ñ:[¹ø¿ª] gtk Tutorial, Chap10~15ÀÔ´Ï´Ù. ¿Ã¸°ÀÌ:Áß¾ÓÀÚ´ë(ÀÌÈÆ ) 98/03/11 15:32 ÀÐÀ½:167 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- ***************** *** 10. ÆÄÀÏ ¼±Åà ***************** ÆÄÀϼ±Åà widgetÀº ÆÄÀÏ ´ëÈ»óÀÚ¸¦ º¸ÀÌ´Â ºü¸£°í °£ÆíÇÑ °ÍÀÌ´Ù. ÀÌ°ÍÀº Ok, Cancel, Help ¹öÆ°À» °¡Áö°í ÀÖÀ¸¸ç, ÇÁ·Î±×·¡¹Ö ½Ã°£À» »ó´çÈ÷ ÁÙ¿©ÁØ´Ù. »õ·Î¿î ÆÄÀϼ±Åà ¹Ú½º¸¦ ¸¸µé·Á¸é ÀÌ°ÍÀ» ÀÌ¿ëÇÑ´Ù. GtkWidget* gtk_file_selection_new (gchar *title); ÆÄÀÏÀ̸§À» ¼¼ÆÃÇϱâ À§Çؼ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. void gtk_file_selection_set_filename (GtkFileSelection *filesel, gchar *filename); »ç¿ëÀÚ°¡ Å°º¸µå ȤÀº ¸¶¿ì½º Ŭ¸¯À¸·Î ÀÔ·ÂÇÑ ÅؽºÆ®¸¦ Æ÷ÂøÇϱâ À§Çؼ´Â ÀÌ ÇÔ¼ö¸¦ ¾´´Ù. gchar* gtk_file_selection_get_filename (GtkFileSelection *filesel); ÆÄÀϼ±ÅÃwidget ³»ºÎ¿¡ Æ÷ÇÔµÈ widgetµé¿¡ ´ëÇÑ Æ÷ÀÎÅ͵鵵 ÀÖ´Ù. ±×µéÀº ´ÙÀ½°ú °°´Ù. o dir_list o file_list o selection_entry o selection_text o main_vbox o ok_button o cancel_button o help_button ¿ì¸®°¡ °¡Àå ¸¹ÀÌ ÀÌ¿ëÇÏ°Ô µÉ °ÍÀº ok_button, cancel_button, ±×¸®°í help_button Æ÷ÀÎÅÍ°¡ µÉ °ÍÀÌ´Ù. ÀÌ°ÍÀº testgtk.c ¿¡¼ ¹ßÃéÇÑ °ÍÀ» ¸ñÀû¿¡ ÀÇÇØ º¯ÇüÇÑ °ÍÀÌ´Ù. º¸¸é ¾Ë°ÚÁö¸¸, ¿©±â¼´Â ÆÄÀϼ±ÅÃwidgetÀ» Çϳª ¸¸µé »ÓÀÌ´Ù. Help ¹öÆ°ÀÌ ½ºÅ©¸°¿¡ º¸ÀÌ°ÚÁö¸¸, ¾Æ¹«·± ½Ã±×³ÎÀÌ ¿¬°áµÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î ¾Æ¹« ±â´ÉÀÌ ¾øÀ» °ÍÀÌ´Ù. #include <gtk/gtk.h> /* ¼±ÅÃµÈ ÆÄÀÏ À̸§À» ÃëÇؼ ±×°ÍÀ» ÄַܼΠÇÁ¸°Æ®ÇÑ´Ù. */ void file_ok_sel (GtkWidget *w, GtkFileSelection *fs) { g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs))); } void destroy (GtkWidget *widget, gpointer *data) { gtk_main_quit (); } int main (int argc, char *argv[]) { GtkWidget *filew; gtk_init (&argc, &argv); /* ÆÄÀϼ±Åà widgetÀ» Çϳª ¸¸µç´Ù. */ filew = gtk_file_selection_new ("File selection"); gtk_signal_connect (GTK_OBJECT (filew), "destroy", (GtkSignalFunc) destroy, &filew); /* file_ok_sel ÇÔ¼ö·Î ok_buttonÀ» ¿¬°á½ÃŲ´Ù. */ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked", (GtkSignalFunc) file_ok_sel, filew ); /* gtk_widget_destroy ÇÔ¼ö·Î cancel_buttonÀ» ¿¬°á½ÃŲ´Ù. */ gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT (filew)); /* ÆÄÀÏÀ̸§À» ¼¼ÆÃÇÑ´Ù. */ gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), "penguin.png"); gtk_widget_show(filew); gtk_main (); return 0; } ******************* *** 11. ¸Þ´º widget ******************* ¸Þ´º¸¦ ¸¸µé±â À§ÇØ ½¬¿î ¹æ¹ý°ú ¾î·Á¿î ¹æ¹ý µÎ°¡Áö°¡ ÀÖ´Ù. °¢°¢ ¾²ÀÏ µ¥°¡ ÀÖ´Â °ÍµéÀÌÁö¸¸, ¿ì¸®´Â º¸Åë ½¬¿î ¹æ¹ýÀ¸·Î menu_factory¸¦ ¾²´Â ÂÊÀ» ÅÃÇÒ °ÍÀÌ´Ù. "¾î·Á¿î" ¹æ¹ýÀ̶õ ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ Á÷Á¢ÀûÀ¸·Î ¸Þ´º¸¦ ¸¸µå´Â °ÍÀÌ´Ù. ±×¸®°í ½¬¿î ¹æ¹ýÀº gtk_menu_factory ÇÔ¼öµéÀ» ¾²´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº ÈξÀ °£´ÜÇÏÁö¸¸, ³ª¸§´ë·Î ÀåÁ¡°ú ´ÜÁ¡À» °¡Áö°í ÀÖ´Ù. ¼öµ¿ÀûÀÎ ¹æ¹ýÀ¸·Î ¸î °¡Áö wrapper ÇÔ¼öµéÀ» ½á °¡¸ç ¸Þ´º¸¦ ¸¸µå´Â °ÍÀÌ À¯¿ë¼º¿¡ ÀÖ¾î¼ ÈξÀ À¯¸®ÇÔ¿¡µµ ºÒ±¸ÇÏ°í, menufactory¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀº ÈξÀ »ç¿ëÇϱ⠽±°í ¶Ç »õ·Î¿î ¸Þ´º¸¦ Ãß°¡Çϱ⵵ ½±´Ù. Menufactory¸¦ ÀÌ¿ëÇÏ°Ô µÇ¸é, ¸Þ´º¿¡ À̹ÌÁö¶óµç°¡ '/'¸¦ ¾²´Â °ÍÀÌ ºÒ°¡´ÉÇØÁø´Ù. *** *** 11-1. ¼öµ¿ÀûÀ¸·Î ¸Þ´º ¸¸µé±â *** ±³À°ÀÇ ¹Ù¶÷Á÷ÇÑ ÀüÅë¿¡ µû¶ó, ¸ÕÀú ¾î·Á¿î ¹æ¹ýºÎÅÍ º¸ÀÌ°Ú´Ù. :) ¸Þ´º¸¦ ¸¸µé±â À§ÇØ ¾²ÀÌ´Â ÇÔ¼öµéÀ» »ìÆ캸ÀÚ. ÀÌ Ã¹¹ø° ÇÔ¼ö´Â »õ·Î¿î ¸Þ´º¸¦ ¸¸µé±â À§ÇØ ¾²ÀδÙ. GtkWidget *gtk_menu_bar_new() ÀÌ°ÍÀº À̸§ ±×´ë·Î »õ·Î¿î ¸Þ´º¹Ù¸¦ ¸¸µç´Ù. ¹öÆ°°ú ¸¶Âù°¡Áö·Î, ¿ì¸®´Â ÀÌ°ÍÀ» À©µµ¿¡ ÆÐÅ·Çϱâ À§ÇØ gtk_container_add¸¦ ÀÌ¿ëÇÒ¼öµµ ÀÖ°í, ¶Ç´Â ¹Ú½º¿¡ ÆÐÅ·Çϱâ À§ÇØ box_pack ÇÔ¼öµéÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. GtkWidget *gtk_menu_new(); ÀÌ ÇÔ¼ö´Â »õ·Î¿î ¸Þ´º¸¦ ÇâÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϴµ¥, ÀÌ°ÍÀº ½ÇÁ¦·Î º¸¿©ÁöÁö´Â ¾Ê°í(gtk_widget_show·Î½á) ´Ù¸¸ ¸Þ´º ¾ÆÀÌÅÛµéÀ» °¡Áö°í¸¸ ÀÖ´Ù. ÀÌ ¾Æ·¡¿¡ ³ª¿À´Â ¿¹Á¦¸¦ º¸¸ç ´õ ¸íÈ®È÷ ÀÌÇØÇϱ⸦ ¹Ù¶õ´Ù. À̹øÀÇ µÎ ÇÔ¼ö´Â ¸Þ´º ¾ÈÀ¸·Î ÆÐÅ·µÇ´Â ¸Þ´º ¾ÆÀÌÅÛÀ» ¸¸µé±â À§ÇØ ¾²ÀδÙ. GtkWidget *gtk_menu_item_new() GtkWidget *gtk_menu_item_new_with_label(const char *label) ÀÌ ÇÔ¼öµéÀº º¸¿©Áö±â À§ÇÑ ¸Þ´º¸¦ ¸¸µé ¶§ ¾²ÀδÙ. gtk_menu_new·Î½á ¸¸µé¾îÁö´Â "¸Þ´º"¿Í gtk_menu_item_new·Î½á ¸¸µé¾îÁö´Â "¸Þ´º ¾ÆÀÌÅÛ"À» ²À ±¸º°ÇØ¾ß ÇÑ´Ù. ¸Þ´º ¾ÆÀÌÅÛÀº ¿¬°áµÈ µ¿ÀÛÀÌ ÀÖ´Â ½ÇÁ¦ÀÇ ¹öÆ°ÀÌ µÉ °ÍÀÌÁö¸¸, ¹Ý¸é ¸Þ´º´Â À̰͵éÀ» °¡Áö°í ÀÖ´Â ÄÁÅ×À̳ʰ¡ µÉ °ÍÀÌ´Ù. gtk_menu_item_append() gtk_menu_item_set_submenu() gtk_menu_new_with_label°ú ´Ü¼øÇÑ gtk_menu_new ÇÔ¼ö´Â ¿©·¯ºÐÀÌ ¹öÆ°¿¡ ´ëÇØ °øºÎÇÑ ÈÄ¿¡ ÁüÀÛÇÏ´Â ±×´ë·Î´Ù. gtk_menu_new_with_labelÀº ¶óº§ÀÌ ÀÌ¹Ì ÆÐÅ·µÇ¾î ÀÖ´Â ¸Þ´º ¾ÆÀÌÅÛÀ» ¸¸µé°í, gtk_menu_new´Â ºñ¾îÀÖ´Â ¸Þ´º ¾ÆÀÌÅÛÀ» ¸¸µç´Ù. ÀÌ°ÍÀº ¸Þ´ºµéÀÌ ´Þ·ÁÀÖ´Â ¸Þ´º¹Ù¸¦ ¸¸µå´Â ´Ü°èµéÀÌ´Ù. o gtk_menu_new()¸¦ ÀÌ¿ëÇؼ »õ·Î¿î ¸Þ´º¸¦ ¸¸µç´Ù. o gtk_menu_item_new()¸¦ ÀÌ¿ëÇؼ ¸Þ´º ¾ÆÀÌÅÛÀ» ¸¸µç´Ù. ÀÌ°ÍÀº root ¸Þ´º°¡ µÇ°í, ¿©±âÀÇ ÅؽºÆ®´Â ¸Þ´º¹Ù ÀÚ½ÅÀÇ À̸§ÀÌ µÉ °ÍÀÌ´Ù. o °¢ ¾ÆÀÌÅÛ¸¶´Ù gtk_menu_item_new()¸¦ ÀÌ¿ëÇØ ¿øÇÏ´Â ¸Þ´º¸¦ ±¸¼ºÇÑ´Ù. ±×¸®°í ÀÌ°Íµé °¢°¢¿¡ »õ·Î¿î ¾ÆÀÌÅÛÀ» ºÙÀ̱â À§ÇØ gtk_menu_item_append() ¸¦ ¾´´Ù. ÀÌ·¸°Ô ¸Þ´º ¾ÆÀÌÅÛÀÇ ¸®½ºÆ®¸¦ ¸¸µç´Ù. o »õ·Ó°Ô ¸¸µé¾îÁö´Â ¸Þ´º ¾ÆÀÌÅÛÀ» root ¸Þ´º ¾ÆÀÌÅÛ(µÎ¹ø° ´Ü°è¿¡ ÀÖ´Â) ¿¡ ºÙ¿©ÁÖ±â À§ÇØ gtk_menu_item_set_submenu()¸¦ ÀÌ¿ëÇÑ´Ù. o gtk_menu_bar_new()¸¦ ÀÌ¿ëÇؼ »õ·Î¿î ¸Þ´º¹Ù¸¦ ¸¸µç´Ù. ÀÌ ´Ü°è´Â ÇÑ ¸Þ´º¹Ù À§·Î ÀÏ·ÃÀÇ ¸Þ´º¸¦ ¸¸µé ¶§¸¸ ÇÊ¿äÇÏ´Ù. o gtk_menu_bar_append()¸¦ ÀÌ¿ëÇؼ ¸Þ´º¹Ù À§¿¡ root ¸Þ´º¸¦ ³õ´Â´Ù. Æ˾÷¸Þ´º¸¦ ¸¸µå´Â °Íµµ °ÅÀÇ °°´Ù. ´Ù¸¥ Á¡ÀÌ ÀÖ´Ù¸é ¸Þ´º´Â ¸Þ´º¹Ù¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î ºÙ¿©Áö´Â °ÍÀÌ ¾Æ´Ï¶ó, button_press À̺¥Æ®·ÎºÎÅÍ gtk_menu_popup() ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á ºÙ¿©Áø´Ù´Â °ÍÀÌ´Ù. ÀÌ °úÁ¤À» µû¶óº¸ÀÚ. o À̺¥Æ® Çڵ鸵 ÇÔ¼ö¸¦ ¸¸µç´Ù. ÀÌ°ÍÀº ÀÌ·± ¿øÇüÀ» °¡Á®¾ß ÇÑ´Ù. static gint handler(GtkWidget *widget, GdkEvent *event); ±×¸®°í ÀÌ°ÍÀº ¸Þ´º¸¦ Æ˾÷½Ãų °÷À» ã±â À§ÇØ À̺¥Æ®¸¦ ÀÌ¿ëÇÒ °ÍÀÌ´Ù. o À̺¥Æ® Çڵ鷯¿¡¼´Â, ¸¸¾à À̺¥Æ®°¡ ¸¶¿ì½º ¹öÆ°À» ´©¸£´Â °ÍÀ̶ó¸é, À̺¥Æ®¸¦ ¹öÆ° À̺¥Æ®·Î ´Ù·ç°í, gtk_menu_popup()¿¡ Á¤º¸¸¦ ³Ñ°ÜÁÖ´Â ¿¹Á¦ Äڵ忡¼ º¸Àδë·Î ÀÌ¿ëÇ϶ó. o ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© À̺¥Æ® Çڵ鷯¸¦ widget¿¡ °áÇÕ½ÃŲ´Ù. gtk_signal_connect_object(GTK_OBJECT(widget), "event", GTK_SIGNAL_FUNC (handler), GTK_OBJECT(menu)); ¿©±â¼ widget ÀÎÀÚ´Â ¿ì¸®°¡ ¹ÙÀεùÇÒ widgetÀÌ°í, handler ÀÎÀÚ´Â Çڵ鸵 ÇÔ¼ö´Ù. ±×¸®°í menu ÀÎÀÚ´Â gtk_menu_new()·Î½á ¸¸µé¾îÁø ¸Þ´º´Ù. ¿¹Á¦ Äڵ忡¼ º¸Àδë·Î, ÀÌ°ÍÀº ¸Þ´º¹Ù¿¡ ºÙ¿©Á® ÀÖ´Â ¸Þ´º°¡ µÉ ¼öµµ ÀÖ´Ù. *** *** 11-2. ¼öµ¿À¸·Î ¸Þ´º¸¦ ¸¸µå´Â ¿¹Á¦ *** ÀÌÁ¦ ºÐ¸íÈ÷ Çصαâ À§ÇØ ¿¹Á¦¸¦ º¸µµ·Ï ÇÏÀÚ. #include <gtk/gtk.h> static gint button_press (GtkWidget *, GdkEvent *); static void menuitem_response (GtkWidget *, gchar *); int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *menu; GtkWidget *menu_bar; GtkWidget *root_menu; GtkWidget *menu_items; GtkWidget *vbox; GtkWidget *button; char buf[128]; int i; gtk_init (&argc, &argv); /* À©µµ¸¦ ¸¸µç´Ù. */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW (window), "GTK Menu Test"); gtk_signal_connect(GTK_OBJECT (window), "delete_event", (GtkSignalFunc) gtk_exit, NULL); /* menu-widgetÀ» ½ÃÀÛÇÑ´Ù. ¿©±â¼ ¸Þ´º widgetµé¿¡ ´ëÇØ * gtk_show_widget()À» ¾²¸é ¾ÈµÈ´Ù! * ÀÌ°ÍÀº ¸Þ´º ¾ÆÀÌÅÛÀ» °¡Áö°í ÀÖ´Â ¸Þ´º°í, ¿ì¸®°¡ ¾îÇÿ¡¼ * "Root Menu"¸¦ Ŭ¸¯ÇßÀ» ¶§ Æ˾÷µÉ °ÍÀÌ´Ù. */ menu = gtk_menu_new(); /* ÀÌ°ÍÀº root ¸Þ´º¸ç, ¸Þ´º¹Ù¿¡ ³ªÅ¸³¯ ¸Þ´ºÀÇ À̸§ Áï ¶óº§ÀÌ * µÉ °ÍÀÌ´Ù. ÀÌ°ÍÀº ´ÜÁö ´·¯Á³À» ¶§ ¸Þ´ºÀÇ ³ª¸ÓÁö ºÎºÐÀÌ * Æ˾÷µÇ±â¸¸ ÇÒ °ÍÀ̹ǷΠƯº°È÷ ½Ã±×³Î Çڵ鷯°¡ °áÇյǾî * ÀÖÀ» ÇÊ¿ä´Â ¾ø´Ù. */ root_menu = gtk_menu_item_new_with_label("Root Menu"); gtk_widget_show(root_menu); /* ´ÙÀ½À¸·Î ¿ì¸®´Â ¼¼ ¸Þ´º¿£Æ®¸®¸¦ ¸¸µé±â À§ÇØ ÀÛÀº ·çÇÁ¸¦ * ±¸ÇöÇÑ´Ù. º¸ÅëÀ̶ó¸é, ¿ì¸®´Â °¢ ¸Þ´º ¾ÆÀÌÅ۵鿡 ´ëÇØ * "clicked" ½Ã±×³ÎÀ» Àâ¾Æ³¾ °ÍÀÌ°í, ±×°ÍÀ» À§ÇØ callbackÀ» * ¼¼ÆÃÇÒ °ÍÀÌ´Ù. ±×·¯³ª °ø°£À» Àý¾àÇϱâ À§ÇØ ±× °úÁ¤Àº * »ý·«ÇÑ´Ù. */ for(i = 0; i < 3; i++) { /* buf·Î ¸Þ´º À̸§À» º¹»çÇÑ´Ù. */ sprintf(buf, "Test-undermenu - %d", i); /* À̸§À» °¡Áø »õ ¸Þ´º ¾ÆÀÌÅÛÀ» ¸¸µç´Ù. */ menu_items = gtk_menu_item_new_with_label(buf); /* ÀÌ°ÍÀ» ¸Þ´º¿¡ ÷°¡ÇÑ´Ù. */ gtk_menu_append(GTK_MENU (menu), menu_items); /* ¸Þ´º ¾ÆÀÌÅÛÀÌ ¼±ÅÃµÇ¸é ¹º°¡ ¾µ¸¸ÇÑ µ¿ÀÛÀ» ½ÃŲ´Ù. */ gtk_signal_connect (GTK_OBJECT(menu_items), "activate", GTK_SIGNAL_FUNC(menuitem_response), (gpointer) g_strdup(buf)); /* widgetÀ» º¸ÀδÙ. */ gtk_widget_show(menu_items); } /* ÀÌÁ¦ ¿ì¸®ÀÇ »õ·Ó°Ô ¸¸µé¾îÁø "menu"¸¦, "root menu"°¡ µÇµµ·Ï * ¼³Á¤ÇØ º¸ÀÚ. */ gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu); /* ¸Þ´º¿Í ¹öÆ°À» µé¿©³õÀ» vbox */ vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show(vbox); /* ¸Þ´º¸¦ ´ã°í ÀÖÀ» menu-bar¸¦ ¸¸µé°í ±×°ÍÀ» ¿ì¸®ÀÇ main À©µµ¿¡ * Ãß°¡ÇÑ´Ù. */ menu_bar = gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2); gtk_widget_show(menu_bar); /* ¸Þ´º¸¦ Æ˾÷½ÃÅ°µµ·Ï ¿¬°áµÉ ÇÑ ¹öÆ°À» ¸¸µç´Ù. */ button = gtk_button_new_with_label("press me"); gtk_signal_connect_object(GTK_OBJECT(button), "event", GTK_SIGNAL_FUNC (button_press), GTK_OBJECT(menu)); gtk_box_pack_end(GTK_BOX(vbox), button, TRUE, TRUE, 2); gtk_widget_show(button); /* ³¡À¸·Î menu-itemÀ» menu-bar¿¡ À̾îÁØ´Ù. ÀÌ°ÍÀÌ ¹Ù·Î * ³»°¡ Áö±Ý²¯ Áö²¬¿© ¿Â "root" ¸Þ´º ¾ÆÀÌÅÛÀÌ´Ù. =) */ gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), root_menu); /* ¾ðÁ¦³ª Àüü À©µµ¸¦ ¸¶Áö¸·¿¡ º¸¿©ÁØ´Ù. */ gtk_widget_show(window); gtk_main (); return 0; } /* "widget"À¸·Î ³Ñ°Ü¹ÞÀº ¸Þ´º¸¦ º¸ÀÓÀ¸·Î½á button-press¿¡ ÀÀ´äÇÑ´Ù. * * ÀÎÀÚ "widget"Àº ´·ÁÁø ¹öÆ°ÀÌ ¾Æ´Ï¶ó º¸¿©Áú ¸Þ´º¶ó´Â °É ±â¾ïÇÏÀÚ. */ static gint button_press (GtkWidget *widget, GdkEvent *event) { if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *bevent = (GdkEventButton *) event; gtk_menu_popup (GTK_MENU(widget), NULL, NULL, NULL, NULL, bevent->button, bevent->time); /* ¿ì¸®°¡ ÀÌ À̺¥Æ®¸¦ ´Ù·ç¾úÀ½À» ¸»ÇÑ´Ù. ¿©±â¼ ¸ØÃá´Ù. */ return TRUE; } /* ¿ì¸®°¡ ÀÌ À̺¥Æ®¸¦ ´Ù·çÁö ¾Ê¾ÒÀ½À» ¸»ÇÑ´Ù. °è¼Ó Áö³ªÄ£´Ù. */ return FALSE; } /* ¸Þ´º ¾ÆÀÌÅÛÀÌ ¼±ÅõǾúÀ» ¶§ ¹®ÀÚ¿À» ÇÁ¸°Æ®ÇÑ´Ù. */ static void menuitem_response (GtkWidget *widget, gchar *string) { printf("%s\n", string); } ¿ì¸®´Â ¶ÇÇÑ ¸Þ´º ¾ÆÀÌÅÛÀ» ¹ÝÀÀÀ» º¸ÀÌÁö ¾Ê°Ôµµ ¸¸µé ¼ö ÀÖ°í, Ç¥¸¦ ÂüÁ¶ Çؼ ¸Þ´º ÇÔ¼öµé¿¡ Å°º¸µå ¹ÙÀεùÀ» ÇØÁÙ ¼öµµ ÀÖ´Ù. *** *** 11-3. GtkMenuFactory¸¦ ÀÌ¿ëÇϱâ *** ÀÌÁ¦ ¾î·Á¿î ¹æ¹ýÀ» º¸¿´°í, gtk_menu_factory ÇÔ¼öµéÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ ¿©±â ÀÖ´Ù. *** *** 11-4. Menu factoryÀÇ ¿¹Á¦ *** ÀÌ°ÍÀº GTK menu factory¸¦ ÀÌ¿ëÇÏ´Â ¿¹Á¦ÀÌ´Ù. ÀÌ°ÍÀº ù¹ø° ÆÄÀÏ menus.h ´Ù. ¿ì¸®´Â menus.c¿¡¼ ¾²ÀÎ globalº¯¼öµéÀ» °í·ÁÇؼ menus.c ¿Í main.c¸¦ ºÐ¸®ÇÒ °ÍÀÌ´Ù. #ifndef __MENUS_H__ #define __MENUS_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void get_main_menu (GtkWidget **menubar, GtkAcceleratorTable **table); void menus_create(GtkMenuEntry *entries, int nmenu_entries); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __MENUS_H__ */ ±×¸®°í ÀÌ°ÍÀº menus.c ÆÄÀÏÀÌ´Ù. #include <gtk/gtk.h> #include <strings.h> #include "main.h" static void menus_remove_accel(GtkWidget * widget, gchar * signal_name, gchar * path); static gint menus_install_accel(GtkWidget * widget, gchar * signal_name, gchar key, gchar modifiers, gchar * path); void menus_init(void); void menus_create(GtkMenuEntry * entries, int nmenu_entries); /* ÀÌ°ÍÀº »õ·Î¿î ¸Þ´º¸¦ ¸¸µé±â À§ÇØ ¾´ GtkMenuEntry ±¸Á¶Ã¼´Ù. * ù¹ø° ¸â¹ö´Â ¸Þ´º¸¦ Á¤ÀÇÇÏ´Â ¹®ÀÚ¿ÀÌ´Ù. µÎ¹ø°´Â ÀÌ ¸Þ´ºÇÔ¼ö¸¦ * Å°º¸µå·Î ºÒ·¯³¾ ¶§ ¾²ÀÌ´Â µðÆúÆ® ´ÜÃàÅ°´Ù. ¼¼¹ø° ¸â¹ö´Â ÀÌ ¸Þ´º * ¾ÆÀÌÅÛÀÌ ¼±ÅõǾúÀ»(¸¶¿ì½º ȤÀº ´ÜÃàÅ°·Î½á) ¶§ È£ÃâµÉ callback ÇÔ¼ö´Ù. * ±×¸®°í ¸¶Áö¸· ¸â¹ö´Â ÀÌ callbackÇÔ¼ö¿¡ ³Ñ°ÜÁú µ¥ÀÌÅÍ´Ù. */ static GtkMenuEntry menu_items[] = { {"<Main>/File/New", "<control>N", NULL, NULL}, {"<Main>/File/Open", "<control>O", NULL, NULL}, {"<Main>/File/Save", "<control>S", NULL, NULL}, {"<Main>/File/Save as", NULL, NULL, NULL}, {"<Main>/File/<separator>", NULL, NULL, NULL}, {"<Main>/File/Quit", "<control>Q", file_quit_cmd_callback, "OK, I'll quit"}, {"<Main>/Options/Test", NULL, NULL, NULL} }; /* ¸Þ´º ¾ÆÀÌÅÛÀÇ °¹¼ö¸¦ °è»êÇÑ´Ù. */ static int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); static int initialize = TRUE; static GtkMenuFactory *factory = NULL; static GtkMenuFactory *subfactory[1]; static GHashTable *entry_ht = NULL; void get_main_menu(GtkWidget ** menubar, GtkAcceleratorTable ** table) { if (initialize) menus_init(); if (menubar) *menubar = subfactory[0]->widget; if (table) *table = subfactory[0]->table; } void menus_init(void) { if (initialize) { initialize = FALSE; factory = gtk_menu_factory_new(GTK_MENU_FACTORY_MENU_BAR); subfactory[0] = gtk_menu_factory_new(GTK_MENU_FACTORY_MENU_BAR); gtk_menu_factory_add_subfactory(factory, subfactory[0], "<Main>"); menus_create(menu_items, nmenu_items); } } void menus_create(GtkMenuEntry * entries, int nmenu_entries) { char *accelerator; int i; if (initialize) menus_init(); if (entry_ht) for (i = 0; i < nmenu_entries; i++) { accelerator = g_hash_table_lookup(entry_ht, entries[i].path); if (accelerator) { if (accelerator[0] == '\0') entries[i].accelerator = NULL; else entries[i].accelerator = accelerator; } } gtk_menu_factory_add_entries(factory, entries, nmenu_entries); for (i = 0; i < nmenu_entries; i++) if (entries[i].widget) { gtk_signal_connect(GTK_OBJECT(entries[i].widget), "install_accelerator", (GtkSignalFunc) menus_install_accel, entries[i].path); gtk_signal_connect(GTK_OBJECT(entries[i].widget), "remove_accelerator", (GtkSignalFunc) menus_remove_accel, entries[i].path); } } static gint menus_install_accel(GtkWidget * widget, gchar * signal_name, gchar key, gchar modifiers, gchar * path) { char accel[64]; char *t1, t2[2]; accel[0] = '\0'; if (modifiers & GDK_CONTROL_MASK) strcat(accel, "<control>"); if (modifiers & GDK_SHIFT_MASK) strcat(accel, "<shift>"); if (modifiers & GDK_MOD1_MASK) strcat(accel, "<alt>"); t2[0] = key; t2[1] = '\0'; strcat(accel, t2); if (entry_ht) { t1 = g_hash_table_lookup(entry_ht, path); g_free(t1); } else entry_ht = g_hash_table_new(g_string_hash, g_string_equal); g_hash_table_insert(entry_ht, path, g_strdup(accel)); return TRUE; } static void menus_remove_accel(GtkWidget * widget, gchar * signal_name, gchar * path) { char *t; if (entry_ht) { t = g_hash_table_lookup(entry_ht, path); g_free(t); g_hash_table_insert(entry_ht, path, g_strdup("")); } } void menus_set_sensitive(char *path, int sensitive) { GtkMenuPath *menu_path; if (initialize) menus_init(); menu_path = gtk_menu_factory_find(factory, path); if (menu_path) gtk_widget_set_sensitive(menu_path->widget, sensitive); else g_warning("Unable to set sensitivity for menu which doesn't exist: %s", path); } ÀÌ°ÍÀº main.h´Ù. #ifndef __MAIN_H__ #define __MAIN_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void file_quit_cmd_callback(GtkWidget *widget, gpointer data); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __MAIN_H__ */ ±×¸®°í ÀÌ°ÍÀÌ main.c´Ù. #include <gtk/gtk.h> #include "main.h" #include "menus.h" int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *main_vbox; GtkWidget *menubar; GtkAcceleratorTable *accel; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(file_quit_cmd_callback), "WM destroy"); gtk_window_set_title(GTK_WINDOW(window), "Menu Factory"); gtk_widget_set_usize(GTK_WIDGET(window), 300, 200); main_vbox = gtk_vbox_new(FALSE, 1); gtk_container_border_width(GTK_CONTAINER(main_vbox), 1); gtk_container_add(GTK_CONTAINER(window), main_vbox); gtk_widget_show(main_vbox); get_main_menu(&menubar, &accel); gtk_window_add_accelerator_table(GTK_WINDOW(window), accel); gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0); gtk_widget_show(menubar); gtk_widget_show(window); gtk_main(); return(0); } /* ¿©±â¼´Â menufactory¸¦ ÀÌ¿ëÇÒ ¶§ callbackµéÀÌ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö¸¦ * º¸¿©ÁØ´Ù. Á¾Á¾, »ç¶÷µéÀº ¸Þ´ºµé·ÎºÎÅÍÀÇ ¸ðµç callbackÀ» º°µµÀÇ ÆÄÀÏ¿¡ * ¸ð¾ÆµÎ°í, °Å±â¼ ÀûÀýÇÑ ÇÔ¼ö¸¦ È£ÃâÇØ ¾²´Â ¹æ¹ýÀ» ÅÃÇϱ⵵ ÇÑ´Ù. */ void file_quit_cmd_callback (GtkWidget *widget, gpointer data) { g_print ("%s\n", (char *) data); gtk_exit(0); } ±×¸®°í ÄÄÆÄÀÏÀ» ½±°Ô ÇØÁÖ´Â makefileÀÌ´Ù. CC = gcc PROF = -g C_FLAGS = -Wall $(PROF) -L/usr/local/include -DDEBUG L_FLAGS = $(PROF) -L/usr/X11R6/lib -L/usr/local/lib L_POSTFLAGS = -lgtk -lgdk -lglib -lXext -lX11 -lm PROGNAME = at O_FILES = menus.o main.o $(PROGNAME): $(O_FILES) rm -f $(PROGNAME) $(CC) $(L_FLAGS) -o $(PROGNAME) $(O_FILES) $(L_POSTFLAGS) $(CC) -c $(C_FLAGS) $< clean: rm -f core *.o $(PROGNAME) nohup.out distclean: clean rm -f *~ ******************************** *** 12. ¹®¼ÈµÇÁö ¾ÊÀº widgetµé ******************************** À̵éÀº ¸ðµÎ ÀúÀÚ¸¦ ±â´Ù¸®°í ÀÖ´Ù! :) ¿ì¸®ÀÇ ÀÌ ¹®¼¿¡ ´ç½ÅÀÌ °øÇåÇØ º¸´Â °Íµµ °í·ÁÇØ º¸±â¸¦. ¸¸¾à ´ç½ÅÀÌ ¹®¼ÈµÇÁö ¾ÊÀº ÀÌ widgetÀ» ¾²°Ô µÈ´Ù¸é, GTK ¹èÆ÷ÆÇ¿¡ ÀÖ´Â ±×µé °¢°¢ÀÇ Çì´õÆÄÀÏÀ» »ìÆ캸±â¸¦ Àû±Ø ±ÇÀåÇÑ´Ù. GTKÀÇ ÇÔ¼öÀ̸§µéÀº ¸Å¿ì ¼¼úÀûÀÌ´Ù. ÀÏ´Ü ¹«¾ùÀÌ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö ÀÌÇØÇÑ´Ù¸é, ¾î¶² widget°ú °ü·ÃµÈ ÇÔ¼öÀÇ ¼±¾ð¸¸ º¸´õ¶óµµ ±× widgetÀ» ¾î¶»°Ô ÀÌ¿ëÇÏ´ÂÁö ½±°Ô ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ¹®¼ÈµÇÁö ¾ÊÀº widgetÀÇ ¸ðµç ÇÔ¼öµéÀ» ÀÌÇØÇÏ°Ô µÇ¸é, ´ç½ÅÀÌ tutorialÀ» ½á¼ ´Ù¸¥ »ç¶÷µé¿¡°Ô µµ¿òÀ» ÁÖ´Â °ÍÀ» °í·ÁÇØ ÁáÀ¸¸é ÇÑ´Ù. *** *** 12-1. Text Entries *** 12-2. Color Selections *** 12-3. Range Controls *** 12-4. Rulers *** 12-5. Text Boxes *** 12-6. Previews *** |