源码
#include
#include
#include
#include
#include
#include
#define WINDOW_X 100
#define WINDOW_Y 100
#define WINDOW_WIDTH 500
#define WINDOW_HEIGHT 300
#define DISPLAY_TEXT "Taishan Office"
#define FOREGROUND_COLOR 0xFF0000
#define BACKGROUND_COLOR 0x00FF00
static Display *g_pDisplay;
static Window g_oWindow;
static Window g_oWindowRoot;
static int g_iScreen;
static void window_start()
{
char name[128] = {0};
unsigned long foreground_pixel;
unsigned long background_pixel;
g_pDisplay = XOpenDisplay(NULL);
if (g_pDisplay == NULL)
{
fprintf(stderr, "Cannot open display\n");
exit(1);
}
g_iScreen = DefaultScreen(g_pDisplay);
g_oWindowRoot = DefaultRootWindow( g_pDisplay );
//foreground_pixel = WhitePixel(g_pDisplay, g_iScreen);
//background_pixel = BlackPixel(g_pDisplay, g_iScreen);
foreground_pixel = FOREGROUND_COLOR;
background_pixel = BACKGROUND_COLOR;
g_oWindow = XCreateSimpleWindow(g_pDisplay,
g_oWindowRoot,
WINDOW_X, WINDOW_Y,
WINDOW_WIDTH, WINDOW_HEIGHT,
5, //边框粗细
foreground_pixel,
background_pixel);
XStoreName(g_pDisplay, g_oWindow, DISPLAY_TEXT);
XSetIconName(g_pDisplay, g_oWindow, DISPLAY_TEXT);
XMapWindow( g_pDisplay, g_oWindow);
//XCreateSimpleWindow无法正确定位,所以使用移动
XMoveWindow(g_pDisplay, g_oWindow, WINDOW_X, WINDOW_Y);
XSync(g_pDisplay, False);
}
static void window_event()
{
//响应ReparentNotify
XSelectInput(g_pDisplay, g_oWindowRoot, SubstructureNotifyMask);
//响应按键事件
XSelectInput(g_pDisplay, g_oWindow, ExposureMask | KeyPressMask);
XEvent event;
while (1)
{
XNextEvent(g_pDisplay, &event);
if ( event.type == ReparentNotify )
{
Window x11window = g_oWindow;
Display* x11display = g_pDisplay;
char **srname = (char **)malloc(sizeof(char *));
XReparentEvent *reparentevent = (XReparentEvent *)&event;
printf("window: %ld \n", (unsigned long)(reparentevent->window));
printf("parent: %ld \n", (unsigned long)(reparentevent->parent));
/*获取到新建窗口的window ID*/
//x11window = (unsigned long)(reparentevent->window);
//x11display = (reparentevent->display);
x11window = g_oWindow;
x11display = g_pDisplay;
XFetchName(x11display, x11window, srname);
if (*srname != NULL)
{
printf("name: %s\n" ,*srname);
}
free(*srname);
}
//任意键退出
if (event.type == KeyPress)
{
break;
}
}
}
static void window_close()
{
XCloseDisplay(g_pDisplay);
}
int main(int argc, char** argv)
{
window_start();
window_event();
window_close();
return 0;
}