 609e04ddcf
			
		
	
	609e04ddcf
	
	
	
		
			
			Clean up the code of many examples in minor ways, fix some memory leaks, and avoid the use of dialogs where a regular toplevel works just as well.
		
			
				
	
	
		
			174 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Dialogs and Message Boxes
 | |
|  *
 | |
|  * Dialog widgets are used to pop up a transient window for user feedback.
 | |
|  */
 | |
| 
 | |
| #include <glib/gi18n.h>
 | |
| #include <gtk/gtk.h>
 | |
| 
 | |
| static GtkWidget *window = NULL;
 | |
| static GtkWidget *entry1 = NULL;
 | |
| static GtkWidget *entry2 = NULL;
 | |
| 
 | |
| static void
 | |
| message_dialog_clicked (GtkButton *button,
 | |
|                         gpointer   user_data)
 | |
| {
 | |
|   GtkWidget *dialog;
 | |
|   static gint i = 1;
 | |
| 
 | |
|   dialog = gtk_message_dialog_new (GTK_WINDOW (window),
 | |
|                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 | |
|                                    GTK_MESSAGE_INFO,
 | |
|                                    GTK_BUTTONS_OK_CANCEL,
 | |
|                                    "This message box has been popped up the following\n"
 | |
|                                    "number of times:");
 | |
|   gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
 | |
|                                             "%d", i);
 | |
|   gtk_dialog_run (GTK_DIALOG (dialog));
 | |
|   gtk_widget_destroy (dialog);
 | |
|   i++;
 | |
| }
 | |
| 
 | |
| static void
 | |
| interactive_dialog_clicked (GtkButton *button,
 | |
|                             gpointer   user_data)
 | |
| {
 | |
|   GtkWidget *content_area;
 | |
|   GtkWidget *dialog;
 | |
|   GtkWidget *hbox;
 | |
|   GtkWidget *image;
 | |
|   GtkWidget *table;
 | |
|   GtkWidget *local_entry1;
 | |
|   GtkWidget *local_entry2;
 | |
|   GtkWidget *label;
 | |
|   gint response;
 | |
| 
 | |
|   dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
 | |
|                                         GTK_WINDOW (window),
 | |
|                                         GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT,
 | |
|                                         _("_OK"),
 | |
|                                         GTK_RESPONSE_OK,
 | |
|                                         "_Cancel",
 | |
|                                         GTK_RESPONSE_CANCEL,
 | |
|                                         NULL);
 | |
| 
 | |
|   content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
 | |
| 
 | |
|   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
 | |
|   gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
 | |
|   gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
 | |
| 
 | |
|   image = gtk_image_new_from_icon_name ("dialog-question", GTK_ICON_SIZE_DIALOG);
 | |
|   gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
 | |
| 
 | |
|   table = gtk_grid_new ();
 | |
|   gtk_grid_set_row_spacing (GTK_GRID (table), 4);
 | |
|   gtk_grid_set_column_spacing (GTK_GRID (table), 4);
 | |
|   gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
 | |
|   label = gtk_label_new_with_mnemonic ("_Entry 1");
 | |
|   gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
 | |
|   local_entry1 = gtk_entry_new ();
 | |
|   gtk_entry_set_text (GTK_ENTRY (local_entry1), gtk_entry_get_text (GTK_ENTRY (entry1)));
 | |
|   gtk_grid_attach (GTK_GRID (table), local_entry1, 1, 0, 1, 1);
 | |
|   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry1);
 | |
| 
 | |
|   label = gtk_label_new_with_mnemonic ("E_ntry 2");
 | |
|   gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1);
 | |
| 
 | |
|   local_entry2 = gtk_entry_new ();
 | |
|   gtk_entry_set_text (GTK_ENTRY (local_entry2), gtk_entry_get_text (GTK_ENTRY (entry2)));
 | |
|   gtk_grid_attach (GTK_GRID (table), local_entry2, 1, 1, 1, 1);
 | |
|   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
 | |
