summaryrefslogtreecommitdiff
path: root/backend/pixma/pixma.c
diff options
context:
space:
mode:
Diffstat (limited to 'backend/pixma/pixma.c')
-rw-r--r--backend/pixma/pixma.c48
1 files changed, 39 insertions, 9 deletions
diff --git a/backend/pixma/pixma.c b/backend/pixma/pixma.c
index 72385b2..cd89e99 100644
--- a/backend/pixma/pixma.c
+++ b/backend/pixma/pixma.c
@@ -851,18 +851,48 @@ control_option (pixma_sane_t * ss, SANE_Int n,
case opt_source:
if ((cfg->cap & (PIXMA_CAP_ADF|PIXMA_CAP_ADFDUP|PIXMA_CAP_TPU))
&& (a == SANE_ACTION_SET_VALUE || a == SANE_ACTION_SET_AUTO))
- { /* new source selected: flatbed, ADF, TPU, ... */
- /* to avoid fatal errors,
- * select first entry of dynamic mode_list
- * identifiers are unknown here */
- OVAL (opt_mode).w = ss->mode_map[0];
+ {
+ /* new source selected: flatbed, ADF, TPU, ... */
+ pixma_scan_mode_t curr_mode = ss->mode_map[OVAL (opt_mode).w];
+ SANE_Word curr_res = OVAL (opt_resolution).w;
+
/* recreate dynamic lists */
create_mode_list (ss);
create_dpi_list (ss);
- /* to avoid fatal errors,
- * select first entry of dynamic dpi_list
- * identifiers are unknown here */
- OVAL (opt_resolution).w = ss->dpi_list[1];
+
+ /*
+ * Check to see if the mode and res are still valid.
+ * Replace with default mode or closest res if not.
+ *
+ */
+ for (SANE_Int mode_idx = 0;; mode_idx++)
+ {
+ if (!ss->mode_list[mode_idx])
+ {
+ OVAL (opt_mode).w = 0;
+ break;
+ }
+ if (curr_mode == ss->mode_map[mode_idx])
+ {
+ OVAL (opt_mode).w = mode_idx;
+ break;
+ }
+ }
+
+ for (SANE_Int res_idx = 1;; res_idx++)
+ {
+ if (res_idx > ss->dpi_list[0])
+ {
+ OVAL (opt_resolution).w = ss->dpi_list[1];
+ break;
+ }
+ if (ss->dpi_list[res_idx] >= curr_res)
+ {
+ OVAL (opt_resolution).w = ss->dpi_list[res_idx];
+ break;
+ }
+ }
+
if (ss->mode_map[OVAL (opt_mode).w] == PIXMA_SCAN_MODE_LINEART)
{ /* lineart */
enable_option (ss, opt_threshold, SANE_TRUE);