我正在努力学习X11.这对我来说很难,因为我没有Linux上的窗口应用程序的经验.
我写了一些简单的代码,我无法解决这个不可见的文本问题.一切都很好,当我试图用DrawRectangle函数绘制矩形时,它正在工作.
这是代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
int main()
{
Display* myDisplay;
Window myWindow;
int myScreen;
GC myGC;
XEvent myEvent;
unsigned long black, white;
char* hello = "Hello world!";
XFontStruct* myFont;
if((myDisplay = XOpenDisplay(NULL)) == NULL)
{
puts("Error in conneting to X Server!");
return -1;
}
myScreen = DefaultScreen(myDisplay);
black = BlackPixel(myDisplay, myScreen);
white = WhitePixel(myDisplay, myScreen);
myWindow = XCreateSimpleWindow(myDisplay, RootWindow(myDisplay, myScreen), 0, 0, 640, 320, 5, black, white);
XSelectInput(myDisplay, myWindow, ExposureMask);
XClearWindow(myDisplay, myWindow);
XMapWindow(myDisplay, myWindow);
myGC = XCreateGC(myDisplay, myWindow, 0, 0);
XSetForeground(myDisplay, myGC, black);
XSetBackground(myDisplay, myGC, white);
myFont = XLoadQueryFont(myDisplay, "-Misc-Fixed-Medium-R-Normal--7-70-75-75-C-50-ISO10646-1");
XSetFont(myDisplay, myGC, myFont->fid);
while(1)
{
XNextEvent(myDisplay, &myEvent);
if(myEvent.type == Expose)
{
XClearWindow(myDisplay, myWindow);
// HERE I DONT KNOW WHY IT DOESNT WORK!
XDrawString(myDisplay, myWindow, myGC, 0, 0, hello, strlen(hello));
}
}
XFreeGC(myDisplay, myGC);
XDestroyWindow(myDisplay, myWindow);
XCloseDisplay(myDisplay);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
你的字体路径参数XLoadQueryFont是错误的(在我的Linux/Debian桌面上).用xlsfonts命令检查正确的命令(它们都是小写).
同
myFont = XLoadQueryFont
(myDisplay,
"-misc-fixed-medium-r-normal--9-90-75-75-c-60-iso10646-1");
Run Code Online (Sandbox Code Playgroud)
它可以更好地工作.也尝试"lucidasanstypewriter-bold-14"
最重要的是传递的坐标XDrawString是错误的.请记住,它们是文本基线的坐标.和X = 0,Y = 0是左上角窗角,Y是增长向下,x是增长到右侧.因此,您的文字是在窗外,在其顶部之上绘制的.因此,y应该是正数,而不是字体高度.
尝试
XDrawString (myDisplay, myWindow, myGC, 15, 20, hello,
strlen (hello));
Run Code Online (Sandbox Code Playgroud)
正如我评论,你需要处理很多更多的事件.
我没有Linux上的窗口应用程序的经验.
并了解GUI编程,我强烈建议先使用一些工具像GTK或Qt的或者是SDL.
原始的X11编程太难了(当你学习它时将会过时,例如Wayland),特别是因为X11应用程序需要符合ICCCM和EWMH.请注意,整个X11文档需要近一万页.
另请参见https://tronche.com/gui/x/xlib/
顺便说一句,大多数Linux GUI应用程序都在绘制pixmap客户端并将其发送到X11服务器.了解合成窗口管理器.XDrawString 在实践中不再使用绘图请求.最近的字体相关库,如libfontconfig,libXft等正在客户端工作.