diff --git a/app/scanner/device_user.cpp b/app/scanner/device_user.cpp index 543ea3e2..5f7ef39e 100644 --- a/app/scanner/device_user.cpp +++ b/app/scanner/device_user.cpp @@ -57,7 +57,7 @@ HGResult DeviceUser::ShowSettingDlg() HGResult DeviceUser::StartScan() { - return HGTwain_EnableDS(m_twainDS, HGFALSE, nullptr, DSCloseReqFunc, this, DSImageFunc, this); + return HGTwain_EnableDS(m_twainDS, HGFALSE, (HWND)m_wnd->winId(), DSCloseReqFunc, this, DSImageFunc, this); } HGResult DeviceUser::StartSingleScan() diff --git a/modules/twainui/Manager.cpp b/modules/twainui/Manager.cpp index 0fedac1d..fa107c40 100644 --- a/modules/twainui/Manager.cpp +++ b/modules/twainui/Manager.cpp @@ -9,11 +9,11 @@ Manager::Manager() HGBase_CreateEvent(HGFALSE, HGFALSE, &m_event); connect(this, SIGNAL(init()), this, SLOT(on_init())); - connect(this, SIGNAL(createDeviceSelect()), this, SLOT(on_createDeviceSelect())); - connect(this, SIGNAL(createSettingUi()), this, SLOT(on_createSettingUi())); - connect(this, SIGNAL(createProgressUi()), this, SLOT(on_createProgressUi())); - connect(this, SIGNAL(createMessageBoxUi()), this, SLOT(on_createMessageBoxUi())); - connect(this, SIGNAL(createTwainSrcUi()), this, SLOT(on_createTwainSrcUi())); + connect(this, SIGNAL(createDeviceSelect(bool)), this, SLOT(on_createDeviceSelect(bool))); + connect(this, SIGNAL(createSettingUi(bool)), this, SLOT(on_createSettingUi(bool))); + connect(this, SIGNAL(createProgressUi(bool)), this, SLOT(on_createProgressUi(bool))); + connect(this, SIGNAL(createMessageBoxUi(bool)), this, SLOT(on_createMessageBoxUi(bool))); + connect(this, SIGNAL(createTwainSrcUi(bool)), this, SLOT(on_createTwainSrcUi(bool))); emit init(); } @@ -27,23 +27,26 @@ Manager::~Manager() HGBase_DestroyEvent(m_event); } -int Manager::showDeviceSelect(const std::vector& devs) +int Manager::showDeviceSelect(bool qt, const std::vector& devs) { m_DeviceSelectDevs = devs; m_DeviceSelectThreadId = GetCurrentThreadId(); - emit createDeviceSelect(); + emit createDeviceSelect(qt); - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) + if (!qt) { - TranslateMessage(&msg); - DispatchMessage(&msg); + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } return m_DeviceSelectResult; } -int Manager::showSettingUi(SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan, std::function callback) +int Manager::showSettingUi(bool qt, SANE_Handle device, HWND parent, LPSANEAPI api, const char *devName, bool with_scan, std::function callback) { m_device = device; m_settingUiParent = parent; @@ -54,45 +57,55 @@ int Manager::showSettingUi(SANE_Handle device, HWND parent, LPSANEAPI api, const m_SettingUiThreadId = GetCurrentThreadId(); - emit createSettingUi(); + emit createSettingUi(qt); return 0; } -int Manager::showProgressUi(HWND parent, std::function callback, std::function *notify) +int Manager::showProgressUi(bool qt, HWND parent, std::function callback, std::function *notify) { m_progressUiparent = parent; + hg_settingdialog *settingDlg = hg_settingdialog::GetSettingDialog(); + if (nullptr != settingDlg) + m_progressUiparent = (HWND)settingDlg->winId(); m_progressUiCallback = callback; m_notify = notify; - m_ProgressUiThreadId = GetCurrentThreadId(); - emit createProgressUi(); - - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) + if (!qt) { - TranslateMessage(&msg); - DispatchMessage(&msg); + m_ProgressUiThreadId = GetCurrentThreadId(); + emit createProgressUi(qt); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + else + { + on_createProgressUi(qt); } return 0; } -int Manager::showMessageBoxUi(HWND parent, int event, void *msg, int flag) +int Manager::showMessageBoxUi(bool qt, HWND parent, int event, void *msg, int flag) { - m_messageBoxUiParent = parent; + m_messageBoxUiParent = nullptr; m_notifyEvent = event; m_message = (char*)msg; m_flag = flag; m_MessageBoxUiThreadId = GetCurrentThreadId(); - emit createMessageBoxUi(); + emit createMessageBoxUi(qt); return 0; } -int Manager::showTwainSrcUi(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWindow parent, TW_IDENTITY *ds) +int Manager::showTwainSrcUi(bool qt, DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWindow parent, TW_IDENTITY *ds) { m_twainSrcUiThreadId = GetCurrentThreadId(); @@ -102,13 +115,16 @@ int Manager::showTwainSrcUi(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWi memset(ds, 0, sizeof(TW_IDENTITY)); memset(&m_ds, 0, sizeof(TW_IDENTITY)); - emit createTwainSrcUi(); + emit createTwainSrcUi(qt); - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) + if (!qt) { - TranslateMessage(&msg); - DispatchMessage(&msg); + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } memcpy(ds, &m_ds, sizeof(TW_IDENTITY)); @@ -133,15 +149,19 @@ void Manager::on_init() QCoreApplication::installTranslator(&m_translator_qt); } -void Manager::on_createDeviceSelect() +void Manager::on_createDeviceSelect(bool qt) { Dialog_device_select dlg(m_DeviceSelectDevs); dlg.exec(); m_DeviceSelectResult = dlg.getDevId(); - ::PostThreadMessage(m_DeviceSelectThreadId, WM_QUIT, 0, 0); + + if (!qt) + { + ::PostThreadMessage(m_DeviceSelectThreadId, WM_QUIT, 0, 0); + } } -void Manager::on_createSettingUi() +void Manager::on_createSettingUi(bool qt) { QWidget *qParent = nullptr; #ifdef HG_CMP_MSC @@ -160,7 +180,7 @@ void Manager::on_createSettingUi() dlg->show(); } -void Manager::on_createProgressUi() +void Manager::on_createProgressUi(bool qt) { QWidget *qParent = nullptr; #ifdef HG_CMP_MSC @@ -170,6 +190,7 @@ void Manager::on_createProgressUi() win->showCentered(); qParent = win; } + #else qParent = m_progressUiparent; #endif @@ -177,10 +198,14 @@ void Manager::on_createProgressUi() Dialog_progress_ui *dlg = new Dialog_progress_ui(m_progressUiCallback, m_notify, qParent); dlg->setModal(true); dlg->show(); - ::PostThreadMessage(m_ProgressUiThreadId, WM_QUIT, 0, 0); + + if (!qt) + { + ::PostThreadMessage(m_ProgressUiThreadId, WM_QUIT, 0, 0); + } } -void Manager::on_createMessageBoxUi() +void Manager::on_createMessageBoxUi(bool qt) { QWidget *qParent = nullptr; #ifdef HG_CMP_MSC @@ -195,11 +220,12 @@ void Manager::on_createMessageBoxUi() #endif QMessageBox *msg = new QMessageBox(QMessageBox::Critical, tr("Prompt"), QString::fromStdString(m_message), QMessageBox::Ok, qParent); + msg->setWindowFlags(Qt::SubWindow | Qt::Popup | Qt::WindowStaysOnTopHint); msg->setModal(true); msg->show(); } -void Manager::on_createTwainSrcUi() +void Manager::on_createTwainSrcUi(bool qt) { QWidget *qParent = nullptr; #ifdef HG_CMP_MSC @@ -218,5 +244,9 @@ void Manager::on_createTwainSrcUi() { dlg.GetIdentify(&m_ds); } - ::PostThreadMessage(m_twainSrcUiThreadId, WM_QUIT, 0, 0); + + if (!qt) + { + ::PostThreadMessage(m_twainSrcUiThreadId, WM_QUIT, 0, 0); + } } diff --git a/modules/twainui/Manager.h b/modules/twainui/Manager.h index 9753ddfd..ca0cc781 100644 --- a/modules/twainui/Manager.h +++ b/modules/twainui/Manager.h @@ -15,27 +15,27 @@ public: Manager(); ~Manager(); - int showDeviceSelect(const std::vector& devs); - int showSettingUi(SANE_Handle device, HWND settingUiParent, LPSANEAPI api, const char *devName, bool with_scan, std::function callback); - int showProgressUi(HWND parent, std::function callback, std::function *notify); - int showMessageBoxUi(HWND parent, int event, void *msg, int flag); - int showTwainSrcUi(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWindow parent, TW_IDENTITY *ds); + int showDeviceSelect(bool qt, const std::vector& devs); + int showSettingUi(bool qt, SANE_Handle device, HWND settingUiParent, LPSANEAPI api, const char *devName, bool with_scan, std::function callback); + int showProgressUi(bool qt, HWND parent, std::function callback, std::function *notify); + int showMessageBoxUi(bool qt, HWND parent, int event, void *msg, int flag); + int showTwainSrcUi(bool qt, DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWindow parent, TW_IDENTITY *ds); signals: void init(); - void createDeviceSelect(); - void createSettingUi(); - void createProgressUi(); - void createMessageBoxUi(); - void createTwainSrcUi(); + void createDeviceSelect(bool qt); + void createSettingUi(bool qt); + void createProgressUi(bool qt); + void createMessageBoxUi(bool qt); + void createTwainSrcUi(bool qt); private slots: void on_init(); - void on_createDeviceSelect(); - void on_createSettingUi(); - void on_createProgressUi(); - void on_createMessageBoxUi(); - void on_createTwainSrcUi(); + void on_createDeviceSelect(bool qt); + void on_createSettingUi(bool qt); + void on_createProgressUi(bool qt); + void on_createMessageBoxUi(bool qt); + void on_createTwainSrcUi(bool qt); private: QTranslator m_translator; diff --git a/modules/twainui/dialog_device_select.cpp b/modules/twainui/dialog_device_select.cpp index f7b0adb6..669a7621 100644 --- a/modules/twainui/dialog_device_select.cpp +++ b/modules/twainui/dialog_device_select.cpp @@ -8,6 +8,7 @@ Dialog_device_select::Dialog_device_select(const std::vector& devs, QW , m_devs(devs) { ui->setupUi(this); + setWindowFlags(Qt::SubWindow | Qt::Popup | Qt::WindowStaysOnTopHint); for (int i = 0; i < m_devs.size(); ++i) { diff --git a/modules/twainui/dialog_progress_ui.cpp b/modules/twainui/dialog_progress_ui.cpp index bf322462..a4c7e30b 100644 --- a/modules/twainui/dialog_progress_ui.cpp +++ b/modules/twainui/dialog_progress_ui.cpp @@ -16,7 +16,8 @@ Dialog_progress_ui::Dialog_progress_ui(std::function callback, setAttribute(Qt::WA_DeleteOnClose, true); ui->setupUi(this); - setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); + + setWindowFlags(Qt::SubWindow | Qt::Popup); ui->pbtn_cancelScan->setVisible(false); ui->pbtn_close->setVisible(false); diff --git a/modules/twainui/hg_settingdialog.cpp b/modules/twainui/hg_settingdialog.cpp index 7202f7c0..ea9dbad7 100644 --- a/modules/twainui/hg_settingdialog.cpp +++ b/modules/twainui/hg_settingdialog.cpp @@ -12,7 +12,7 @@ #include #include "device_menu.h" #include "dialog_device_scan.h" -hg_settingdialog * hg_setting_ui_ =NULL; +hg_settingdialog * hg_settingdialog::hg_setting_ui_ =NULL; std::string hg_settingdialog::property_combox_data_type_ = "combox_value_type"; hg_settingdialog::hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, bool showScan, const char* devName, @@ -26,6 +26,7 @@ hg_settingdialog::hg_settingdialog(SANE_Handle handle, const SANEAPI* saneApi, b , m_devName(devName) , m_callback(callback) { + hg_setting_ui_ = this; m_langCode = lang_get_cur_code_page(); if (20127 == m_langCode) { @@ -116,6 +117,11 @@ hg_settingdialog::~hg_settingdialog() m_callback(UI_RESULT_CLOSE_SETTING); } +hg_settingdialog *hg_settingdialog::GetSettingDialog() +{ + return hg_setting_ui_; +} + void hg_settingdialog::initUi() { updateOpt(); diff --git a/modules/twainui/hg_settingdialog.h b/modules/twainui/hg_settingdialog.h index 9992eb95..6e57cf4c 100644 --- a/modules/twainui/hg_settingdialog.h +++ b/modules/twainui/hg_settingdialog.h @@ -51,6 +51,7 @@ public: ~hg_settingdialog(); public: + static hg_settingdialog *GetSettingDialog(); void initUi(); void updateOpt(); void createUI(); @@ -73,6 +74,7 @@ public: int m_closeButton; private: + static hg_settingdialog *hg_setting_ui_; SANEAPI m_saneAPI; SANE_Handle m_devHandle; bool m_showScan; diff --git a/modules/twainui/twainui.cpp b/modules/twainui/twainui.cpp index 45de2d45..efc5c01c 100644 --- a/modules/twainui/twainui.cpp +++ b/modules/twainui/twainui.cpp @@ -46,7 +46,7 @@ int choose_scanner(const std::vector &devs) g_manager = new Manager; } - return g_manager->showDeviceSelect(devs); + return g_manager->showDeviceSelect(nullptr == g_hThread, devs); } char *apply_current_config(const char *dev_name, SANE_Handle device, LPSANEAPI api) @@ -114,7 +114,7 @@ int show_setting_ui(SANE_Handle device, HWND parent, LPSANEAPI api, const char * g_manager = new Manager; } - return g_manager->showSettingUi(device, parent, api, devName, with_scan, callback); + return g_manager->showSettingUi(nullptr == g_hThread, device, parent, api, devName, with_scan, callback); } int show_progress_ui(HWND parent, std::function callback, std::function *notify) @@ -131,7 +131,7 @@ int show_progress_ui(HWND parent, std::function callback, std: g_manager = new Manager; } - return g_manager->showProgressUi(parent, callback, notify); + return g_manager->showProgressUi(nullptr == g_hThread, parent, callback, notify); } int show_messagebox_ui(HWND parent, int event, void *msg, int flag) @@ -148,7 +148,7 @@ int show_messagebox_ui(HWND parent, int event, void *msg, int flag) g_manager = new Manager; } - return g_manager->showMessageBoxUi(parent, event, msg, flag); + return g_manager->showMessageBoxUi(nullptr == g_hThread, parent, event, msg, flag); } int show_twain_srclist_ui(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWindow parent, TW_IDENTITY *ds) @@ -165,5 +165,5 @@ int show_twain_srclist_ui(DSMENTRYPROC dsmProc, const TW_IDENTITY *appId, HGWind g_manager = new Manager; } - return g_manager->showTwainSrcUi(dsmProc, appId, parent, ds); + return g_manager->showTwainSrcUi(nullptr == g_hThread, dsmProc, appId, parent, ds); }