Xlib - window 未呈现
Xlib - window is not rendering
我正在为 Xlib 创建库(类似于 gtk/qt,但已简化)。而且我在桌面上没有看到 window。 GDB什么也没说。我必须做什么来修复这个错误?已经尝试将显示声明移至主函数。使用 -g 标志作为编译(与 GDB 检查)。没有 window!说真的,这是一个很棒的故障!
FXL++ 库:
#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
using namespace std;
class fxlpp{
public:
void init(){
disp = XOpenDisplay(NULL);
if(disp == NULL){ //error 1 if can't open display
cerr << "Can't open display" << endl;
exit(1);
}
screen = DefaultScreen(disp);
}
void mkWin(int winID, int x1, int y1, unsigned x2, unsigned y2){
win[winID] = XCreateSimpleWindow(disp, RootWindow(disp, screen), x1, y1, x2, y2, 0, BlackPixel(disp, screen), WhitePixel(disp, screen));
XSelectInput(disp, win[winID], ExposureMask | KeyPressMask);
XMapWindow(disp, win[winID]);
}
void mkCWin(int cWinID, int pWinID, int x1, int y1, int x2, int y2){
cWin[pWinID][cWinID] = XCreateSimpleWindow(disp, win[pWinID], x1, y1, x2, y2, 1, BlackPixel(disp, screen), WhitePixel(disp, screen));
XSelectInput(disp, cWin[pWinID][cWinID], ExposureMask | KeyPressMask);
XMapWindow(disp, cWin[pWinID][cWinID]);
}
protected:
Display *disp; //declare display pointer
int screen; //declare display num integer
Window win[129]; //declare window
Window cWin[129][129]; //declare child win array
XEvent event; //declare event handler
};
测试库的代码:
#include <iostream>
#include "fxlpp.hpp"
using namespace std;
int main(){
class fxlpp fxlpp;
fxlpp.init();
fxlpp.mkWin(1, 100, 100, 500, 300);
sleep(2);
return 0;
}
正如我 ,X11 不仅仅是创建一个 window,在其上绘制一些线条并期待输出。您必须设置 X 事件循环以接收事件,以正确的方式处理最少的曝光事件,以及键盘、鼠标等。所以恐怕这不是错误,而是程序中的设计缺陷。
有关简短教程,请参阅 here。
虽然事件循环在大多数情况下很重要,但在这种简单的情况下,您只需要在绘制后调用 XFlush()
。
我正在为 Xlib 创建库(类似于 gtk/qt,但已简化)。而且我在桌面上没有看到 window。 GDB什么也没说。我必须做什么来修复这个错误?已经尝试将显示声明移至主函数。使用 -g 标志作为编译(与 GDB 检查)。没有 window!说真的,这是一个很棒的故障!
FXL++ 库:
#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
using namespace std;
class fxlpp{
public:
void init(){
disp = XOpenDisplay(NULL);
if(disp == NULL){ //error 1 if can't open display
cerr << "Can't open display" << endl;
exit(1);
}
screen = DefaultScreen(disp);
}
void mkWin(int winID, int x1, int y1, unsigned x2, unsigned y2){
win[winID] = XCreateSimpleWindow(disp, RootWindow(disp, screen), x1, y1, x2, y2, 0, BlackPixel(disp, screen), WhitePixel(disp, screen));
XSelectInput(disp, win[winID], ExposureMask | KeyPressMask);
XMapWindow(disp, win[winID]);
}
void mkCWin(int cWinID, int pWinID, int x1, int y1, int x2, int y2){
cWin[pWinID][cWinID] = XCreateSimpleWindow(disp, win[pWinID], x1, y1, x2, y2, 1, BlackPixel(disp, screen), WhitePixel(disp, screen));
XSelectInput(disp, cWin[pWinID][cWinID], ExposureMask | KeyPressMask);
XMapWindow(disp, cWin[pWinID][cWinID]);
}
protected:
Display *disp; //declare display pointer
int screen; //declare display num integer
Window win[129]; //declare window
Window cWin[129][129]; //declare child win array
XEvent event; //declare event handler
};
测试库的代码:
#include <iostream>
#include "fxlpp.hpp"
using namespace std;
int main(){
class fxlpp fxlpp;
fxlpp.init();
fxlpp.mkWin(1, 100, 100, 500, 300);
sleep(2);
return 0;
}
正如我
有关简短教程,请参阅 here。
虽然事件循环在大多数情况下很重要,但在这种简单的情况下,您只需要在绘制后调用 XFlush()
。