diff --git a/src/gtkglue.c b/src/gtkglue.c index d5dd0e4..b2e716e 100644 --- a/src/gtkglue.c +++ b/src/gtkglue.c @@ -248,97 +248,89 @@ gsg_close_dialog_callback (GtkWidget * widget, gpointer data) gsg_message_dialog_active = 0; } -void -gsg_message (const gchar * title, const gchar * message) -{ - GtkWidget *main_vbox, *label; - GtkWidget *button, *message_dialog; - - if (gsg_message_dialog_active) - { - fprintf (stderr, "%s: %s\n", title, message); - return; - } - gsg_message_dialog_active = 1; - message_dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_position (GTK_WINDOW (message_dialog), GTK_WIN_POS_MOUSE); - gtk_window_set_title (GTK_WINDOW (message_dialog), title); - - /* create the main vbox */ - main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_box_set_homogeneous (GTK_BOX (main_vbox), TRUE); - gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 5); - gtk_widget_show (main_vbox); - - gtk_container_add (GTK_CONTAINER (message_dialog), main_vbox); - - /* the message */ - label = gtk_label_new (message); - gtk_container_add (GTK_CONTAINER (main_vbox), label); - gtk_widget_show (label); - - /* the confirmation button */ - button = gtk_button_new_with_label (_("OK")); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (gsg_close_dialog_callback), - message_dialog); - gtk_container_add (GTK_CONTAINER (main_vbox), button); - - gtk_widget_show (button); - gtk_widget_show (message_dialog); -} - void gsg_error (const gchar * error) { - gsg_message ("Error", error); + GtkWidget *dialog; + + GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL; + dialog = gtk_message_dialog_new (GTK_WINDOW_TOPLEVEL, + flags, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "%s", + error); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); } void gsg_warning (const gchar * warning) { - gsg_message ("Warning", warning); + GtkWidget *dialog; + + GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL; + dialog = gtk_message_dialog_new (GTK_WINDOW_TOPLEVEL, + flags, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + "%s", + warning); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); } +/* + * Execute scan file name dialog. + * + * Return: -1 = cancel/error, 0 = filename selected. + * + */ int -gsg_get_filename (const char *label, const char *default_name, - size_t max_len, char *filename) +gsg_get_filename (const char *label, const char *default_name, char **filename, SANE_Bool is_save) { - int cancel = 0; + SANE_Bool cancel = SANE_TRUE; GtkWidget *filesel; + GtkFileChooser *chooser; - filesel = gtk_file_chooser_dialog_new ((char*) label, NULL, GTK_FILE_CHOOSER_ACTION_SAVE, - _("Ok"), GTK_RESPONSE_ACCEPT, - _("Cancel"), GTK_RESPONSE_CANCEL, - NULL); + DBG (DBG_debug, "gsg_get_filename start, default=[%s]\n", default_name); - gtk_window_set_modal (GTK_WINDOW (filesel), TRUE); + filesel = gtk_file_chooser_dialog_new ( + label, NULL, + is_save ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN, + "Ok", GTK_RESPONSE_ACCEPT, "Cancel", GTK_RESPONSE_CANCEL, + NULL); - if (default_name) - gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (filesel), - (char *) default_name); + chooser = GTK_FILE_CHOOSER (filesel); - if (gtk_dialog_run (GTK_DIALOG (filesel)) == GTK_RESPONSE_ACCEPT) + if (is_save) { - size_t len, cwd_len; - char *cwd; + gtk_file_chooser_set_do_overwrite_confirmation (chooser, TRUE); - strncpy (filename, - gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filesel)), - max_len - 1); - filename[max_len - 1] = '\0'; + if (default_name) + gtk_file_chooser_set_filename (chooser, default_name); + } + else + { + if (default_name) + gtk_file_chooser_set_current_name (chooser, default_name); - len = strlen (filename); - cwd = alloca (len + 2); - if (getcwd (cwd, len + 1) == NULL) - return -1; - cwd_len = strlen (cwd); - cwd[cwd_len++] = '/'; - cwd[cwd_len] = '\0'; - if (strncmp (filename, cwd, cwd_len) == 0) - memcpy (filename, filename + cwd_len, len - cwd_len + 1); + } + + if (gtk_dialog_run (GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) + { + *filename = strdup(gtk_file_chooser_get_filename (chooser)); + if (!*filename) + { + DBG (DBG_error, "gsg_get_filename failed to allocate filename.\n"); + } + cancel = SANE_FALSE; } gtk_widget_destroy (filesel); + + DBG (DBG_debug, "gsg_get_filename exit\n"); + return cancel ? -1 : 0; } diff --git a/src/gtkglue.h b/src/gtkglue.h index 72e22d8..6d0ff10 100644 --- a/src/gtkglue.h +++ b/src/gtkglue.h @@ -95,11 +95,10 @@ extern int gsg_make_path (size_t max_len, char *filename_ret, const char *prefix, const char *dev_name, const char *postfix); -extern void gsg_message (const gchar *title, const gchar * message); extern void gsg_error (const gchar * error_message); extern void gsg_warning (const gchar * warning_message); extern int gsg_get_filename (const char *label, const char *default_name, - size_t max_len, char *filename); + char **filename, SANE_Bool is_save); extern GSGDialog *gsg_create_dialog (GtkWidget *window, const char *device_name, diff --git a/src/scanadf.c b/src/scanadf.c index 9cd8523..5adaff5 100644 --- a/src/scanadf.c +++ b/src/scanadf.c @@ -104,11 +104,6 @@ sane_strframe (SANE_Frame f) (f) == SANE_FRAME_GREEN || \ (f) == SANE_FRAME_BLUE ) - -#ifndef HAVE_ATEXIT -# define atexit(func) on_exit(func, 0) /* works for SunOS, at least */ -#endif - typedef struct { u_char *data; @@ -1403,8 +1398,6 @@ main (int argc, char **argv) int startNum = 1, endNum = -1; /* start/end numbers of pages to scan */ int no_overwrite = 0; - atexit (sane_exit); - prog_name = strrchr (argv[0], '/'); if (prog_name) ++prog_name; @@ -1464,7 +1457,7 @@ main (int argc, char **argv) case 'V': printf ("%s (%s) %s\n", prog_name, PACKAGE, VERSION); - exit (0); + scanadf_exit (0); default: break; /* ignore device specific options for now */ @@ -1726,5 +1719,5 @@ List of available devices:"), prog_name); if (scriptWait) while (wait(NULL) != -1); - return (status == SANE_STATUS_GOOD) ? 0 : 1; + scanadf_exit((status == SANE_STATUS_GOOD) ? 0 : 1); } diff --git a/src/xcam.c b/src/xcam.c index d772a25..d69e086 100644 --- a/src/xcam.c +++ b/src/xcam.c @@ -66,10 +66,6 @@ #define MAX_LUM 64 /* how many graylevels for 8 bit displays */ -#ifndef HAVE_ATEXIT -# define atexit(func) on_exit(func, 0) /* works for SunOS, at least */ -#endif - typedef struct { GtkWidget *dialog; GtkWidget *spinner; @@ -89,7 +85,9 @@ Canvas; static const char *prog_name; static const SANE_Device **device; static GSGDialog *dialog; -static char device_settings_filename[1024] = "device.rc"; +static char *device_settings_filename = NULL; + +#define DEFAULT_SETTINGS_FILE "device.rc" #define DBG_fatal 0 #define DBG_error 1 @@ -163,6 +161,8 @@ static void update_param (GSGDialog * dialog, void *arg); static void load_defaults (int silent); +static void xcam_exit (void); + static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, @@ -689,7 +689,8 @@ exit_callback (GtkWidget * widget, gpointer data) if (dialog) gsg_destroy_dialog (dialog); dialog = 0; - exit (0); + xcam_exit (); + exit(0); } static void @@ -711,20 +712,27 @@ load_defaults_callback (GtkWidget * widget, gpointer data) static void save_as_callback (GtkWidget * widget, gpointer data) { - if (gsg_get_filename ("File to save settings to", device_settings_filename, - sizeof (device_settings_filename), - device_settings_filename) < 0) + if (gsg_get_filename ( + "File to save settings to", + device_settings_filename ? device_settings_filename : DEFAULT_SETTINGS_FILE, + &device_settings_filename, + SANE_TRUE) < 0) return; + save_settings (device_settings_filename); } static void load_from_callback (GtkWidget * widget, gpointer data) { - if (gsg_get_filename - ("File to load settings from", device_settings_filename, - sizeof (device_settings_filename), device_settings_filename) < 0) + + if (gsg_get_filename ( + "File to load settings from", + device_settings_filename ? device_settings_filename : DEFAULT_SETTINGS_FILE, + &device_settings_filename, + SANE_FALSE) < 0) return; + load_settings (device_settings_filename, 0); } @@ -767,10 +775,6 @@ build_files_menu (void) menu = gtk_menu_new (); - item = gtk_menu_item_new (); - gtk_container_add (GTK_CONTAINER (menu), item); - gtk_widget_show (item); - item = gtk_menu_item_new_with_label ("Exit"); gtk_container_add (GTK_CONTAINER (menu), item); g_signal_connect (G_OBJECT (item), "activate", @@ -795,23 +799,6 @@ device_activate_callback (GtkWidget * widget, gpointer data) g_idle_add (delayed_switch, data); } -static void -xcam_exit (void) -{ - static int active = 0; - - DBG (DBG_debug, "xcam: xcam_exit: enter\n"); - if (active) - return; - - active = 1; - pref_xcam_save (); - sane_exit (); - /* this has the habit of calling exit itself: */ - gtk_main_quit (); - DBG (DBG_debug, "xcam: xcam_exit: exit\n"); -} - static gboolean on_scan_finished(gpointer data) { ScanUI *ui = (ScanUI *)data; GtkWidget *menu, *item; @@ -828,7 +815,7 @@ static gboolean on_scan_finished(gpointer data) { gtk_widget_show (item); } - item = gtk_menu_item_new (); + item = gtk_separator_menu_item_new (); gtk_container_add (GTK_CONTAINER (ui->menu), item); gtk_widget_show (item); @@ -990,7 +977,7 @@ build_preferences_menu (GSGDialog * dialog) g_signal_connect (G_OBJECT (item), "toggled", G_CALLBACK (pref_toggle_twocolumn), 0); - item = gtk_menu_item_new (); + item = gtk_separator_menu_item_new (); gtk_container_add (GTK_CONTAINER (menu), item); gtk_widget_show (item); @@ -1006,7 +993,7 @@ build_preferences_menu (GSGDialog * dialog) G_CALLBACK (load_defaults_callback), 0); gtk_widget_show (item); - item = gtk_menu_item_new (); + item = gtk_separator_menu_item_new (); gtk_container_add (GTK_CONTAINER (menu), item); gtk_widget_show (item); @@ -1650,6 +1637,26 @@ save_frame (void) DBG (DBG_debug, "xcam: save_frame: exit\n"); } +static void +xcam_exit (void) +{ + static int active = 0; + + DBG (DBG_debug, "xcam: xcam_exit: enter\n"); + if (active) + return; + + active = 1; + pref_xcam_save (); + sane_exit (); + /* this has the habit of calling exit itself: */ + gtk_main_quit (); + + free(device_settings_filename); + + DBG (DBG_debug, "xcam: xcam_exit: exit\n"); +} + /* Invoked when window manager's "delete" (or "close") function is invoked. */ static gint @@ -1662,23 +1669,22 @@ xcam_win_delete (GtkWidget * w, gpointer data) static void browse_filename_callback (GtkWidget * widget, gpointer data) { - char filename[1024]; + char *filename = NULL; - DBG (DBG_debug, "xcam: browse_filename_callback\n"); - if (preferences.filename) + DBG (DBG_debug, "browse_filename_callback\n"); + + if (gsg_get_filename ( + "Output Filename", + preferences.filename ? preferences.filename : OUTFILENAME, &filename, + SANE_TRUE) == 0) { - strncpy (filename, preferences.filename, sizeof (filename)); - filename[sizeof (filename) - 1] = '\0'; - } - else - strcpy (filename, OUTFILENAME); - gsg_get_filename (_("Output Filename"), filename, sizeof (filename), filename); - gtk_entry_set_text (GTK_ENTRY (win.filename_entry), filename); + gtk_entry_set_text (GTK_ENTRY (win.filename_entry), filename); - if (preferences.filename) - free ((void *) preferences.filename); - preferences.filename = strdup (filename); - DBG (DBG_debug, "xcam: browse_filename_callback: exit\n"); + if (preferences.filename) + free ((void *) preferences.filename); + preferences.filename = filename; + } + DBG (DBG_debug, "browse_filename_callback: finished\n"); } static void @@ -1741,7 +1747,8 @@ main (int argc, char **argv) { DBG (DBG_fatal, "init: sane_main failed: %s\n", sane_strstatus (status)); - exit (1); + xcam_exit(); + exit(1); } if (argc > 1) @@ -1753,15 +1760,18 @@ main (int argc, char **argv) { case 'V': printf ("xcam (%s) %s\n", PACKAGE, VERSION); - exit (0); + xcam_exit(); + exit(0); case 'B': win.buf_backend_size = 1024 * 1024; break; + case 'h': default: usage (); - exit (0); + xcam_exit(); + exit(0); } } } @@ -1774,8 +1784,6 @@ main (int argc, char **argv) gdk_set_show_events (0); gtk_init (&argc, &argv); - atexit (xcam_exit); - win.gdk_input_tag = -1; win.shell = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (win.shell), (char *) prog_name); @@ -1986,5 +1994,6 @@ main (int argc, char **argv) pref_xcam_save (); DBG (DBG_debug, "xcam main exit\n"); + xcam_exit(); return 0; } diff --git a/src/xscanimage.c b/src/xscanimage.c index b87b6b3..b01fa99 100644 --- a/src/xscanimage.c +++ b/src/xscanimage.c @@ -1205,6 +1205,7 @@ scan_start (void) snprintf (buf, sizeof (buf), _("Failed to start scanner: %s"), sane_strstatus (status)); gsg_error (buf); + scan_done (); return; } @@ -1473,11 +1474,7 @@ files_build_menu (void) DBG (DBG_debug, "files_build_menu\n"); menu = gtk_menu_new (); - item = gtk_menu_item_new (); - gtk_container_add (GTK_CONTAINER (menu), item); - gtk_widget_show (item); - - item = gtk_menu_item_new_with_label (_("Exit")); + item = gtk_menu_item_new_with_label ("Exit"); gtk_container_add (GTK_CONTAINER (menu), item); g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (files_exit_callback), 0); @@ -1815,7 +1812,7 @@ pref_build_menu (void) gtk_widget_show (item); /* insert separator: */ - item = gtk_menu_item_new (); + item = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); @@ -1838,22 +1835,18 @@ pref_build_menu (void) static void browse_filename_callback (GtkWidget * widget, gpointer data) { - char filename[1024]; + char *filename = NULL; DBG (DBG_debug, "browse_filename_callback\n"); - if (preferences.filename) - { - strncpy (filename, preferences.filename, sizeof (filename)); - filename[sizeof (filename) - 1] = '\0'; - } - else - strcpy (filename, OUTFILENAME); - gsg_get_filename ("Output Filename", filename, sizeof (filename), filename); - gtk_entry_set_text (GTK_ENTRY (scan_win.filename_entry), filename); - if (preferences.filename) - free ((void *) preferences.filename); - preferences.filename = strdup (filename); + if (gsg_get_filename ("Output Filename", preferences.filename? preferences.filename: OUTFILENAME, &filename, SANE_TRUE) == 0) + { + gtk_entry_set_text (GTK_ENTRY (scan_win.filename_entry), filename); + + if (preferences.filename) + free ((void *) preferences.filename); + preferences.filename = filename; + } DBG (DBG_debug, "browse_filename_callback: finished\n"); }