From 59885e039e7853704dfefa3a86828ba5359c6734 Mon Sep 17 00:00:00 2001 From: Ralph Little Date: Tue, 7 Mar 2023 22:10:54 -0800 Subject: [PATCH] pixma: don't change resolution or mode when changing source If currently selected resolution and mode are still valid when changing source then retain the selected value rather than picking defaults. --- backend/pixma/pixma.c | 48 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/backend/pixma/pixma.c b/backend/pixma/pixma.c index 72385b286..cd89e99e2 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);