From 1b6a63edf7b64cb9d953058f655d9544c2702d99 Mon Sep 17 00:00:00 2001 From: kanjitalk755 Date: Tue, 26 Feb 2019 14:57:02 +0900 Subject: [PATCH 1/9] alternative PR#11 --- BasiliskII/src/SDL/video_sdl2.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index 138e91b3..c99e3248 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -875,10 +875,6 @@ static int present_sdl_video() SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 0); // Use black SDL_RenderClear(sdl_renderer); // Clear the display - // We're about to work with sdl_update_video_rect, so stop other threads from - // modifying it! - SDL_LockMutex(sdl_update_video_mutex); - // Convert from the guest OS' pixel format, to the host OS' texture, if necessary. if (host_surface != guest_surface && host_surface != NULL && @@ -886,14 +882,17 @@ static int present_sdl_video() { SDL_Rect destRect = sdl_update_video_rect; LOCK_PALETTE; + SDL_LockMutex(sdl_update_video_mutex); int result = SDL_BlitSurface(guest_surface, &sdl_update_video_rect, host_surface, &destRect); + SDL_UnlockMutex(sdl_update_video_mutex); UNLOCK_PALETTE; - if (result != 0) { - SDL_UnlockMutex(sdl_update_video_mutex); - return -1; - } + if (result != 0) return -1; } + // We're about to work with sdl_update_video_rect, so stop other threads from + // modifying it! + SDL_LockMutex(sdl_update_video_mutex); + // Update the host OS' texture void * srcPixels = (void *)((uint8_t *)host_surface->pixels + sdl_update_video_rect.y * host_surface->pitch + From 537412b959ba7cb551ca6b1c1e33a90f181471a6 Mon Sep 17 00:00:00 2001 From: Seth Date: Tue, 26 Feb 2019 13:21:31 -0600 Subject: [PATCH 2/9] trying to remove graphical anomalies, alternative deadlock fix branch --- BasiliskII/src/SDL/video_sdl2.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index c99e3248..82888389 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -875,23 +875,26 @@ static int present_sdl_video() SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 0); // Use black SDL_RenderClear(sdl_renderer); // Clear the display + LOCK_PALETTE; + SDL_LockMutex(sdl_update_video_mutex); // Convert from the guest OS' pixel format, to the host OS' texture, if necessary. if (host_surface != guest_surface && host_surface != NULL && guest_surface != NULL) { SDL_Rect destRect = sdl_update_video_rect; - LOCK_PALETTE; - SDL_LockMutex(sdl_update_video_mutex); int result = SDL_BlitSurface(guest_surface, &sdl_update_video_rect, host_surface, &destRect); - SDL_UnlockMutex(sdl_update_video_mutex); - UNLOCK_PALETTE; - if (result != 0) return -1; + if (result != 0) { + SDL_UnlockMutex(sdl_update_video_mutex); + UNLOCK_PALETTE; + return -1; + } } + UNLOCK_PALETTE; // We're about to work with sdl_update_video_rect, so stop other threads from // modifying it! - SDL_LockMutex(sdl_update_video_mutex); +// SDL_LockMutex(sdl_update_video_mutex); // Update the host OS' texture void * srcPixels = (void *)((uint8_t *)host_surface->pixels + From 1889560d1f13cdf8216f07dfa8404f3a3f998b4e Mon Sep 17 00:00:00 2001 From: Seth Date: Tue, 26 Feb 2019 21:02:57 -0600 Subject: [PATCH 3/9] deadlock and video fix comments tidied --- BasiliskII/src/SDL/video_sdl2.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index 82888389..b6237489 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -875,6 +875,8 @@ static int present_sdl_video() SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 0); // Use black SDL_RenderClear(sdl_renderer); // Clear the display + // We're about to work with sdl_update_video_rect, so stop other threads from + // modifying it! LOCK_PALETTE; SDL_LockMutex(sdl_update_video_mutex); // Convert from the guest OS' pixel format, to the host OS' texture, if necessary. @@ -890,11 +892,7 @@ static int present_sdl_video() return -1; } } - UNLOCK_PALETTE; - - // We're about to work with sdl_update_video_rect, so stop other threads from - // modifying it! -// SDL_LockMutex(sdl_update_video_mutex); + UNLOCK_PALETTE; // passed potential deadlock, can unlock palette // Update the host OS' texture void * srcPixels = (void *)((uint8_t *)host_surface->pixels + From 1647ba7b6fd2e349fff2c813feea6bcaff47cc31 Mon Sep 17 00:00:00 2001 From: Alexander Thomas Date: Wed, 27 Feb 2019 18:41:00 +0100 Subject: [PATCH 4/9] Fix header search paths for kpx_cpu They were still pointing to SDL.framework, not SDL2. --- .../src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj b/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj index a24b1d86..9706b234 100755 --- a/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj +++ b/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj @@ -1126,7 +1126,7 @@ _REENTRANT, ); HEADER_SEARCH_PATHS = ( - /Library/Frameworks/SDL.framework/Versions/A/Headers/, + /Library/Frameworks/SDL2.framework/Headers/, ./config/, ../Unix, ../MacOSX/Launcher, @@ -1163,7 +1163,7 @@ _REENTRANT, ); HEADER_SEARCH_PATHS = ( - /Library/Frameworks/SDL.framework/Versions/A/Headers/, + /Library/Frameworks/SDL2.framework/Headers/, ./config/, ../Unix, ../MacOSX/Launcher, From 5867b3f4c2cacc80a5e2557a4f6f3c148f4db00f Mon Sep 17 00:00:00 2001 From: Alexander Thomas Date: Sat, 9 Mar 2019 17:13:29 +0100 Subject: [PATCH 5/9] Custom icon for SheepVM --- SheepShaver/src/MacOSX/Info.plist.in | 2 +- .../project.pbxproj | 4 ++++ SheepShaver/src/MacOSX/SheepVM.icns | Bin 0 -> 76219 bytes 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 SheepShaver/src/MacOSX/SheepVM.icns diff --git a/SheepShaver/src/MacOSX/Info.plist.in b/SheepShaver/src/MacOSX/Info.plist.in index 670400d9..02528a92 100644 --- a/SheepShaver/src/MacOSX/Info.plist.in +++ b/SheepShaver/src/MacOSX/Info.plist.in @@ -28,7 +28,7 @@ sheepvm CFBundleTypeIconFile - SheepShaver.icns + SheepVM.icns CFBundleTypeName SheepShaver VM CFBundleTypeRole diff --git a/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj b/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj index 9706b234..7a4b5145 100755 --- a/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj +++ b/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj @@ -79,6 +79,7 @@ 087B91C01B780FFC00825F7F /* vm_alloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 087B91BC1B780FFC00825F7F /* vm_alloc.cpp */; }; 08CD42DC14B7B85B009CA2A2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08CD42DB14B7B85B009CA2A2 /* Cocoa.framework */; }; 08CD42E814B7B8AA009CA2A2 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08CD42E714B7B8AA009CA2A2 /* Carbon.framework */; }; + 3D2C25B5221092BA00B635DE /* SheepVM.icns in Resources */ = {isa = PBXBuildFile; fileRef = 3D2C25B4221092BA00B635DE /* SheepVM.icns */; }; A7B1921418C35D4700791D8D /* DiskType.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B1921318C35D4700791D8D /* DiskType.m */; }; E413A40320CF7E6D00FBE967 /* video_sdl2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E413A40220CF7E6D00FBE967 /* video_sdl2.cpp */; }; E4150D1220D557820077C51A /* SDL2.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E4150D1120D557820077C51A /* SDL2.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -321,6 +322,7 @@ 087B91BD1B780FFC00825F7F /* vm_alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vm_alloc.h; path = ../CrossPlatform/vm_alloc.h; sourceTree = SOURCE_ROOT; }; 08CD42DB14B7B85B009CA2A2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 08CD42E714B7B8AA009CA2A2 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 3D2C25B4221092BA00B635DE /* SheepVM.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = SheepVM.icns; sourceTree = ""; }; A7B1921218C35D4700791D8D /* DiskType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiskType.h; sourceTree = ""; }; A7B1921318C35D4700791D8D /* DiskType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DiskType.m; sourceTree = ""; }; E413A40220CF7E6D00FBE967 /* video_sdl2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = video_sdl2.cpp; path = ../../../BasiliskII/src/SDL/video_sdl2.cpp; sourceTree = ""; }; @@ -712,6 +714,7 @@ 0856CE6D14A99EF0000B1711 /* macos_util_macosx.h */, 0856CE7014A99EF0000B1711 /* prefs_macosx.mm */, 0856CE8314A99EF0000B1711 /* SheepShaver.icns */, + 3D2C25B4221092BA00B635DE /* SheepVM.icns */, 0856CE8714A99EF0000B1711 /* sys_darwin.cpp */, 0873A80014AC515D004F12B7 /* utils_macosx.h */, 0873A80114AC515D004F12B7 /* utils_macosx.mm */, @@ -961,6 +964,7 @@ E44C460820D262B0000583AE /* VERSION in Resources */, 0856D05914A99EF1000B1711 /* SheepShaver.icns in Resources */, E44C460F20D262B0000583AE /* COPYRIGHT in Resources */, + 3D2C25B5221092BA00B635DE /* SheepVM.icns in Resources */, 0856D33514A9A704000B1711 /* VMSettingsWindow.nib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SheepShaver/src/MacOSX/SheepVM.icns b/SheepShaver/src/MacOSX/SheepVM.icns new file mode 100644 index 0000000000000000000000000000000000000000..0d6552464b8d273128a9d6057db46b222892c530 GIT binary patch literal 76219 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 Date: Thu, 28 Mar 2019 14:32:16 +0900 Subject: [PATCH 6/9] hard cursor in full screen mode --- BasiliskII/src/SDL/video_sdl2.cpp | 37 ++++++++++++++++---- BasiliskII/src/Unix/Linux/NetDriver/config.h | 1 - 2 files changed, 31 insertions(+), 7 deletions(-) delete mode 120000 BasiliskII/src/Unix/Linux/NetDriver/config.h diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index b6237489..d3b50d9b 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -942,6 +942,34 @@ void update_sdl_video(SDL_Surface *s, Sint32 x, Sint32 y, Sint32 w, Sint32 h) update_sdl_video(s, 1, &temp); } +#ifdef SHEEPSHAVER +static void MagBits(Uint8 *dst, Uint8 *src, int mag) { + for (int y = 0; y < 16; y++) + for (int x = 0; x < 16; x++) { + int sa = 16 * y + x; + if (!(src[sa >> 3] & 0x80 >> (sa & 7))) continue; + for (int dy = 0; dy < mag; dy++) + for (int dx = 0; dx < mag; dx++) { + int da = 16 * mag * (mag * y + dy) + mag * x + dx; + dst[da >> 3] |= 0x80 >> (da & 7); + } + } +} +static SDL_Cursor *MagCursor(bool hot) { + float sx, sy; + SDL_RenderGetScale(sdl_renderer, &sx, &sy); + int mag = std::min(sx, sy); + Uint8 *data = (Uint8 *)SDL_calloc(1, 32 * mag * mag); + Uint8 *mask = (Uint8 *)SDL_calloc(1, 32 * mag * mag); + MagBits(data, &MacCursor[4], mag); + MagBits(mask, &MacCursor[36], mag); + SDL_Cursor *cursor = SDL_CreateCursor(data, mask, 16 * mag, 16 * mag, hot ? MacCursor[2] : 0, hot ? MacCursor[3] : 0); + SDL_free(data); + SDL_free(mask); + return cursor; +} +#endif + void driver_base::set_video_mode(int flags) { int depth = sdl_depth_of_video_depth(VIDEO_MODE_DEPTH); @@ -1018,7 +1046,7 @@ void driver_base::adapt_to_video_mode() { hardware_cursor = video_can_change_cursor(); if (hardware_cursor) { // Create cursor - if ((sdl_cursor = SDL_CreateCursor(MacCursor + 4, MacCursor + 36, 16, 16, 0, 0)) != NULL) { + if ((sdl_cursor = MagCursor(false)) != NULL) { SDL_SetCursor(sdl_cursor); } } @@ -1816,10 +1844,7 @@ void SDL_monitor_desc::switch_to_current_mode(void) #ifdef SHEEPSHAVER bool video_can_change_cursor(void) { - if (display_type != DISPLAY_WINDOW || !PrefsFindBool("hardcursor")) - return false; - - return true; + return PrefsFindBool("hardcursor") && (display_type == DISPLAY_WINDOW || PrefsFindBool("scale_integer")); } #endif @@ -1834,7 +1859,7 @@ void video_set_cursor(void) // Set new cursor image if it was changed if (sdl_cursor) { SDL_FreeCursor(sdl_cursor); - sdl_cursor = SDL_CreateCursor(MacCursor + 4, MacCursor + 36, 16, 16, MacCursor[2], MacCursor[3]); + sdl_cursor = MagCursor(true); if (sdl_cursor) { SDL_ShowCursor(private_data == NULL || private_data->cursorVisible); SDL_SetCursor(sdl_cursor); diff --git a/BasiliskII/src/Unix/Linux/NetDriver/config.h b/BasiliskII/src/Unix/Linux/NetDriver/config.h deleted file mode 120000 index fc383f11..00000000 --- a/BasiliskII/src/Unix/Linux/NetDriver/config.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../SheepShaver/src/Unix/config.h \ No newline at end of file From 62deb590a61dc8d38413771cbe4289a102c2ee60 Mon Sep 17 00:00:00 2001 From: kanjitalk755 Date: Fri, 29 Mar 2019 12:59:13 +0900 Subject: [PATCH 7/9] fixed hot spot --- BasiliskII/src/SDL/video_sdl2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index d3b50d9b..89512ba1 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -963,7 +963,7 @@ static SDL_Cursor *MagCursor(bool hot) { Uint8 *mask = (Uint8 *)SDL_calloc(1, 32 * mag * mag); MagBits(data, &MacCursor[4], mag); MagBits(mask, &MacCursor[36], mag); - SDL_Cursor *cursor = SDL_CreateCursor(data, mask, 16 * mag, 16 * mag, hot ? MacCursor[2] : 0, hot ? MacCursor[3] : 0); + SDL_Cursor *cursor = SDL_CreateCursor(data, mask, 16 * mag, 16 * mag, hot ? MacCursor[2] * mag : 0, hot ? MacCursor[3] * mag : 0); SDL_free(data); SDL_free(mask); return cursor; From 7131e8205d4a2599ef995e39eddc908f8f875254 Mon Sep 17 00:00:00 2001 From: kanjitalk755 Date: Sat, 30 Mar 2019 13:23:52 +0900 Subject: [PATCH 8/9] Windows: ignore Alt+F4 --- BasiliskII/src/SDL/video_sdl2.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index 89512ba1..1e79de1a 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -2287,6 +2287,9 @@ static void handle_events(void) // Window "close" widget clicked case SDL_QUIT: +#ifdef WIN32 + if (SDL_GetModState() & (KMOD_LALT | KMOD_RALT)) break; +#endif ADBKeyDown(0x7f); // Power key ADBKeyUp(0x7f); break; From 4603bd305c8747ba5b480bced7555c68f30672a5 Mon Sep 17 00:00:00 2001 From: kanjitalk755 Date: Mon, 1 Apr 2019 12:29:42 +0900 Subject: [PATCH 9/9] fix cursor for high DPI ignore Alt+F4 for all platform --- BasiliskII/src/SDL/video_sdl2.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index 1e79de1a..409abe24 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -956,9 +956,9 @@ static void MagBits(Uint8 *dst, Uint8 *src, int mag) { } } static SDL_Cursor *MagCursor(bool hot) { - float sx, sy; - SDL_RenderGetScale(sdl_renderer, &sx, &sy); - int mag = std::min(sx, sy); + int w, h; + SDL_GetWindowSize(sdl_window, &w, &h); + int mag = std::min(w / drv->VIDEO_MODE_X, h / drv->VIDEO_MODE_Y); Uint8 *data = (Uint8 *)SDL_calloc(1, 32 * mag * mag); Uint8 *mask = (Uint8 *)SDL_calloc(1, 32 * mag * mag); MagBits(data, &MacCursor[4], mag); @@ -2287,9 +2287,7 @@ static void handle_events(void) // Window "close" widget clicked case SDL_QUIT: -#ifdef WIN32 if (SDL_GetModState() & (KMOD_LALT | KMOD_RALT)) break; -#endif ADBKeyDown(0x7f); // Power key ADBKeyUp(0x7f); break;