#include #include #include #include #include #include int main(int argc, char *argv[]) { Display *display; Window win, mover, resizer, info, root, close; XEvent event; XFontStruct *font; GC gc, gc2; XSetWindowAttributes a; Cursor arrow; int screen, depth, white, black, press; int x1, x2, y1, y2, x, y, w, h, m, quit; char buffer[10]; if (!(display = XOpenDisplay(getenv("DISPLAY")))) { fprintf(stderr, "%s: unable to open display: %s\n", argv[0], getenv("DISPLAY")); exit(1); } screen = DefaultScreen(display); root = RootWindow(display, screen); depth = DefaultDepth(display, screen); white = WhitePixel(display, screen); black = BlackPixel(display, screen); m = quit = 0; x = y = h = 100; w = 200; win = XCreateSimpleWindow(display, root, 100, 100, w, h, 0, white, white); mover = XCreateSimpleWindow(display, win, 2, 2, 196, 20, 0, white, black); resizer = XCreateSimpleWindow(display, win, 190, 90, 10, 10, 0, white, white); info = XCreateSimpleWindow(display, win, 70, 50, 60, 20, 0, white, white); close = XCreateSimpleWindow(display, win, 180, 4, 15, 15, 0, white, white); gc = XCreateGC(display, info, 0, 0); gc2 = XCreateGC(display, close, 0, 0); XSetForeground(display, gc2, black); arrow = XCreateFontCursor(display, 78); XDefineCursor(display, resizer, arrow); font = XLoadQueryFont(display, "*helveti*med*-r*12*"); XSetFont(display, gc, font->fid); a.override_redirect = True; XChangeWindowAttributes(display, win, CWOverrideRedirect, &a); XChangeWindowAttributes(display, info, CWOverrideRedirect, &a); XSelectInput(display, mover, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask); XSelectInput(display, resizer, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask); XSelectInput(display, close, ExposureMask | ButtonPressMask); XMapWindow(display, win); XMapWindow(display, mover); XMapWindow(display, close); XMapWindow(display, resizer); while (!quit) { XNextEvent(display, &event); switch(event.type) { case Expose: if (event.xany.window == close) { XDrawLine(display, close, gc, 4, 4, 10, 10); XDrawLine(display, close, gc, 10, 4, 4, 10); } break; case ButtonPress: if (event.xany.window == close) quit = 1; if (event.xany.window == mover) press = 1; x1 = event.xbutton.x; y1 = event.xbutton.y; break; case ButtonRelease: if (event.xany.window == resizer) { XMoveWindow(display, resizer, (w+(x2-x1))-10, (h+(y2-y1))-10); w += x2-x1; h += y2-y1; break; } press = 0; x1 = y1 = 0; if (m) { XUnmapWindow(display, info); m = 0; } break; case MotionNotify: if (event.xany.window == resizer) { x2 = event.xmotion.x; y2 = event.xmotion.y; XResizeWindow(display, win, w+(x2-x1), h+(y2-y1)); XResizeWindow(display, mover, (w+(x2-x1))-4, 20); XMoveWindow(display, close, (w+(x2-x1))-20, 4); XMoveWindow(display, info, ((w+(x2-x1))/2) - 30, ((h+(y2-y1))/2)); break; } if (!m) { XMapWindow(display, info); m = 1; } x += event.xmotion.x-x1; y += event.xmotion.y-y1; XMoveWindow(display, win, x, y); sprintf(buffer, "%d:%d", x, y); XSetForeground(display, gc, white); XFillRectangle(display, info, gc, 0, 0, 70, 20); XSetForeground(display, gc, black); XDrawString(display, info, gc, 5, 15, buffer, strlen(buffer)); break; } } printf("done\n"); XCloseDisplay(display); return 0; }