XOpenDisplay失败

时间:2014-01-26 22:09:01

标签: c++ x11

我正在编写一个无法返回显示的简单窗口类。这是简短版本:

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>

class WindowImpl
{
    public:
        WindowImpl()
        {
            open = true;
        }

        WindowImpl(float width, float height)
        {
            if(!create(width, height))
            {
                fprintf(stderr, "Could not open display\n");
                exit(1);
            }

            open = true;
        }

        ~WindowImpl()
        {
            XCloseDisplay(display);
        };

        bool create(float width, float height)
        {
            display = XOpenDisplay(NULL);
            if(display == NULL)
                return false;

            int displayID = DefaultScreen(display);

            window = XCreateSimpleWindow(display, RootWindow(display, displayID), 10, 10, width, height, 1, BlackPixel(display, displayID), WhitePixel(display, displayID));
            XMapWindow(display, window);

            return true;
        }

        bool isOpen()
        {
            return open;
        }

        void close()
        {
            open == false;
        }

    private:
        Display* display;
        Window window;
        bool open;
};


int main()
{
    WindowImpl myWindow(1920, 1080);
    char* cmd;

    while(myWindow.isOpen())
    {
        if(gets(cmd) == "close")
            myWindow.close();
    }

    return 0;
}

WindowImpl :: create失败,XOpenDisplay返回NULL,但我不确定原因。希望有人能在这里解决这个问题。

编辑:更改WindowImpl :: create以返回true和false而不是0和1会导致它通过但窗口仍然无法打开;

澄清:

#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    Display* display;
    Window window;
    XEvent event;
    char* message = "Hello";
    int screenSize;

    display = XOpenDisplay(NULL);
    if(display == NULL)
    {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }

    screenSize = DefaultScreen(display);
    window = XCreateSimpleWindow(display, RootWindow(display, screenSize), 10, 10, 1920, 1080, 1, BlackPixel(display, screenSize), WhitePixel(display, screenSize));
    XSelectInput(display, window, ExposureMask | KeyPressMask);
    XMapWindow(display, window);

    KeySym keysym = XK_Escape;
    KeyCode keycode = XKeysymToKeycode(display, keysym);

    while(true)
    {
        XNextEvent(display, &event);
        if(event.type == KeyPress && event.xkey.keycode == keycode)
            break;
    }

    XCloseDisplay(display);
    return 0;
}

编译并运行得很好。

1 个答案:

答案 0 :(得分:0)

创建窗口时,需要让X服务器处理输出缓冲区。通常,这是在您进入窗口事件循环时完成的,即调用名称中包含EVENT的任何函数。

一旦你没有处理代码中的事件,另一种刷新输出缓冲区的方法是调用XFlush,如其手册中所述:

  

XFlush函数刷新输出缓冲区。大多数客户端应用程序不需要使用此函数,因为输出缓冲区会根据需要通过调用XPending,XNextEvent和XWindowEvent自动刷新。服务器生成的事件可能会排入库的事件队列。

     

XSync函数刷新输出缓冲区,然后等待,直到X服务器收到并处理了所有请求。

所以,为了解决你的问题,我建议把这行代码放在一边:

        window = XCreateSimpleWindow(display, RootWindow(display, displayID), 10, 10, width, height, 1, BlackPixel(display, displayID), WhitePixel(display, displayID));
        XMapWindow(display, window);

        XFlush(display);   // <------------

        return true;