From 0f69aa7ff7ccc6cf491bfc527531f7191fccf1ea Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 18 Sep 2021 15:24:00 +0200 Subject: [PATCH] Some fixes, fixes PCjr when the emulator is started in full screen, fixes #1702. --- src/config.c | 14 ++++++++++---- src/win/win.c | 34 ++++++++++++++++++++-------------- src/win/win_sdl.c | 45 ++++++++++++++++++++++++++++----------------- src/win/win_ui.c | 11 ++++++----- 4 files changed, 64 insertions(+), 40 deletions(-) diff --git a/src/config.c b/src/config.c index c10c3049d..6d26fe9c6 100644 --- a/src/config.c +++ b/src/config.c @@ -505,7 +505,7 @@ load_general(void) video_fullscreen_scale = config_get_int(cat, "video_fullscreen_scale", 0); - video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 1); + video_fullscreen_first = config_get_int(cat, "video_fullscreen_first", 0); video_filter_method = config_get_int(cat, "video_filter_method", 1); @@ -524,7 +524,10 @@ load_general(void) update_icons = config_get_int(cat, "update_icons", 1); window_remember = config_get_int(cat, "window_remember", 0); - if (window_remember) { + if (window_remember || (vid_resize & 2)) { + if (!window_remember) + config_delete_var(cat, "window_remember"); + p = config_get_string(cat, "window_coordinates", NULL); if (p == NULL) p = "0, 0, 0, 0"; @@ -2156,8 +2159,11 @@ save_general(void) else config_set_int(cat, "update_icons", update_icons); - if (window_remember) { - config_set_int(cat, "window_remember", window_remember); + if (window_remember || (vid_resize & 2)) { + if (window_remember) + config_set_int(cat, "window_remember", window_remember); + else + config_delete_var(cat, "window_remember"); sprintf(temp, "%i, %i, %i, %i", window_w, window_h, window_x, window_y); config_set_string(cat, "window_coordinates", temp); diff --git a/src/win/win.c b/src/win/win.c index f3f96cb2e..6d7cc86f9 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -1047,10 +1047,10 @@ plat_setfullscreen(int on) int dpi = win_get_dpi(hwndMain); /* Are we changing from the same state to the same state? */ - if ((!!on) == (!!video_fullscreen)) + if ((!!(on & 1)) == (!!video_fullscreen)) return; - if (on && video_fullscreen_first) { + if (on && (start_in_fullscreen || video_fullscreen_first)) { video_fullscreen |= 2; if (ui_msgbox_header(MBX_INFO | MBX_DONTASK, (wchar_t *) IDS_2134, (wchar_t *) IDS_2052) == 10) { video_fullscreen_first = 0; @@ -1060,13 +1060,14 @@ plat_setfullscreen(int on) } /* OK, claim the video. */ - win_mouse_close(); + if (!(on & 2)) + win_mouse_close(); /* Close the current mode, and open the new one. */ - video_fullscreen = on | 2; + video_fullscreen = (on & 1) | 2; if (vid_apis[vid_api].set_fs) - vid_apis[vid_api].set_fs(on); - if (!on) { + vid_apis[vid_api].set_fs(on & 1); + if (!(on & 1)) { plat_resize(scrnsz_x, scrnsz_y); if (vid_resize) { /* scale the screen base on DPI */ @@ -1114,26 +1115,31 @@ plat_setfullscreen(int on) } video_fullscreen &= 1; video_force_resize_set(1); - if (!on) + if (!(on & 1)) doresize = 1; win_mouse_init(); - /* Release video and make it redraw the screen. */ - device_force_redraw(); + if (!(on & 2)) { + /* Release video and make it redraw the screen. */ + device_force_redraw(); - /* Send a CTRL break code so CTRL does not get stuck. */ - keyboard_input(0, 0x01D); + /* Send a CTRL break code so CTRL does not get stuck. */ + keyboard_input(0, 0x01D); + } /* Finally, handle the host's mouse cursor. */ /* win_log("%s full screen, %s cursor\n", on ? "enter" : "leave", on ? "hide" : "show"); */ show_cursor(video_fullscreen ? 0 : -1); - /* This is needed for OpenGL. */ - plat_vidapi_enable(0); - plat_vidapi_enable(1); + if (!(on & 2)) { + /* This is needed for OpenGL. */ + plat_vidapi_enable(0); + plat_vidapi_enable(1); + } } + void plat_vid_reload_options(void) { diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index 303fb5f69..ffd589ce0 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -234,7 +234,7 @@ sdl_blit(int x, int y, int w, int h) SDL_Rect r_src; int ret; - if (!sdl_enabled || (h <= 0) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { + if (!sdl_enabled || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { video_blit_complete(); return; } @@ -277,6 +277,11 @@ sdl_destroy_window(void) static void sdl_destroy_texture(void) { + if (sdl_tex != NULL) { + SDL_DestroyTexture(sdl_tex); + sdl_tex = NULL; + } + /* SDL_DestroyRenderer also automatically destroys all associated textures. */ if (sdl_render != NULL) { SDL_DestroyRenderer(sdl_render); @@ -339,13 +344,8 @@ sdl_select_best_hw_driver(void) static void -sdl_reinit_texture(void) +sdl_init_texture(void) { - if (sdl_flags == -1) - return; - - sdl_destroy_texture(); - if (sdl_flags & RENDERER_HARDWARE) { sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); @@ -357,6 +357,17 @@ sdl_reinit_texture(void) } +static void +sdl_reinit_texture(void) +{ + if (sdl_flags == -1) + return; + + sdl_destroy_texture(); + sdl_init_texture(); +} + + void sdl_set_fs(int fs) { @@ -365,7 +376,6 @@ sdl_set_fs(int fs) SDL_LockMutex(sdl_mutex); sdl_enabled = 0; - sdl_destroy_texture(); if (fs) { ShowWindow(sdl_parent_hwnd, TRUE); @@ -408,7 +418,7 @@ sdl_set_fs(int fs) else sdl_flags &= ~RENDERER_FULL_SCREEN; - sdl_reinit_texture(); + // sdl_reinit_texture(); sdl_enabled = 1; SDL_UnlockMutex(sdl_mutex); } @@ -456,6 +466,7 @@ sdl_init_common(int flags) } sdl_win = SDL_CreateWindowFrom((void *)hwndRender); + sdl_init_texture(); sdl_set_fs(video_fullscreen & 1); /* Make sure we get a clean exit. */ @@ -554,16 +565,16 @@ sdl_enable(int enable) SDL_UnlockMutex(sdl_mutex); } + void sdl_reload(void) { - if (sdl_flags & RENDERER_HARDWARE) - { - SDL_LockMutex(sdl_mutex); + if (sdl_flags & RENDERER_HARDWARE) { + SDL_LockMutex(sdl_mutex); - SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); - sdl_reinit_texture(); + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); + sdl_reinit_texture(); - SDL_UnlockMutex(sdl_mutex); - } -} \ No newline at end of file + SDL_UnlockMutex(sdl_mutex); + } +} diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 79cc3a121..a778d60e7 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -1427,7 +1427,8 @@ ui_init(int nCmdShow) } /* Initialize the mouse module. */ - win_mouse_init(); + if (!start_in_fullscreen && !video_fullscreen_first) + win_mouse_init(); /* * Before we can create the Render window, we first have @@ -1457,16 +1458,16 @@ ui_init(int nCmdShow) else plat_resize(scrnsz_x, scrnsz_y); + /* Initialize the rendering window, or fullscreen. */ + if (start_in_fullscreen || video_fullscreen_first) + plat_setfullscreen(3); + /* Fire up the machine. */ pc_reset_hard_init(); /* Set the PAUSE mode depending on the renderer. */ plat_pause(0); - /* Initialize the rendering window, or fullscreen. */ - if (start_in_fullscreen) - plat_setfullscreen(1); - /* If so requested via the command line, inform the * application that started us of our HWND, using the * the hWnd and unique ID the application has given