diff --git a/Changelog b/Changelog index 39b2f81..5a3c30b 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,9 @@ +2008-06-06 Stéphane Voltz + * src/gtkglue.c src/preview.c src/progress.c src/progress.h + src/scanadf.c src/xcam.c src/xscanimage.c configure.in configure: + change version to SANE 1.1, compile fixes for SANE 1.1, progress + dialog improvement and handling of SANE_STATUS_WRMING_UP + 2008-04-30 Gerard Klaver * src/xcam.c: For GRAY view mode added time stamp option, removed compiler warning for DBG line diff --git a/configure b/configure index 977c2cc..58da820 100755 --- a/configure +++ b/configure @@ -1324,8 +1324,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # version code: V_MAJOR=1 -V_MINOR=0 -V_BUILD=14 +V_MINOR=1 +V_BUILD=0 V_EXTRA=-cvs PACKAGE=sane-frontends @@ -6163,7 +6163,7 @@ else echo "${ECHO_T}no" >&6 fi - min_sane_version=1.0.0 + min_sane_version=1.1.0 echo "$as_me:$LINENO: checking for SANE - version >= $min_sane_version" >&5 echo $ECHO_N "checking for SANE - version >= $min_sane_version... $ECHO_C" >&6 no_sane="" diff --git a/configure.in b/configure.in index eafa882..2d6e26c 100644 --- a/configure.in +++ b/configure.in @@ -6,8 +6,8 @@ AC_CONFIG_HEADER(include/sane/config.h) # version code: V_MAJOR=1 -V_MINOR=0 -V_BUILD=14 +V_MINOR=1 +V_BUILD=0 V_EXTRA=-cvs PACKAGE=sane-frontends @@ -112,7 +112,7 @@ fi AC_CHECK_TOOL(RANLIB, ranlib, :) -AM_PATH_SANE(1.0.0, HAVE_SANE=yes, ) +AM_PATH_SANE(1.1.0, HAVE_SANE=yes, ) dnl Print error message if sane is missing if test "x${HAVE_SANE}" = "x"; then echo "**********************************************************************" diff --git a/src/gtkglue.c b/src/gtkglue.c index ba5cbf5..1981958 100644 --- a/src/gtkglue.c +++ b/src/gtkglue.c @@ -1475,9 +1475,10 @@ gsg_set_sensitivity (GSGDialog * dialog, int sensitive) if (!SANE_OPTION_IS_ACTIVE (opt->cap) || opt->type == SANE_TYPE_GROUP || !dialog->element[i].widget) continue; - +#ifdef SANE_CAP_ALWAYS_SETTABLE if (!(opt->cap & SANE_CAP_ALWAYS_SETTABLE)) gtk_widget_set_sensitive (dialog->element[i].widget, sensitive); +#endif } } diff --git a/src/preview.c b/src/preview.c index 6fb21c0..f2ef50f 100644 --- a/src/preview.c +++ b/src/preview.c @@ -73,11 +73,13 @@ #include #include +#include #include #include "gtkglue.h" #include "preview.h" #include "preferences.h" +#include "progress.h" #define DBG_fatal 0 #define DBG_error 1 @@ -860,6 +862,10 @@ scan_start (Preview * p) SANE_Status status; char buf[256]; int fd, y; + Progress_t *progress; +#ifdef HAVE_SYS_TIME_H + struct timeval start, current; +#endif gtk_widget_set_sensitive (p->cancel, TRUE); gtk_widget_set_sensitive (p->preview, FALSE); @@ -881,6 +887,28 @@ scan_start (Preview * p) gsg_sync (p->dialog); status = sane_start (dev); + if (status == SANE_STATUS_WARMING_UP) + { + snprintf (buf, sizeof (buf), "Scanner is warming up."); + progress = + progress_new ("Warming up ...", buf, GTK_WINDOW(p->top), NULL, 0); +#ifdef HAVE_SYS_TIME_H + gettimeofday (&start, NULL); +#endif + while (status == SANE_STATUS_WARMING_UP) + { +#ifdef HAVE_SYS_TIME_H + gettimeofday (¤t, NULL); + /* we assume that warming up won't exceed 60 seconds */ + progress_update (progress, + (current.tv_sec - start.tv_sec) / (gfloat) 60); +#endif + while (gtk_events_pending ()) + gtk_main_iteration (); + status = sane_start (dev); + } + progress_free (progress); + } if (status != SANE_STATUS_GOOD) { snprintf (buf, sizeof (buf), diff --git a/src/progress.c b/src/progress.c index 4957295..d78bbb4 100644 --- a/src/progress.c +++ b/src/progress.c @@ -23,9 +23,6 @@ #include #include "progress.h" -static const int progress_x = 5; -static const int progress_y = 5; - void progress_cancel (GtkWidget * widget, gpointer data) { @@ -36,18 +33,26 @@ progress_cancel (GtkWidget * widget, gpointer data) Progress_t * -progress_new (char *title, char *text, +progress_new (char *title, char *text, GtkWindow *parent, GtkSignalFunc callback, gpointer callback_data) { GtkWidget *button, *label; GtkBox *vbox, *hbox; Progress_t *p; +#if GTK_MAJOR_VERSION < 2 + gint x,y; +#endif p = (Progress_t *) malloc (sizeof (Progress_t)); p->callback = callback; p->shell = gtk_dialog_new (); - gtk_widget_set_uposition (p->shell, progress_x, progress_y); +#if GTK_MAJOR_VERSION < 2 + gtk_window_get_position (GTK_WINDOW(parent), &x, &y); + gtk_widget_set_uposition (p->shell, x, y); +#else + gtk_window_set_transient_for (GTK_WINDOW (p->shell),parent); +#endif gtk_window_set_title (GTK_WINDOW (p->shell), title); vbox = GTK_BOX (GTK_DIALOG (p->shell)->vbox); hbox = GTK_BOX (GTK_DIALOG (p->shell)->action_area); @@ -62,14 +67,19 @@ progress_new (char *title, char *text, gtk_widget_set_usize (p->pbar, 200, 20); gtk_box_pack_start (vbox, p->pbar, TRUE, TRUE, 0); - button = gtk_toggle_button_new_with_label ("Cancel"); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - (GtkSignalFunc) progress_cancel, p); - gtk_box_pack_start (hbox, button, TRUE, TRUE, 0); + /* no cancel button if no callback */ + if (callback != NULL) + { + button = gtk_toggle_button_new_with_label ("Cancel"); + gtk_signal_connect (GTK_OBJECT (button), "clicked", + (GtkSignalFunc) progress_cancel, p); + gtk_box_pack_start (hbox, button, TRUE, TRUE, 0); + } gtk_widget_show (label); gtk_widget_show (p->pbar); - gtk_widget_show (button); + if (callback != NULL) + gtk_widget_show (button); gtk_widget_show (GTK_WIDGET (p->shell)); gtk_progress_bar_update (GTK_PROGRESS_BAR (p->pbar), 0); return p; diff --git a/src/progress.h b/src/progress.h index 13a924e..305d876 100644 --- a/src/progress.h +++ b/src/progress.h @@ -19,16 +19,17 @@ #define progress_h typedef struct Progress_t - { - GtkSignalFunc callback; - gpointer callback_data; - GtkWidget *shell; - GtkWidget *pbar; - } +{ + GtkSignalFunc callback; + gpointer callback_data; + GtkWidget *shell; + GtkWidget *pbar; +} Progress_t; -extern Progress_t *progress_new (char *, char *, GtkSignalFunc, void *); -extern void progress_free (Progress_t *); -extern void progress_update (Progress_t *, gfloat); +extern Progress_t * progress_new (char *title, char *text, GtkWindow *parent, + GtkSignalFunc callback, gpointer callback_data); +extern void progress_free (Progress_t *p); +extern void progress_update (Progress_t *p, gfloat newval); #endif /* progress_h */ diff --git a/src/scanadf.c b/src/scanadf.c index a9e604c..e5b976a 100644 --- a/src/scanadf.c +++ b/src/scanadf.c @@ -971,7 +971,10 @@ scan_it_raw (const char *fname, SANE_Bool raw, const char *script, do { - status = sane_start (device); + do + { + status = sane_start (device); + } while (status == SANE_STATUS_WARMING_UP); if (status != SANE_STATUS_GOOD) { if (status != SANE_STATUS_NO_DOCS) diff --git a/src/xcam.c b/src/xcam.c index 796ffad..7274d88 100644 --- a/src/xcam.c +++ b/src/xcam.c @@ -404,9 +404,15 @@ xcam_add_text (SANE_Byte * image, int width, int height, char *txt) snprintf (buf, sizeof (buf), "Time stamp for separate channel transfers are not supported"); break; + default: + snprintf (buf, sizeof (buf), + "Unsupported image format %d", win.params.format); + DBG (DBG_error, "xcam_add_text: unsupported image format %d\n", + win.params.format); + status = SANE_STATUS_INVAL; } DBG (DBG_debug, "xcam_add_text: exit vw=%d, vh=%d\n", width, height); - status = (SANE_STATUS_GOOD); + status = SANE_STATUS_GOOD; return status; } @@ -1215,7 +1221,11 @@ next_frame (void) DBG (DBG_debug, "xcam: next frame, start gsg_sync\n"); gsg_sync (dialog); - status = sane_start (gsg_dialog_get_device (dialog)); + do + { + status = sane_start (gsg_dialog_get_device (dialog)); + } + while (status == SANE_STATUS_WARMING_UP); if (status != SANE_STATUS_GOOD) { sprintf (buf, "Failed to start webcam: %s.", sane_strstatus (status)); @@ -1437,6 +1447,8 @@ save_frame (void) case SANE_FRAME_GRAY: frame_type = "gray"; break; + default: + frame_type = "RGB"; } if (!win.header_size) @@ -1472,6 +1484,11 @@ save_frame (void) win.params.pixels_per_line, win.params.lines, (win.params.depth <= 8) ? 255 : 65535); break; + default: + snprintf (buf, sizeof (buf), + "Unsupported image format %d", win.params.format); + DBG (DBG_error, "xcam_add_text: unsupported image format %d\n", + win.params.format); } win.header_size = ftell (win.out); fwrite (win.buf, 1, win.num_bytes, win.out); diff --git a/src/xscanimage.c b/src/xscanimage.c index 86e625f..6858880 100644 --- a/src/xscanimage.c +++ b/src/xscanimage.c @@ -49,9 +49,9 @@ #define BACKEND_NAME xscanimage #include "../include/sane/sanei_debug.h" -#include -#include -#include +#include "progress.h" +#include "preferences.h" +#include "preview.h" #ifndef PATH_MAX # define PATH_MAX 1024 @@ -1026,11 +1026,11 @@ scan_done (void) } static void -progress_cancel (void) +cancel_action (void) { - DBG (DBG_debug, "progress_cancel\n"); + DBG (DBG_debug, "cancel_action\n"); sane_cancel (gsg_dialog_get_device (dialog)); - DBG (DBG_debug, "progress_cancel: done\n"); + DBG (DBG_debug, "cancel_action: done\n"); } static void @@ -1043,6 +1043,10 @@ scan_start (void) SANE_Word resolution; #endif /* HAVE_LIBGIMP_GIMP_H */ +#ifdef HAVE_SYS_TIME_H + struct timeval start, current; +#endif + const char *frame_type = 0; char buf[256]; int fd; @@ -1089,7 +1093,32 @@ scan_start (void) while (gtk_events_pending ()) gtk_main_iteration (); + status = sane_start (dev); + if (status == SANE_STATUS_WARMING_UP) + { + if (scan_win.progress) + progress_free (scan_win.progress); + snprintf (buf, sizeof (buf), "Scanner is warming up."); + scan_win.progress = progress_new ("Warming up ...", buf, scan_win.shell, + (GtkSignalFunc) cancel_action, NULL); +#ifdef HAVE_SYS_TIME_H + gettimeofday(&start,NULL); +#endif + while (status == SANE_STATUS_WARMING_UP) + { +#ifdef HAVE_SYS_TIME_H + gettimeofday(¤t,NULL); + /* we assume that warming up won't exceed 60 seconds */ + progress_update (scan_win.progress, (gfloat)(current.tv_sec - start.tv_sec) / (gfloat) 60); +#endif + while (gtk_events_pending ()) + gtk_main_iteration (); + status = sane_start (dev); + } + progress_free (scan_win.progress); + scan_win.progress = 0; + } if (status != SANE_STATUS_GOOD) { gsg_set_sensitivity (dialog, TRUE); @@ -1259,8 +1288,8 @@ scan_start (void) #endif /* HAVE_LIBGIMP_GIMP_H */ if (scan_win.progress) progress_free (scan_win.progress); - scan_win.progress = progress_new ("Scanning", buf, - (GtkSignalFunc) progress_cancel, 0); + scan_win.progress = progress_new ("Scanning", buf, GTK_WINDOW(scan_win.shell), + (GtkSignalFunc) cancel_action, 0); scan_win.input_tag = -1; if (sane_set_io_mode (dev, SANE_TRUE) == SANE_STATUS_GOOD