mirror of
https://github.com/glfw/glfw.git
synced 2026-09-21 00:30:57 +00:00
Add GLFW_TRANSPARENT attribute and documentation
This completes support for window framebuffer transparency on Windows, macOS and X11. Note that the hint/attribute may be renamed before release to clarify its relationship to GLFW_OPACITY. Fixes #197. Closes #1079. Related to #663. Related to #715. Related to #723. Related to #1078.
This commit is contained in:
@@ -364,6 +364,7 @@ static void updateWindowMode(_GLFWwindow* window)
|
||||
}
|
||||
|
||||
// Enable compositor bypass
|
||||
if (!window->x11.transparent)
|
||||
{
|
||||
const unsigned long value = 1;
|
||||
|
||||
@@ -402,6 +403,7 @@ static void updateWindowMode(_GLFWwindow* window)
|
||||
}
|
||||
|
||||
// Disable compositor bypass
|
||||
if (!window->x11.transparent)
|
||||
{
|
||||
XDeleteProperty(_glfw.x11.display, window->x11.handle,
|
||||
_glfw.x11.NET_WM_BYPASS_COMPOSITOR);
|
||||
@@ -577,6 +579,8 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
|
||||
visual,
|
||||
AllocNone);
|
||||
|
||||
window->x11.transparent = _glfwIsVisualTransparentX11(visual);
|
||||
|
||||
// Create the actual window
|
||||
{
|
||||
XSetWindowAttributes wa;
|
||||
@@ -1838,6 +1842,15 @@ unsigned long _glfwGetWindowPropertyX11(Window window,
|
||||
return itemCount;
|
||||
}
|
||||
|
||||
GLFWbool _glfwIsVisualTransparentX11(Visual* visual)
|
||||
{
|
||||
if (!_glfw.x11.xrender.available)
|
||||
return GLFW_FALSE;
|
||||
|
||||
XRenderPictFormat* pf = XRenderFindVisualFormat(_glfw.x11.display, visual);
|
||||
return pf && pf->direct.alphaMask;
|
||||
}
|
||||
|
||||
// Push contents of our selection to clipboard manager
|
||||
//
|
||||
void _glfwPushSelectionToManagerX11(void)
|
||||
@@ -2422,6 +2435,18 @@ int _glfwPlatformWindowMaximized(_GLFWwindow* window)
|
||||
return maximized;
|
||||
}
|
||||
|
||||
int _glfwPlatformFramebufferTransparent(_GLFWwindow* window)
|
||||
{
|
||||
if (!window->x11.transparent)
|
||||
return GLFW_FALSE;
|
||||
|
||||
// Check whether a compositing manager is running
|
||||
char name[32];
|
||||
snprintf(name, sizeof(name), "_NET_WM_CM_S%u", _glfw.x11.screen);
|
||||
const Atom selection = XInternAtom(_glfw.x11.display, name, False);
|
||||
return XGetSelectionOwner(_glfw.x11.display, selection) != None;
|
||||
}
|
||||
|
||||
void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)
|
||||
{
|
||||
int width, height;
|
||||
|
||||
Reference in New Issue
Block a user