2014-03-07 86 views
3

後可以恢復時SDL窗口不能最小化

SDL_RestoreWindow(gameWindow); 

被稱爲最小化窗口上出現問題。該窗口不會重新出現。

我製作了一個虛擬程序來模擬我的主程序正在調用的SDL調用,然後問題重現。這裏是代碼:

#include <SDL.h> 

int main(int argn, char **argv) 
{ 
    // The windows  
    SDL_Window *gameWindow;   

    // Initialise 
    SDL_Init(SDL_INIT_EVERYTHING);    

    // Create window 
    gameWindow = SDL_CreateWindow(
     "Game Window",     
     SDL_WINDOWPOS_UNDEFINED,   
     SDL_WINDOWPOS_UNDEFINED,   
     640,        
     480,        
     SDL_WINDOW_OPENGL     
    ); 

    // Minimise/ hide or whatever? 
    SDL_MinimizeWindow(gameWindow); 

    // Wait 
    SDL_Delay(1000); 

    // Attempt to bring back the window 
    SDL_RestoreWindow(gameWindow); 

    // program would run here 
    SDL_Delay(1000); 

    // quit out 
    SDL_DestroyWindow(gameWindow); 

    // Clean up 
    SDL_Quit(); 
    return 0; 
} 

任何想法,爲什麼這個gameWindow不重新出現? SDL_Restore不是用來恢復最小化的窗口嗎?

而且FYI這是在Ubuntu 13.10上運行,並用gcc 4.8.1和Gnome的metacity 2.34.13

+0

做函數返回什麼值? – this

+0

SDL_RestoreWindow和其他人根據https://wiki.libsdl.org/SDL_RestoreWindow返回void – foips

+0

似乎無法重現此(不同的環境,但不過)。在你的測試案例中,你是否會在最小化之前彈出一個窗口? SDL_CreateWindow是否成功返回?你有沒有嘗試沒有OpenGL(嘗試標誌SDL_WINDOW_SHOWN)? – ysalmi

回答

1

UPDATE

編譯這不是SDL庫中的缺陷。雖然下面的補丁工作,但它不應該如何。當事件收到UnmapNotify事件時,SDL觸發SDL_WINDOWEVENT_MINIMIZED事件。

因此,需要調用SDL_PumpEvents()SDL_PollEvent(SDL_Event * event)以便讓SDL流程事件和事件按預期工作。


OLD ANSWER

此錯誤在座仍處於SDL2。

由於窗口未分配SDL_WINDOW_MINIMIZED標誌,窗口未被恢復。因此,SDL_RestoreWindow()回報沒有做任何事情:

void 
SDL_RestoreWindow(SDL_Window * window) 
{ 
    CHECK_WINDOW_MAGIC(window,); 

    if (!(window->flags & (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED))) { 
     return; 
    } 

    if (_this->RestoreWindow) { 
     _this->RestoreWindow(_this, window); 
    } 
} 

Link to SDL repository

的解決方案是增加SDL_SendWindowEvent()這反過來將適當地設置標誌和SDL_RestoreWindow()通話將開始按預期運行。

應用這個補丁將修復它(僅適用於SDL_MinimizeWindow()

--- src/video/SDL_video~.c 2017-01-18 17:31:08.180521882 -0500 
+++ src/video/SDL_video.c 2017-01-18 17:12:37.025949492 -0500 
@@ -2105,6 +2105,7 @@ 
    if (_this->MinimizeWindow) { 
     _this->MinimizeWindow(_this, window); 
    } 
+ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); 
} 

void 
@@ -2119,6 +2120,7 @@ 
    if (_this->RestoreWindow) { 
     _this->RestoreWindow(_this, window); 
    } 
+ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0); 
} 

int