我正在编写一个无法返回显示的简单窗口类。这是简短版本:
#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;
}
编译并运行得很好。
答案 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;