X11为什么我不能画任何文字?

Dav*_*vey 2 c linux x11 text


我正在努力学习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)

谢谢你的帮助!

Bas*_*tch 5

你的字体路径参数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编程,我强烈建议先使用一些工具GTKQt的或者是SDL.

原始的X11编程太难了(当你学习它时将会过时,例如Wayland),特别是因为X11应用程序需要符合ICCCMEWMH.请注意,整个X11文档需要近一万页.

另请参见https://tronche.com/gui/x/xlib/

顺便说一句,大多数Linux GUI应用程序都在绘制pixmap客户端并将其发送到X11服务器.了解合成窗口管理器.XDrawString 在实践中不再使用绘图请求.最近的字体相关库,如libfontconfig,libXft等正在客户端工作.

  • 那么它现在已经过时了吗?) (2认同)