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 <代码>系统中的调用)请参见编辑,我添加了编译并运行的示例。但就我目前的目的而言,我只是想打开一扇窗户。