diff --git a/src/const.h b/src/const.h index 30ac38aa..1b30205b 100644 --- a/src/const.h +++ b/src/const.h @@ -652,4 +652,11 @@ enum FSOBJECT_TYPE FSOBJECT_DRIVE = 2 }; +enum GFX2_WINDOW_STATES +{ + GFX2_WINDOW_STANDARD = 0, + GFX2_WINDOW_MAXIMIZED, + GFX2_WINDOW_MINIMIZED +}; + #endif diff --git a/src/engine.c b/src/engine.c index b65bf533..82258e00 100644 --- a/src/engine.c +++ b/src/engine.c @@ -685,6 +685,12 @@ void Main_handler(void) // Resize requested if (Resize_width || Resize_height) { + if (Window_state == GFX2_WINDOW_STANDARD) + { + Default_window_width = Resize_width; + Default_window_height = Resize_height; + } + Hide_cursor(); Init_mode_video(Resize_width, Resize_height, 0, Pixel_ratio); // Reset the variables that indicate a resize was requested. diff --git a/src/global.h b/src/global.h index 72c88788..23c93230 100644 --- a/src/global.h +++ b/src/global.h @@ -215,6 +215,12 @@ GFX2_GLOBAL Func_draw_brush Display_brush; GFX2_GLOBAL int Resize_width; /// Requested window height. This is set when the user resizes the window. GFX2_GLOBAL int Resize_height; +/// Current window state (standard, minimized, maximized) +GFX2_GLOBAL enum GFX2_WINDOW_STATES Window_state; +/// Default window width (not maximized) +GFX2_GLOBAL int Default_window_width; +/// Default window height (not maximized) +GFX2_GLOBAL int Default_window_height; /// Current video mode. Index in ::Video_mode GFX2_GLOBAL int Current_resolution; /// After loading an image, this holds the "original screen width", if the file format supported it. diff --git a/src/input.c b/src/input.c index a0f9da85..9ac08c00 100644 --- a/src/input.c +++ b/src/input.c @@ -767,6 +767,27 @@ static void Handle_SelectionRequest(const XSelectionRequestEvent* xselectionrequ #if defined(USE_SDL) static void Handle_window_resize(SDL_ResizeEvent * event) { +#if defined(WIN32) + WINDOWPLACEMENT windowplacement; + windowplacement.length = sizeof(WINDOWPLACEMENT); + if (GetWindowPlacement(GFX2_Get_Window_Handle(), &windowplacement)) + { + switch (windowplacement.showCmd) + { + case SW_SHOWMAXIMIZED: + Window_state = GFX2_WINDOW_MAXIMIZED; + GFX2_Log(GFX2_DEBUG, "window is MAXIMIZED\n"); + break; + case SW_SHOWMINIMIZED: + Window_state = GFX2_WINDOW_MINIMIZED; + GFX2_Log(GFX2_DEBUG, "window is MINIMIZED\n"); + break; + default: + Window_state = GFX2_WINDOW_STANDARD; + GFX2_Log(GFX2_DEBUG, "window is NORMAL\n"); + } + } +#endif Resize_width = event->w; Resize_height = event->h; } @@ -1428,39 +1449,47 @@ int Get_input(int sleep_time) Handle_window_resize(&event.resize); user_feedback_required = 1; break; + + case SDL_VIDEOEXPOSE: + GFX2_Log(GFX2_DEBUG, "SDL_VIDEOEXPOSE\n"); + break; #endif #if defined(USE_SDL2) case SDL_WINDOWEVENT: switch(event.window.event) { - case SDL_WINDOWEVENT_RESIZED: // change by external event (user or window manager) - Resize_width = event.window.data1; - Resize_height = event.window.data2; - // forbid window size < 320x200 - if (Resize_width < 320) - Resize_width = 320; - if (Resize_height < 200) - Resize_height = 200; - if (Resize_width != event.window.data1 || Resize_height != event.window.data2) - SDL_SetWindowSize(SDL_GetWindowFromID(event.window.windowID), Resize_width, Resize_height); - break; - case SDL_WINDOWEVENT_CLOSE: - GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_CLOSE %d\n", event.window.windowID); - Quit_is_required = 1; - user_feedback_required = 1; - break; - case SDL_WINDOWEVENT_MINIMIZED: - GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_MINIMIZED %d\n", event.window.windowID); - break; - case SDL_WINDOWEVENT_MAXIMIZED: - GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_MAXIMIZED %d\n", event.window.windowID); - break; - case SDL_WINDOWEVENT_RESTORED: - GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_RESTORED %d\n", event.window.windowID); - break; - default: - GFX2_Log(GFX2_DEBUG, "Unhandled SDL_WINDOWEVENT : %d\n", event.window.event); + case SDL_WINDOWEVENT_RESIZED: // change by external event (user or window manager) + GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_RESIZED %d %dx%d\n", event.window.windowID, event.window.data1, event.window.data2); + Resize_width = event.window.data1; + Resize_height = event.window.data2; + // forbid window size < 320x200 + if (Resize_width < 320) + Resize_width = 320; + if (Resize_height < 200) + Resize_height = 200; + if (Resize_width != event.window.data1 || Resize_height != event.window.data2) + SDL_SetWindowSize(SDL_GetWindowFromID(event.window.windowID), Resize_width, Resize_height); + break; + case SDL_WINDOWEVENT_CLOSE: + GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_CLOSE %d\n", event.window.windowID); + Quit_is_required = 1; + user_feedback_required = 1; + break; + case SDL_WINDOWEVENT_MINIMIZED: + GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_MINIMIZED %d\n", event.window.windowID); + Window_state = GFX2_WINDOW_MINIMIZED; + break; + case SDL_WINDOWEVENT_MAXIMIZED: + GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_MAXIMIZED %d\n", event.window.windowID); + Window_state = GFX2_WINDOW_MAXIMIZED; + break; + case SDL_WINDOWEVENT_RESTORED: + GFX2_Log(GFX2_DEBUG, "SDL_WINDOWEVENT_RESTORED %d\n", event.window.windowID); + Window_state = GFX2_WINDOW_STANDARD; + break; + default: + GFX2_Log(GFX2_DEBUG, "Unhandled SDL_WINDOWEVENT : %d\n", event.window.event); } break; #endif diff --git a/src/main.c b/src/main.c index 559365f3..46d8fbd0 100644 --- a/src/main.c +++ b/src/main.c @@ -1244,16 +1244,15 @@ void Program_shutdown(void) // Windows only: Recover the window position. #if defined(WIN32) - #if defined(USE_SDL) || defined(USE_SDL2) { - RECT r; - GetWindowRect(GFX2_Get_Window_Handle(), &r); - - Config.Window_pos_x = r.left; - Config.Window_pos_y = r.top; + WINDOWPLACEMENT windowplacement; + windowplacement.length = sizeof(WINDOWPLACEMENT); + if (GetWindowPlacement(GFX2_Get_Window_Handle(), &windowplacement)) + { + Config.Window_pos_x = windowplacement.rcNormalPosition.left; + Config.Window_pos_y = windowplacement.rcNormalPosition.top; + } } - #endif - // Config.Window_pos_x / Config.Window_pos_y are set in win32screen.c #elif !defined(USE_X11) // All other targets: irrelevant dimensions. // Do not attempt to force them back on next program run. diff --git a/src/readini.c b/src/readini.c index d3939e08..ff82cb29 100644 --- a/src/readini.c +++ b/src/readini.c @@ -792,9 +792,9 @@ int Load_INI(T_Config * conf) if (!Load_INI_get_values (file,buffer,"Default_window_size",2,values)) { if ((values[0]>=320)) - Video_mode[0].Width = values[0]; + Default_window_width = Video_mode[0].Width = values[0]; if ((values[1]>=200)) - Video_mode[0].Height = values[1]; + Default_window_height = Video_mode[0].Height = values[1]; } } diff --git a/src/saveini.c b/src/saveini.c index 08cb2d36..b4553a80 100644 --- a/src/saveini.c +++ b/src/saveini.c @@ -651,8 +651,14 @@ int Save_INI(const T_Config * conf) if ((return_code=Save_INI_set_strings (old_file,new_file,buffer,"Default_video_mode",Mode_label(conf->Default_resolution)))) goto Erreur_Retour; - values[0]=Video_mode[0].Width; - values[1]=Video_mode[0].Height; + if (Default_window_width > 0) + values[0] = Default_window_width; + else + values[0] = Video_mode[0].Width; + if (Default_window_height > 0) + values[1] = Default_window_height; + else + values[1] = Video_mode[0].Height; if ((return_code=Save_INI_set_values (old_file,new_file,buffer,"Default_window_size",2,values,0))) goto Erreur_Retour; diff --git a/src/win32screen.c b/src/win32screen.c index 8deb0b88..7867f065 100644 --- a/src/win32screen.c +++ b/src/win32screen.c @@ -168,10 +168,16 @@ static LRESULT CALLBACK Win32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LP break; case WM_SIZE: GFX2_Log(GFX2_DEBUG, "WM_SIZE : %dx%d type=%d\n", LOWORD(lParam), HIWORD(lParam), wParam); - if (wParam != SIZE_MINIMIZED) + if (wParam == SIZE_MINIMIZED) + Window_state = GFX2_WINDOW_MINIMIZED; + else { Resize_width = LOWORD(lParam); Resize_height = HIWORD(lParam); + if (wParam == SIZE_MAXIMIZED) + Window_state = GFX2_WINDOW_MAXIMIZED; + else if (wParam == SIZE_RESTORED) + Window_state = GFX2_WINDOW_STANDARD; } return 0; case WM_CLOSE: