win32: save the "not maximized" window size

also fix the window start up position

see http://pulkomandy.tk/projects/GrafX2/ticket/102
This commit is contained in:
Thomas Bernard 2019-05-21 20:45:21 +02:00
parent 31d3719f26
commit 2d645edbc0
8 changed files with 99 additions and 40 deletions

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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];
}
}

View File

@ -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;

View File

@ -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: