0%

First XWindow Program

找了一下在Linux底下寫OpenGL程式的方法,覺得有必要繞過glut,直接跟XWindow打交道,才能拿到更大的控制權。
終於找到一個可以用的骨架。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <X11/Xlib.h>
#include <iostream>

int main()
{
Display* dpy;

dpy = XOpenDisplay(NULL);

std::cout << std::endl;

if (dpy == NULL)
{
std::cout << "Error: could not open display";
return 0;
}
else
{
std::cout << "Success!";
}

int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));

Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0,
200, 100, 0, whiteColor, blackColor);

XSelectInput(dpy, w, StructureNotifyMask);

XMapWindow(dpy, w);

GC gc = XCreateGC(dpy, w, 0, NULL);

XSetForeground(dpy, gc, whiteColor);

while(true)
{
XEvent e;
XNextEvent(dpy, &e);
if (e.type == MapNotify)
{
break;
}
}

XDrawLine(dpy, w, gc, 10, 60, 10, 0);
XFlush(dpy);

while(true)
{
XEvent e;
XNextEvent(dpy, &e);
if (e.type == DestroyNotify)
{
break;
}
}

std::cout << std::endl << std::endl;
return 0;
}

需要連結X11 library才能順利成功

1
$ g++ demo.cpp -o demo -lX11

不過奇怪的是當關閉視窗時,總會有以下的錯誤訊息出現

XIO: fatal IO error 11 (Resource temporarily unavailable) on X server “:0.0”
after 12 requests (10 known processed) with 0 events remaining.
Success

Google了一下也沒什麼正確的解法,就不管他。
程式的骨架跟Win32的架構很像,因此不會太難了解。