Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ xOpen显示失败_C++_X11 - Fatal编程技术网

C++ xOpen显示失败

C++ xOpen显示失败,c++,x11,C++,X11,我正在编写一个简单的窗口类,它无法返回显示。以下是简短的版本: #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> class WindowImpl { public: WindowImpl() { open = true; } WindowImpl(float width, float he

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

#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
{
公众:
WindowImpl()
{
开放=真实;
}
WindowImpl(浮动宽度、浮动高度)
{
如果(!创建(宽度、高度))
{
fprintf(stderr,“无法打开显示\n”);
出口(1);
}
开放=真实;
}
~WindowImpl()
{
XCloseDisplay(显示);
};
布尔创建(浮动宽度、浮动高度)
{
display=XOpenDisplay(空);
如果(显示==NULL)
返回false;
int displayID=默认屏幕(显示);
window=XCreateSimpleWindow(显示,根窗口(显示,显示ID),10,10,宽度,高度,1,黑色像素(显示,显示ID),白色像素(显示,显示ID));
XMapWindow(显示,窗口);
返回true;
}
bool isOpen()
{
返回打开;
}
无效关闭()
{
open==false;
}
私人:
显示*显示;
窗口窗口;
布尔公开赛;
};
int main()
{
WindowImpl myWindow(1920、1080);
char*cmd;
while(myWindow.isOpen())
{
如果(获取(cmd)=“关闭”)
myWindow.close();
}
返回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;
}
#包括
#包括
#包括
#包括
int main()
{
显示*显示;
窗口窗口;
XEvent事件;
char*message=“你好”;
int屏幕大小;
display=XOpenDisplay(空);
如果(显示==NULL)
{
fprintf(stderr,“无法打开显示\n”);
出口(1);
}
屏幕大小=默认屏幕(显示);
window=XCreateSimpleWindow(显示,根窗口(显示,屏幕大小),10,10,1920,1080,1,黑色像素(显示,屏幕大小),白色像素(显示,屏幕大小));
XSelectInput(显示、窗口、曝光蒙版|按键蒙版);
XMapWindow(显示,窗口);
KeySym KeySym=XK_Escape;
KeyCode KeyCode=XKeysymToKeycode(显示,keysym);
while(true)
{
XNextEvent(显示和事件);
if(event.type==KeyPress&&event.xkey.keycode==keycode)
打破
}
XCloseDisplay(显示);
返回0;
}

编译和运行正常。

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

一旦不处理代码中的事件,另一种刷新输出缓冲区的方法是调用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;
window=XCreateSimpleWindow(显示,根窗口(显示,显示ID),10,10,宽度,高度,1,黑色像素(显示,显示ID),白色像素(显示,显示ID));
XMapWindow(显示,窗口);

XFlush(显示);//你的显示环境变量定义了吗?是的,如果我在main中做所有的事情,我可以打开一个窗口,出于某种原因,把它放在一个类中会有麻烦。有点离题,但是你会为每个窗口打开新的连接吗?请注意,每个服务器的最大连接总数通常很小,通常只有256(所有<代码> XOpenDisplay <代码>系统中的调用)请参见编辑,我添加了编译并运行的示例。但就我目前的目的而言,我只是想打开一扇窗户。