Wait for EWMH WM to add _NET_SUPPORTING_WM_CHECK property, addresses #54

This commit is contained in:
Jarcode
2018-08-05 18:22:07 -07:00
parent e694261f4d
commit 198596eaee
3 changed files with 32 additions and 0 deletions

View File

@@ -681,6 +681,8 @@ static struct gl_bind_src* lookup_bind_src(const char* str) {
struct renderer* rd_new(const char** paths, const char* entry, struct renderer* rd_new(const char** paths, const char* entry,
const char* force_mod, const char* force_backend) { const char* force_mod, const char* force_backend) {
xwin_wait_for_wm();
renderer* r = malloc(sizeof(struct renderer)); renderer* r = malloc(sizeof(struct renderer));
*r = (struct renderer) { *r = (struct renderer) {

29
xwin.c
View File

@@ -8,6 +8,8 @@
#include <limits.h> #include <limits.h>
#include <errno.h> #include <errno.h>
#include <time.h>
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
@@ -53,6 +55,33 @@ static Window find_desktop(struct renderer* r) {
return desktop; return desktop;
} }
void xwin_wait_for_wm(void) {
Display* d = XOpenDisplay(0);
Atom check = None;
bool exists = false;
struct timespec tv = { .tv_sec = 0, .tv_nsec = 50 * 1000000 };
do {
if (check == None) {
check = XInternAtom(d, "_NET_SUPPORTING_WM_CHECK", true);
}
if (check) {
int num_prop, idx;
Atom* props = XListProperties(d, DefaultRootWindow(d), &num_prop);
for (idx = 0; idx < num_prop; ++idx) {
if (props[idx] == check) {
exists = true;
break;
}
}
}
if (!exists) nanosleep(&tv, NULL);
} while (!exists);
XCloseDisplay(d);
}
bool xwin_should_render(struct renderer* rd) { bool xwin_should_render(struct renderer* rd) {
bool ret = true, should_close = false; bool ret = true, should_close = false;
Display* d = rd_get_wcb(rd)->get_x11_display(); Display* d = rd_get_wcb(rd)->get_x11_display();

1
xwin.h
View File

@@ -2,6 +2,7 @@
#define XWIN_ALL_DESKTOPS 0xFFFFFFFF #define XWIN_ALL_DESKTOPS 0xFFFFFFFF
bool xwin_should_render(struct renderer* rd); bool xwin_should_render(struct renderer* rd);
void xwin_wait_for_wm(void);
bool xwin_settype(struct gl_wcb* wcb, void* impl, const char* type); bool xwin_settype(struct gl_wcb* wcb, void* impl, const char* type);
void xwin_setdesktop(struct gl_wcb* wcb, void* impl, unsigned long desktop); void xwin_setdesktop(struct gl_wcb* wcb, void* impl, unsigned long desktop);
void xwin_addstate(struct gl_wcb* wcb, void* impl, const char* state); void xwin_addstate(struct gl_wcb* wcb, void* impl, const char* state);