2012-11-15 4 views
5

테두리 선, 제목, 닫기 버튼 만 표시하고 마우스로 이동할 수있는 Xlib로 창을 만드는 방법이 있습니까? 창의 내용은 비어 있어야합니다 (또는 "투명성"이 더 이상 필요하지 않은 효과처럼 들리더라도 "완전히 투명"해야합니다). 기본적으로 창에는 배경 영역이 표시되어야합니다.테두리 선만 표시하는 Xlib이있는 비어 있거나 투명한 창

답변

11

원하는지 확실하지 않지만 다음 코드는 투명한 배경을 가진 X 창을 생성하지만 여전히 창 관리자의 창 장식을 사용합니다.

X11 및 그래픽 하드웨어 구성이 32 비트 깊이의 영상을 지원하는 경우에만 작동합니다.

#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; 
} 
관련 문제