diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2024-06-30 15:46:39 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2024-06-30 15:46:39 +0200 |
commit | 73365252941d4053dca0e7fa06f4c205194cf1b8 (patch) | |
tree | 3eff4566f12e48cfee6b35955d262e46ee5a5da1 /backend/pixma/pixma.c | |
parent | 52c7d661296d9efb9a51b52c38dda22516cf981a (diff) | |
parent | 3c9b873509b5c2278d4e345bf86a22c1ff26f3c0 (diff) |
Merge branch 'release/debian/1.3.0-1'debian/1.3.0-1
Diffstat (limited to 'backend/pixma/pixma.c')
-rw-r--r-- | backend/pixma/pixma.c | 48 |
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); |