// gcc -o wm_normal_hints wm_normal_hints.c -lX11 #include #include #include #include Display *display; int screen_num; Window root; Window create_window(char * name, Window parent, int x, int y, int width, int height, int flags) { XSizeHints sh; Window win = XCreateSimpleWindow(display, parent, x, y, width, height, 2, // border width BlackPixel(display, screen_num), WhitePixel(display, screen_num)); sh.width = width; sh.height = height; sh.x = x; sh.y = y; sh.flags = flags; XSetWMNormalHints(display, win, &sh); XStoreName(display, win, name); XSelectInput(display, win, KeyPressMask | ButtonPressMask); XMapWindow(display, win); XFlush(display); XSync(display, False); return win; } int main(int argc, char **argv) { Window window1, window2, window3; XEvent ev; int i = 0; int flags; bool done = false; char *display_name = NULL; if ((display = XOpenDisplay(display_name)) == NULL) { fprintf(stderr, "Couldn't open %s\n", XDisplayName(display_name)); return -1; } screen_num = DefaultScreen(display); root = RootWindow(display, screen_num); while (1) { switch (i%3) { case 0: flags = 0; fprintf(stderr, "no flags\n"); break; case 1: flags = PPosition; fprintf(stderr, "flags = PPosition\n"); break; case 2: flags = USPosition; fprintf(stderr, "flags = USPosition\n"); break; } i++; window1 = create_window("Test -ve", root, -100, -100, 200, 100, flags); window2 = create_window("Test origin", root, 0, 0, 200, 100, flags); window3 = create_window("Test +ve", root, 100, 100, 200, 100, flags); while (1) { XNextEvent(display, &ev); fprintf(stderr, "event on frame %i: ", ev.xany.window); fprintf(stderr, "%d\n", ev.xany.type); if (ev.type == ButtonPress) break; } XDestroyWindow(display, window1); XDestroyWindow(display, window2); XDestroyWindow(display, window3); if (done) break; } return 0; }