Xlib如何在启动画面中绘制字符串

这是我的代码,我无法跳出while(!done)函数

使用XFlush(d)可以显示显示窗体缓冲区,并且在XCloseDisplay(d)之前不会消失

我想像这样画画线

g ++ -o youname youcppname -lX11

#include <X11/Xlib.h>

#include <X11/Xatom.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

int main(void)

{

Display *d;

Window w;

XEvent e;

const char *msg = "Hello, World!";

int s;

bool done = false;

/* open connection with the server */

d = XOpenDisplay(NULL);

if (d == NULL)

{

fprintf(stderr, "Cannot open display\n");

exit(1);

}

s = DefaultScreen(d);

/* create window */

w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 480, 320, 0,BlackPixel(d, s), WhitePixel(d, s));

Atom type = XInternAtom(d,"_NET_WM_WINDOW_TYPE", False);

Atom value = XInternAtom(d,"_NET_WM_WINDOW_TYPE_SPLASH", False);

XChangeProperty(d, w, type, XA_ATOM, 32, PropModeReplace, reinterpret_cast<unsigned char*>(&value), 1);

/* register interest in the delete window message */

Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);

XSetWMProtocols(d, w, &wmDeleteMessage, 1);

/* select kind of events we are interested in */

XSelectInput(d, w, ExposureMask | KeyPressMask | StructureNotifyMask);

/* map (show) the window */

XMapWindow(d, w);

/* event loop */

while (!done)

{

XNextEvent(d, &e);

/* draw or redraw the window */

if (e.type == Expose)

{

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

}

/* exit on key press */

switch(e.type)

{

case KeyPress:

XDestroyWindow(d, w);

break;

case DestroyNotify:

done = true;

break;

case ClientMessage:

if (e.xclient.data.l[0] == wmDeleteMessage)

{

done = true;

}

break;

}

}

/* close connection to server */

XCloseDisplay(d);

return 0;

}

回答:

我不太确定为什么XFlush不起作用,但这是事件循环和冲洗的混合体。它等待暴露事件,绘制字符串并退出循环。

5秒钟后,它将取消映射窗口,然后5秒钟后退出。

#include <X11/Xlib.h>

#include <X11/Xatom.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

int main(void)

{

Display *d;

Window w;

XEvent e;

const char *msg = "Hello, World!";

int s;

bool done = false;

/* open connection with the server */

d = XOpenDisplay(NULL);

if (d == NULL)

{

fprintf(stderr, "Cannot open display\n");

exit(1);

}

s = DefaultScreen(d);

/* create window */

w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 480, 320, 0,BlackPixel(d, s), WhitePixel(d, s));

Atom type = XInternAtom(d,"_NET_WM_WINDOW_TYPE", False);

Atom value = XInternAtom(d,"_NET_WM_WINDOW_TYPE_SPLASH", False);

XChangeProperty(d, w, type, XA_ATOM, 32, PropModeReplace, reinterpret_cast<unsigned char*>(&value), 1);

/* register interest in the delete window message */

Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);

XSetWMProtocols(d, w, &wmDeleteMessage, 1);

/* select kind of events we are interested in */

XSelectInput(d, w, ExposureMask);

/* map (show) the window */

XMapWindow(d, w);

/* event loop */

while (!done)

{

XNextEvent(d, &e);

/* draw or redraw the window */

if (e.type == Expose)

{

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

done = true;

}

}

XFlush(d);

sleep(5);

XUnmapWindow(d,w);

XFlush(d);

printf("unmapped\n");

sleep(5);

/* close connection to server */

XCloseDisplay(d);

return 0;

}

以上是 Xlib如何在启动画面中绘制字符串 的全部内容, 来源链接: utcz.com/qa/410044.html

回到顶部