Установка "Сохранить миниатюры окон", чтобы всегда в KDE "ломать минимизацию"? Как?

Эффекты рабочего стола KDE (композитинг) имеют настройку, когда сохранять миниатюры окон. Это говорит о том, что установка этого параметра всегда "ломает минимизацию". Кто-нибудь знает, как это ломает минимизацию?

2 ответа

Решение

Чтобы иметь возможность рисовать окна (за кадром), чтобы создавать миниатюры, KWin просто показывает их как свернутые, хотя на самом деле это не так.

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

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

Приложения SDL получают события свертывания/восстановления с включенной функцией «Сохранять миниатюры окон», начиная с KDE 5.20:

      // g++ main.cpp `pkg-config --cflags --libs sdl2`
#include <SDL.h>
#include <iostream>

#define CASE_STR( value ) case value: return #value; 
const char* sdlGetWindowEventString( Uint8 event )
{
    switch( event )
    {
    CASE_STR( SDL_WINDOWEVENT_NONE            )
    CASE_STR( SDL_WINDOWEVENT_SHOWN           )
    CASE_STR( SDL_WINDOWEVENT_HIDDEN          )
    CASE_STR( SDL_WINDOWEVENT_EXPOSED         )
    CASE_STR( SDL_WINDOWEVENT_MOVED           )
    CASE_STR( SDL_WINDOWEVENT_RESIZED         )
    CASE_STR( SDL_WINDOWEVENT_SIZE_CHANGED    )
    CASE_STR( SDL_WINDOWEVENT_MINIMIZED       )
    CASE_STR( SDL_WINDOWEVENT_MAXIMIZED       )
    CASE_STR( SDL_WINDOWEVENT_RESTORED        )
    CASE_STR( SDL_WINDOWEVENT_ENTER           )
    CASE_STR( SDL_WINDOWEVENT_LEAVE           )
    CASE_STR( SDL_WINDOWEVENT_FOCUS_GAINED    )
    CASE_STR( SDL_WINDOWEVENT_FOCUS_LOST      )
    CASE_STR( SDL_WINDOWEVENT_CLOSE           )
    CASE_STR( SDL_WINDOWEVENT_TAKE_FOCUS      )
    CASE_STR( SDL_WINDOWEVENT_HIT_TEST        )
    //CASE_STR( SDL_WINDOWEVENT_ICCPROF_CHANGED )
    //CASE_STR( SDL_WINDOWEVENT_DISPLAY_CHANGED )
    default: return "Unknown";
    }
}
#undef CASE_STR

int main( int argc, char** argv )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    SDL_Window* window = SDL_CreateWindow
        (
        "SDL2",
         SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
         640, 480,
         SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE
        );
    

    bool running = true;
    while( running )
    {
        SDL_Surface* surface = SDL_GetWindowSurface( window );
        SDL_FillRect( surface, nullptr, SDL_MapRGB( surface->format, 127, 127, 127 ) );
        SDL_UpdateWindowSurface( window );

        SDL_Event ev;
        if( SDL_WaitEvent( &ev ) )
        {
            if( ( SDL_QUIT == ev.type ) ||
                ( SDL_KEYDOWN == ev.type && SDL_SCANCODE_ESCAPE == ev.key.keysym.scancode ) )
            {
                running = false;
                break;
            }
            
            if( SDL_WINDOWEVENT == ev.type )
            {
                std::cout << sdlGetWindowEventString( ev.window.event );
                std::cout << '\n';
            }
        }
        
    }

    SDL_DestroyWindow( window );
    SDL_Quit();
    return 0;
}

Во время цикла свертывания/восстановления следите за:

  • SDL_WINDOWEVENT_HIDDEN
  • SDL_WINDOWEVENT_MINIMIZED
  • SDL_WINDOWEVENT_RESTORED
  • SDL_WINDOWEVENT_SHOWN
Другие вопросы по тегам