diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index 509beaa1f..47e9c3bb2 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -1932,10 +1932,10 @@ _glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig #define nswindow window->ns.object window->resizable = false; if (value) config = *value; - const bool is_transparent = ![nswindow isOpaque]; + const bool is_transparent = _glfwPlatformFramebufferTransparent(window); int background_blur = config.related.background_blur; if (!is_transparent || config.related.background_opacity >= 1.f) { background_blur = 0; } - [nswindow setBackgroundColor:nil]; + [nswindow setBackgroundColor:[NSColor clearColor]]; _glfwPlatformSetWindowBlur(window, background_blur); window->ns.titlebar_hidden = true; window->decorated = false; @@ -1960,18 +1960,50 @@ _glfwPlatformSetLayerShellConfig(_GLFWwindow* window, const GLFWLayerShellConfig float xscale = (float)config.expected.xscale, yscale = (float)config.expected.yscale; _glfwPlatformGetWindowContentScale(window, &xscale, &yscale); config.size_callback((GLFWwindow*)window, xscale, yscale, &cell_width, &cell_height, &left_edge_spacing, &top_edge_spacing, &right_edge_spacing, &bottom_edge_spacing); - CGFloat x = NSMinX(screen.visibleFrame), y = NSMinY(screen.visibleFrame) + 1, width = NSWidth(screen.visibleFrame), height = NSHeight(screen.visibleFrame); + double spacing_x = left_edge_spacing + right_edge_spacing; + double spacing_y = top_edge_spacing + bottom_edge_spacing; + const unsigned xsz = config.x_size_in_pixels ? (unsigned)(config.x_size_in_pixels * xscale) : (cell_width * config.x_size_in_cells); + const unsigned ysz = config.y_size_in_pixels ? (unsigned)(config.y_size_in_pixels * yscale) : (cell_height * config.y_size_in_cells); CGFloat dock_height = NSMinY(screen.visibleFrame) - NSMinY(screen.frame); CGFloat menubar_height = NSHeight(screen.frame) - NSHeight(screen.visibleFrame) - dock_height; + CGFloat x = NSMinX(screen.visibleFrame), y = NSMinY(screen.visibleFrame) - 1, width = NSWidth(screen.visibleFrame), height = NSHeight(screen.visibleFrame) + 2; + if (config.type == GLFW_LAYER_SHELL_BACKGROUND || config.edge == GLFW_EDGE_CENTER) { + x = NSMinX(screen.frame); height = NSHeight(screen.frame) - menubar_height + 1; y = NSMinY(screen.frame); width = NSWidth(screen.frame); + } // Screen co-ordinate system is with origin in lower left and y increasing upwards and x increasing rightwards // NSLog(@"frame: %@ visibleFrame: %@\n", NSStringFromRect(screen.frame), NSStringFromRect(screen.visibleFrame)); NSWindowLevel level = NSScreenSaverWindowLevel - 1; NSWindowAnimationBehavior animation_behavior = NSWindowAnimationBehaviorUtilityWindow; - if (config.type == GLFW_LAYER_SHELL_BACKGROUND) { - x = NSMinX(screen.frame); height = NSHeight(screen.frame) - menubar_height + 1; y = NSMinY(screen.frame); width = NSWidth(screen.frame); - animation_behavior = NSWindowAnimationBehaviorNone; - // See: https://stackoverflow.com/questions/4982584/how-do-i-draw-the-desktop-on-mac-os-x/4982619#4982619 - level = kCGDesktopWindowLevel; + switch (config.type) { + case GLFW_LAYER_SHELL_BACKGROUND: + animation_behavior = NSWindowAnimationBehaviorNone; + // See: https://stackoverflow.com/questions/4982584/how-do-i-draw-the-desktop-on-mac-os-x/4982619#4982619 + level = kCGDesktopWindowLevel; + break; + case GLFW_LAYER_SHELL_OVERLAY: case GLFW_LAYER_SHELL_NONE: break; + case GLFW_LAYER_SHELL_PANEL: level = NSNormalWindowLevel - 1; break; + case GLFW_LAYER_SHELL_TOP: level = NSPopUpMenuWindowLevel + 1; break; + } + if (config.type != GLFW_LAYER_SHELL_BACKGROUND && config.edge != GLFW_EDGE_CENTER) { + double panel_height = spacing_y + ysz / yscale, panel_width = spacing_x + xsz / xscale; + switch (config.edge) { + case GLFW_EDGE_BOTTOM: height = panel_height; break; + case GLFW_EDGE_TOP: + y += height - panel_height + 1.; + height = panel_height; + break; + case GLFW_EDGE_LEFT: width = panel_width; break; + case GLFW_EDGE_RIGHT: + x += width - panel_width + 1.; + width = panel_width; + break; + default: // top left + y += height - panel_height + 1.; + height = panel_height; width = panel_width; + break; + } + if (width < 1.) width = NSWidth(screen.visibleFrame); + if (height < 1.) height = NSWidth(screen.visibleFrame); } x += config.requested_left_margin; width -= config.requested_left_margin + config.requested_right_margin; @@ -3075,7 +3107,7 @@ GLFWAPI GLFWcocoarenderframefun glfwCocoaSetWindowResizeCallback(GLFWwindow *w, GLFWAPI void glfwCocoaSetWindowChrome(GLFWwindow *w, unsigned int color, bool use_system_color, unsigned int system_color, int background_blur, unsigned int hide_window_decorations, bool show_text_in_titlebar, int color_space, float background_opacity, bool resizable) { @autoreleasepool { _GLFWwindow* window = (_GLFWwindow*)w; if (window->ns.layer_shell.is_active) return; - const bool is_transparent = ![window->ns.object isOpaque]; + const bool is_transparent = _glfwPlatformFramebufferTransparent(window); if (!is_transparent) { background_opacity = 1.0; background_blur = 0; } NSColor *background = nil; NSAppearance *appearance = nil;