Fix screen recording for certain windows (such as termite)
This commit is contained in:
parent
6343c5a76b
commit
bf9df281d2
30
src/main.cpp
30
src/main.cpp
@ -151,6 +151,12 @@ static bool recreate_window_pixmap(Display *dpy, Window window_id,
|
|||||||
WindowPixmap &pixmap) {
|
WindowPixmap &pixmap) {
|
||||||
cleanup_window_pixmap(dpy, pixmap);
|
cleanup_window_pixmap(dpy, pixmap);
|
||||||
|
|
||||||
|
XWindowAttributes attr;
|
||||||
|
if (!XGetWindowAttributes(dpy, window_id, &attr)) {
|
||||||
|
fprintf(stderr, "Failed to get window attributes\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const int pixmap_config[] = {
|
const int pixmap_config[] = {
|
||||||
GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
|
GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
|
||||||
GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT | GLX_WINDOW_BIT,
|
GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT | GLX_WINDOW_BIT,
|
||||||
@ -181,6 +187,28 @@ static bool recreate_window_pixmap(Display *dpy, Window window_id,
|
|||||||
ScopedGLXFBConfig scoped_configs;
|
ScopedGLXFBConfig scoped_configs;
|
||||||
scoped_configs.configs = configs;
|
scoped_configs.configs = configs;
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
GLXFBConfig config;
|
||||||
|
for (int i = 0; i < c; i++) {
|
||||||
|
config = configs[i];
|
||||||
|
XVisualInfo *visual = glXGetVisualFromFBConfig(dpy, config);
|
||||||
|
if (!visual)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (attr.depth != visual->depth) {
|
||||||
|
XFree(visual);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
XFree(visual);
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found) {
|
||||||
|
fprintf(stderr, "No matching fb config found\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Pixmap new_window_pixmap = XCompositeNameWindowPixmap(dpy, window_id);
|
Pixmap new_window_pixmap = XCompositeNameWindowPixmap(dpy, window_id);
|
||||||
if (!new_window_pixmap) {
|
if (!new_window_pixmap) {
|
||||||
fprintf(stderr, "Failed to get pixmap for window %ld\n", window_id);
|
fprintf(stderr, "Failed to get pixmap for window %ld\n", window_id);
|
||||||
@ -188,7 +216,7 @@ static bool recreate_window_pixmap(Display *dpy, Window window_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
GLXPixmap glx_pixmap =
|
GLXPixmap glx_pixmap =
|
||||||
glXCreatePixmap(dpy, *configs, new_window_pixmap, pixmap_attribs);
|
glXCreatePixmap(dpy, config, new_window_pixmap, pixmap_attribs);
|
||||||
if (!glx_pixmap) {
|
if (!glx_pixmap) {
|
||||||
fprintf(stderr, "Failed to create glx pixmap\n");
|
fprintf(stderr, "Failed to create glx pixmap\n");
|
||||||
XFreePixmap(dpy, new_window_pixmap);
|
XFreePixmap(dpy, new_window_pixmap);
|
||||||
|
Loading…
Reference in New Issue
Block a user