Update OpenGLWindow.cpp
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 1m58s
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 1m58s
Fix for our window not showing up in the window list on some floating window managers.
This commit is contained in:
@@ -58,6 +58,20 @@ namespace OpenGL {
|
||||
typedef GLXContext (*glXCreateContextAttribsARBProc)(Display *, GLXFBConfig, GLXContext, Bool, const int *);
|
||||
}
|
||||
|
||||
// Used to determine if we should force our window to start as floating on tiling window managers.
|
||||
[[nodiscard]] bool TilingWindowManager() {
|
||||
const char* xdg_env = std::getenv("XDG_CURRENT_DESKTOP");
|
||||
const char* session_env = std::getenv("DESKTOP_SESSION");
|
||||
|
||||
std::string xdg_current_desktop = xdg_env ? xdg_env : "";
|
||||
std::string desktop_session = session_env ? session_env : "";
|
||||
|
||||
if (xdg_current_desktop == "i3" || desktop_session == "i3")
|
||||
return true;
|
||||
|
||||
return false;
|
||||
// TODO check for dwm & sway.
|
||||
}
|
||||
void OpenGLWindow::SwapBuffers() {
|
||||
OpenGL::glXSwapBuffers(platform->display,platform->window);
|
||||
}
|
||||
@@ -73,6 +87,8 @@ std::string OpenGLWindow::GetGraphicsDriverVendor() {
|
||||
}
|
||||
|
||||
bool OpenGLWindow::Open() {
|
||||
bool tiling = TilingWindowManager();
|
||||
|
||||
if (!OpenGL::constructor_success)
|
||||
return false;
|
||||
|
||||
@@ -81,9 +97,11 @@ bool OpenGLWindow::Open() {
|
||||
|
||||
platform->xSetWindowAttributes.border_pixel = BlackPixel(platform->display, platform->defaultScreen);
|
||||
platform->xSetWindowAttributes.background_pixel = BlackPixel(platform->display, platform->defaultScreen);
|
||||
platform->xSetWindowAttributes.override_redirect = True;
|
||||
platform->xSetWindowAttributes.event_mask = ExposureMask;
|
||||
|
||||
if (tiling)
|
||||
platform->xSetWindowAttributes.override_redirect = True;
|
||||
|
||||
auto glXCreateContextAttribsARB = (OpenGL::glXCreateContextAttribsARBProc) OpenGL::glXGetProcAddressARB((const GLubyte*)"glXCreateContextAttribsARB");
|
||||
XVisualInfo* vi = nullptr;
|
||||
|
||||
@@ -125,7 +143,6 @@ bool OpenGLWindow::Open() {
|
||||
platform->window = XCreateWindow(platform->display, RootWindow(platform->display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput,
|
||||
vi->visual, CWBackPixel | CWColormap | CWBorderPixel, &platform->xSetWindowAttributes);
|
||||
|
||||
// TODO allow the user to specify what OpenGL version they want.
|
||||
int context_attributes[] { GLX_CONTEXT_MAJOR_VERSION_ARB, gl_major, GLX_CONTEXT_MINOR_VERSION_ARB, gl_minor, None };
|
||||
platform->gl_context = glXCreateContextAttribsARB(platform->display, best_fbc, nullptr, True, context_attributes);
|
||||
XFree(fb_configurations);
|
||||
@@ -146,9 +163,13 @@ bool OpenGLWindow::Open() {
|
||||
XMapWindow(platform->display, platform->window);
|
||||
XStoreName(platform->display, platform->window, title.c_str());
|
||||
|
||||
platform->windowTypeAtom = XInternAtom(platform->display, "_NET_WM_WINDOW_TYPE", False);
|
||||
platform->windowTypeUtilityAtom = XInternAtom(platform->display, "_NET_WM_WINDOW_TYPE_UTILITY", False);
|
||||
XChangeProperty(platform->display, platform->window, platform->windowTypeAtom, XA_ATOM, 32, PropModeReplace, (unsigned char*) &platform->windowTypeUtilityAtom, 1);
|
||||
|
||||
if (tiling) {
|
||||
platform->windowTypeAtom = XInternAtom(platform->display, "_NET_WM_WINDOW_TYPE", False);
|
||||
platform->windowTypeUtilityAtom = XInternAtom(platform->display, "_NET_WM_WINDOW_TYPE_UTILITY", False);
|
||||
XChangeProperty(platform->display, platform->window, platform->windowTypeAtom, XA_ATOM, 32, PropModeReplace,
|
||||
(unsigned char *) &platform->windowTypeUtilityAtom, 1);
|
||||
}
|
||||
|
||||
platform->wmDeleteWindow = XInternAtom(platform->display, "WM_DELETE_WINDOW", False);
|
||||
XSetWMProtocols(platform->display, platform->window, &platform->wmDeleteWindow, 1);
|
||||
|
Reference in New Issue
Block a user