From 36195df44a442041185c729010a0c07bd7adead9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20A=2E=20A=CC=81lvarez?= Date: Fri, 25 Oct 2019 23:11:36 +0200 Subject: [PATCH] make window transparent --- BasiliskII/src/MacOSX/utils_macosx.mm | 34 +++++++++++++++++++++++++++ BasiliskII/src/SDL/video_sdl2.cpp | 5 ++++ 2 files changed, 39 insertions(+) diff --git a/BasiliskII/src/MacOSX/utils_macosx.mm b/BasiliskII/src/MacOSX/utils_macosx.mm index c68d2115..71ad1d3b 100644 --- a/BasiliskII/src/MacOSX/utils_macosx.mm +++ b/BasiliskII/src/MacOSX/utils_macosx.mm @@ -52,6 +52,40 @@ void disable_SDL2_macosx_menu_bar_keyboard_shortcuts() { } } +void make_window_transparent(SDL_Window * window) +{ + if (!window) { + return; + } + + SDL_SysWMinfo wmInfo; + SDL_VERSION(&wmInfo.version); + if (!SDL_GetWindowWMInfo(window, &wmInfo)) { + return; + } + + CGColorRef clearColor = [NSColor clearColor].CGColor; + NSWindow *cocoaWindow = wmInfo.info.cocoa.window; + NSView *sdlView = cocoaWindow.contentView; + sdlView.layer.backgroundColor = [NSColor clearColor].CGColor; + cocoaWindow.backgroundColor = [NSColor clearColor]; + cocoaWindow.hasShadow = NO; + cocoaWindow.opaque = NO; + + // make metal layer transparent + for (NSView *view in sdlView.subviews) { + if ([view.className isEqualToString:@"SDL_cocoametalview"]) { + view.layer.opaque = NO; + view.layer.backgroundColor = clearColor; + return; + } + } + + // make OpenGL surface transparent + GLint zero = 0; + [[NSOpenGLContext currentContext] setValues:&zero forParameter:NSOpenGLCPSurfaceOpacity]; +} + bool is_fullscreen_osx(SDL_Window * window) { if (!window) { diff --git a/BasiliskII/src/SDL/video_sdl2.cpp b/BasiliskII/src/SDL/video_sdl2.cpp index 42247b21..86520abf 100644 --- a/BasiliskII/src/SDL/video_sdl2.cpp +++ b/BasiliskII/src/SDL/video_sdl2.cpp @@ -751,6 +751,11 @@ static SDL_Surface * init_sdl_video(int width, int height, int bpp, Uint32 flags } if (flags & SDL_WINDOW_FULLSCREEN) SDL_SetWindowGrab(sdl_window, SDL_TRUE); +#ifdef __MACOSX__ + extern void make_window_transparent(SDL_Window * window); + make_window_transparent(sdl_window); +#endif + // Some SDL events (regarding some native-window events), need processing // as they are generated. SDL2 has a facility, SDL_AddEventWatch(), which // allows events to be processed as they are generated.