去掉设置对话框上面的sane_io_control相关调用

This commit is contained in:
luoliangyi 2023-05-29 16:49:43 +08:00
parent bfb53a388c
commit c4fe1495ec
3 changed files with 80 additions and 30 deletions

View File

@ -195,12 +195,76 @@ public:
gb::scanner_cfg::update(conf, &func); gb::scanner_cfg::update(conf, &func);
} }
static SANE_Status restore_settings(const SANEAPI* saneApi, SANE_Handle h)
{
SANE_Int dev_options = 0;
saneApi->sane_control_option_api(h, 0, SANE_ACTION_GET_VALUE, &dev_options, nullptr);
for(int i = 1; i < dev_options; ++i)
{
const SANE_Option_Descriptor* opt = saneApi->sane_get_option_descriptor_api(h, i);
if(!opt)
continue;
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_AUTO, NULL, NULL);
}
return SANE_STATUS_GOOD;
}
static SANE_Status get_default_value(const SANEAPI* saneApi, SANE_Handle h, int i, void* def)
{
const SANE_Option_Descriptor* opt = saneApi->sane_get_option_descriptor_api(h, i);
if(!opt)
{
return SANE_STATUS_INVAL;
}
if(opt->type == SANE_TYPE_BOOL)
{
SANE_Bool v = SANE_TRUE;
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, &v, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_AUTO, NULL, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, def, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_VALUE, &v, NULL);
}
else if (opt->type == SANE_TYPE_INT)
{
SANE_Int v = 0;
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, &v, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_AUTO, NULL, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, def, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_VALUE, &v, NULL);
}
else if(opt->type == SANE_TYPE_FIXED)
{
SANE_Fixed v = 0;
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, &v, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_AUTO, NULL, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, def, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_VALUE, &v, NULL);
}
else
{
char *buf = new char[opt->size + 4];
memset(buf, 0, opt->size + 4);
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, buf, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_AUTO, NULL, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_GET_VALUE, def, NULL);
saneApi->sane_control_option_api(h, i, SANE_ACTION_SET_VALUE, buf, NULL);
delete[] buf;
}
return SANE_STATUS_GOOD;
}
static SANE_Status set_custom_gamma(const SANEAPI* saneApi, SANE_Handle h, SANE_Gamma *gamma)
{
return saneApi->sane_control_option_api(h, 0x885A, SANE_ACTION_SET_VALUE, gamma, NULL);
}
static void apply_scheme(const SANEAPI* saneApi, SANE_Handle h, gb::sane_config_schm* schm) static void apply_scheme(const SANEAPI* saneApi, SANE_Handle h, gb::sane_config_schm* schm)
{ {
SANE_Int count = 0, none = 0; SANE_Int count = 0, none = 0;
std::string name(""), val(""); std::string name(""), val("");
none = saneApi->sane_io_control_api(h, IO_CTRL_CODE_RESTORE_SETTINGS, NULL, NULL); none = restore_settings(saneApi, h);
if(schm && schm->id_from_name(SANE_STD_OPT_NAME_COLOR_MODE) == -1) if(schm && schm->id_from_name(SANE_STD_OPT_NAME_COLOR_MODE) == -1)
{ {
SANE_Int dev_options = 0; SANE_Int dev_options = 0;
@ -215,24 +279,24 @@ public:
if(opt->type == SANE_TYPE_BOOL) if(opt->type == SANE_TYPE_BOOL)
{ {
SANE_Bool v = SANE_TRUE; SANE_Bool v = SANE_TRUE;
saneApi->sane_io_control_api(h, IO_CTRL_CODE_GET_DEFAULT_VALUE, &v, &n); get_default_value(saneApi, h, n, &v);
schm->set_default_value(i, opt->name, (char*)&v, sizeof(v)); schm->set_default_value(i, opt->name, (char*)&v, sizeof(v));
} }
else if (opt->type == SANE_TYPE_INT) { else if (opt->type == SANE_TYPE_INT) {
SANE_Int v = 0; SANE_Int v = 0;
saneApi->sane_io_control_api(h, IO_CTRL_CODE_GET_DEFAULT_VALUE, &v, &n); get_default_value(saneApi, h, n, &v);
schm->set_default_value(i, opt->name, (char*)&v, sizeof(v)); schm->set_default_value(i, opt->name, (char*)&v, sizeof(v));
} }
else if(opt->type == SANE_TYPE_FIXED) else if(opt->type == SANE_TYPE_FIXED)
{ {
SANE_Fixed v = 0; SANE_Fixed v = 0;
saneApi->sane_io_control_api(h, IO_CTRL_CODE_GET_DEFAULT_VALUE, &v, &n); get_default_value(saneApi, h, n, &v);
schm->set_default_value(i, opt->name, (char*)&v, sizeof(v)); schm->set_default_value(i, opt->name, (char*)&v, sizeof(v));
} }
else { else {
char *buf = new char[opt->size + 4]; char *buf = new char[opt->size + 4];
memset(buf, 0, opt->size + 4); memset(buf, 0, opt->size + 4);
saneApi->sane_io_control_api(h, IO_CTRL_CODE_GET_DEFAULT_VALUE, buf, &n); get_default_value(saneApi, h, n, buf);
std::string langCN(to_default_language(buf, nullptr)); std::string langCN(to_default_language(buf, nullptr));
schm->set_default_value(i, opt->name, &langCN[0], langCN.length()); schm->set_default_value(i, opt->name, &langCN[0], langCN.length());
delete[] buf; delete[] buf;
@ -250,8 +314,7 @@ public:
{ {
if(name == SANE_STD_OPT_NAME_IS_CUSTOM_GAMMA && val.length() == sizeof(SANE_Gamma)) if(name == SANE_STD_OPT_NAME_IS_CUSTOM_GAMMA && val.length() == sizeof(SANE_Gamma))
{ {
unsigned int l = val.length(); set_custom_gamma(saneApi, h, (SANE_Gamma*)&val[0]);
saneApi->sane_io_control_api(h, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &val[0], &l);
} }
} }
} }

View File

@ -173,7 +173,7 @@ void hg_settingdialog::updateOpt()
if(first) if(first)
{ {
unsigned int n = i; unsigned int n = i;
m_saneAPI.sane_io_control_api(m_devHandle, IO_CTRL_CODE_GET_DEFAULT_VALUE, &init, &n); dev_que::get_default_value(&m_saneAPI, m_devHandle, n, &init);
cur_scheme_->set_default_value(i, opt->name, (char*)&init, sizeof(init)); cur_scheme_->set_default_value(i, opt->name, (char*)&init, sizeof(init));
} }
} }
@ -187,7 +187,7 @@ void hg_settingdialog::updateOpt()
if(first) if(first)
{ {
unsigned int n = i; unsigned int n = i;
m_saneAPI.sane_io_control_api(m_devHandle, IO_CTRL_CODE_GET_DEFAULT_VALUE, &init, &n); dev_que::get_default_value(&m_saneAPI, m_devHandle, n, &init);
cur_scheme_->set_default_value(i, opt->name, (char*)&init, sizeof(init)); cur_scheme_->set_default_value(i, opt->name, (char*)&init, sizeof(init));
} }
} }
@ -201,7 +201,7 @@ void hg_settingdialog::updateOpt()
if(first) if(first)
{ {
unsigned int n = i; unsigned int n = i;
m_saneAPI.sane_io_control_api(m_devHandle, IO_CTRL_CODE_GET_DEFAULT_VALUE, &init, &n); dev_que::get_default_value(&m_saneAPI, m_devHandle, n, &init);
cur_scheme_->set_default_value(i, opt->name, (char*)&init, sizeof(init)); cur_scheme_->set_default_value(i, opt->name, (char*)&init, sizeof(init));
} }
} }
@ -216,7 +216,7 @@ void hg_settingdialog::updateOpt()
if(first) if(first)
{ {
unsigned int n = i; unsigned int n = i;
int err = m_saneAPI.sane_io_control_api(m_devHandle, IO_CTRL_CODE_GET_DEFAULT_VALUE, init, &n); int err = dev_que::get_default_value(&m_saneAPI, m_devHandle, n, init);
(void)err; (void)err;
std::string langCN(to_default_language(init, nullptr)); std::string langCN(to_default_language(init, nullptr));
cur_scheme_->set_default_value(i, opt->name, &langCN[0], langCN.length()); cur_scheme_->set_default_value(i, opt->name, &langCN[0], langCN.length());
@ -1249,8 +1249,7 @@ void hg_settingdialog::slot_gammaButtonClicked()
} }
} }
unsigned int len = sizeof(SANE_Gamma); dev_que::set_custom_gamma(&m_saneAPI, m_devHandle, &m_gammaData);
m_saneAPI.sane_io_control_api(m_devHandle, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &m_gammaData, &len);
cur_scheme_->config_changed(SANE_STD_OPT_NAME_IS_CUSTOM_GAMMA, (char*)&m_gammaData, sizeof(m_gammaData), true); cur_scheme_->config_changed(SANE_STD_OPT_NAME_IS_CUSTOM_GAMMA, (char*)&m_gammaData, sizeof(m_gammaData), true);
} }
} }
@ -1870,23 +1869,11 @@ void hg_settingdialog::cancel_setting(void)
dev_que::apply_scheme(&m_saneAPI, m_devHandle, cur_scheme_); dev_que::apply_scheme(&m_saneAPI, m_devHandle, cur_scheme_);
} }
void hg_settingdialog::getAppVersion() std::string hg_settingdialog::getAppVersion()
{ {
SANE_About *about = nullptr; char v[256] = {0};
unsigned int len = 0; m_saneAPI.sane_control_option_api(m_devHandle, (SANE_Int)0x884A, SANE_ACTION_GET_VALUE, v, NULL);
std::string versionNum; return v;
if (m_saneAPI.sane_io_control_api(m_devHandle, IO_CTRL_CODE_ABOUT_INFO, about, &len) == SANE_STATUS_NO_MEM)
{
about = (SANE_About*)malloc(len + 128);
if (about)
{
memset(about, 0, len + 128);
if (m_saneAPI.sane_io_control_api(m_devHandle, IO_CTRL_CODE_ABOUT_INFO, about, &len) == SANE_STATUS_GOOD)
{
versionNum = about->version;
}
}
}
} }
void hg_settingdialog::apply_current_scheme(void) void hg_settingdialog::apply_current_scheme(void)
{ {

View File

@ -104,7 +104,7 @@ private:
std::string getCurUiShemeName(std::string name); std::string getCurUiShemeName(std::string name);
void save_scheme(void); void save_scheme(void);
void cancel_setting(void); void cancel_setting(void);
void getAppVersion(); std::string getAppVersion();
void apply_current_scheme(void); void apply_current_scheme(void);
private: private: