X11 为什么我无法绘制任何文字?
X11 Why I can't draw any text?
我正在尝试学习 X11。这对我来说很难,因为我没有在 Linux 上使用 window 应用程序的经验。
我写了一些简单的代码,但我无法解决这个不可见的文本问题。
可能一切都很好,当我尝试使用 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;
}
感谢您的帮助!
您 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是window的左上角,y在增长向下 并且 x 向 右侧 增长。因此,您的文本在其顶部上方绘制 -window。所以y应该是正数并且大于字体高度。
尝试
XDrawString (myDisplay, myWindow, myGC, 15, 20, hello,
strlen (hello));
正如我所说,您需要处理 很多 个事件。
I don't have experience with window applications on Linux.
和要了解 GUI 编程,我强烈建议首先使用一些 toolkit like GTK or Qt or perhaps SDL。
原始 X11 编程太难了(等你学会的时候它会过时,例如 Wayland), in particular because an X11 application needs to be ICCCM & EWMH 兼容。注意整个 X11文档需要近万页。
另见 https://tronche.com/gui/x/xlib/
顺便说一句,大多数 Linux GUI 应用程序正在绘制像素图客户端并将其发送到 X11 服务器。阅读 compositing window managers。在实践中不再使用像 XDrawString
这样的绘图请求。 libfontconfig
、libXft
等最近的字体相关库正在 客户端 端工作。
我正在尝试学习 X11。这对我来说很难,因为我没有在 Linux 上使用 window 应用程序的经验。
我写了一些简单的代码,但我无法解决这个不可见的文本问题。
可能一切都很好,当我尝试使用 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;
}
感谢您的帮助!
您 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是window的左上角,y在增长向下 并且 x 向 右侧 增长。因此,您的文本在其顶部上方绘制 -window。所以y应该是正数并且大于字体高度。
尝试
XDrawString (myDisplay, myWindow, myGC, 15, 20, hello,
strlen (hello));
正如我所说,您需要处理 很多 个事件。
I don't have experience with window applications on Linux.
和要了解 GUI 编程,我强烈建议首先使用一些 toolkit like GTK or Qt or perhaps SDL。
原始 X11 编程太难了(等你学会的时候它会过时,例如 Wayland), in particular because an X11 application needs to be ICCCM & EWMH 兼容。注意整个 X11文档需要近万页。
另见 https://tronche.com/gui/x/xlib/
顺便说一句,大多数 Linux GUI 应用程序正在绘制像素图客户端并将其发送到 X11 服务器。阅读 compositing window managers。在实践中不再使用像 XDrawString
这样的绘图请求。 libfontconfig
、libXft
等最近的字体相关库正在 客户端 端工作。