int WndForm::ShowModal() { #ifndef USE_WINUSER ContainerWindow *root = GetRootOwner(); WindowReference old_focus_reference = root->GetFocusedWindowReference(); #else HWND oldFocusHwnd; #endif /* USE_WINUSER */ PeriodClock enter_clock; if (IsEmbedded()) enter_clock.Update(); ShowOnTop(); modal_result = 0; SingleWindow &main_window = GetMainWindow(); main_window.CancelMode(); #ifdef USE_WINUSER oldFocusHwnd = ::GetFocus(); #endif /* USE_WINUSER */ SetDefaultFocus(); bool hastimed = false; main_window.AddDialog(this); #ifndef USE_GDI main_window.Refresh(); #endif #if defined(ANDROID) || defined(USE_POLL_EVENT) || defined(ENABLE_SDL) EventLoop loop(*event_queue, main_window); #else DialogEventLoop loop(*event_queue, *this); #endif Event event; while ((modal_result == 0 || force) && loop.Get(event)) { if (!main_window.FilterEvent(event, this)) { if (modeless && event.IsMouseDown()) break; else continue; } // hack to stop exiting immediately if (IsEmbedded() && !hastimed && event.IsUserInput()) { if (!enter_clock.Check(200)) /* ignore user input in the first 200ms */ continue; else hastimed = true; } if (event.IsKeyDown()) { if (OnAnyKeyDown(event.GetKeyCode())) continue; #ifdef ENABLE_SDL if (event.GetKeyCode() == SDLK_TAB) { /* the Tab key moves the keyboard focus */ #if SDL_MAJOR_VERSION >= 2 const Uint8 *keystate = ::SDL_GetKeyboardState(nullptr); event.event.key.keysym.sym = keystate[SDL_SCANCODE_LSHIFT] || keystate[SDL_SCANCODE_RSHIFT] ? SDLK_UP : SDLK_DOWN; #else const Uint8 *keystate = ::SDL_GetKeyState(nullptr); event.event.key.keysym.sym = keystate[SDLK_LSHIFT] || keystate[SDLK_RSHIFT] ? SDLK_UP : SDLK_DOWN; #endif } #endif if ( #ifdef USE_WINUSER IdentifyDescendant(event.msg.hwnd) && #endif (event.GetKeyCode() == KEY_UP || event.GetKeyCode() == KEY_DOWN)) { /* KEY_UP and KEY_DOWN move the focus only within the current control group - but we want it to behave like Shift-Tab and Tab */ if (!CheckKey(this, event)) { /* this window doesn't handle KEY_UP/KEY_DOWN */ if (event.GetKeyCode() == KEY_DOWN) FocusNextControl(); else FocusPreviousControl(); continue; } } #ifndef USE_WINUSER if (event.GetKeyCode() == KEY_ESCAPE) { modal_result = mrCancel; continue; } #endif #ifdef USE_LINUX_INPUT if (event.GetKeyCode() == KEY_POWER) { /* the Kobo power button closes the modal dialog */ modal_result = mrCancel; continue; } #endif } if (character_function && (event.GetCharacterCount() > 0)) { bool handled = false; for (size_t i = 0; i < event.GetCharacterCount(); ++i) handled = character_function(event.GetCharacter(i)) || handled; if (handled) continue; } loop.Dispatch(event); } // End Modal Loop main_window.RemoveDialog(this); #ifdef USE_WINUSER ::SetFocus(oldFocusHwnd); #else if (old_focus_reference.Defined()) { Window *old_focus = old_focus_reference.Get(*root); if (old_focus != nullptr) old_focus->SetFocus(); } #endif /* !USE_WINUSER */ return modal_result; }
int WndForm::ShowModal() { assert_none_locked(); #define OPENCLOSESUPPRESSTIME 500 #ifndef USE_GDI ContainerWindow *root = get_root_owner(); WindowReference old_focus_reference = root->GetFocusedWindowReference(); #else HWND oldFocusHwnd; #endif /* USE_GDI */ PeriodClock enter_clock; if (is_embedded() && !is_altair()) enter_clock.update(); show_on_top(); mModalResult = 0; #ifdef USE_GDI oldFocusHwnd = ::GetFocus(); if (oldFocusHwnd != NULL) ::SendMessage(oldFocusHwnd, WM_CANCELMODE, 0, 0); #endif /* USE_GDI */ set_focus(); focus_first_control(); bool hastimed = false; WndForm::timeAnyOpenClose.update(); // when current dlg opens or child closes main_window.add_dialog(this); #ifndef USE_GDI main_window.refresh(); #endif #ifdef ANDROID EventLoop loop(*event_queue, main_window); Event event; #elif defined(ENABLE_SDL) EventLoop loop(main_window); SDL_Event event; #else DialogEventLoop loop(*this); MSG event; #endif while ((mModalResult == 0 || force) && loop.get(event)) { #if defined(ENABLE_SDL) && !defined(ANDROID) if (event.type == SDL_QUIT) { mModalResult = mrCancel; continue; } #endif if (!main_window.FilterEvent(event, this)) continue; // hack to stop exiting immediately if (is_embedded() && !is_altair() && !hastimed && is_user_input(event)) { if (!enter_clock.check(200)) /* ignore user input in the first 200ms */ continue; else hastimed = true; } if (is_embedded() && is_mouse_up(event) && !timeAnyOpenClose.check(OPENCLOSESUPPRESSTIME)) /* prevents child click from being repeat-handled by parent if buttons overlap */ continue; if (mOnKeyDownNotify != NULL && is_key_down(event) && #ifdef USE_GDI identify_descendant(event.hwnd) && #endif !check_special_key(this, event) && mOnKeyDownNotify(*this, get_key_code(event))) continue; #if defined(ENABLE_SDL) && !defined(ANDROID) if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_TAB) { /* the Tab key moves the keyboard focus */ const Uint8 *keystate = ::SDL_GetKeyState(NULL); event.key.keysym.sym = keystate[SDLK_LSHIFT] || keystate[SDLK_RSHIFT] ? SDLK_UP : SDLK_DOWN; } #endif if (is_key_down(event) && #ifdef USE_GDI identify_descendant(event.hwnd) && #endif (get_key_code(event) == VK_UP || get_key_code(event) == VK_DOWN)) { /* VK_UP and VK_DOWN move the focus only within the current control group - but we want it to behave like Shift-Tab and Tab */ if (!check_key(this, event)) { /* this window doesn't handle VK_UP/VK_DOWN */ if (get_key_code(event) == VK_DOWN) focus_next_control(); else focus_previous_control(); continue; } } #ifndef USE_GDI if (is_key_down(event) && get_key_code(event) == VK_ESCAPE) { mModalResult = mrCancel; continue; } #endif /* map VK_ESCAPE to mrOK on Altair, because the Escape key is expected to be the one that saves and closes a dialog */ if (is_altair() && is_key_down(event) && get_key_code(event) == VK_ESCAPE) { mModalResult = mrOK; continue; } loop.dispatch(event); } // End Modal Loop main_window.remove_dialog(this); // static. this is current open/close or child open/close WndForm::timeAnyOpenClose.update(); #ifdef USE_GDI SetFocus(oldFocusHwnd); #else if (old_focus_reference.Defined()) { Window *old_focus = old_focus_reference.Get(*root); if (old_focus != NULL) old_focus->set_focus(); } #endif /* !USE_GDI */ return mModalResult; }
int WndForm::ShowModal() { AssertNoneLocked(); #define OPENCLOSESUPPRESSTIME 500 #ifndef USE_GDI ContainerWindow *root = GetRootOwner(); WindowReference old_focus_reference = root->GetFocusedWindowReference(); #else HWND oldFocusHwnd; #endif /* USE_GDI */ PeriodClock enter_clock; if (IsEmbedded() && !IsAltair()) enter_clock.Update(); ShowOnTop(); modal_result = 0; SingleWindow &main_window = GetMainWindow(); main_window.CancelMode(); #ifdef USE_GDI oldFocusHwnd = ::GetFocus(); #endif /* USE_GDI */ SetFocus(); if (default_focus) default_focus->SetFocus(); else client_area.FocusFirstControl(); bool hastimed = false; main_window.AddDialog(this); #ifndef USE_GDI main_window.Refresh(); #endif #if defined(ANDROID) || defined(USE_EGL) EventLoop loop(*event_queue, main_window); #elif defined(ENABLE_SDL) EventLoop loop(main_window); #else DialogEventLoop loop(*this); #endif Event event; while ((modal_result == 0 || force) && loop.Get(event)) { if (!main_window.FilterEvent(event, this)) { if (modeless && event.IsMouseDown()) break; else continue; } // hack to stop exiting immediately if (IsEmbedded() && !IsAltair() && !hastimed && event.IsUserInput()) { if (!enter_clock.Check(200)) /* ignore user input in the first 200ms */ continue; else hastimed = true; } if (event.IsKeyDown()) { if (key_down_function && #ifdef USE_GDI IdentifyDescendant(event.msg.hwnd) && #endif !CheckSpecialKey(this, event) && key_down_function(event.GetKeyCode())) continue; #ifdef ENABLE_SDL if (event.GetKeyCode() == SDLK_TAB) { /* the Tab key moves the keyboard focus */ const Uint8 *keystate = ::SDL_GetKeyState(NULL); event.event.key.keysym.sym = keystate[SDLK_LSHIFT] || keystate[SDLK_RSHIFT] ? SDLK_UP : SDLK_DOWN; } #endif if ( #ifdef USE_GDI IdentifyDescendant(event.msg.hwnd) && #endif (event.GetKeyCode() == KEY_UP || event.GetKeyCode() == KEY_DOWN)) { /* KEY_UP and KEY_DOWN move the focus only within the current control group - but we want it to behave like Shift-Tab and Tab */ if (!CheckKey(this, event)) { /* this window doesn't handle KEY_UP/KEY_DOWN */ if (event.GetKeyCode() == KEY_DOWN) FocusNextControl(); else FocusPreviousControl(); continue; } } #if !defined USE_GDI || defined _WIN32_WCE /* The Windows CE dialog manager does not handle KEY_ESCAPE and so we have to do it by ourself */ // On Altair, the RemoteKey ("E" Button) shall also close the analyse-page if (IsAltair()) { #ifdef GNAV if (event.GetKeyCode() == KEY_ESCAPE || event.GetKeyCode() == KEY_F15) { modal_result = mrOK; continue; } #endif } else if (event.GetKeyCode() == KEY_ESCAPE) { modal_result = mrCancel; continue; } #endif } if (event.IsCharacter() && character_function && character_function(event.GetCharacter())) continue; loop.Dispatch(event); } // End Modal Loop main_window.RemoveDialog(this); #ifdef USE_GDI ::SetFocus(oldFocusHwnd); #else if (old_focus_reference.Defined()) { Window *old_focus = old_focus_reference.Get(*root); if (old_focus != NULL) old_focus->SetFocus(); } #endif /* !USE_GDI */ return modal_result; }