diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2024-03-03 09:54:51 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2024-03-03 09:54:51 +0100 |
commit | 44916ca6d75e0b5f258a098a50d659f31c6625fd (patch) | |
tree | 2e51a12ae43b3def9e55d3f2c9ca60d2032ad45c /backend/pixma/pixma.c | |
parent | 84357741a6a6e6430f199b2c3f7498e0e97da9ad (diff) |
New upstream version 1.3.0upstream/1.3.0
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); |