【问题标题】:Is it possible to program in C++ for X11 Xlib instead of using C?是否可以用 C++ 为 X11 Xlib 编程而不是使用 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);

【问题讨论】:

标签: c++ x11 xlib xorg


【解决方案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,但问题是另一个问题。如果你喜欢我可以发送一段代码供你审查?
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 2012-05-15
  • 2011-03-03
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多