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

HomePage Backward Forward Post Reply List
Delete Modify
  Á¦¸ñ   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
***

HomePage Backward Forward Post Reply List
1998 by swindler