X11为什么我无法绘制任何文字?

时间:2017-06-10 18:16:50

标签: c linux text x11


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

谢谢你的帮助!

1 个答案:

答案 0 :(得分:5)

XLoadQueryFont字体路径参数错误(在我的Linux / Debian桌面上)。使用xlsfonts命令检查正确的命令(它们都是小写)。

  myFont = XLoadQueryFont 
      (myDisplay,
        "-misc-fixed-medium-r-normal--9-90-75-75-c-60-iso10646-1");

它可以更好地工作。也可以使用"lucidasanstypewriter-bold-14"

最重要的是传递给XDrawString的坐标是错误的。请记住它们是文本的基线的坐标。并且 x = 0,y = 0 是窗口的左上角角,y正在向下,x正在增长到< EM>右。因此,您的文字是在窗外,在其顶部之上绘制的。所以 y 应该是正数,而不是字体高度。

尝试

  XDrawString (myDisplay, myWindow, myGC, 15, 20, hello,
           strlen (hello));

正如我评论的那样,您需要处理批次更多事件。

  

我没有在Linux上使用窗口应用程序的经验。

要了解GUI编程,我强烈建议您首先使用toolkitGTKQt SDL

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

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

BTW,大多数Linux GUI应用程序都在绘制pixmap客户端并将其发送到X11服务器。阅读compositing window managers。像XDrawString这样的绘图请求在实践中不再使用了。最近的字体相关库(如libfontconfiglibXft等)正在客户端方面工作。