是否可以用 C++ 为 X11 Xlib 编程而不是使用 C?

Posted

技术标签:

【中文标题】是否可以用 C++ 为 X11 Xlib 编程而不是使用 C?【英文标题】:Is it possible to program in C++ for X11 Xlib instead of using C? 【发布时间】:2022-01-05 17:12:35 【问题描述】:

我正在尝试在 X11、XLib 应用程序的 C++ 类中进行编程,但在执行以下行时不断收到“程序收到信号 SIGSEGV 分段错误”。 进一步执行 stop n 程序崩溃!

   void
sysInfo::Create_Window (Display *dpy, int border_width)

    scrn = DefaultScreen (dpy);  // **ERROR hit on this line**
    win_width  = DisplayWidth (dpy, scrn);
    win_height = DisplayHeight (dpy, scrn);

    wmDeleteMsg = XInternAtom (dpy, "WM_DELETE_WINDOW", False);
    /* Set up for window Manager Icon */
    win_icon = XInternAtom (dpy, "_NET_WM_ICON", False);
    cardinal = XInternAtom (dpy, "CARDINAL", False);


    /* create operque window  */
   win = XCreateSimpleWindow (dpy,
                               RootWindow (dpy, scrn),
                               0, 0,
                               win_width,
                               win_height,
                               border_width,
                               BlackPixel (dpy, scrn),
                               WhitePixel (dpy, scrn) );

    //wmHints ();                 // Window Manager Hints
    //sizeHints ();               // Window default size could be override
    //classHints ();              // Window class

    // set up exit proc for sudden exit
    XSetWMProtocols (dpy, win, &wmDeleteMsg, 1);

【问题讨论】:

是的,当然可以。请创建minimal reproducible example 以帮助人们诊断您的错误。 可以演示吗? 【参考方案1】:

是否可以用 C++ 为 X11 Xlib 编程而不是使用 C?

是的。

不断收到“程序收到信号SIGSEGV分段错误”

在您的示例中不清楚dpy 的来源,但您确定您已正确打开显示连接吗?如果是这样,这个例子应该可以正常工作:

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <iostream>
#include <chrono>
#include <thread>

Window win;

void Create_Window(Display* dpy, int border_width)

    int scrn = DefaultScreen(dpy);
    int win_width = DisplayWidth(dpy, scrn);
    int win_height = DisplayHeight(dpy, scrn);

    Atom wmDeleteMsg = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
    /* Set up for window Manager Icon */
    Atom win_icon = XInternAtom(dpy, "_NET_WM_ICON", False);
    Atom cardinal = XInternAtom(dpy, "CARDINAL", False);

    /* create operque window  */
    win = XCreateSimpleWindow(dpy,
                              RootWindow(dpy, scrn),
                              0,
                              0,
                              win_width,
                              win_height,
                              border_width,
                              BlackPixel(dpy, scrn),
                              WhitePixel(dpy, scrn));

    // wmHints ();                 // Window Manager Hints
    // sizeHints ();               // Window default size could be override
    // classHints ();              // Window class

    // set up exit proc for sudden exit
    XSetWMProtocols(dpy, win, &wmDeleteMsg, 1);


int main()

    Display* dpy = XOpenDisplay(nullptr);
    if (dpy == nullptr)
    
        std::cout << "Failed to open display connection" << '\n';
        exit(1);
    
    Create_Window(dpy, 1);
    XMapRaised(dpy, win);
    XSync(dpy, false);
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    XDestroyWindow(dpy, win);
    XCloseDisplay(dpy);
    return 0;

【讨论】:

谢谢 Alexey104,但问题是另一个问题。如果你喜欢我可以发送一段代码供你审查?

以上是关于是否可以用 C++ 为 X11 Xlib 编程而不是使用 C?的主要内容,如果未能解决你的问题,请参考以下文章

Linux下判断活动窗口是否全屏

Linux下判断活动窗口是否全屏

Linux下判断活动窗口是否全屏

使用 MSYS 构建 GLEW:未找到 X11

获取当前 X11 服务器时间

使用 X11 (c++) 为 lib 链接目标失败