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() { 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; }