2016-10-06 17 views
2

XLib에서 반투명 흰색 창을 만들고 싶지만 반투명이 아닌 창은 완전히 불투명합니다. 코드에서 나는 콤프 턴 컴포 지터를 사용하여 시스템의 투명 창이있다, 그래서이 문제는 다음과 같습니다XLib에서 반투명 흰색 창을 만드는 방법

#include <X11/Xlib.h> 
#include <X11/Xutil.h> 
#include <stdio.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 = 0x80ffffff; 

    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; 
} 

답변

4

X11은 사전 승산 색, 즉 실제 불투명 색상 즉 경우 채널 (256)로 나눈 알파 값 (곱 따라 스케일링 될 필요가 기대 : 같이

결과는 보인다 너비는 8 비트입니다). 이 형식은 여러 단계를 결합해야 할 때보다 쉽게 ​​작업 할 수 있습니다. 수식 here을 참조하십시오. 모든 것이 미리 곱해질 때 계산이 줄어 듭니다.

:

그래서 당신은 0x80808080에 배경을 설정 256

하여 R, 알파 값 (0x80으로) 및 분할에 의한 G와 B 각 채널을 곱하면 원하는 결과를 제공 필요

결과는 @patthoyts가 제안한 것과 다르다는 점에 유의하십시오. 여기서 적절한 창만 반투명하며 WM 장식은 불투명하게 유지됩니다. 거기에 적절한 창과 장식 모두 WM에 의해 투명하게 만들어집니다 (그리고 WM는 필요한 색상 블렌딩을 수행합니다).

+0

아니, 그게 아니야. 이 이미지를 확인하십시오 : http://oscomp.hu/depot/white_transparency_qt5_vs_xlib.png 배경색은 두 창에서 동일합니다 : 0x80ffffff; Qt5는 내가 필요로하는 것과 XLib가 필요하지 않는 것을 좋아합니다. 그것은 코드에서 뭔가 있어야합니다, 내가 잘못하고 있지만, 뭐야? – jsr

+0

@jsr 시도해 보셨습니까? 이미지를보세요. 김프에서 편집 한 것 같아? –

+0

Qt가 XLib이 아닙니다. X11, Windows GDI, 원시 Linux 프레임 버퍼와 함께 작동하는 휴대용 툴킷입니다. Qt가 내부적으로 사용자를 기쁘게하고 일관된 API를 유지하기 위해 어떤 일을하는지 전혀 알지 못합니다. X11은 내가 게시 한 이미지에서 볼 수있는 것과 정확히 일치합니다. –

2

당신은 _NET_WM_WINDOW_OPACITY를 설정해야합니다. 당신이 XA_CARDINAL의 선언을 얻을 수 #include <X11/Xatom.h>을 추가해야

double alpha = 0.8; 
unsigned long opacity = (unsigned long)(0xFFFFFFFFul * alpha); 
Atom XA_NET_WM_WINDOW_OPACITY = XInternAtom(display, "_NET_WM_WINDOW_OPACITY", False); 
XChangeProperty(display, win, XA_NET_WM_WINDOW_OPACITY, XA_CARDINAL, 32, 
       PropModeReplace, (unsigned char *)&opacity, 1L); 

참고 : 다음은 창을지도하기 전에 추가하는 조각이다.

이 인터페이스가 얼마나 안정적인지 확신 할 수 없습니다. 이것은 Extended Window Manager Hints 사양의 제안 된 확장 인 것으로 보이지만 내가 볼 수있는 것으로부터 최종 개정을하지 않았습니다. 나는 이것이 유닉스에서 어떻게 Tk implements transparency support 인지를 안다.

transparent X11 window over editor

+0

불행히도 작동하지 않았습니다. Xfce, TDE, MotifWM에서 compton을 사용해 보았지만 모든 환경에서 여전히 완전히 흰색입니다. 배경색을 상위 8 비트로 설정하여 배경 투명도를 설정할 수있는 Qt5 코드가 있습니다. 이전에 수행 한 유일한 작업은 윈도우의 "WA_TranslucentBackground"속성 설정입니다. 나는 여전히 Qt5 소스를 보면서 그것이 무엇을하는지 알아 내려고 노력하지만 운은 없다. – jsr

+0

@jsr은 최신 KDE에서 작동합니다. Xfce 및 TDE의 창 관리자를이 원자를 지원하는 것으로 변경할 수 있습니다. –

+0

나는 보편적 인 해결책이 필요합니다. WM에 의존하지 않습니다. Qt5은 반투명 흰색 창을 수행 할 수 있습니다 게다가 : 는 http://oscomp.hu/depot/white_transparency_qt5_vs_xlib.png 배경색이 두 프로그램에서 동일하다 : 아직 0x80ffffff 및 순수 Xlib를 하나는 완전히 불투명 창을 보여줍니다 . – jsr