gpt4 book ai didi

c - 为什么在 XWindows 中绘图很重要?

转载 作者:IT王子 更新时间:2023-10-29 00:57:13 25 4
gpt4 key购买 nike

我从网上得到了这个 XWindows“hello, world”。我在更复杂的程序中有我不理解的行为,但这里的简单程序也显示了它:

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
Display *d;
Window w;
XEvent e;
const char *msg = "Hello, World!";
int s;
int x;

d = XOpenDisplay(NULL);
if (d == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}

s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);

XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg));

//XFlush(d);

while (1) {
XNextEvent(d, &e);
if (e.type == Expose) {
// XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg));
}
if (e.type == KeyPress) break;
}

XCloseDisplay(d);
return 0;
}

因此,第一个 XDrawString() 调用实际上并没有写入窗口,但取消注释 expose 事件中的窗口。我发现这种行为令人困惑。在第一次XDrawString()时,显示、屏幕和窗口都设置好了。然而,这并没有绘制,而出现在事件处理程序中的那个绘制了。我还尝试了 XFlush()'ing 队列,这没有什么区别。

这种效果影响了我正在处理的(很多)更复杂的代码,即在屏幕上放置字符。我将它们放置在支持屏幕的像素图中的所需位置,然后我对真实屏幕进行相同的绘制以保持同步。公开处理程序会将像素图复制到屏幕,更新它,但公开事件要到稍后才会发生,此外,将整个像素图复制回屏幕比放置单个字符的代价更高。

我怀疑我需要跟随绘制到缓冲操作,将字符下的矩形标记为无效(这将是 MS Windows 方式)并让事件处理程序处理它,但我想了解什么继续在 X11 内部实现这一点。

最佳答案

X服务器不需要自己提供后台存储,所以Expose事件是在需要绘制窗口的时候发送的。这也是在其他环境中发生的相同功能。开始时您可以绘制,但 X 服务器可能尚未正确设置窗口,稍后会在准备好将内容绘制到屏幕上时向您报告。绘图有点直接在屏幕上,而不是后备缓冲区,因此每次将窗口带到前面时都必须完成。

至于自己请求重绘,您可以使用 XSendEvent 自己发送一个 Expose 事件,然后 X 会将其中继到您的事件循环。所以它实际上与 Windows 完全相同。

关于c - 为什么在 XWindows 中绘图很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56454948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com