/*------------------------------------------------------------------------- * Copyright (c) 1999-2003 Kenneth W. Sodemann (stuffle@mac.com) *------------------------------------------------------------------------- * print_dlg * * Synopsis: * Determine what to print and where to print it. * * $Id: print_dlg.c,v 1.21 2003/03/08 22:44:08 stuffle Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * *------------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H # include #endif /* * Only bother to compile this file if printing is supported. */ #ifdef PRINTING_SUPPORTED #include #include #include #include #ifdef HAVE_STATBUF_H # include #endif #include #include #include #include #include "defs.h" #include "gtkutils.h" #include "print_prog_dlg.h" #include "tex_pr.h" #include "util.h" #define PRINTER_CB "printer_cb" #define LP_ENTRY "lp_entry" #define FILE_CB "file_cb" #define FILE_ENTRY "file_entry" #define FILE_SEL_BUTTON "file_sel_button" #define ALL_PR_RB "all_pr_rb" #define SEL_PR_RB "sel_pr_rb" #define OK_BUTTON "ok_button" #define CANCEL_BUTTON "cancel_button" static gint return_value; /* Only used when executing as modal dlg. */ #define FULL_LIST "full_list" #define SEL_LIST "sel_list" /* * data that is passed around in the file selection dlg signal handlers. */ typedef struct file_sel_struct { GtkFileSelection *file_sel_dlg; GtkEntry *file_entry; /* entry filled in when file selected. */ } file_sel_struct; /*--------------------------------------------------------------------------- * File selection dialog functions * * The following three functions are NOT directly associated with the * print dialog, but rather are signal handlers used by the file * selection dialog (see 'on_file_sel_button_clicked). *--------------------------------------------------------------------------- */ /* * on_file_sel_destroy * * File selection dialog destroyed. Clean up after it. */ static void on_file_sel_destroy (GtkWidget *widget, gpointer user_data) { g_assert (user_data); g_free (user_data); gtk_main_quit (); } /* * on_file_sel_cancel * * Signal handler for the user clicking the 'Cancel' button in the * file selection dialog. Not much to do here other than destroy * the file selection dialog box. */ static void on_file_sel_cancel (GtkButton *button, gpointer user_data) { g_assert (user_data); gtk_widget_destroy (GTK_WIDGET (((file_sel_struct *)user_data)->file_sel_dlg)); } /* * on_file_sel_ok * * Signal handler for the user clicking the 'OK' button in the file * selection dialog. Fills in the file_entry widget with the selected * file name. */ static void on_file_sel_ok (GtkButton *button, gpointer user_data) { GtkFileSelection *fsd; GString *file_name; struct stat stat_buf; GtkWidget *msg_dlg; GString *msg; g_assert (user_data); fsd = ((file_sel_struct *)user_data)->file_sel_dlg; file_name = g_string_new (gtk_file_selection_get_filename (fsd)); /* * Check the status of the file stat was selected. */ if (stat (file_name->str, &stat_buf) == 0) { /* * If the file exists, make sure it is not a special kind of * file. */ if (S_ISDIR (stat_buf.st_mode) || S_ISCHR (stat_buf.st_mode) || S_ISBLK (stat_buf.st_mode) || S_ISFIFO (stat_buf.st_mode) || S_ISSOCK (stat_buf.st_mode)) { msg = g_string_new (file_name->str); msg = g_string_append (msg, _("\nis eiter a directory or a special type of file.\nPlease choose another name.")); msg_dlg = gtk_message_dialog_new (GTK_WINDOW (fsd), 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, msg->str); gtk_dialog_run (GTK_DIALOG (msg_dlg)); gtk_widget_destroy (msg_dlg); g_string_free (msg, TRUE); } else { /* * We have a regular file. Make sure we actually want to * over-write it. */ msg = g_string_new (file_name->str); msg = g_string_append (msg, _("\nalready exists. Are you sure that you want to overwrite the file?")); msg_dlg = gtk_message_dialog_new (GTK_WINDOW (fsd), 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, msg->str); g_string_free (msg, TRUE); gtk_dialog_set_default_response (GTK_DIALOG (msg_dlg), GTK_RESPONSE_NO); if (gtk_dialog_run (GTK_DIALOG (msg_dlg)) == GTK_RESPONSE_YES) { gtk_entry_set_text (((file_sel_struct *)user_data)->file_entry, file_name->str); gtk_widget_destroy (GTK_WIDGET (((file_sel_struct *)user_data)->file_sel_dlg)); } gtk_widget_destroy (msg_dlg); } } else { /* * stat returned an error. This can happen under two different * types of conditions: * 1.) The file does not exist * 2.) There is something wrong * * For case 1, accept the file name and close the dlg. For the * second case, display an error message and leave the dlg open. */ if (errno == ENOENT) { gtk_entry_set_text (((file_sel_struct *)user_data)->file_entry, file_name->str); gtk_widget_destroy (GTK_WIDGET (((file_sel_struct *)user_data)->file_sel_dlg)); } else { msg = g_string_new (_("There is an error with the file ")); msg = g_string_append (msg, file_name->str); msg = g_string_append_c (msg, '\n'); msg = g_string_append (msg, g_strerror (errno)); msg_dlg = gtk_message_dialog_new (GTK_WINDOW (fsd), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, msg->str); gtk_dialog_run (GTK_DIALOG (msg_dlg)); gtk_widget_destroy (msg_dlg); g_string_free (msg, TRUE); /* * This one could be serious. Log it. */ syslog (LOG_ERR, _("Failed to stat %s: %m"), file_name->str); } } g_string_free (file_name, TRUE); } /*--------------------------------------------------------------------------- * End file selection dialog functions, start print dialog functions. *--------------------------------------------------------------------------- */ static void on_printer_dlg_show (GtkWidget *widget, gpointer user_data) { GtkRadioButton *all_pr_rb; GtkRadioButton *sel_pr_rb; GtkToggleButton *prn_cb; GtkToggleButton *file_cb; GtkEntry *prn_entry; GtkEntry *file_entry; GtkButton *file_sel_btn; GList *sel_list; GString *config_str; gboolean flag; gchar *txt; GConfClient *client; GError *error = NULL; sel_list = g_object_get_data (G_OBJECT (widget), SEL_LIST); all_pr_rb = GTK_RADIO_BUTTON (lookup_widget (widget, ALL_PR_RB)); g_assert (all_pr_rb != NULL); sel_pr_rb = GTK_RADIO_BUTTON (lookup_widget (widget, SEL_PR_RB)); g_assert (sel_pr_rb != NULL); prn_cb = GTK_TOGGLE_BUTTON (lookup_widget (widget, PRINTER_CB)); g_assert (prn_cb != NULL); file_cb = GTK_TOGGLE_BUTTON (lookup_widget (widget, FILE_CB)); g_assert (file_cb != NULL); prn_entry = GTK_ENTRY (lookup_widget (widget, LP_ENTRY)); g_assert (prn_entry != NULL); file_entry = GTK_ENTRY (lookup_widget (widget, FILE_ENTRY)); g_assert (file_entry != NULL); file_sel_btn = GTK_BUTTON (lookup_widget (widget, FILE_SEL_BUTTON)); g_assert (file_sel_btn != NULL); client = g_object_get_data (G_OBJECT (widget), MY_GCONF_CLIENT); g_assert (client != NULL); /* * Initialize according to the config file... */ config_str = g_string_new (""); g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, TO_PRINTER); flag = gconf_client_get_bool (client, config_str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); error = NULL; flag = FALSE; } gtk_toggle_button_set_active (prn_cb, flag); g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, PRINTER_NAME); txt = gconf_client_get_string (client, config_str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); error = NULL; txt = g_strdup (DEF_PRINTER); } if (txt != NULL) { gtk_entry_set_text (prn_entry, txt); g_free (txt); } g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, TO_FILE); flag = gconf_client_get_bool (client, config_str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); error = NULL; flag = FALSE; } gtk_toggle_button_set_active (file_cb, flag); g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, FILE_NAME); txt = gconf_client_get_string (client, config_str->str, &error); if (error != NULL) { g_warning (error->message); g_error_free (error); error = NULL; } if (txt != NULL) { gtk_entry_set_text (file_entry, txt); g_free (txt); } g_string_free (config_str, TRUE); /* * If there are no problem reports selected, default to printing * all listed PRs and do not let the user change that. */ if (sel_list == NULL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (all_pr_rb), TRUE); gtk_widget_set_sensitive (GTK_WIDGET (all_pr_rb), FALSE); gtk_widget_set_sensitive (GTK_WIDGET (sel_pr_rb), FALSE); } /* * Activate or deactive the entries based on the state of the * associated check box. */ gtk_widget_set_sensitive (GTK_WIDGET (prn_entry), gtk_toggle_button_get_active (prn_cb)); gtk_widget_set_sensitive (GTK_WIDGET (file_entry), gtk_toggle_button_get_active (file_cb)); gtk_widget_set_sensitive (GTK_WIDGET (file_sel_btn), gtk_toggle_button_get_active (file_cb)); } static void on_printer_dlg_destroy (GtkWidget *widget, gpointer user_data) { GtkToggleButton *cb; GtkEntry *entry; GString *config_str; gchar *txt; GConfClient *client; config_str = g_string_new (""); client = g_object_get_data (G_OBJECT (widget), MY_GCONF_CLIENT); g_assert (client != NULL); cb = GTK_TOGGLE_BUTTON (lookup_widget (widget, PRINTER_CB)); g_assert (cb != NULL); g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, TO_PRINTER); gconf_client_set_bool (client, config_str->str, gtk_toggle_button_get_active (cb), NULL); entry = GTK_ENTRY (lookup_widget (widget, LP_ENTRY)); g_assert (entry != NULL); g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, PRINTER_NAME); txt = (gchar *)gtk_entry_get_text (entry); if (strlen (txt) > 0) { gconf_client_set_string (client, config_str->str, txt, NULL); } else { gconf_client_unset (client, config_str->str, NULL); } cb = GTK_TOGGLE_BUTTON (lookup_widget (widget, FILE_CB)); g_assert (cb != NULL); g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, TO_FILE); gconf_client_set_bool (client, config_str->str, gtk_toggle_button_get_active (cb), NULL); entry = GTK_ENTRY (lookup_widget (widget, FILE_ENTRY)); g_assert (entry != NULL); g_string_printf (config_str, "%s/%s/%s/%s", BASE_KEY, WINSTATES, PRNT_DLG_SEC, FILE_NAME); txt = (gchar *)gtk_entry_get_text (entry); if (strlen (txt) > 0) { gconf_client_set_string (client, config_str->str, txt, NULL); } else { gconf_client_unset (client, config_str->str, NULL); } g_string_free (config_str, TRUE); /* * First check the main widget, and see if we are running * modally. It is assumed that we were started via the * execute_xxx function in this case, so we need to quit * the main loop created there. */ if (GTK_WINDOW (widget)->modal) { gtk_main_quit (); } return; } static void on_prn_cb_toggled (GtkToggleButton *btn, gpointer user_data) { GtkWidget *prn_entry; g_assert (user_data != NULL); prn_entry = lookup_widget (GTK_WIDGET (user_data), LP_ENTRY); g_assert (prn_entry != NULL); gtk_widget_set_sensitive (prn_entry, gtk_toggle_button_get_active (btn)); } static void on_file_cb_toggled (GtkToggleButton *btn, gpointer user_data) { GtkWidget *file_entry; GtkWidget *file_sel_btn; g_assert (user_data != NULL); file_entry = lookup_widget (GTK_WIDGET (user_data), FILE_ENTRY); g_assert (file_entry != NULL); file_sel_btn = lookup_widget (GTK_WIDGET (user_data), FILE_SEL_BUTTON); g_assert (file_sel_btn != NULL); gtk_widget_set_sensitive (file_entry, gtk_toggle_button_get_active (btn)); gtk_widget_set_sensitive (file_sel_btn, gtk_toggle_button_get_active (btn)); } /* * on_file_sel_button_clicked * * When the file selection button is clicked, bring up a modal file * selection dialog box. This box will fill in the file_entry * widget if the user closes it with 'OK' */ static void on_file_sel_button_clicked (GtkButton *button, gpointer user_data) { GtkWidget *filew; GtkWidget *main_widget; GtkEntry *file_entry; file_sel_struct *data; g_assert (user_data != NULL); main_widget = GTK_WIDGET (user_data); file_entry = GTK_ENTRY (lookup_widget (main_widget, FILE_ENTRY)); g_assert (file_entry != NULL); filew = gtk_file_selection_new (_("Print To File...")); data = g_malloc (sizeof (file_sel_struct)); data->file_sel_dlg = GTK_FILE_SELECTION (filew); data->file_entry = file_entry; g_signal_connect (filew, "destroy", G_CALLBACK (on_file_sel_destroy), data); g_signal_connect (GTK_FILE_SELECTION (filew)->ok_button, "clicked", G_CALLBACK (on_file_sel_ok), data); g_signal_connect (GTK_FILE_SELECTION (filew)->cancel_button, "clicked", G_CALLBACK (on_file_sel_cancel), data); gtk_widget_show (filew); gtk_window_set_modal (GTK_WINDOW (filew), TRUE); gtk_main (); } /* * This one needs better data checking, and really should fork. For now, * just get it working, and re-design it after all the background stuff * is tested out. */ static void on_ok_button_clicked (GtkDialog *dlg) { GtkWidget *main_widget; GtkWidget *prn_prog_dlg; GtkToggleButton *prn_cb; GtkToggleButton *file_cb; GtkToggleButton *all_rb; GtkEntry *file_entry; GtkEntry *prn_entry; GList *the_list; GString *base_file; PGconn *conn; GtkWidget *msg_dlg; main_widget = GTK_WIDGET (dlg); conn = g_object_get_data (G_OBJECT (dlg), MY_DB_CONN); g_assert (conn != NULL); prn_cb = GTK_TOGGLE_BUTTON (lookup_widget (main_widget, PRINTER_CB)); g_assert (prn_cb); file_cb = GTK_TOGGLE_BUTTON (lookup_widget (main_widget, FILE_CB)); g_assert (file_cb); all_rb = GTK_TOGGLE_BUTTON (lookup_widget (main_widget, ALL_PR_RB)); g_assert (all_rb); file_entry = GTK_ENTRY (lookup_widget (main_widget, FILE_ENTRY)); g_assert (file_entry); prn_entry = GTK_ENTRY (lookup_widget (main_widget, LP_ENTRY)); g_assert (prn_entry); /* * If neither the 'to printer' nor the 'to file' check boxes are * checked, don't attempt to print. Tell the user and exit without * destroying the dialog. */ if (!gtk_toggle_button_get_active (prn_cb) && !gtk_toggle_button_get_active (file_cb)) { msg_dlg = gtk_message_dialog_new (GTK_WINDOW (main_widget), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, _("You must select at least one print target.\n" "Please choose 'Send to Printer' or 'Print to File'.\n" "Press 'Cancel' if you do not want to print.")); gtk_dialog_run (GTK_DIALOG (msg_dlg)); gtk_widget_destroy (msg_dlg); return; } /* * Display the message dialog, and get a pointer to the text widget * that all messages will need to be written to. */ prn_prog_dlg = create_print_prog_dlg (GTK_WIDGET (dlg)); gtk_widget_show (prn_prog_dlg); /* * Which radio button (all or selected)? Pick the list to use * accordingly. */ if (gtk_toggle_button_get_active (all_rb)) { the_list = g_list_first (g_object_get_data (G_OBJECT (main_widget), FULL_LIST)); } else { the_list = g_list_first (g_object_get_data (G_OBJECT (main_widget), SEL_LIST)); } /* * Create the TeX file, and process it into a DVI file. The user can * choose to send the DVI to printer, or to file (or both). Do that * and then clean up. */ base_file = create_tex_file (conn, the_list, prn_prog_dlg); if (base_file != NULL) { if (tex_to_dvi (base_file->str, prn_prog_dlg)) { if (gtk_toggle_button_get_active (prn_cb)) { dvi_to_printer (base_file->str, gtk_entry_get_text (prn_entry), prn_prog_dlg); } if (gtk_toggle_button_get_active (file_cb)) { dvi_to_ps (base_file->str, gtk_entry_get_text (file_entry), prn_prog_dlg); } } else { dump_tex_log (base_file->str, prn_prog_dlg); print_prog_dlg_output_message (prn_prog_dlg, _("Error in DVI creation.\n"), TRUE); } cleanup_files (base_file->str); g_string_free (base_file, TRUE); } else { print_prog_dlg_output_message (prn_prog_dlg, _("Error in TeX file creation\n"), TRUE); } print_prog_dlg_printing_complete (prn_prog_dlg); gtk_widget_destroy (main_widget); } static void on_cancel_button_clicked (GtkDialog *dlg) { gtk_widget_destroy (GTK_WIDGET (dlg)); } static void on_printer_dlg_clicked (GtkDialog *dlg, gint btn_cd, gpointer user_data) { switch (btn_cd) { case GTK_RESPONSE_OK: on_ok_button_clicked (dlg); break; case GTK_RESPONSE_CANCEL: on_cancel_button_clicked (dlg); break; case GTK_RESPONSE_DELETE_EVENT: break; default: g_assert_not_reached (); } } GtkWidget * create_print_dlg (GtkWidget *parent, PGconn *conn, GList *list, GList *sel) { GtkWidget *printer_dlg; GtkWidget *vbox1; GtkWidget *vbox2; GtkWidget *printer_cb; GtkWidget *lp_entry; GtkWidget *vbox3; GtkWidget *to_file_cb; GtkWidget *hbox3; GtkWidget *entry2; GtkWidget *file_sel_button; GtkWidget *hseparator3; GtkWidget *frame1; GtkWidget *vbox4; GSList *vbox4_group = NULL; GtkWidget *all_pr_rb; GtkWidget *sel_pr_rb; GtkTooltips *tooltips; GConfClient *client; tooltips = g_object_get_data (G_OBJECT (parent), TOOLTIPS); g_assert (tooltips != NULL); client = g_object_get_data (G_OBJECT (parent), MY_GCONF_CLIENT); g_assert (client != NULL); printer_dlg = gtk_dialog_new_with_buttons (_("Print Problem Reports"), GTK_WINDOW (parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); GLADE_HOOKUP_OBJECT_NO_REF (printer_dlg, printer_dlg, "printer_dlg"); gtk_window_set_resizable (GTK_WINDOW (printer_dlg), FALSE); g_object_set_data (G_OBJECT (printer_dlg), TOP_DOG, printer_dlg); g_object_set_data (G_OBJECT (printer_dlg), MY_PARENT, parent); g_object_set_data (G_OBJECT (printer_dlg), MY_DB_CONN, conn); g_object_set_data (G_OBJECT (printer_dlg), MY_GCONF_CLIENT, client); g_object_set_data (G_OBJECT (printer_dlg), FULL_LIST, list); g_object_set_data (G_OBJECT (printer_dlg), SEL_LIST, sel); g_signal_connect (printer_dlg, "show", G_CALLBACK (on_printer_dlg_show), NULL); g_signal_connect (printer_dlg, "destroy", G_CALLBACK (on_printer_dlg_destroy), NULL); g_signal_connect (printer_dlg, "response", G_CALLBACK (on_printer_dlg_clicked), NULL); vbox1 = GTK_DIALOG (printer_dlg)->vbox; GLADE_HOOKUP_OBJECT (printer_dlg, vbox1, "vbox1"); gtk_widget_show (vbox1); vbox2 = gtk_vbox_new (FALSE, 0); GLADE_HOOKUP_OBJECT (printer_dlg, vbox2, "vbox2"); gtk_widget_show (vbox2); gtk_box_pack_start (GTK_BOX (vbox1), vbox2, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5); printer_cb = gtk_check_button_new_with_label (_("Send to Printer")); GLADE_HOOKUP_OBJECT (printer_dlg, printer_cb, PRINTER_CB); gtk_widget_show (printer_cb); gtk_box_pack_start (GTK_BOX (vbox2), printer_cb, TRUE, TRUE, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (printer_cb), TRUE); g_signal_connect (printer_cb, "toggled", G_CALLBACK (on_prn_cb_toggled), printer_dlg); lp_entry = gtk_entry_new (); GLADE_HOOKUP_OBJECT (printer_dlg, lp_entry, LP_ENTRY); gtk_widget_show (lp_entry); gtk_box_pack_start (GTK_BOX (vbox2), lp_entry, TRUE, TRUE, 0); gtk_widget_set_size_request (lp_entry, 250, -1); gtk_tooltips_set_tip (tooltips, lp_entry, _("Enter the name of the printer here ('lp', for example)."), NULL); gtk_entry_set_text (GTK_ENTRY (lp_entry), "lp"); vbox3 = gtk_vbox_new (FALSE, 0); GLADE_HOOKUP_OBJECT (printer_dlg, vbox3, "vbox3"); gtk_widget_show (vbox3); gtk_box_pack_start (GTK_BOX (vbox1), vbox3, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox3), 5); to_file_cb = gtk_check_button_new_with_label (_("Print to File")); GLADE_HOOKUP_OBJECT (printer_dlg, to_file_cb, FILE_CB); gtk_widget_show (to_file_cb); gtk_box_pack_start (GTK_BOX (vbox3), to_file_cb, TRUE, TRUE, 0); g_signal_connect (to_file_cb, "toggled", G_CALLBACK (on_file_cb_toggled), printer_dlg); hbox3 = gtk_hbox_new (FALSE, 5); GLADE_HOOKUP_OBJECT (printer_dlg, hbox3, "hbox3"); gtk_widget_show (hbox3); gtk_box_pack_start (GTK_BOX (vbox3), hbox3, TRUE, TRUE, 0); entry2 = gtk_entry_new (); GLADE_HOOKUP_OBJECT (printer_dlg, entry2, FILE_ENTRY); gtk_widget_show (entry2); gtk_box_pack_start (GTK_BOX (hbox3), entry2, TRUE, TRUE, 0); gtk_tooltips_set_tip (tooltips, entry2, _("Enter the name of the file here."), NULL); file_sel_button = gtk_button_new_with_label ("..."); GLADE_HOOKUP_OBJECT (printer_dlg, file_sel_button, FILE_SEL_BUTTON); gtk_widget_show (file_sel_button); gtk_box_pack_start (GTK_BOX (hbox3), file_sel_button, TRUE, TRUE, 0); gtk_tooltips_set_tip (tooltips, file_sel_button, _("Press to select file."), NULL); g_signal_connect (file_sel_button, "clicked", G_CALLBACK (on_file_sel_button_clicked), printer_dlg); hseparator3 = gtk_hseparator_new (); gtk_widget_show (hseparator3); gtk_box_pack_start (GTK_BOX (vbox1), hseparator3, TRUE, TRUE, 0); frame1 = gtk_frame_new (_("PRs to Print")); GLADE_HOOKUP_OBJECT (printer_dlg, frame1, "frame1"); gtk_widget_show (frame1); gtk_box_pack_start (GTK_BOX (vbox1), frame1, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame1), 5); vbox4 = gtk_vbox_new (FALSE, 0); GLADE_HOOKUP_OBJECT (printer_dlg, vbox4, "vbox4"); gtk_widget_show (vbox4); gtk_container_add (GTK_CONTAINER (frame1), vbox4); all_pr_rb = gtk_radio_button_new_with_label (vbox4_group, _("All Problem Reports Listed")); GLADE_HOOKUP_OBJECT (printer_dlg, all_pr_rb, ALL_PR_RB); vbox4_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (all_pr_rb)); gtk_widget_show (all_pr_rb); gtk_box_pack_start (GTK_BOX (vbox4), all_pr_rb, TRUE, TRUE, 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (all_pr_rb), TRUE); sel_pr_rb = gtk_radio_button_new_with_label (vbox4_group, _("Selected Problem Report Only")); GLADE_HOOKUP_OBJECT (printer_dlg, sel_pr_rb, SEL_PR_RB); vbox4_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (sel_pr_rb)); gtk_widget_show (sel_pr_rb); gtk_box_pack_start (GTK_BOX (vbox4), sel_pr_rb, TRUE, TRUE, 0); g_object_set_data (G_OBJECT (printer_dlg), TOOLTIPS, tooltips); return printer_dlg; } gint execute_print_dlg (GtkWidget *parent, PGconn *conn, GList *list, GList *sel) { GtkWidget *dlg; dlg = create_print_dlg (parent, conn, list, sel); gtk_widget_show (dlg); gtk_window_set_modal (GTK_WINDOW (dlg), TRUE); gtk_main (); return return_value; } #endif