2012-11-15 38 views
5

Có cách nào để tạo cửa sổ với Xlib chỉ hiển thị đường viền, tiêu đề, nút đóng và bạn có thể di chuyển bằng chuột không? Nội dung của cửa sổ phải trống (hoặc "hoàn toàn trong suốt", mặc dù "minh bạch" có vẻ giống như một hiệu ứng tôi không cần). Về cơ bản cửa sổ sẽ hiển thị khu vực nền.Cửa sổ trống hoặc trong suốt với Xlib hiển thị đường viền chỉ

Trả lời

11

Tôi không chắc đó có phải là thứ bạn muốn hay không, nhưng mã sau tạo cửa sổ X với nền trong suốt nhưng vẫn sử dụng trang trí cửa sổ của trình quản lý cửa sổ của bạn.

Nó sẽ chỉ hoạt động nếu cấu hình phần cứng đồ họa và X11 của bạn hỗ trợ hình ảnh với độ sâu 32 bit.

#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

int main(int argc, char* argv[]) 
{ 
    Display* display = XOpenDisplay(NULL); 

    XVisualInfo vinfo; 
    XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo); 

    XSetWindowAttributes attr; 
    attr.colormap = XCreateColormap(display, DefaultRootWindow(display), vinfo.visual, AllocNone); 
    attr.border_pixel = 0; 
    attr.background_pixel = 0; 

    Window win = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 300, 200, 0, vinfo.depth, InputOutput, vinfo.visual, CWColormap | CWBorderPixel | CWBackPixel, &attr); 
    XSelectInput(display, win, StructureNotifyMask); 
    GC gc = XCreateGC(display, win, 0, 0); 

    Atom wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", 0); 
    XSetWMProtocols(display, win, &wm_delete_window, 1); 

    XMapWindow(display, win); 

    int keep_running = 1; 
    XEvent event; 

    while (keep_running) { 
     XNextEvent(display, &event); 

     switch(event.type) { 
      case ClientMessage: 
       if (event.xclient.message_type == XInternAtom(display, "WM_PROTOCOLS", 1) && (Atom)event.xclient.data.l[0] == XInternAtom(display, "WM_DELETE_WINDOW", 1)) 
        keep_running = 0; 

       break; 

      default: 
       break; 
     } 
    } 

    XDestroyWindow(display, win); 
    XCloseDisplay(display); 
    return 0; 
}