gui_utils.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:18k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * gui_utils.c - various gui utilities taken from Developing Linux
  23.  * Applications and from xmps
  24.  */
  25. /*
  26.  * Sample GUI application front end.
  27.  *
  28.  * Auth: Eric Harlow
  29.  *
  30.  */
  31. #include <gtk/gtk.h>
  32. #include <gdk/gdkkeysyms.h>
  33. #include <string.h>
  34. #include "gui_utils.h"
  35. #include <stdio.h>
  36. #include <stdint.h>
  37. #include <errno.h>
  38. /*
  39.  * CreateWidgetFromXpm
  40.  *
  41.  * Using the window information and the string with the icon color/data, 
  42.  * create a widget that represents the data.  Once done, this widget can
  43.  * be added to buttons or other container widgets.
  44.  */
  45. GtkWidget *CreateWidgetFromXpm (GtkWidget *window, gchar **xpm_data)
  46. {
  47.   // got this code from Xmps
  48.     GdkColormap *colormap;
  49.     GdkPixmap *gdkpixmap;
  50.     GdkBitmap *mask;
  51.     GtkWidget *pixmap;
  52.     colormap = gtk_widget_get_colormap(window);
  53.     gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
  54.        NULL, xpm_data);
  55.     if (gdkpixmap == NULL) {
  56.       printf("Errorn");
  57.       return (NULL);
  58.     }
  59.     pixmap = gtk_pixmap_new (gdkpixmap, mask);
  60.     gdk_pixmap_unref (gdkpixmap);
  61.     gdk_bitmap_unref (mask);
  62.     gtk_widget_show(pixmap);
  63.     return pixmap;
  64. }
  65. /*
  66.  * CreateMenuItem
  67.  *
  68.  * Creates an item and puts it in the menu and returns the item.
  69.  *
  70.  * menu - container menu
  71.  * szName - Name of the menu - NULL for a separator
  72.  * szAccel - Acceleration string - "^C" for Control-C
  73.  * szTip - Tool tips
  74.  * func - Call back function
  75.  * data - call back function data
  76.  *
  77.  * returns new menuitem
  78.  */
  79. GtkWidget *CreateMenuItem (GtkWidget *menu, 
  80.    GtkAccelGroup *accel_group,
  81.    GtkTooltips   *tooltips,
  82.                            char *szName, 
  83.                            char *szAccel,
  84.                            char *szTip, 
  85.                            GtkSignalFunc func,
  86.                            gpointer data)
  87. {
  88.     GtkWidget *menuitem;
  89.     /* --- If there's a name, create the item and put a
  90.      *     Signal handler on it.
  91.      */
  92.     if (szName && strlen (szName)) {
  93.         menuitem = gtk_menu_item_new_with_label (szName);
  94.         gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
  95.                     GTK_SIGNAL_FUNC(func), data);
  96.     } else {
  97.         /* --- Create a separator --- */
  98.         menuitem = gtk_menu_item_new ();
  99.     }
  100.     /* --- Add menu item to the menu and show it. --- */
  101.     gtk_menu_append (GTK_MENU (menu), menuitem);
  102.     gtk_widget_show (menuitem);
  103.     /* --- If there was an accelerator --- */
  104.     if (szAccel && accel_group != NULL) {
  105.       guint modifier = 0;
  106.       guint key;
  107.       if (szAccel[0] == '^') {
  108. szAccel++;
  109. modifier |= GDK_CONTROL_MASK;
  110.       }
  111.       if (strncmp(szAccel, "M-", 2) == 0) {
  112. szAccel += 2;
  113. modifier |= GDK_MOD1_MASK;
  114.       }
  115.       key = szAccel[0];
  116.       if (strncmp(szAccel,"<enter>", sizeof("<enter>")) == 0) {
  117. key = GDK_Return;
  118.       }
  119.       gtk_widget_add_accelerator (menuitem, 
  120.   "activate", 
  121.   accel_group,
  122.   key, 
  123.   modifier,
  124.   GTK_ACCEL_VISIBLE);
  125.     }
  126.     /* --- If there was a tool tip --- */
  127.     if (szTip && strlen (szTip) && tooltips != NULL) {
  128.         /* --- If tooltips not created yet --- */
  129.         gtk_tooltips_set_tip (tooltips, menuitem, szTip, NULL);
  130.     }
  131.     return (menuitem);
  132. }
  133. /*
  134.  * CreateMenuCheck
  135.  *
  136.  * Create a menu checkbox
  137.  *
  138.  * menu - container menu
  139.  * szName - name of the menu
  140.  * func - Call back function.
  141.  * data - call back function data
  142.  *
  143.  * returns new menuitem
  144.  */ 
  145. GtkWidget *CreateMenuCheck (GtkWidget *menu, 
  146.                             char *szName, 
  147.                             GtkSignalFunc func, 
  148.                             gpointer data)
  149. {
  150.     GtkWidget *menuitem;
  151.     /* --- Create menu item --- */
  152.     menuitem = gtk_check_menu_item_new_with_label (szName);
  153.     /* --- Add it to the menu --- */
  154.     gtk_menu_append (GTK_MENU (menu), menuitem);
  155.     gtk_widget_show (menuitem);
  156.     /* --- Listen for "toggled" messages --- */
  157.     gtk_signal_connect (GTK_OBJECT (menuitem), "toggled",
  158.                         GTK_SIGNAL_FUNC(func), data);
  159.     return (menuitem);
  160. }
  161. /*
  162.  * CreateMenuRadio
  163.  *
  164.  * Create a menu radio
  165.  *
  166.  * menu - container menu
  167.  * szName - name of the menu
  168.  * func - Call back function.
  169.  * data - call back function data
  170.  *
  171.  * returns new menuitem
  172.  */ 
  173. GtkWidget *CreateMenuRadio (GtkWidget *menu, 
  174.                             char *szName, 
  175.                             GSList **group,
  176.                             GtkSignalFunc func, 
  177.                             gpointer data)
  178. {
  179.     GtkWidget *menuitem;
  180.     /* --- Create menu item --- */
  181.     menuitem = gtk_radio_menu_item_new_with_label (*group, szName);
  182.     *group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menuitem));
  183.     /* --- Add it to the menu --- */
  184.     gtk_menu_append (GTK_MENU (menu), menuitem);
  185.     gtk_widget_show (menuitem);
  186.     /* --- Listen for "toggled" messages --- */
  187.     gtk_signal_connect (GTK_OBJECT (menuitem), "toggled",
  188.                         GTK_SIGNAL_FUNC(func), data);
  189.     return (menuitem);
  190. }
  191. /*
  192.  * CreateSubMenu
  193.  *
  194.  * Create a submenu off the menubar.
  195.  *
  196.  * menubar - obviously, the menu bar.
  197.  * szName - Label given to the new submenu
  198.  *
  199.  * returns new menu widget
  200.  */
  201. GtkWidget *CreateSubMenu (GtkWidget *menubar, char *szName)
  202. {
  203.     GtkWidget *menuitem;
  204.     GtkWidget *menu;
  205.  
  206.     /* --- Create menu --- */
  207.     menuitem = gtk_menu_item_new_with_label (szName);
  208.     /* --- Add it to the menubar --- */
  209.     gtk_widget_show (menuitem);
  210.     gtk_menu_append (GTK_MENU (menubar), menuitem);
  211.     /* --- Get a menu and attach to the menuitem --- */
  212.     menu = gtk_menu_new ();
  213.     gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
  214.     /* --- Voila! --- */
  215.     return (menu);
  216. }
  217. /*
  218.  * CreateBarSubMenu
  219.  *
  220.  * Create a submenu within an existing submenu.  (In other words, it's not
  221.  * the menubar.)
  222.  *
  223.  * menu - existing submenu
  224.  * szName - label to be given to the new submenu off of this submenu
  225.  *
  226.  * returns new menu widget 
  227.  */ 
  228. GtkWidget *CreateBarSubMenu (GtkWidget *menu, char *szName)
  229. {
  230.     GtkWidget *menuitem;
  231.     GtkWidget *submenu;
  232.  
  233.     /* --- Create menu --- */
  234.     menuitem = gtk_menu_item_new_with_label (szName);
  235.     /* --- Add it to the menubar --- */
  236.     gtk_menu_bar_append (GTK_MENU_BAR (menu), menuitem);
  237.     gtk_widget_show (menuitem);
  238.     /* --- Get a menu and attach to the menuitem --- */
  239.     submenu = gtk_menu_new ();
  240.     gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
  241.     /* --- Voila! --- */
  242.     return (submenu);
  243. }
  244. GtkWidget *CreateOptionMenu(GtkWidget *omenu,
  245.  char* (*gather_func)(size_t index, void* pUserData),
  246.      void* pUserData,
  247.      size_t max,
  248.      size_t current_index,
  249.      GtkSignalFunc on_activate,
  250.  GSList** menuItems)
  251. {
  252.   GtkWidget *menu;
  253.   GtkWidget *menuitem;
  254.   GSList *group;
  255.   size_t ix;
  256.   if (omenu != NULL) {
  257.     if (gtk_option_menu_get_menu(GTK_OPTION_MENU(omenu)) != NULL) {
  258.       gtk_option_menu_remove_menu(GTK_OPTION_MENU(omenu));
  259.     }
  260.   } else {
  261.     omenu = gtk_option_menu_new();
  262.   }
  263.   menu = gtk_menu_new();
  264.   group = NULL;
  265.   
  266.   for (ix = 0; ix < max; ix++) {
  267. char* name = (gather_func)(ix, pUserData);
  268. if (name == NULL) {
  269. break;
  270. }
  271.     menuitem = gtk_radio_menu_item_new_with_label(group, name);
  272.     group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(menuitem));
  273.     gtk_menu_append(GTK_MENU(menu), menuitem);
  274.     gtk_widget_show(menuitem);
  275.     gtk_signal_connect(GTK_OBJECT(menuitem),
  276.        "activate",
  277.        GTK_SIGNAL_FUNC(on_activate),
  278.        (gpointer)ix);
  279.   }
  280.   gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu);
  281.   gtk_option_menu_set_history(GTK_OPTION_MENU(omenu), current_index);
  282.   gtk_widget_show(omenu);
  283.   if (menuItems) {
  284.    *menuItems = group;
  285.   }
  286.   return (omenu);
  287. }
  288. static char* GetArrayItem(size_t index, void* pUserData)
  289. {
  290. return ((char**)pUserData)[index];
  291. }
  292. GtkWidget *CreateOptionMenu(GtkWidget *omenu,
  293.      char **names,
  294.      size_t max,
  295.      size_t current_index,
  296.      GtkSignalFunc on_activate,
  297.  GSList** menuItems)
  298. {
  299. return CreateOptionMenu(
  300. omenu, 
  301. GetArrayItem, 
  302. (void*)names, 
  303. max, 
  304. current_index, 
  305. on_activate, 
  306. menuItems);
  307. }
  308. void SetNumberEntryValue (GtkWidget *entry,
  309.      size_t value)
  310. {
  311.   char buffer[80];
  312.   
  313.   sprintf(buffer, "%u", value);
  314.   gtk_entry_set_text(GTK_ENTRY(entry), buffer);
  315. }
  316. GtkWidget *AddNumberEntryBoxWithLabel (GtkWidget *vbox,
  317.        const char *label_name,
  318.        size_t value,
  319.        size_t value_len)
  320. {
  321.   GtkWidget *hbox, *label, *ret;
  322.   hbox = gtk_hbox_new(FALSE, 1);
  323.   gtk_widget_show(hbox);
  324.   label = gtk_label_new(label_name);
  325.   gtk_widget_ref(label);
  326.   gtk_widget_show(label);
  327.   gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
  328.   ret = gtk_entry_new_with_max_length(value_len);
  329.   SetNumberEntryValue(ret, value);
  330.   gtk_widget_show(ret);
  331.   gtk_box_pack_start(GTK_BOX(hbox), ret, TRUE, TRUE, 5);
  332.   gtk_box_pack_start(GTK_BOX(vbox),
  333.      hbox,
  334.      TRUE,
  335.      TRUE, 
  336.      3);
  337.   return (ret);
  338. }
  339. int GetNumberEntryValue (GtkWidget *entry, size_t *result)
  340. {
  341.   const char *text;
  342.   char *endptr;
  343.   text = gtk_entry_get_text(GTK_ENTRY(entry));
  344.   *result = strtoul(text, &endptr, 10);
  345.   if (*text != '' && endptr != NULL && *endptr == '') {
  346.     if (*result == ULONG_MAX && errno == ERANGE)
  347.       return (0);
  348.     return (1);
  349.   }
  350.   return (0);
  351. }
  352. GtkWidget *AddButtonToDialog (GtkWidget *dialog,
  353.       const char *name,
  354.       GtkSignalFunc on_click)
  355. {
  356.   GtkWidget *button;
  357.   button = gtk_button_new_with_label(name);
  358.   gtk_signal_connect(GTK_OBJECT(button), 
  359.      "clicked",
  360.      GTK_SIGNAL_FUNC(on_click),
  361.      NULL);
  362.   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  363.     /* --- Add the button to the dialog --- */
  364.   gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->action_area),
  365.       button, TRUE, TRUE, 5);
  366.   /* --- Make the button visible --- */
  367.   gtk_widget_show (button);
  368.   return (button);
  369. }
  370. GtkWidget *AddEntryBoxWithLabel (GtkWidget *vbox,
  371.  const char *label_name,
  372.  const char *initial_value,
  373.  size_t value_len)
  374. {
  375.   GtkWidget *hbox, *label, *ret;
  376.   hbox = gtk_hbox_new(FALSE, 1);
  377.   gtk_widget_show(hbox);
  378.   label = gtk_label_new(label_name);
  379.   gtk_widget_ref(label);
  380.   gtk_widget_show(label);
  381.   gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
  382.   ret = gtk_entry_new_with_max_length(value_len);
  383.   gtk_entry_set_text(GTK_ENTRY(ret),
  384.      initial_value == NULL ? "" : initial_value);
  385.   gtk_widget_show(ret);
  386.   gtk_box_pack_start(GTK_BOX(hbox), ret, TRUE, TRUE, 5);
  387.   gtk_box_pack_start(GTK_BOX(vbox),
  388.      hbox,
  389.      TRUE,
  390.      TRUE, 
  391.      3);
  392.   return (ret);
  393. }
  394. /*
  395.  * FreeChild
  396.  *
  397.  * Free all the children of the widget
  398.  * This is called when the button has to display a new image.
  399.  * The old image is destroyed here.
  400.  */
  401. void FreeChild (GtkWidget *widget)
  402. {
  403.     /* --- Free button children --- */
  404.     gtk_container_foreach (
  405.                GTK_CONTAINER (widget),
  406.                (GtkCallback) gtk_widget_destroy,
  407.                NULL);
  408. }
  409. void SetEntryValidator(GtkObject* object, 
  410. GtkSignalFunc changed_func, GtkSignalFunc leave_func)
  411. {
  412. gtk_signal_connect(object,
  413.      "changed",
  414.      GTK_SIGNAL_FUNC(changed_func),
  415.      object);
  416. gtk_signal_connect(object,
  417.      "focus_out_event",
  418.      GTK_SIGNAL_FUNC(leave_func),
  419.      object);
  420. }
  421. static GtkWidget* filesel;
  422. static GtkWidget* fileentry;
  423. static void on_filename_selected (GtkFileSelection *widget, 
  424.   gpointer data)
  425. {
  426.   const gchar *name;
  427.   name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel));
  428.   gtk_entry_set_text(GTK_ENTRY(fileentry), name);
  429.   gtk_widget_show(fileentry);
  430.   gtk_grab_remove(filesel);
  431.   gtk_widget_destroy(filesel);
  432. }
  433. void FileBrowser (GtkWidget* entry)
  434. {
  435.   fileentry = entry;
  436.   filesel = gtk_file_selection_new("Select File");
  437.   gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(filesel));
  438.   gtk_signal_connect(
  439. GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button),
  440.      "clicked",
  441.      GTK_SIGNAL_FUNC(on_filename_selected),
  442.      filesel);
  443.   gtk_signal_connect_object(
  444. GTK_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button),
  445.      "clicked",
  446.      GTK_SIGNAL_FUNC(gtk_widget_destroy),
  447.      GTK_OBJECT(filesel));
  448.   gtk_widget_show(filesel);
  449.   gtk_grab_add(filesel);
  450. }
  451. /*
  452.  * Showmessage.c  from Developing Linux Applications
  453.  */
  454. /*
  455.  * CloseShowMessage
  456.  *
  457.  * Routine to close the about dialog window.
  458.  */
  459. void CloseShowMessage (GtkWidget *widget, gpointer data)
  460. {
  461.     GtkWidget *dialog_widget = (GtkWidget *) data;
  462.     gtk_grab_remove (dialog_widget);
  463.     /* --- Close the widget --- */
  464.     gtk_widget_destroy (dialog_widget);
  465. }
  466. /*
  467.  * ClearShowMessage
  468.  *
  469.  * Release the window "grab" 
  470.  * Clear out the global dialog_window since that
  471.  * is checked when the dialog is brought up.
  472.  */
  473. static void ClearShowMessage (GtkWidget *widget, gpointer data)
  474. {
  475.     gtk_grab_remove (widget);
  476. }
  477. /*
  478.  * ShowMessage
  479.  *
  480.  * Show a popup message to the user.
  481.  */
  482. GtkWidget* ShowMessage (
  483. const char *szTitle, const char *szMessage, bool userDismiss)
  484. {
  485.     GtkWidget *label;
  486.     GtkWidget *button;
  487.     GtkWidget *dialog_window;
  488.     /* --- Create a dialog window --- */
  489.     dialog_window = gtk_dialog_new ();
  490.     gtk_signal_connect (GTK_OBJECT (dialog_window), "destroy",
  491.               GTK_SIGNAL_FUNC (ClearShowMessage),
  492.               NULL);
  493.     /* --- Set the title and add a border --- */
  494.     gtk_window_set_title (GTK_WINDOW (dialog_window), szTitle);
  495.     gtk_container_border_width (GTK_CONTAINER (dialog_window), 0);
  496.     /* --- Create an "Ok" button with the focus --- */
  497. if (userDismiss) {
  498. button = gtk_button_new_with_label ("OK");
  499. gtk_signal_connect (GTK_OBJECT (button), "clicked",
  500.   GTK_SIGNAL_FUNC (CloseShowMessage),
  501.   dialog_window);
  502. /* --- Default the "Ok" button --- */
  503. GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  504. gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area), 
  505.   button, TRUE, TRUE, 0);
  506. gtk_widget_grab_default (button);
  507. gtk_widget_show (button);
  508. }
  509.     /* --- Create a descriptive label --- */
  510.     label = gtk_label_new (szMessage);
  511.     /* --- Put some room around the label text --- */
  512.     gtk_misc_set_padding (GTK_MISC (label), 10, 10);
  513.     /* --- Add label to designated area on dialog --- */
  514.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox), 
  515.               label, TRUE, TRUE, 0);
  516.     /* --- Show the label --- */
  517.     gtk_widget_show (label);
  518.     /* --- Show the dialog --- */
  519.     gtk_widget_show (dialog_window);
  520.     /* --- Only this window can have actions done. --- */
  521.     gtk_grab_add (dialog_window);
  522. return dialog_window;
  523. }
  524. static GtkSignalFunc local_yesroutine, local_noroutine;
  525. static void on_yes_button (GtkWidget *widget, gpointer gdata)
  526. {
  527.   GtkWidget *dialog = (GtkWidget *)gdata;
  528.   if (local_yesroutine != NULL) {
  529.     (local_yesroutine)();
  530.   }
  531.   gtk_grab_remove(dialog);
  532.   gtk_widget_destroy(dialog);
  533. }
  534. static void on_no_button (GtkWidget *widget, gpointer data)
  535. {
  536.   GtkWidget *dialog = (GtkWidget *)data;
  537.   if (local_noroutine != NULL) {
  538.     (local_noroutine)();
  539.   }
  540.   gtk_grab_remove(dialog);
  541.   gtk_widget_destroy(dialog);
  542. }
  543. void YesOrNo (const char *szTitle,
  544.       const char *szMessage,
  545.       int yes_as_default,
  546.       GtkSignalFunc yesroutine,
  547.       GtkSignalFunc noroutine)
  548. {
  549.     GtkWidget *label;
  550.     GtkWidget *button;
  551.     GtkWidget *dialog_window;
  552.     local_yesroutine = yesroutine;
  553.     local_noroutine = noroutine;
  554.     
  555.     /* --- Create a dialog window --- */
  556.     dialog_window = gtk_dialog_new ();
  557.     gtk_signal_connect (GTK_OBJECT (dialog_window), "destroy",
  558.               GTK_SIGNAL_FUNC (ClearShowMessage),
  559.               NULL);
  560.     /* --- Set the title and add a border --- */
  561.     gtk_window_set_title (GTK_WINDOW (dialog_window), szTitle);
  562.     gtk_container_border_width (GTK_CONTAINER (dialog_window), 0);
  563.     /* --- Create an "Ok" button with the focus --- */
  564.     button = gtk_button_new_with_label ("Yes");
  565.     gtk_signal_connect (GTK_OBJECT (button), "clicked",
  566.               GTK_SIGNAL_FUNC (on_yes_button),
  567.               dialog_window);
  568.     /* --- Default the "Ok" button --- */
  569.     if (yes_as_default != 0) 
  570.       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  571.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area), 
  572.               button, TRUE, TRUE, 0);
  573.     if (yes_as_default != 0) 
  574.       gtk_widget_grab_default (button);
  575.     gtk_widget_show (button);
  576.     button = gtk_button_new_with_label("No");
  577.     gtk_signal_connect(GTK_OBJECT(button),
  578.        "clicked",
  579.        GTK_SIGNAL_FUNC(on_no_button),
  580.        dialog_window);
  581.     if (yes_as_default == 0) 
  582.       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
  583.     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area),
  584.        button, TRUE, TRUE, 0);
  585.     if (yes_as_default == 0)
  586.       gtk_widget_grab_default(button);
  587.     gtk_widget_show(button);
  588.       
  589.         /* --- Create a descriptive label --- */
  590.     label = gtk_label_new (szMessage);
  591.     /* --- Put some room around the label text --- */
  592.     gtk_misc_set_padding (GTK_MISC (label), 10, 10);
  593.     /* --- Add label to designated area on dialog --- */
  594.     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox), 
  595.               label, TRUE, TRUE, 0);
  596.     /* --- Show the label --- */
  597.     gtk_widget_show (label);
  598.     /* --- Show the dialog --- */
  599.     gtk_widget_show (dialog_window);
  600.     /* --- Only this window can have actions done. --- */
  601.     gtk_grab_add (dialog_window);
  602. }