sla*_*uko 4 c++ linux opengl overlay glfw
我在正确设置 glfw 覆盖层时遇到了一些问题,我已经成功创建了一个具有透明背景的 glfw 窗口,现在我想让该窗口也“点击通过”,这样我就可以访问它后面的窗口并让它像一个覆盖。
遗憾的是我不知道如何在 glfw 中执行此操作,我当前初始化窗口的代码如下所示:
Width = 3440;
Height = 1440;
/* GLFW */
if (!glfwInit()) {
fprintf(stdout, "[GLFW] failed to init!\n");
exit(1);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
glfwWindowHint(GLFW_FOCUSED, GLFW_FALSE);
glfwWindowHint(GLFW_FOCUS_ON_SHOW, GLFW_FALSE);
/*Topmost and see through*/
glfwWindowHint(GLFW_FLOATING, GLFW_TRUE);
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
glfwSwapInterval(1);
Window = glfwCreateWindow(Width, Height, "Overlay", 0, 0);
glfwMakeContextCurrent(Window);
Run Code Online (Sandbox Code Playgroud)
我还尝试使用 glfw3_native.h 给出的 glfwGetX11Window 函数并尝试做类似的事情
void Render::MakeClickable(bool State){
auto X11Window = glfwGetX11Window(Window);
if(State){
}else{
XserverRegion region = XFixesCreateRegion (MainDisplay, NULL, 0);
XFixesSetWindowShapeRegion (MainDisplay, X11Window, ShapeInput, 0, 0, region);
XFixesDestroyRegion (MainDisplay, region);
}
}
Run Code Online (Sandbox Code Playgroud)
但这没有用:/
如何正确设置窗口以忽略我的点击并让它传递到后面的窗口,以便我可以将其用作覆盖层?
最近GLFW_MOUSE_PASSTHROUGHGLFW 添加了一个新的窗口提示来启用此功能。
你可以这样使用它:
glfwWindowHint(GLFW_MOUSE_PASSTHROUGH, GLFW_TRUE);
Run Code Online (Sandbox Code Playgroud)