| 
 | |
|   gtk_widget_show_all (hbox);
 | |
|   response = gtk_dialog_run (GTK_DIALOG (dialog));
 | |
| 
 | |
|   if (response == GTK_RESPONSE_OK)
 | |
|     {
 | |
|       gtk_entry_set_text (GTK_ENTRY (entry1), gtk_entry_get_text (GTK_ENTRY (local_entry1)));
 | |
|       gtk_entry_set_text (GTK_ENTRY (entry2), gtk_entry_get_text (GTK_ENTRY (local_entry2)));
 | |
|     }
 | |
| 
 | |
|   gtk_widget_destroy (dialog);
 | |
| }
 | |
| 
 | |
| GtkWidget *
 | |
| do_dialog (GtkWidget *do_widget)
 | |
| {
 | |
|   GtkWidget *frame;
 | |
|   GtkWidget *vbox;
 | |
|   GtkWidget *vbox2;
 | |
|   GtkWidget *hbox;
 | |
|   GtkWidget *button;
 | |
|   GtkWidget *table;
 | |
|   GtkWidget *label;
 | |
| 
 | |
|   if (!window)
 | |
|     {
 | |
|       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 | |
|       gtk_window_set_screen (GTK_WINDOW (window),
 | |
|                              gtk_widget_get_screen (do_widget));
 | |
|       gtk_window_set_title (GTK_WINDOW (window), "Dialogs and Message Boxes");
 | |
| 
 | |
|       g_signal_connect (window, "destroy",
 | |
|                         G_CALLBACK (gtk_widget_destroyed), &window);
 | |
| 
 | |
|       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
 | |
| 
 | |
|       frame = gtk_frame_new ("Dialogs");
 | |
|       gtk_container_add (GTK_CONTAINER (window), frame);
 | |
| 
 | |
|       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
 | |
|       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
 | |
|       gtk_container_add (GTK_CONTAINER (frame), vbox);
 | |
| 
 | |
|       /* Standard message dialog */
 | |
|       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
 | |
|       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
 | |
|       button = gtk_button_new_with_mnemonic ("_Message Dialog");
 | |
|       g_signal_connect (button, "clicked",
 | |
|                         G_CALLBACK (message_dialog_clicked), NULL);
 | |
|       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
 | |
| 
 | |
|       gtk_box_pack_start (GTK_BOX (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL),
 | |
|                           FALSE, FALSE, 0);
 | |
| 
 | |
|       /* Interactive dialog*/
 | |
|       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
 | |
|       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
 | |
|       vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
 | |
| 
 | |
|       button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
 | |
|       g_signal_connect (button, "clicked",
 | |
|                         G_CALLBACK (interactive_dialog_clicked), NULL);
 | |
|       gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
 | |
|       gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
 | |
| 
 | |
|       table = gtk_grid_new ();
 | |
|       gtk_grid_set_row_spacing (GTK_GRID (table), 4);
 | |
|       gtk_grid_set_column_spacing (GTK_GRID (table), 4);
 | |
|       gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
 | |
| 
 | |
|       label = gtk_label_new_with_mnemonic ("_Entry 1");
 | |
|       gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
 | |
| 
 | |
|       entry1 = gtk_entry_new ();
 | |
|       gtk_grid_attach (GTK_GRID (table), entry1, 1, 0, 1, 1);
 | |
|       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry1);
 | |
| 
 | |
|       label = gtk_label_new_with_mnemonic ("E_ntry 2");
 | |
|       gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1);
 | |
| 
 | |
|       entry2 = gtk_entry_new ();
 | |
|       gtk_grid_attach (GTK_GRID (table), entry2, 1, 1, 1, 1);
 | |
|     }
 | |
| 
 | |
|   if (!gtk_widget_get_visible (window))
 | |
|     gtk_widget_show_all (window);
 | |
|   else
 | |
|     gtk_widget_destroy (window);
 | |
| 
 | |
|   return window;
 | |
| }
 |