Как передать фокус на всплывающее окно, пока оно не будет закрыто? (SDL2)

Для курсовой работы пишу простейший растровый редактор. В основном окне происходит работа над изображением, при закрытии окна всплывает новое окошко, в котором предлагается выбор - сохранить изображение или выйти без сохранения.
Нужно, чтобы, когда всплывает маленькое окошко, основное окно было недоступно, то есть нельзя было переключиться на него никаким образом, пока не будет сделан выбор во всплывающем окне (ни мышью, ни alt+tab, ничем подобным тоже). Теоретический вопрос: как сохранять фокус на всплывающем окне? Как пример, такое есть при сохранении перед выходом из PaintNET.

Пробовал сделать так:

int showSavePopUpMessage (INITDATA &ID)
{
    bool Shutdown = false;                //Флаг выхода из цикла обработки событий
    SDL_Event Pop_Up_Event;               //Событие всплывающего окна
    SDL_Event Main_Window_Event;          //Событие главного окна (передаётся в ID, но привёл так)
    
    //Инициализации и вот это всё
    
    while (!Shutdown)
    {
        //Обновляем рендер всплывающего окна

        Pop_Up_Event.type = NULL;
        if (SDL_PollEvent (&Pop_Up_Event))
        {
            //Если сделан выбор, то окно закрывается
        }
        if (SDL_PollEvent (&Main_Window_Event))
        {
            if (Main_Window_Event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED)
            {
                //Обновляем рендер главного окна
                Main_Window_Event.type = NULL;
                Pop_Up_Event.window.event = SDL_WINDOWEVENT_FOCUS_GAINED;
                SDL_PushEvent (&Pop_Up_Event);
                SDL_PollEvent (&Pop_Up_Event);
                SDL_RaiseWindow (Pop_Up_Window);
            }
        }
    }
    ...
}

Рассуждал так: при переключении с помощью alt+tab или при щелчке мыши в главном окне появлялось событие SDL_WINDOWEVENT_FOCUS_GAINED, значит, фокус оно получает с помощью этого флага. Отсюда фокус нужно передать на всплывающее окно, а само всплывающее окно показать поверх главного. Но такой подход не работает - главное окно не теряет фокус, да и всплывающее не всплывает.


Ответы (1 шт):

Автор решения: Артём Оконечников

То, что вы имеете ввиду называется модальное окно. Это окно, которое требует действие от пользователя, блокируя взаимодействие с другими окнами приложения.

Вот пример из документации SDL2:

const SDL_MessageBoxButtonData buttons[] = 
{
    {                                       0, 0, "no" },
    { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 1, "yes" }
};

const SDL_MessageBoxData messageboxdata =
{
    SDL_MESSAGEBOX_INFORMATION, /* .flags */
    NULL, // Не забудьте передать указатель на Parent Window (SDL_Window *)
    "example message box", /* .title */
    "select a button", /* .message */
    SDL_arraysize(buttons), /* .numbuttons */
    buttons
};

int buttonid;
if (SDL_ShowMessageBox(&messageboxdata, &buttonid) < 0)
{
    SDL_Log("error displaying message box");
    return 1;
}

if (buttonid == -1)
{
    SDL_Log("no selection");
}
else
{
    SDL_Log("selection was %s", buttons[buttonid].text);
}

Если я вас правильно понял, конечно :-)

→ Ссылка