// Check whether the running window manager is EWMH-compliant // static void detectEWMH(void) { Window* windowFromRoot = NULL; Window* windowFromChild = NULL; // First we need a couple of atoms const Atom supportingWmCheck = XInternAtom(_glfw.x11.display, "_NET_SUPPORTING_WM_CHECK", False); const Atom wmSupported = XInternAtom(_glfw.x11.display, "_NET_SUPPORTED", False); // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window if (_glfwGetWindowPropertyX11(_glfw.x11.root, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromRoot) != 1) { if (windowFromRoot) XFree(windowFromRoot); return; } _glfwGrabErrorHandlerX11(); // It should be the ID of a child window (of the root) // Then we look for the same property on the child window if (_glfwGetWindowPropertyX11(*windowFromRoot, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromChild) != 1) { XFree(windowFromRoot); if (windowFromChild) XFree(windowFromChild); return; } _glfwReleaseErrorHandlerX11(); // It should be the ID of that same child window if (*windowFromRoot != *windowFromChild) { XFree(windowFromRoot); XFree(windowFromChild); return; } XFree(windowFromRoot); XFree(windowFromChild); // We are now fairly sure that an EWMH-compliant window manager is running Atom* supportedAtoms; unsigned long atomCount; // Now we need to check the _NET_SUPPORTED property of the root window // It should be a list of supported WM protocol and state atoms atomCount = _glfwGetWindowPropertyX11(_glfw.x11.root, wmSupported, XA_ATOM, (unsigned char**) &supportedAtoms); // See which of the atoms we support that are supported by the WM _glfw.x11.NET_WM_STATE = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE"); _glfw.x11.NET_WM_STATE_ABOVE = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_ABOVE"); _glfw.x11.NET_WM_STATE_FULLSCREEN = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_FULLSCREEN"); _glfw.x11.NET_WM_STATE_MAXIMIZED_VERT = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_MAXIMIZED_VERT"); _glfw.x11.NET_WM_STATE_MAXIMIZED_HORZ = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_MAXIMIZED_HORZ"); _glfw.x11.NET_WM_FULLSCREEN_MONITORS = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_FULLSCREEN_MONITORS"); _glfw.x11.NET_WM_WINDOW_TYPE = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_WINDOW_TYPE"); _glfw.x11.NET_WM_WINDOW_TYPE_NORMAL = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_WINDOW_TYPE_NORMAL"); _glfw.x11.NET_ACTIVE_WINDOW = getSupportedAtom(supportedAtoms, atomCount, "_NET_ACTIVE_WINDOW"); _glfw.x11.NET_FRAME_EXTENTS = getSupportedAtom(supportedAtoms, atomCount, "_NET_FRAME_EXTENTS"); _glfw.x11.NET_REQUEST_FRAME_EXTENTS = getSupportedAtom(supportedAtoms, atomCount, "_NET_REQUEST_FRAME_EXTENTS"); XFree(supportedAtoms); }
// Check whether the running window manager is EWMH-compliant // static void detectEWMH(void) { Window* windowFromRoot = NULL; Window* windowFromChild = NULL; // First we need a couple of atoms, which should already be there Atom supportingWmCheck = XInternAtom(_glfw.x11.display, "_NET_SUPPORTING_WM_CHECK", True); Atom wmSupported = XInternAtom(_glfw.x11.display, "_NET_SUPPORTED", True); if (supportingWmCheck == None || wmSupported == None) return; // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window if (_glfwGetWindowProperty(_glfw.x11.root, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromRoot) != 1) { if (windowFromRoot) XFree(windowFromRoot); return; } _glfwGrabXErrorHandler(); // It should be the ID of a child window (of the root) // Then we look for the same property on the child window if (_glfwGetWindowProperty(*windowFromRoot, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromChild) != 1) { XFree(windowFromRoot); if (windowFromChild) XFree(windowFromChild); return; } _glfwReleaseXErrorHandler(); // It should be the ID of that same child window if (*windowFromRoot != *windowFromChild) { XFree(windowFromRoot); XFree(windowFromChild); return; } XFree(windowFromRoot); XFree(windowFromChild); // We are now fairly sure that an EWMH-compliant window manager is running Atom* supportedAtoms; unsigned long atomCount; // Now we need to check the _NET_SUPPORTED property of the root window // It should be a list of supported WM protocol and state atoms atomCount = _glfwGetWindowProperty(_glfw.x11.root, wmSupported, XA_ATOM, (unsigned char**) &supportedAtoms); // See which of the atoms we support that are supported by the WM _glfw.x11.NET_WM_STATE = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE"); _glfw.x11.NET_WM_STATE_ABOVE = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_ABOVE"); _glfw.x11.NET_WM_STATE_FULLSCREEN = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_FULLSCREEN"); _glfw.x11.NET_WM_FULLSCREEN_MONITORS = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_FULLSCREEN_MONITORS"); _glfw.x11.NET_WM_NAME = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_NAME"); _glfw.x11.NET_WM_ICON_NAME = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_ICON_NAME"); _glfw.x11.NET_WM_PID = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_PID"); _glfw.x11.NET_WM_PING = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_PING"); _glfw.x11.NET_ACTIVE_WINDOW = getSupportedAtom(supportedAtoms, atomCount, "_NET_ACTIVE_WINDOW"); _glfw.x11.NET_FRAME_EXTENTS = getSupportedAtom(supportedAtoms, atomCount, "_NET_FRAME_EXTENTS"); _glfw.x11.NET_REQUEST_FRAME_EXTENTS = getSupportedAtom(supportedAtoms, atomCount, "_NET_REQUEST_FRAME_EXTENTS"); _glfw.x11.NET_WM_BYPASS_COMPOSITOR = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_BYPASS_COMPOSITOR"); XFree(supportedAtoms); }
static void initEWMH(void) { Window* windowFromRoot = NULL; Window* windowFromChild = NULL; // First we need a couple of atoms, which should already be there Atom supportingWmCheck = XInternAtom(_glfwLibrary.X11.display, "_NET_SUPPORTING_WM_CHECK", True); Atom wmSupported = XInternAtom(_glfwLibrary.X11.display, "_NET_SUPPORTED", True); if (supportingWmCheck == None || wmSupported == None) return; // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window if (getWindowProperty(_glfwLibrary.X11.root, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromRoot) != 1) { XFree(windowFromRoot); return; } // It should be the ID of a child window (of the root) // Then we look for the same property on the child window if (getWindowProperty(*windowFromRoot, supportingWmCheck, XA_WINDOW, (unsigned char**) &windowFromChild) != 1) { XFree(windowFromRoot); XFree(windowFromChild); return; } // It should be the ID of that same child window if (*windowFromRoot != *windowFromChild) { XFree(windowFromRoot); XFree(windowFromChild); return; } XFree(windowFromRoot); XFree(windowFromChild); // We are now fairly sure that an EWMH-compliant window manager is running Atom* supportedAtoms; unsigned long atomCount; // Now we need to check the _NET_SUPPORTED property of the root window // It should be a list of supported WM protocol and state atoms atomCount = getWindowProperty(_glfwLibrary.X11.root, wmSupported, XA_ATOM, (unsigned char**) &supportedAtoms); // See which of the atoms we support that are supported by the WM _glfwLibrary.X11.wmState = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE"); _glfwLibrary.X11.wmStateFullscreen = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_STATE_FULLSCREEN"); _glfwLibrary.X11.wmName = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_NAME"); _glfwLibrary.X11.wmIconName = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_ICON_NAME"); _glfwLibrary.X11.wmPing = getSupportedAtom(supportedAtoms, atomCount, "_NET_WM_PING"); _glfwLibrary.X11.wmActiveWindow = getSupportedAtom(supportedAtoms, atomCount, "_NET_ACTIVE_WINDOW"); XFree(supportedAtoms); _glfwLibrary.X11.hasEWMH = GL_TRUE; }